hardsploit_gui 2.3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -22
  3. data/Rakefile +1 -1
  4. data/bin/hardsploit_gui +3 -3
  5. data/lib/Firmwares/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  6. data/lib/Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  7. data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  8. data/lib/Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd +0 -0
  9. data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  10. data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
  11. data/lib/Firmwares/FPGA/VersionFPGA.rb +5 -5
  12. data/lib/Firmwares/UC/VersionUC.rb +12 -12
  13. data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -210
  14. data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -150
  15. data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -109
  16. data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -305
  17. data/lib/HardsploitAPI/Core/HardsploitAPI_PROGRESS.rb +28 -28
  18. data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -166
  19. data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -356
  20. data/lib/HardsploitAPI/Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb +206 -206
  21. data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -306
  22. data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -340
  23. data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -83
  24. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -367
  25. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -89
  26. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -61
  27. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_STM32.rb +121 -121
  28. data/lib/HardsploitAPI/Modules/TEST/HardsploitAPI_TEST_INTERACT.rb +98 -98
  29. data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -196
  30. data/lib/Hardsploit_gui.rb +96 -96
  31. data/lib/LICENSE.txt +674 -674
  32. data/lib/README.md +22 -22
  33. data/lib/TRADEMARK +2 -2
  34. data/lib/class/Chip_editor.rb +304 -304
  35. data/lib/class/Chip_management.rb +496 -496
  36. data/lib/class/Command_editor.rb +216 -216
  37. data/lib/class/Command_table.rb +233 -233
  38. data/lib/class/Console.rb +26 -26
  39. data/lib/class/ErrorMsg.rb +312 -312
  40. data/lib/class/Export.rb +140 -140
  41. data/lib/class/Export_manager.rb +124 -124
  42. data/lib/class/Firmware.rb +70 -70
  43. data/lib/class/Generic_commands.rb +260 -260
  44. data/lib/class/{i2c → I2C}/I2c_command.rb +51 -51
  45. data/lib/class/{i2c → I2C}/I2c_export.rb +95 -95
  46. data/lib/class/{i2c → I2C}/I2c_import.rb +117 -117
  47. data/lib/class/{i2c → I2C}/I2c_scanner.rb +114 -114
  48. data/lib/class/{i2c → I2C}/I2c_settings.rb +148 -148
  49. data/lib/class/Import.rb +193 -193
  50. data/lib/class/{parallel → PARALLEL}/Parallel_export.rb +118 -118
  51. data/lib/class/{parallel → PARALLEL}/Parallel_import.rb +113 -113
  52. data/lib/class/{parallel → PARALLEL}/Parallel_settings.rb +81 -81
  53. data/lib/class/Progress_bar.rb +32 -32
  54. data/lib/class/{spi → SPI}/Spi_export.rb +108 -108
  55. data/lib/class/{spi → SPI}/Spi_import.rb +159 -159
  56. data/lib/class/{spi → SPI}/Spi_settings.rb +108 -108
  57. data/lib/class/{spi → SPI}/Spi_sniffer.rb +101 -101
  58. data/lib/class/Signal_mapper.rb +120 -120
  59. data/lib/class/Wire_helper.rb +230 -230
  60. data/lib/class/swd/Swd.rb +125 -125
  61. data/lib/class/swd/Swd_scanner.rb +121 -121
  62. data/lib/class/swd/Swd_settings.rb +76 -76
  63. data/lib/class/uart/Uart_baudrate.rb +62 -62
  64. data/lib/class/uart/Uart_console.rb +115 -115
  65. data/lib/class/uart/Uart_settings.rb +102 -102
  66. data/lib/db/associations.rb +138 -138
  67. data/lib/db/database.rb +4 -4
  68. data/lib/db/development.sqlite3 +0 -0
  69. data/lib/db/migrate/004_create_manufacturers.rb +13 -13
  70. data/lib/db/migrate/005_create_packages.rb +13 -13
  71. data/lib/db/migrate/006_create_chip_types.rb +11 -11
  72. data/lib/db/migrate/007_create_buses.rb +11 -11
  73. data/lib/db/migrate/008_create_signals.rb +14 -14
  74. data/lib/db/migrate/009_create_chips.rb +25 -25
  75. data/lib/db/migrate/010_create_commands.rb +21 -21
  76. data/lib/db/migrate/011_create_bytes.rb +19 -19
  77. data/lib/db/migrate/012_create_i2c_settings.rb +21 -21
  78. data/lib/db/migrate/013_create_spi_settings.rb +26 -26
  79. data/lib/db/migrate/014_create_parallel_settings.rb +21 -21
  80. data/lib/db/migrate/015_create_pins.rb +19 -19
  81. data/lib/db/migrate/016_create_uses.rb +17 -17
  82. data/lib/db/migrate/017_create_swd_settings.rb +19 -19
  83. data/lib/db/migrate/018_create_uart_settings.rb +22 -22
  84. data/lib/db/schema.rb +157 -157
  85. data/lib/db/seeds.rb +161 -161
  86. data/lib/gui/gui_chip_editor.rb +349 -349
  87. data/lib/gui/gui_chip_management.rb +377 -377
  88. data/lib/gui/gui_command_editor.rb +219 -219
  89. data/lib/gui/gui_export.rb +132 -132
  90. data/lib/gui/gui_export_manager.rb +93 -93
  91. data/lib/gui/gui_generic_commands.rb +202 -202
  92. data/lib/gui/gui_generic_export.rb +164 -164
  93. data/lib/gui/gui_generic_import.rb +142 -142
  94. data/lib/gui/gui_i2c_command.rb +116 -116
  95. data/lib/gui/gui_i2c_settings.rb +230 -230
  96. data/lib/gui/gui_import.rb +131 -131
  97. data/lib/gui/gui_parallel_settings.rb +195 -195
  98. data/lib/gui/gui_progress_bar.rb +85 -85
  99. data/lib/gui/gui_signal_mapper.rb +121 -121
  100. data/lib/gui/gui_signal_scanner.rb +146 -146
  101. data/lib/gui/gui_spi_import.rb +126 -126
  102. data/lib/gui/gui_spi_settings.rb +313 -313
  103. data/lib/gui/gui_spi_sniffer.rb +112 -112
  104. data/lib/gui/gui_swd_settings.rb +166 -166
  105. data/lib/gui/gui_uart_baudrate.rb +114 -114
  106. data/lib/gui/gui_uart_console.rb +164 -164
  107. data/lib/gui/gui_uart_settings.rb +243 -243
  108. data/lib/gui/gui_wire_helper.rb +99 -99
  109. data/lib/gui_designer/gui_chip_editor.ui +549 -549
  110. data/lib/gui_designer/gui_chip_management.ui +886 -886
  111. data/lib/gui_designer/gui_command_editor.ui +350 -350
  112. data/lib/gui_designer/gui_export.ui +171 -171
  113. data/lib/gui_designer/gui_export_manager.ui +115 -115
  114. data/lib/gui_designer/gui_generic_commands.ui +342 -342
  115. data/lib/gui_designer/gui_generic_export.ui +202 -202
  116. data/lib/gui_designer/gui_generic_import.ui +165 -165
  117. data/lib/gui_designer/gui_i2c_command.ui +148 -148
  118. data/lib/gui_designer/gui_i2c_settings.ui +292 -292
  119. data/lib/gui_designer/gui_import.ui +168 -168
  120. data/lib/gui_designer/gui_parallel_settings.ui +247 -247
  121. data/lib/gui_designer/gui_progress_bar.ui +86 -86
  122. data/lib/gui_designer/gui_signal_mapper.ui +179 -179
  123. data/lib/gui_designer/gui_signal_scanner.ui +261 -261
  124. data/lib/gui_designer/gui_spi_settings.ui +446 -446
  125. data/lib/gui_designer/gui_spi_sniffer.ui +156 -156
  126. data/lib/gui_designer/gui_swd_settings.ui +189 -189
  127. data/lib/gui_designer/gui_uart_baudrate.ui +161 -161
  128. data/lib/gui_designer/gui_uart_console.ui +284 -284
  129. data/lib/gui_designer/gui_uart_settings.ui +280 -280
  130. data/lib/gui_designer/gui_wire_helper.ui +117 -117
  131. data/lib/images/search.png +0 -0
  132. data/lib/logs/error.log +0 -63
  133. data/lib/models/bus.rb +19 -19
  134. data/lib/models/byte.rb +29 -29
  135. data/lib/models/chip.rb +41 -41
  136. data/lib/models/chip_type.rb +14 -14
  137. data/lib/models/command.rb +20 -20
  138. data/lib/models/i2c_setting.rb +41 -41
  139. data/lib/models/manufacturer.rb +14 -14
  140. data/lib/models/package.rb +26 -26
  141. data/lib/models/parallel_setting.rb +37 -37
  142. data/lib/models/pin.rb +14 -14
  143. data/lib/models/signall.rb +20 -20
  144. data/lib/models/spi_setting.rb +67 -67
  145. data/lib/models/swd_setting.rb +25 -25
  146. data/lib/models/uart_setting.rb +52 -52
  147. data/lib/models/use.rb +6 -6
  148. data/lib/startHardsploit.rb +10 -10
  149. metadata +14 -14
