hardsploit_gui 2.3 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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