@@ -1,216 +1,216 @@
1
- #===================================================
2
- # Hardsploit GUI - By Opale Security
3
- # www.opale-security.com || www.hardsploit.io
4
- # License: GNU General Public License v3
5
- # License URI: http://www.gnu.org/licenses/gpl.txt
6
- #===================================================
7
-
8
- require_relative '../gui/gui_command_editor'
9
- class Command_editor < Qt::Widget
10
- slots 'add_cmd()'
11
- slots 'edit_cmd()'
12
- slots 'add_row()'
13
- slots 'clone_row()'
14
- slots 'remove_row()'
15
- slots 'check_cell_content(QTableWidgetItem*)'
16
-
17
- def initialize(action, cmd_name, chip, bus_id, parent, bus_param={})
18
- super()
19
- @view = Ui_Command_editor.new
20
- centerWindow(self)
21
- @view.setupUi(self)
22
- @bus = Bus.find(bus_id)
23
- @chip_id = chip.id
24
- @cmd_name = cmd_name
25
- @bus_id = bus_id
26
- @parent = parent
27
- @cmd_table = Command_table.new(@view.tbl_bytes, @bus.name)
28
-
29
- inputRestrict(@view.lie_name, 2)
30
- inputRestrict(@view.lie_description, 2)
31
- @view.lbl_chip_val.setText(chip.reference)
32
- @cmd_table.resize_to_content
33
- @cmd_table.build_spi if @bus.name == 'SPI'
34
- @view.lie_text_2_bytes.hide unless @bus.name == 'SPI'
35
-
36
- case action
37
- when 0
38
- # Add
39
- @view.lbl_cmd_val.setText('-')
40
- Qt::Object.connect(@view.btn_validate, SIGNAL('clicked()'), self, SLOT('add_cmd()'))
41
- when 1
42
- # Template
43
- @view.lbl_cmd_val.setText(cmd_name)
44
- feed_editor_form
45
- @view.lie_name.setText('')
46
- Qt::Object.connect(@view.btn_validate, SIGNAL('clicked()'), self, SLOT('add_cmd()'))
47
- else
48
- # Edit
49
- @view.lbl_cmd_val.setText(cmd_name)
50
- feed_editor_form
51
- @view.btn_validate.setText('Edit')
52
- Qt::Object.connect(@view.btn_validate, SIGNAL('clicked()'), self, SLOT('edit_cmd()'))
53
- end
54
- unless bus_param.empty?
55
- feed_i2c_cmd_array(bus_param)
56
- end
57
- rescue Exception => msg
58
- ErrorMsg.new.unknown(msg)
59
- end
60
-
61
- def feed_i2c_cmd_array(bus_param)
62
- if bus_param[:mode] == 'w'
63
- @cmd_table.i2c_write_cmd(bus_param[:addr], bus_param[:size].to_i)
64
- else
65
- @cmd_table.i2c_read_cmd(bus_param[:addr], bus_param[:size].to_i)
66
- end
67
- end
68
-
69
- def add_cmd
70
- return false if @cmd_table.empty_data_exist? || is_cmd_size_valid? == false
71
- @cmd = Command.create(
72
- name: @view.lie_name.text,
73
- description: @view.lie_description.text,
74
- bus_id: @bus_id,
75
- chip_id: @chip_id
76
- )
77
- unless check_for_errors(@cmd)
78
- add_bytes
79
- @parent.feed_cmd_array
80
- close
81
- end
82
- rescue Exception => msg
83
- ErrorMsg.new.unknown(msg)
84
- end
85
-
86
- def edit_cmd
87
- return false if @cmd_table.empty_data_exist? && !is_cmd_size_valid?
88
- @cmd = Command.find_by(name: @cmd_name, chip_id: @chip_id)
89
- @cmd.update(
90
- name: @view.lie_name.text,
91
- description: @view.lie_description.text
92
- )
93
- @view.tbl_bytes.sortItems(0, Qt::AscendingOrder)
94
- unless check_for_errors(@cmd)
95
- Byte.where(command_id: @cmd.id).destroy_all
96
- add_bytes
97
- @parent.feed_cmd_array
98
- close
99
- end
100
- rescue Exception => msg
101
- ErrorMsg.new.unknown(msg)
102
- end
103
-
104
- def add_bytes
105
- @view.tbl_bytes.sortItems(0, Qt::AscendingOrder)
106
- @view.tbl_bytes.rowCount.times do |i|
107
- if @bus.name == 'SPI'
108
- iteration = @view.tbl_bytes.item(i, 2).text
109
- description = @view.tbl_bytes.item(i, 3).text
110
- else
111
- iteration = nil
112
- description = @view.tbl_bytes.item(i, 2).text
113
- end
114
- byte = Byte.create(
115
- index: i.next,
116
- value: @view.tbl_bytes.item(i, 1).text,
117
- iteration: iteration,
118
- description: description,
119
- command_id: @cmd.id
120
- )
121
- return false if check_for_errors(byte)
122
- end
123
- Qt::MessageBox.new(
124
- Qt::MessageBox::Information,
125
- 'Command status',
126
- 'Command saved'
127
- ).exec
128
- rescue Exception => msg
129
- ErrorMsg.new.unknown(msg)
130
- end
131
-
132
- def check_cell_content(item)
133
- case @view.tbl_bytes.horizontalHeaderItem(item.column).text
134
- when 'Order', 'Repetition'
135
- if item.text.to_i < 0
136
- item.setData(0, Qt::Variant.new(0))
137
- ErrorMsg.new.positive_cell_value
138
- end
139
- when 'Byte (Hexa)'
140
- reg = Qt::RegExp.new("^[A-Fa-f0-9]{2}")
141
- reg_val = Qt::RegExpValidator.new(reg, self)
142
- if reg_val.validate(item.text, item.text.length) == 0
143
- item.setText('')
144
- ErrorMsg.new.hexa_cell_value
145
- end
146
- when 'Description'
147
- unless item.text.nil?
148
- reg = Qt::RegExp.new("^[a-zA-Z0-9_@-\s]+$")
149
- reg_val = Qt::RegExpValidator.new(reg, self)
150
- if reg_val.validate(item.text, item.text.length) == 0
151
- item.setText('')
152
- ErrorMsg.new.char_cell_value
153
- end
154
- end
155
- end
156
- rescue Exception => msg
157
- ErrorMsg.new.unknown(msg)
158
- end
159
-
160
- def is_cmd_size_valid?
161
- byte_table_size = @view.tbl_bytes.rowCount
162
- case @bus_name
163
- when 'SPI'
164
- cmd_size = byte_table_size + @cmd_table.count_total_repetition
165
- return true if cmd_size < 4000
166
- return ErrorMsg.new.spi_cmd_too_long
167
- when 'I2C'
168
- count = i = 0
169
- while i <= byte_table_size - 1 do
170
- low_byte = @view.tbl_bytes.item(i, 1)
171
- high_byte = @view.tbl_bytes.item(i + 1, 1)
172
- command_byte = @view.tbl_bytes.item(i + 2, 1)
173
- return ErrorMsg.new.lowbyte_missing if low_byte.nil?
174
- return ErrorMsg.new.highbyte_missing if high_byte.nil?
175
- return ErrorMsg.new.mode_missing if command_byte.nil?
176
- current_count = HardsploitAPI.BytesToInt(
177
- lByte: low_byte.text.to_i(16),
178
- hByte: high_byte.text.to_i(16)
179
- )
180
- count += current_count
181
- (command_type.to_i(16) % 2).zero? ? i += current_count + 3 : i += 3
182
- end
183
- return ErrorMsg.new.size_neq_row_number unless i == byte_table_size
184
- return ErrorMsg.new.i2c_cmd_too_long if count > 2000
185
- return true
186
- end
187
- rescue Exception => msg
188
- ErrorMsg.new.unknown(msg)
189
- end
190
-
191
- def feed_editor_form
192
- cmd = Command.find_by(name: @cmd_name)
193
- @view.lie_name.setText(@cmd_name)
194
- @view.lie_description.setText(cmd.description)
195
- @cmd_table.fill_byte_table(cmd.bytes)
196
- rescue Exception => msg
197
- ErrorMsg.new.unknown(msg)
198
- end
199
-
200
- def add_row
201
- if @view.lie_text_2_bytes.text.empty?
202
- @cmd_table.add_row
203
- else
204
- @cmd_table.add_text_rows(@view.lie_text_2_bytes.text)
205
- @view.lie_text_2_bytes.setText('')
206
- end
207
- end
208
-
209
- def clone_row
210
- @cmd_table.clone_rows
211
- end
212
-
213
- def remove_row
214
- @cmd_table.remove_rows
215
- end
216
- end
1
+ #===================================================
2
+ # Hardsploit GUI - By Opale Security
3
+ # www.opale-security.com || www.hardsploit.io
4
+ # License: GNU General Public License v3
5
+ # License URI: http://www.gnu.org/licenses/gpl.txt
6
+ #===================================================
7
+
8
+ require_relative '../gui/gui_command_editor'
9
+ class Command_editor < Qt::Widget
10
+ slots 'add_cmd()'
11
+ slots 'edit_cmd()'
12
+ slots 'add_row()'
13
+ slots 'clone_row()'
14
+ slots 'remove_row()'
15
+ slots 'check_cell_content(QTableWidgetItem*)'
16
+
17
+ def initialize(action, cmd_name, chip, bus_id, parent, bus_param={})
18
+ super()
19
+ @view = Ui_Command_editor.new
20
+ centerWindow(self)
21
+ @view.setupUi(self)
22
+ @bus = Bus.find(bus_id)
23
+ @chip_id = chip.id
24
+ @cmd_name = cmd_name
25
+ @bus_id = bus_id
26
+ @parent = parent
27
+ @cmd_table = Command_table.new(@view.tbl_bytes, @bus.name)
28
+
29
+ inputRestrict(@view.lie_name, 2)
30
+ inputRestrict(@view.lie_description, 2)
31
+ @view.lbl_chip_val.setText(chip.reference)
32
+ @cmd_table.resize_to_content
33
+ @cmd_table.build_spi if @bus.name == 'SPI'
34
+ @view.lie_text_2_bytes.hide unless @bus.name == 'SPI'
35
+
36
+ case action
37
+ when 0
38
+ # Add
39
+ @view.lbl_cmd_val.setText('-')
40
+ Qt::Object.connect(@view.btn_validate, SIGNAL('clicked()'), self, SLOT('add_cmd()'))
41
+ when 1
42
+ # Template
43
+ @view.lbl_cmd_val.setText(cmd_name)
44
+ feed_editor_form
45
+ @view.lie_name.setText('')
46
+ Qt::Object.connect(@view.btn_validate, SIGNAL('clicked()'), self, SLOT('add_cmd()'))
47
+ else
48
+ # Edit
49
+ @view.lbl_cmd_val.setText(cmd_name)
50
+ feed_editor_form
51
+ @view.btn_validate.setText('Edit')
52
+ Qt::Object.connect(@view.btn_validate, SIGNAL('clicked()'), self, SLOT('edit_cmd()'))
53
+ end
54
+ unless bus_param.empty?
55
+ feed_i2c_cmd_array(bus_param)
56
+ end
57
+ rescue Exception => msg
58
+ ErrorMsg.new.unknown(msg)
59
+ end
60
+
61
+ def feed_i2c_cmd_array(bus_param)
62
+ if bus_param[:mode] == 'w'
63
+ @cmd_table.i2c_write_cmd(bus_param[:addr], bus_param[:size].to_i)
64
+ else
65
+ @cmd_table.i2c_read_cmd(bus_param[:addr], bus_param[:size].to_i)
66
+ end
67
+ end
68
+
69
+ def add_cmd
70
+ return false if @cmd_table.empty_data_exist? || is_cmd_size_valid? == false
71
+ @cmd = Command.create(
72
+ name: @view.lie_name.text,
73
+ description: @view.lie_description.text,
74
+ bus_id: @bus_id,
75
+ chip_id: @chip_id
76
+ )
77
+ unless check_for_errors(@cmd)
78
+ add_bytes
79
+ @parent.feed_cmd_array
80
+ close
81
+ end
82
+ rescue Exception => msg
83
+ ErrorMsg.new.unknown(msg)
84
+ end
85
+
86
+ def edit_cmd
87
+ return false if @cmd_table.empty_data_exist? && !is_cmd_size_valid?
88
+ @cmd = Command.find_by(name: @cmd_name, chip_id: @chip_id)
89
+ @cmd.update(
90
+ name: @view.lie_name.text,
91
+ description: @view.lie_description.text
92
+ )
93
+ @view.tbl_bytes.sortItems(0, Qt::AscendingOrder)
94
+ unless check_for_errors(@cmd)
95
+ Byte.where(command_id: @cmd.id).destroy_all
96
+ add_bytes
97
+ @parent.feed_cmd_array
98
+ close
99
+ end
100
+ rescue Exception => msg
101
+ ErrorMsg.new.unknown(msg)
102
+ end
103
+
104
+ def add_bytes
105
+ @view.tbl_bytes.sortItems(0, Qt::AscendingOrder)
106
+ @view.tbl_bytes.rowCount.times do |i|
107
+ if @bus.name == 'SPI'
108
+ iteration = @view.tbl_bytes.item(i, 2).text
109
+ description = @view.tbl_bytes.item(i, 3).text
110
+ else
111
+ iteration = nil
112
+ description = @view.tbl_bytes.item(i, 2).text
113
+ end
114
+ byte = Byte.create(
115
+ index: i.next,
116
+ value: @view.tbl_bytes.item(i, 1).text,
117
+ iteration: iteration,
118
+ description: description,
119
+ command_id: @cmd.id
120
+ )
121
+ return false if check_for_errors(byte)
122
+ end
123
+ Qt::MessageBox.new(
124
+ Qt::MessageBox::Information,
125
+ 'Command status',
126
+ 'Command saved'
127
+ ).exec
128
+ rescue Exception => msg
129
+ ErrorMsg.new.unknown(msg)
130
+ end
131
+
132
+ def check_cell_content(item)
133
+ case @view.tbl_bytes.horizontalHeaderItem(item.column).text
134
+ when 'Order', 'Repetition'
135
+ if item.text.to_i < 0
136
+ item.setData(0, Qt::Variant.new(0))
137
+ ErrorMsg.new.positive_cell_value
138
+ end
139
+ when 'Byte (Hexa)'
140
+ reg = Qt::RegExp.new("^[A-Fa-f0-9]{2}")
141
+ reg_val = Qt::RegExpValidator.new(reg, self)
142
+ if reg_val.validate(item.text, item.text.length) == 0
143
+ item.setText('')
144
+ ErrorMsg.new.hexa_cell_value
145
+ end
146
+ when 'Description'
147
+ unless item.text.nil?
148
+ reg = Qt::RegExp.new("^[a-zA-Z0-9_@-\s]+$")
149
+ reg_val = Qt::RegExpValidator.new(reg, self)
150
+ if reg_val.validate(item.text, item.text.length) == 0
151
+ item.setText('')
152
+ ErrorMsg.new.char_cell_value
153
+ end
154
+ end
155
+ end
156
+ rescue Exception => msg
157
+ ErrorMsg.new.unknown(msg)
158
+ end
159
+
160
+ def is_cmd_size_valid?
161
+ byte_table_size = @view.tbl_bytes.rowCount
162
+ case @bus_name
163
+ when 'SPI'
164
+ cmd_size = byte_table_size + @cmd_table.count_total_repetition
165
+ return true if cmd_size < 4000
166
+ return ErrorMsg.new.spi_cmd_too_long
167
+ when 'I2C'
168
+ count = i = 0
169
+ while i <= byte_table_size - 1 do
170
+ low_byte = @view.tbl_bytes.item(i, 1)
171
+ high_byte = @view.tbl_bytes.item(i + 1, 1)
172
+ command_byte = @view.tbl_bytes.item(i + 2, 1)
173
+ return ErrorMsg.new.lowbyte_missing if low_byte.nil?
174
+ return ErrorMsg.new.highbyte_missing if high_byte.nil?
175
+ return ErrorMsg.new.mode_missing if command_byte.nil?
176
+ current_count = HardsploitAPI.BytesToInt(
177
+ lByte: low_byte.text.to_i(16),
178
+ hByte: high_byte.text.to_i(16)
179
+ )
180
+ count += current_count
181
+ (command_type.to_i(16) % 2).zero? ? i += current_count + 3 : i += 3
182
+ end
183
+ return ErrorMsg.new.size_neq_row_number unless i == byte_table_size
184
+ return ErrorMsg.new.i2c_cmd_too_long if count > 2000
185
+ return true
186
+ end
187
+ rescue Exception => msg
188
+ ErrorMsg.new.unknown(msg)
189
+ end
190
+
191
+ def feed_editor_form
192
+ cmd = Command.find_by(name: @cmd_name)
193
+ @view.lie_name.setText(@cmd_name)
194
+ @view.lie_description.setText(cmd.description)
195
+ @cmd_table.fill_byte_table(cmd.bytes)
196
+ rescue Exception => msg
197
+ ErrorMsg.new.unknown(msg)
198
+ end
199
+
200
+ def add_row
201
+ if @view.lie_text_2_bytes.text.empty?
202
+ @cmd_table.add_row
203
+ else
204
+ @cmd_table.add_text_rows(@view.lie_text_2_bytes.text)
205
+ @view.lie_text_2_bytes.setText('')
206
+ end
207
+ end
208
+
209
+ def clone_row
210
+ @cmd_table.clone_rows
211
+ end
212
+
213
+ def remove_row
214
+ @cmd_table.remove_rows
215
+ end
216
+ end
@@ -1,233 +1,233 @@
1
- #===================================================
2
- # Hardsploit GUI - By Opale Security
3
- # www.opale-security.com || www.hardsploit.io
4
- # License: GNU General Public License v3
5
- # License URI: http://www.gnu.org/licenses/gpl.txt
6
- #===================================================
7
-
8
- class Command_table < Qt::Widget
9
-
10
- def initialize(cmd_table, bus)
11
- super()
12
- @cmd_table = cmd_table
13
- @bus = bus
14
- cmd_table.insertColumn(0)
15
- cmd_table.setHorizontalHeaderItem(0, Qt::TableWidgetItem.new('Order'))
16
- cmd_table.insertColumn(1)
17
- cmd_table.setHorizontalHeaderItem(1, Qt::TableWidgetItem.new('Byte (Hexa)'))
18
- cmd_table.insertColumn(2)
19
- cmd_table.setHorizontalHeaderItem(2, Qt::TableWidgetItem.new('Description'))
20
- end
21
-
22
- def build_spi
23
- @cmd_table.insertColumn(2)
24
- @cmd_table.setHorizontalHeaderItem(2, Qt::TableWidgetItem.new('Repetition'))
25
- end
26
-
27
- def fill_byte_table(byte_list)
28
- byte_list.to_enum.with_index(0).each do |b, i|
29
- @cmd_table.insertRow(@cmd_table.rowCount)
30
- @cmd_table.setItem(i, 1, Qt::TableWidgetItem.new(b.value))
31
- if @bus == 'SPI'
32
- item = Qt::TableWidgetItem.new
33
- item.setData(0, Qt::Variant.new(b.iteration))
34
- @cmd_table.setItem(i, 2, item)
35
- @cmd_table.setItem(i, 3, Qt::TableWidgetItem.new(b.description))
36
- else
37
- @cmd_table.setItem(i, 2, Qt::TableWidgetItem.new(b.description))
38
- end
39
- item = Qt::TableWidgetItem.new
40
- item.setData(0, Qt::Variant.new(b.index))
41
- @cmd_table.setItem(i, 0, item)
42
- end
43
- end
44
-
45
- def add_row
46
- @cmd_table.insertRow(@cmd_table.rowCount)
47
- @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new('00'))
48
- if @bus == 'SPI'
49
- item = Qt::TableWidgetItem.new
50
- item.setData(0, Qt::Variant.new(0))
51
- @cmd_table.setItem(@cmd_table.rowCount - 1, 2, item)
52
- @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new)
53
- else
54
- @cmd_table.setItem(@cmd_table.rowCount - 1, 2, Qt::TableWidgetItem.new)
55
- end
56
- item = Qt::TableWidgetItem.new
57
- item.setData(0, Qt::Variant.new(@cmd_table.rowCount))
58
- @cmd_table.setItem(@cmd_table.rowCount - 1, 0, item)
59
- end
60
-
61
- def add_text_rows(txt)
62
- return ErrorMsg.new.ascii_only unless txt.ascii_only?
63
- txt.each_byte do |x|
64
- @cmd_table.insertRow(@cmd_table.rowCount)
65
- @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new(x.to_s(16)))
66
- item = Qt::TableWidgetItem.new
67
- item.setData(0, Qt::Variant.new(0))
68
- @cmd_table.setItem(@cmd_table.rowCount - 1, 2, item)
69
- @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new(x.chr))
70
- item = Qt::TableWidgetItem.new
71
- item.setData(0, Qt::Variant.new(@cmd_table.rowCount))
72
- @cmd_table.setItem(@cmd_table.rowCount - 1, 0, item)
73
- end
74
- end
75
-
76
- def clone_rows
77
- return 0 if @cmd_table.currentItem.nil?
78
- rows_to_delete = []
79
- @cmd_table.selectedItems.each do |item|
80
- rows_to_delete.push item.row
81
- end
82
- rows_to_delete.uniq!
83
- rows_to_delete.each_with_index do |row, i|
84
- @cmd_table.insertRow(@cmd_table.rowCount)
85
- unless @cmd_table.item(row, 1).nil?
86
- @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new(@cmd_table.item(row, 1).text))
87
- end
88
- if @bus == 'SPI'
89
- unless @cmd_table.item(row, 2).nil?
90
- repetition_item = Qt::TableWidgetItem.new
91
- repetition_item.setData(0, Qt::Variant.new(@cmd_table.item(row, 2).text.to_i))
92
- @cmd_table.setItem(@cmd_table.rowCount - 1, 2, repetition_item)
93
- end
94
- unless @cmd_table.item(row, 3).nil?
95
- @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new(@cmd_table.item(row, 3).text))
96
- end
97
- else
98
- unless @cmd_table.item(row, 2).nil?
99
- @cmd_table.setItem(@cmd_table.rowCount - 1, 2, Qt::TableWidgetItem.new(@cmd_table.item(row, 2).text))
100
- end
101
- end
102
- unless @cmd_table.item(row, 0).nil?
103
- order_item = Qt::TableWidgetItem.new
104
- order_item.setData(0, Qt::Variant.new(@cmd_table.item(row, 0).text.to_i))
105
- @cmd_table.setItem(@cmd_table.rowCount - 1, 0, order_item)
106
- end
107
- end
108
- end
109
-
110
- def remove_rows
111
- return 0 if @cmd_table.currentItem.nil?
112
- rows_to_delete = []
113
- @cmd_table.selectedItems.each do |item|
114
- rows_to_delete.push item.row
115
- end
116
- rows_to_delete.uniq!
117
- rows_to_delete.each_with_index do |row, i|
118
- @cmd_table.removeRow(row - i)
119
- end
120
- end
121
-
122
- def i2c_read_cmd(write_address, cmd_size)
123
- # Byte array size
124
- @cmd_table.setRowCount(3)
125
- # Size 1
126
- @cmd_table.setItem(0, 1, Qt::TableWidgetItem.new(HardsploitAPI.lowByte(word: cmd_size).to_s(16).upcase))
127
- @cmd_table.setItem(0, 2, Qt::TableWidgetItem.new('Payload size - low'))
128
- # Index
129
- item = Qt::TableWidgetItem.new
130
- item.setData(0, Qt::Variant.new(1))
131
- @cmd_table.setItem(0, 0, item)
132
- # Size 2
133
- @cmd_table.setItem(1, 1, Qt::TableWidgetItem.new(HardsploitAPI.highByte(word: cmd_size).to_s(16).upcase))
134
- @cmd_table.setItem(1, 2, Qt::TableWidgetItem.new('Payload size - high'))
135
- # Index
136
- item = Qt::TableWidgetItem.new
137
- item.setData(0, Qt::Variant.new(2))
138
- @cmd_table.setItem(1, 0, item)
139
- # Address
140
- @cmd_table.setItem(2, 1, Qt::TableWidgetItem.new(write_address))
141
- @cmd_table.setItem(2, 2, Qt::TableWidgetItem.new('Read address (control byte)'))
142
- # Index
143
- item = Qt::TableWidgetItem.new
144
- item.setData(0, Qt::Variant.new(3))
145
- @cmd_table.setItem(2, 0, item)
146
- end
147
-
148
- def i2c_write_cmd(write_address, cmd_size)
149
- # Byte array size
150
- @cmd_table.setRowCount(3 + cmd_size)
151
- # Payload size low
152
- # -byte
153
- itemLB1 = Qt::TableWidgetItem.new(HardsploitAPI.lowByte(word: cmd_size).to_s(16).upcase)
154
- @cmd_table.setItem(0, 1, itemLB1)
155
- # -description
156
- itemLB3 = Qt::TableWidgetItem.new('Payload size - low')
157
- @cmd_table.setItem(0, 2, itemLB3)
158
- # -order
159
- itemLB0 = Qt::TableWidgetItem.new
160
- itemLB0.setData(0, Qt::Variant.new(1))
161
- @cmd_table.setItem(0, 0, itemLB0)
162
- # Payload size high
163
- # -byte
164
- itemHB1 = Qt::TableWidgetItem.new(HardsploitAPI.highByte(word: cmd_size).to_s(16).upcase)
165
- @cmd_table.setItem(1, 1, itemHB1)
166
- # -description
167
- itemHB3 = Qt::TableWidgetItem.new('Payload size - high')
168
- @cmd_table.setItem(1, 2, itemHB3)
169
- # -order
170
- itemHB0 = Qt::TableWidgetItem.new
171
- itemHB0.setData(0, Qt::Variant.new(2))
172
- @cmd_table.setItem(1, 0, itemHB0)
173
- # Address
174
- # -byte
175
- itemA1 = Qt::TableWidgetItem.new(write_address)
176
- @cmd_table.setItem(2, 1, itemA1)
177
- # -description
178
- itemA3 = Qt::TableWidgetItem.new('Write address (control byte)')
179
- @cmd_table.setItem(2, 2, itemA3)
180
- # -order
181
- itemA0 = Qt::TableWidgetItem.new
182
- itemA0.setData(0, Qt::Variant.new(3))
183
- @cmd_table.setItem(2, 0, itemA0)
184
- # Payload bytes
185
- for i in 3...(cmd_size + 3) do
186
- @cmd_table.setItem(i, 1, Qt::TableWidgetItem.new(''))
187
- @cmd_table.setItem(i, 2, Qt::TableWidgetItem.new('Payload byte'))
188
- # Index
189
- item = Qt::TableWidgetItem.new
190
- item.setData(0, Qt::Variant.new(i.next))
191
- @cmd_table.setItem(i, 0, item)
192
- end
193
- end
194
-
195
- def resize_to_content
196
- @cmd_table.resizeColumnsToContents
197
- @cmd_table.resizeRowsToContents
198
- @cmd_table.horizontalHeader.stretchLastSection = true
199
- end
200
-
201
- def count_total_repetition
202
- repetition_value = 0
203
- @cmd_table.rowCount.times do |i|
204
- repetition_value += @cmd_table.item(i, 2).text.to_i
205
- end
206
- return repetition_value
207
- end
208
-
209
- def empty_data_exist?
210
- # ARRAY SIZE
211
- if @cmd_table.rowCount == 0
212
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Bytes array empty', 'The bytes array is empty').exec
213
- return true
214
- end
215
- @cmd_table.rowCount.times do |i|
216
- # EMPTY BYTE CELL
217
- if @cmd_table.item(i, 1).text == ''
218
- @cmd_table.setCurrentItem(@cmd_table.item(i, 1))
219
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty byte', 'Empty byte cell detected').exec
220
- return true
221
- end
222
- if @bus == 'SPI'
223
- # EMPTY REPETITION CELL
224
- if @cmd_table.item(i, 2).text == ''
225
- @cmd_table.setCurrentItem(@cmd_table.item(i, 2))
226
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty repetition', 'Empty repetition cell detected').exec
227
- return true
228
- end
229
- end
230
- end
231
- return false
232
- end
233
- end
1
+ #===================================================
2
+ # Hardsploit GUI - By Opale Security
3
+ # www.opale-security.com || www.hardsploit.io
4
+ # License: GNU General Public License v3
5
+ # License URI: http://www.gnu.org/licenses/gpl.txt
6
+ #===================================================
7
+
8
+ class Command_table < Qt::Widget
9
+
10
+ def initialize(cmd_table, bus)
11
+ super()
12
+ @cmd_table = cmd_table
13
+ @bus = bus
14
+ cmd_table.insertColumn(0)
15
+ cmd_table.setHorizontalHeaderItem(0, Qt::TableWidgetItem.new('Order'))
16
+ cmd_table.insertColumn(1)
17
+ cmd_table.setHorizontalHeaderItem(1, Qt::TableWidgetItem.new('Byte (Hexa)'))
18
+ cmd_table.insertColumn(2)
19
+ cmd_table.setHorizontalHeaderItem(2, Qt::TableWidgetItem.new('Description'))
20
+ end
21
+
22
+ def build_spi
23
+ @cmd_table.insertColumn(2)
24
+ @cmd_table.setHorizontalHeaderItem(2, Qt::TableWidgetItem.new('Repetition'))
25
+ end
26
+
27
+ def fill_byte_table(byte_list)
28
+ byte_list.to_enum.with_index(0).each do |b, i|
29
+ @cmd_table.insertRow(@cmd_table.rowCount)
30
+ @cmd_table.setItem(i, 1, Qt::TableWidgetItem.new(b.value))
31
+ if @bus == 'SPI'
32
+ item = Qt::TableWidgetItem.new
33
+ item.setData(0, Qt::Variant.new(b.iteration))
34
+ @cmd_table.setItem(i, 2, item)
35
+ @cmd_table.setItem(i, 3, Qt::TableWidgetItem.new(b.description))
36
+ else
37
+ @cmd_table.setItem(i, 2, Qt::TableWidgetItem.new(b.description))
38
+ end
39
+ item = Qt::TableWidgetItem.new
40
+ item.setData(0, Qt::Variant.new(b.index))
41
+ @cmd_table.setItem(i, 0, item)
42
+ end
43
+ end
44
+
45
+ def add_row
46
+ @cmd_table.insertRow(@cmd_table.rowCount)
47
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new('00'))
48
+ if @bus == 'SPI'
49
+ item = Qt::TableWidgetItem.new
50
+ item.setData(0, Qt::Variant.new(0))
51
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, item)
52
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new)
53
+ else
54
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, Qt::TableWidgetItem.new)
55
+ end
56
+ item = Qt::TableWidgetItem.new
57
+ item.setData(0, Qt::Variant.new(@cmd_table.rowCount))
58
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 0, item)
59
+ end
60
+
61
+ def add_text_rows(txt)
62
+ return ErrorMsg.new.ascii_only unless txt.ascii_only?
63
+ txt.each_byte do |x|
64
+ @cmd_table.insertRow(@cmd_table.rowCount)
65
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new(x.to_s(16)))
66
+ item = Qt::TableWidgetItem.new
67
+ item.setData(0, Qt::Variant.new(0))
68
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, item)
69
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new(x.chr))
70
+ item = Qt::TableWidgetItem.new
71
+ item.setData(0, Qt::Variant.new(@cmd_table.rowCount))
72
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 0, item)
73
+ end
74
+ end
75
+
76
+ def clone_rows
77
+ return 0 if @cmd_table.currentItem.nil?
78
+ rows_to_delete = []
79
+ @cmd_table.selectedItems.each do |item|
80
+ rows_to_delete.push item.row
81
+ end
82
+ rows_to_delete.uniq!
83
+ rows_to_delete.each_with_index do |row, i|
84
+ @cmd_table.insertRow(@cmd_table.rowCount)
85
+ unless @cmd_table.item(row, 1).nil?
86
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new(@cmd_table.item(row, 1).text))
87
+ end
88
+ if @bus == 'SPI'
89
+ unless @cmd_table.item(row, 2).nil?
90
+ repetition_item = Qt::TableWidgetItem.new
91
+ repetition_item.setData(0, Qt::Variant.new(@cmd_table.item(row, 2).text.to_i))
92
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, repetition_item)
93
+ end
94
+ unless @cmd_table.item(row, 3).nil?
95
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new(@cmd_table.item(row, 3).text))
96
+ end
97
+ else
98
+ unless @cmd_table.item(row, 2).nil?
99
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, Qt::TableWidgetItem.new(@cmd_table.item(row, 2).text))
100
+ end
101
+ end
102
+ unless @cmd_table.item(row, 0).nil?
103
+ order_item = Qt::TableWidgetItem.new
104
+ order_item.setData(0, Qt::Variant.new(@cmd_table.item(row, 0).text.to_i))
105
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 0, order_item)
106
+ end
107
+ end
108
+ end
109
+
110
+ def remove_rows
111
+ return 0 if @cmd_table.currentItem.nil?
112
+ rows_to_delete = []
113
+ @cmd_table.selectedItems.each do |item|
114
+ rows_to_delete.push item.row
115
+ end
116
+ rows_to_delete.uniq!
117
+ rows_to_delete.each_with_index do |row, i|
118
+ @cmd_table.removeRow(row - i)
119
+ end
120
+ end
121
+
122
+ def i2c_read_cmd(write_address, cmd_size)
123
+ # Byte array size
124
+ @cmd_table.setRowCount(3)
125
+ # Size 1
126
+ @cmd_table.setItem(0, 1, Qt::TableWidgetItem.new(HardsploitAPI.lowByte(word: cmd_size).to_s(16).upcase))
127
+ @cmd_table.setItem(0, 2, Qt::TableWidgetItem.new('Payload size - low'))
128
+ # Index
129
+ item = Qt::TableWidgetItem.new
130
+ item.setData(0, Qt::Variant.new(1))
131
+ @cmd_table.setItem(0, 0, item)
132
+ # Size 2
133
+ @cmd_table.setItem(1, 1, Qt::TableWidgetItem.new(HardsploitAPI.highByte(word: cmd_size).to_s(16).upcase))
134
+ @cmd_table.setItem(1, 2, Qt::TableWidgetItem.new('Payload size - high'))
135
+ # Index
136
+ item = Qt::TableWidgetItem.new
137
+ item.setData(0, Qt::Variant.new(2))
138
+ @cmd_table.setItem(1, 0, item)
139
+ # Address
140
+ @cmd_table.setItem(2, 1, Qt::TableWidgetItem.new(write_address))
141
+ @cmd_table.setItem(2, 2, Qt::TableWidgetItem.new('Read address (control byte)'))
142
+ # Index
143
+ item = Qt::TableWidgetItem.new
144
+ item.setData(0, Qt::Variant.new(3))
145
+ @cmd_table.setItem(2, 0, item)
146
+ end
147
+
148
+ def i2c_write_cmd(write_address, cmd_size)
149
+ # Byte array size
150
+ @cmd_table.setRowCount(3 + cmd_size)
151
+ # Payload size low
152
+ # -byte
153
+ itemLB1 = Qt::TableWidgetItem.new(HardsploitAPI.lowByte(word: cmd_size).to_s(16).upcase)
154
+ @cmd_table.setItem(0, 1, itemLB1)
155
+ # -description
156
+ itemLB3 = Qt::TableWidgetItem.new('Payload size - low')
157
+ @cmd_table.setItem(0, 2, itemLB3)
158
+ # -order
159
+ itemLB0 = Qt::TableWidgetItem.new
160
+ itemLB0.setData(0, Qt::Variant.new(1))
161
+ @cmd_table.setItem(0, 0, itemLB0)
162
+ # Payload size high
163
+ # -byte
164
+ itemHB1 = Qt::TableWidgetItem.new(HardsploitAPI.highByte(word: cmd_size).to_s(16).upcase)
165
+ @cmd_table.setItem(1, 1, itemHB1)
166
+ # -description
167
+ itemHB3 = Qt::TableWidgetItem.new('Payload size - high')
168
+ @cmd_table.setItem(1, 2, itemHB3)
169
+ # -order
170
+ itemHB0 = Qt::TableWidgetItem.new
171
+ itemHB0.setData(0, Qt::Variant.new(2))
172
+ @cmd_table.setItem(1, 0, itemHB0)
173
+ # Address
174
+ # -byte
175
+ itemA1 = Qt::TableWidgetItem.new(write_address)
176
+ @cmd_table.setItem(2, 1, itemA1)
177
+ # -description
178
+ itemA3 = Qt::TableWidgetItem.new('Write address (control byte)')
179
+ @cmd_table.setItem(2, 2, itemA3)
180
+ # -order
181
+ itemA0 = Qt::TableWidgetItem.new
182
+ itemA0.setData(0, Qt::Variant.new(3))
183
+ @cmd_table.setItem(2, 0, itemA0)
184
+ # Payload bytes
185
+ for i in 3...(cmd_size + 3) do
186
+ @cmd_table.setItem(i, 1, Qt::TableWidgetItem.new(''))
187
+ @cmd_table.setItem(i, 2, Qt::TableWidgetItem.new('Payload byte'))
188
+ # Index
189
+ item = Qt::TableWidgetItem.new
190
+ item.setData(0, Qt::Variant.new(i.next))
191
+ @cmd_table.setItem(i, 0, item)
192
+ end
193
+ end
194
+
195
+ def resize_to_content
196
+ @cmd_table.resizeColumnsToContents
197
+ @cmd_table.resizeRowsToContents
198
+ @cmd_table.horizontalHeader.stretchLastSection = true
199
+ end
200
+
201
+ def count_total_repetition
202
+ repetition_value = 0
203
+ @cmd_table.rowCount.times do |i|
204
+ repetition_value += @cmd_table.item(i, 2).text.to_i
205
+ end
206
+ return repetition_value
207
+ end
208
+
209
+ def empty_data_exist?
210
+ # ARRAY SIZE
211
+ if @cmd_table.rowCount == 0
212
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Bytes array empty', 'The bytes array is empty').exec
213
+ return true
214
+ end
215
+ @cmd_table.rowCount.times do |i|
216
+ # EMPTY BYTE CELL
217
+ if @cmd_table.item(i, 1).text == ''
218
+ @cmd_table.setCurrentItem(@cmd_table.item(i, 1))
219
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty byte', 'Empty byte cell detected').exec
220
+ return true
221
+ end
222
+ if @bus == 'SPI'
223
+ # EMPTY REPETITION CELL
224
+ if @cmd_table.item(i, 2).text == ''
225
+ @cmd_table.setCurrentItem(@cmd_table.item(i, 2))
226
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty repetition', 'Empty repetition cell detected').exec
227
+ return true
228
+ end
229
+ end
230
+ end
231
+ return false
232
+ end
233
+ end