hardsploit_gui 2.2 → 2.3

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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/bin/hardsploit_gui +2 -2
  3. data/lib/{Firmware → Firmwares}/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  4. data/lib/{Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd → Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd} +0 -0
  5. data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  6. data/lib/{Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd → Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd} +0 -0
  7. data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  8. data/lib/{Firmware → Firmwares}/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
  9. data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
  10. data/lib/{Firmware → Firmwares}/FPGA/VersionFPGA.rb +1 -1
  11. data/lib/{Firmware → Firmwares}/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
  12. data/lib/{Firmware → Firmwares}/UC/VersionUC.rb +1 -1
  13. data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -0
  14. data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -0
  15. data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -0
  16. data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -0
  17. data/lib/HardsploitAPI/{HardsploitAPI_PROGRESS.rb → Core/HardsploitAPI_PROGRESS.rb} +0 -0
  18. data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -0
  19. data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -0
  20. data/lib/HardsploitAPI/{HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb → Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb} +26 -49
  21. data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -0
  22. data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -0
  23. data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -0
  24. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -0
  25. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -0
  26. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -0
  27. data/lib/HardsploitAPI/{SWD → Modules/SWD}/HardsploitAPI_SWD_STM32.rb +32 -15
  28. data/lib/HardsploitAPI/{HardsploitAPI_TEST_INTERACT.rb → Modules/TEST/HardsploitAPI_TEST_INTERACT.rb} +1 -1
  29. data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -0
  30. data/lib/Hardsploit_gui.rb +96 -0
  31. data/lib/class/Chip_editor.rb +186 -330
  32. data/lib/class/Chip_management.rb +496 -0
  33. data/lib/class/Command_editor.rb +130 -182
  34. data/lib/class/Command_table.rb +16 -22
  35. data/lib/class/Console.rb +0 -2
  36. data/lib/class/ErrorMsg.rb +312 -0
  37. data/lib/class/Export.rb +140 -0
  38. data/lib/class/Export_manager.rb +43 -43
  39. data/lib/class/Firmware.rb +52 -11
  40. data/lib/class/Generic_commands.rb +180 -190
  41. data/lib/class/Import.rb +193 -0
  42. data/lib/class/Progress_bar.rb +1 -0
  43. data/lib/class/Signal_mapper.rb +120 -0
  44. data/lib/class/Wire_helper.rb +132 -148
  45. data/lib/class/{I2C → i2c}/I2c_command.rb +16 -13
  46. data/lib/class/i2c/I2c_export.rb +95 -0
  47. data/lib/class/i2c/I2c_import.rb +117 -0
  48. data/lib/class/i2c/I2c_scanner.rb +114 -0
  49. data/lib/class/i2c/I2c_settings.rb +148 -0
  50. data/lib/class/parallel/Parallel_export.rb +118 -0
  51. data/lib/class/parallel/Parallel_import.rb +113 -0
  52. data/lib/class/parallel/Parallel_settings.rb +81 -0
  53. data/lib/class/spi/Spi_export.rb +108 -0
  54. data/lib/class/spi/Spi_import.rb +159 -0
  55. data/lib/class/spi/Spi_settings.rb +108 -0
  56. data/lib/class/spi/Spi_sniffer.rb +101 -0
  57. data/lib/class/swd/Swd.rb +125 -0
  58. data/lib/class/swd/Swd_scanner.rb +121 -0
  59. data/lib/class/swd/Swd_settings.rb +76 -0
  60. data/lib/class/uart/Uart_baudrate.rb +62 -0
  61. data/lib/class/uart/Uart_console.rb +115 -0
  62. data/lib/class/uart/Uart_settings.rb +102 -0
  63. data/lib/db/associations.rb +42 -29
  64. data/lib/db/database.rb +4 -0
  65. data/lib/db/development.sqlite3 +0 -0
  66. data/lib/db/migrate/004_create_manufacturers.rb +13 -0
  67. data/lib/db/migrate/005_create_packages.rb +13 -0
  68. data/lib/db/migrate/006_create_chip_types.rb +11 -0
  69. data/lib/db/migrate/007_create_buses.rb +11 -0
  70. data/lib/db/migrate/008_create_signals.rb +14 -0
  71. data/lib/db/migrate/009_create_chips.rb +25 -0
  72. data/lib/db/migrate/010_create_commands.rb +21 -0
  73. data/lib/db/migrate/011_create_bytes.rb +19 -0
  74. data/lib/db/migrate/012_create_i2c_settings.rb +21 -0
  75. data/lib/db/migrate/013_create_spi_settings.rb +26 -0
  76. data/lib/db/migrate/014_create_parallel_settings.rb +21 -0
  77. data/lib/db/migrate/015_create_pins.rb +19 -0
  78. data/lib/db/migrate/016_create_uses.rb +17 -0
  79. data/lib/db/migrate/017_create_swd_settings.rb +19 -0
  80. data/lib/db/migrate/018_create_uart_settings.rb +22 -0
  81. data/lib/db/schema.rb +157 -0
  82. data/lib/db/seeds.rb +161 -0
  83. data/lib/gui/gui_chip_editor.rb +23 -22
  84. data/lib/gui/gui_chip_management.rb +43 -38
  85. data/lib/gui/gui_command_editor.rb +2 -1
  86. data/lib/gui/gui_export.rb +132 -0
  87. data/lib/gui/gui_generic_commands.rb +69 -31
  88. data/lib/gui/gui_generic_export.rb +18 -2
  89. data/lib/gui/gui_generic_import.rb +18 -2
  90. data/lib/gui/gui_i2c_command.rb +2 -1
  91. data/lib/gui/gui_i2c_settings.rb +2 -2
  92. data/lib/gui/gui_import.rb +131 -0
  93. data/lib/gui/gui_parallel_settings.rb +2 -1
  94. data/lib/gui/gui_progress_bar.rb +2 -1
  95. data/lib/gui/gui_signal_mapper.rb +121 -0
  96. data/lib/gui/gui_signal_scanner.rb +146 -0
  97. data/lib/gui/gui_spi_settings.rb +6 -2
  98. data/lib/gui/gui_spi_sniffer.rb +112 -0
  99. data/lib/gui/gui_swd_settings.rb +166 -0
  100. data/lib/gui/gui_uart_baudrate.rb +114 -0
  101. data/lib/gui/gui_uart_console.rb +164 -0
  102. data/lib/gui/gui_uart_settings.rb +243 -0
  103. data/lib/gui_designer/gui_chip_editor.ui +9 -6
  104. data/lib/gui_designer/gui_chip_management.ui +79 -35
  105. data/lib/gui_designer/gui_command_editor.ui +3 -0
  106. data/lib/gui_designer/gui_export.ui +171 -0
  107. data/lib/gui_designer/gui_generic_commands.ui +274 -190
  108. data/lib/gui_designer/gui_generic_export.ui +24 -1
  109. data/lib/gui_designer/gui_generic_import.ui +25 -2
  110. data/lib/gui_designer/gui_i2c_command.ui +3 -0
  111. data/lib/gui_designer/gui_i2c_settings.ui +2 -2
  112. data/lib/gui_designer/gui_import.ui +168 -0
  113. data/lib/gui_designer/gui_parallel_settings.ui +4 -1
  114. data/lib/gui_designer/gui_progress_bar.ui +3 -0
  115. data/lib/gui_designer/gui_signal_mapper.ui +179 -0
  116. data/lib/gui_designer/gui_signal_scanner.ui +261 -0
  117. data/lib/gui_designer/gui_spi_settings.ui +15 -2
  118. data/lib/gui_designer/gui_spi_sniffer.ui +156 -0
  119. data/lib/gui_designer/gui_swd_settings.ui +189 -0
  120. data/lib/gui_designer/gui_uart_baudrate.ui +161 -0
  121. data/lib/gui_designer/gui_uart_console.ui +284 -0
  122. data/lib/gui_designer/gui_uart_settings.ui +280 -0
  123. data/lib/logs/error.log +63 -0
  124. data/lib/models/bus.rb +19 -0
  125. data/lib/models/byte.rb +29 -0
  126. data/lib/models/chip.rb +41 -0
  127. data/lib/models/chip_type.rb +14 -0
  128. data/lib/models/command.rb +20 -0
  129. data/lib/models/i2c_setting.rb +41 -0
  130. data/lib/models/manufacturer.rb +14 -0
  131. data/lib/models/package.rb +26 -0
  132. data/lib/models/parallel_setting.rb +37 -0
  133. data/lib/models/pin.rb +14 -0
  134. data/lib/models/signall.rb +20 -0
  135. data/lib/models/spi_setting.rb +67 -0
  136. data/lib/models/swd_setting.rb +25 -0
  137. data/lib/models/uart_setting.rb +52 -0
  138. data/lib/models/use.rb +6 -0
  139. data/lib/startHardsploit.rb +2 -2
  140. metadata +106 -41
  141. data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  142. data/lib/HardsploitAPI/HardsploitAPI.rb +0 -133
  143. data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +0 -145
  144. data/lib/HardsploitAPI/HardsploitAPI_ERROR.rb +0 -38
  145. data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +0 -311
  146. data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +0 -360
  147. data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +0 -369
  148. data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +0 -148
  149. data/lib/HardsploitAPI/LICENSE.txt +0 -674
  150. data/lib/HardsploitAPI/README.md +0 -22
  151. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +0 -249
  152. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +0 -102
  153. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +0 -78
  154. data/lib/HardsploitAPI/TRADEMARK +0 -3
  155. data/lib/class/HardsploitGUI.rb +0 -463
  156. data/lib/class/I2C/I2c_export.rb +0 -118
  157. data/lib/class/I2C/I2c_import.rb +0 -79
  158. data/lib/class/I2C/I2c_settings.rb +0 -129
  159. data/lib/class/PARALLEL/Parallel_export.rb +0 -146
  160. data/lib/class/PARALLEL/Parallel_import.rb +0 -88
  161. data/lib/class/PARALLEL/Parallel_settings.rb +0 -102
  162. data/lib/class/SPI/Spi_export.rb +0 -138
  163. data/lib/class/SPI/Spi_import.rb +0 -113
  164. data/lib/class/SPI/Spi_settings.rb +0 -134
  165. data/lib/db/hs.db +0 -0
  166. data/lib/hardsploit.rb +0 -131
@@ -0,0 +1,193 @@
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 'json'
9
+ require_relative '../gui/gui_import'
10
+ class Import < Qt::Widget
11
+ slots 'import()'
12
+ slots 'import_file()'
13
+
14
+ def initialize(cm, chip = 'none')
15
+ super()
16
+ @import_ui = Ui_Import.new
17
+ centerWindow(self)
18
+ @import_ui.setupUi(self)
19
+ @chip = chip
20
+ @cm = cm
21
+ @import_ui.lbl_import.setText("Import:")
22
+ end
23
+
24
+ def import_file
25
+ @filepath = Qt::FileDialog.getOpenFileName(
26
+ self,
27
+ tr('Select a file'),
28
+ '/',
29
+ tr('JSON file (*.json)')
30
+ )
31
+ end
32
+
33
+ def import
34
+ unless @filepath.nil?
35
+ @file = File.read("#{@filepath}")
36
+ data_hash = JSON.parse(@file)
37
+ data_hash.each_with_index do |element, index|
38
+ @data_chip = element[1]['chip']
39
+ @data_commands = element[1]['commands']
40
+ if @import_ui.rbn_both.isChecked
41
+ import_chip
42
+ import_commands
43
+ elsif @import_ui.rbn_comp.isChecked
44
+ import_chip
45
+ else
46
+ import_commands
47
+ end
48
+ end
49
+ @cm.feed_chip_array
50
+ Qt::MessageBox.new(
51
+ Qt::MessageBox::Information,
52
+ 'Import status',
53
+ 'Import complete'
54
+ ).exec
55
+ self.close
56
+ else
57
+ Qt::MessageBox.new(
58
+ Qt::MessageBox::Warning,
59
+ 'File missing',
60
+ 'Choose a file before importing'
61
+ ).exec
62
+ end
63
+ end
64
+
65
+ def import_package
66
+ package = Package.new
67
+ package.from_json(@data_chip['package'].to_json)
68
+ if Package.exists?(name: package.name)
69
+ return Package.find_by(name: package.name).id
70
+ else
71
+ Package.last.nil? ? package.id = 1 : package.id = Package.last.id.next
72
+ package.save
73
+ return package.id
74
+ end
75
+ end
76
+
77
+ def import_type
78
+ chip_type = ChipType.new
79
+ chip_type.from_json(@data_chip['chip_type'].to_json)
80
+ if ChipType.exists?(name: chip_type.name)
81
+ return ChipType.find_by(name: chip_type.name).id
82
+ else
83
+ ChipType.last.nil? ? chip_type.id = 1 : chip_type.id = ChipType.last.id.next
84
+ chip_type.save
85
+ return chip_type.id
86
+ end
87
+ end
88
+
89
+ def import_manufacturer
90
+ manufacturer = Manufacturer.new
91
+ manufacturer.from_json(@data_chip['manufacturer'].to_json)
92
+ if Manufacturer.exists?(name: manufacturer.name)
93
+ return Manufacturer.find_by(name: manufacturer.name).id
94
+ else
95
+ Manufacturer.last.nil? ? manufacturer.id = 1 : manufacturer.id = Manufacturer.last.id.next
96
+ manufacturer.save
97
+ return manufacturer.id
98
+ end
99
+ end
100
+
101
+ def import_chip
102
+ @chip = Chip.new
103
+ @chip.from_json(@data_chip['characteristics'].to_json)
104
+ if Chip.exists?(reference: @chip.reference)
105
+ Qt::MessageBox.new(
106
+ Qt::MessageBox::Warning,
107
+ 'Import aborted',
108
+ 'This component already exists'
109
+ ).exec
110
+ return 0
111
+ else
112
+ Chip.last.nil? ? @chip.id = 1 : @chip.id = Chip.last.id.next
113
+ @chip.package_id = import_package
114
+ @chip.chip_type_id = import_type
115
+ @chip.manufacturer_id = import_manufacturer
116
+ @chip.save
117
+ import_parallel_settings unless @data_chip['settings']['parallel'].nil?
118
+ import_spi_settings unless @data_chip['settings']['spi'].empty?
119
+ import_i2c_settings unless @data_chip['settings']['i2c'].empty?
120
+ import_swd_settings unless @data_chip['settings']['swd'].empty?
121
+ import_uart_settings unless @data_chip['settings']['uart'].empty?
122
+ import_pins
123
+ end
124
+ end
125
+
126
+ def import_pins
127
+ @data_chip['pins'].each do |data_pin|
128
+ pin = Pin.new
129
+ pin.from_json(data_pin.to_json)
130
+ pin.chip_id = @chip.id
131
+ Pin.last.nil? ? pin.id = 1 : pin.id = Pin.last.id.next
132
+ pin.save
133
+ end
134
+ end
135
+
136
+ def import_parallel_settings
137
+ parallel_settings = ParallelSetting.new
138
+ parallel_settings.from_json(@data_chip['settings']['parallel'].to_json)
139
+ parallel_settings.chip_id = @chip.id
140
+ ParallelSetting.last.nil? ? parallel_settings.id = 1 : parallel_settings.id = ParallelSetting.last.id.next
141
+ parallel_settings.save
142
+ end
143
+
144
+ def import_spi_settings
145
+ spi_settings = SpiSetting.new
146
+ spi_settings.from_json(@data_chip['settings']['spi'].to_json)
147
+ spi_settings.chip_id = @chip.id
148
+ SpiSetting.last.nil? ? spi_settings.id = 1 : spi_settings.id = SpiSetting.last.id.next
149
+ spi_settings.save
150
+ end
151
+
152
+ def import_i2c_settings
153
+ i2c_settings = I2cSetting.new
154
+ i2c_settings.from_json(@data_chip['settings']['i2c'].to_json)
155
+ i2c_settings.chip_id = @chip.id
156
+ I2cSetting.last.nil? ? i2c_settings.id = 1 : i2c_settings.id = I2cSetting.last.id.next
157
+ i2c_settings.save
158
+ end
159
+
160
+ def import_swd_settings
161
+ swd_settings = SwdSetting.new
162
+ swd_settings.from_json(@data_chip['settings']['swd'].to_json)
163
+ swd_settings.chip_id = @chip.id
164
+ SwdSetting.last.nil? ? swd_settings.id = 1 : swd_settings.id = SwdSetting.last.id.next
165
+ swd_settings.save
166
+ end
167
+
168
+ def import_uart_settings
169
+ uart_settings = UartSetting.new
170
+ uart_settings.from_json(@data_chip['settings']['uart'].to_json)
171
+ uart_settings.chip_id = @chip.id
172
+ UartSetting.last.nil? ? uart_settings.id = 1 : uart_settings.id = UartSetting.last.id.next
173
+ uart_settings.save
174
+ end
175
+
176
+ def import_commands
177
+ return 0 if @data_commands.empty?
178
+ @data_commands.each do |cmd_element|
179
+ cmd = Command.new
180
+ cmd.from_json(cmd_element[1]['characteristics'].to_json)
181
+ Command.last.nil? ? cmd.id = 1 : cmd.id = Command.last.id.next
182
+ cmd.chip_id = @chip.id
183
+ cmd.save
184
+ cmd_element[1]['bytes'].each do |byte_element|
185
+ byte = Byte.new
186
+ byte.from_json(byte_element.to_json)
187
+ Byte.last.nil? ? byte.id = 1 : byte.id = Byte.last.id.next
188
+ byte.command_id = cmd.id
189
+ byte.save
190
+ end
191
+ end
192
+ end
193
+ end
@@ -14,6 +14,7 @@ class Progress_bar < Qt::Widget
14
14
  centerWindow(self)
15
15
  @pgb_ui.setupUi(self)
16
16
  self.update_status(status)
17
+ @pgb_ui.lbl_close.setEnabled(false)
17
18
  self.display_time("Total duration:")
18
19
  end
19
20
 
@@ -0,0 +1,120 @@
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_signal_mapper'
9
+ class Signal_mapper < Qt::Widget
10
+ slots 'check_mapping_value(QTableWidgetItem*)'
11
+ slots 'update_map_table(QString)'
12
+ slots 'save_signal_mapping()'
13
+
14
+ def initialize
15
+ super()
16
+ @view = Ui_Signal_mapper.new
17
+ centerWindow(self)
18
+ @view.setupUi(self)
19
+ init_bus_list
20
+ rescue Exception => msg
21
+ ErrorMsg.new.unknown(msg)
22
+ end
23
+
24
+ def init_bus_list
25
+ Bus.all.each do |b|
26
+ @view.cbx_bus.addItem(b.name) unless b.name == "NA"
27
+ end
28
+ end
29
+
30
+ def check_mapping_value(item)
31
+ if item.column == 1
32
+ item.setText(item.text.upcase)
33
+ reg = Qt::RegExp.new("^[A-H]{1}[0-7]${1}")
34
+ reg_val = Qt::RegExpValidator.new(reg, self)
35
+ if reg_val.validate(item.text, item.text.length) == Qt::Validator::Invalid || item.text.nil?
36
+ item.setText('')
37
+ Qt::MessageBox.new(
38
+ Qt::MessageBox::Warning,
39
+ 'Wrong data',
40
+ 'Only values from A0 to H7 are accepted in this cell'
41
+ ).exec
42
+ end
43
+ end
44
+ rescue Exception => msg
45
+ ErrorMsg.new.unknown(msg)
46
+ end
47
+
48
+ def update_map_table(bus_name)
49
+ unless bus_name == 'Bus...'
50
+ @view.map_table.clearContents
51
+ @view.map_table.setRowCount(0)
52
+ Bus.find_by(name: bus_name).signalls.each do |s|
53
+ @view.map_table.insertRow(@view.map_table.rowCount)
54
+ signal_cell = Qt::TableWidgetItem.new(s.name)
55
+ signal_cell.setFlags(Qt::ItemIsEnabled)
56
+ @view.map_table.setItem(@view.map_table.rowCount - 1, 0, signal_cell)
57
+ pin_cell = Qt::TableWidgetItem.new(s.pin)
58
+ @view.map_table.setItem(@view.map_table.rowCount - 1, 1, pin_cell)
59
+ end
60
+ resize_to_content
61
+ end
62
+ rescue Exception => msg
63
+ ErrorMsg.new.unknown(msg)
64
+ end
65
+
66
+ def save_signal_mapping
67
+ return 0 unless are_values_ok?
68
+ @view.map_table.rowCount.times do |i|
69
+ current_signal = Signall.find_by(name: @view.map_table.item(i, 0).text)
70
+ if current_signal.name != @view.map_table.item(i, 1).text
71
+ current_signal.update(pin: @view.map_table.item(i, 1).text)
72
+ end
73
+ end
74
+ Qt::MessageBox.new(
75
+ Qt::MessageBox::Information,
76
+ 'Save mapping',
77
+ 'Pin mapping saved successfuly'
78
+ ).exec
79
+ close
80
+ end
81
+
82
+ def are_values_ok?
83
+ pins = []
84
+ @view.map_table.rowCount.times do |i|
85
+ pins.push(@view.map_table.item(i, 1).text)
86
+ end
87
+ return true if check_empty(pins) && check_duplicate(pins)
88
+ end
89
+
90
+ def check_empty(pins)
91
+ return true unless pins.include?('')
92
+ @view.map_table.setCurrentItem(@view.map_table.item(pins.index(''), 1))
93
+ Qt::MessageBox.new(
94
+ Qt::MessageBox::Warning,
95
+ 'Empty pin',
96
+ 'Empty pin value detected'
97
+ ).exec
98
+ return false
99
+ end
100
+
101
+ def check_duplicate(pins)
102
+ duplicate = pins.inject(Hash.new(0)) {|ha, e| ha[e] += 1 ; ha}.delete_if {|k, v| v == 1}.keys
103
+ unless duplicate.empty?
104
+ @view.map_table.setCurrentItem(@view.map_table.item(pins.index(duplicate[0]), 1))
105
+ Qt::MessageBox.new(
106
+ Qt::MessageBox::Warning,
107
+ 'Wrong value',
108
+ "Duplicate values detected: #{duplicate[0]}"
109
+ ).exec
110
+ return false
111
+ end
112
+ return true
113
+ end
114
+
115
+ def resize_to_content
116
+ @view.map_table.resizeColumnsToContents
117
+ @view.map_table.resizeRowsToContents
118
+ @view.map_table.horizontalHeader.stretchLastSection = true
119
+ end
120
+ end
@@ -5,126 +5,39 @@
5
5
  # License URI: http://www.gnu.org/licenses/gpl.txt
6
6
  #===================================================
7
7
 
8
- require_relative '../HardsploitAPI/HardsploitAPI'
9
8
  require_relative '../gui/gui_wire_helper'
9
+ require_relative '../HardsploitAPI/Core/HardsploitAPI'
10
10
 
11
11
  class Wire_helper < Qt::Widget
12
12
  slots 'rotate_scene()'
13
13
 
14
- def initialize(chip, api)
14
+ def initialize(chip)
15
15
  super()
16
16
  @wire_helper_gui = Ui_Wire_helper.new
17
17
  centerWindow(self)
18
18
  @wire_helper_gui.setupUi(self)
19
19
  @chip = chip
20
- @api = api
21
-
22
- # Default led position
23
- api.setWiringLeds(0x0000000000000000)
24
-
25
- # Draw the chip
26
- scene = Qt::GraphicsScene.new
27
- @wire_helper_gui.lbl_chip.setText("Your chip (#{chip.chip_reference}):")
28
-
29
- # Get the pin total number
30
- # UniqPin parameters: (scene, pinNum, pinChip, xSig, ySig, xNum, yNum, xRect, yRect, wRect, hRect, rotation)
31
- total_pin_nbr = Pin.where(pin_chip: @chip.chip_id).count
32
- # If it's a square
33
- if Package.find_by(package_id: chip.chip_package).package_shape == 0
34
- pin_by_side = total_pin_nbr / 4
35
- cHeight = 14*(pin_by_side + 4) # Chip's height (+4 because we add a space equal to one pin for each corner)
36
- scene.addRect(Qt::RectF.new(0, 0, cHeight, cHeight))
37
- y = 32
38
- y2 = cHeight - 38
39
- x = 32
40
- x2 = cHeight - 38
41
- (1..total_pin_nbr).each do |i|
42
- # Face 1
43
- if i <= pin_by_side
44
- ySig = y
45
- yNum = y
46
- UniqPin.new(scene, i, @chip.chip_id, -70, ySig - 12, 0, yNum - 12, 0, y, -20, 6, false, api)
47
- y = y + 14 # Space between each pin
48
- elsif i > pin_by_side && i <= total_pin_nbr / 2
49
- # Face 2
50
- xSig2 = x
51
- xNum2 = x
52
- UniqPin.new(scene, i, @chip.chip_id, xSig2 - 12, cHeight + 55, xNum2 - 12, cHeight, x, cHeight, 6, 20, true, api)
53
- x = x + 14
54
- elsif i > total_pin_nbr / 2 && i <= (total_pin_nbr - (pin_by_side))
55
- # Face 3
56
- xSig = cHeight + 24
57
- ySig = y2
58
- yNum = y2
59
-
60
- if i < 10
61
- xNum = cHeight - 20
62
- elsif i >= 10 && i < 100
63
- xNum = cHeight - 25
64
- else
65
- xNum = cHeight - 35
66
- end
67
- UniqPin.new(scene, i, @chip.chip_id, xSig, ySig - 12, xNum, yNum - 12, cHeight, y2, 20, 6, false, api)
68
- y2 = y2 - 14
69
- else
70
- # Face 4
71
- xSig2 = x2
72
- xNum2 = x2
73
-
74
- if i < 10
75
- yNum2 = 20
76
- elsif i >= 10 && i < 100
77
- yNum2 = 30
78
- else
79
- yNum2 = 40
80
- end
81
- UniqPin.new(scene, i, @chip.chip_id, xSig2 - 12, -20, xNum2 - 12, yNum2, x2, 0, 6, -20, true, api)
82
- x2 = x2 - 14
83
- end
84
- end
85
- # If it's a rectangle
86
- else
87
- pin_by_side = total_pin_nbr / 2
88
- cHeight = 14 * (pin_by_side + 2) # +2 because we add a space equal to one pin for each corner
89
- scene.addRect(Qt::RectF.new(0, 0, cHeight, cHeight))
90
- # Add the pins + text
91
- y = 18
92
- y2 = cHeight - 24
93
- (1..total_pin_nbr).each do |i|
94
- # Face 1
95
- if i <= total_pin_nbr / 2
96
- ySig = y
97
- yNum = y
98
- UniqPin.new(scene, i, @chip.chip_id, -70, ySig - 12, 0, yNum - 12, 0, y, -20, 6, false, api)
99
- y = y + 14
100
- # Face 2
101
- else
102
- xSig = cHeight + 24
103
- ySig = y2
104
- yNum = y2
105
-
106
- if i < 10
107
- xNum = cHeight - 20
108
- elsif i >= 10 && i < 100
109
- xNum = cHeight - 25
110
- else
111
- xNum = cHeight - 35
112
- end
113
- UniqPin.new(scene, i, @chip.chip_id, xSig, ySig - 12, xNum, yNum - 12, cHeight, y2, 20, 6, false, api)
114
- y2 = y2 - 14
115
- end
116
- end
117
- end
118
- # Draw!
119
- @wire_helper_gui.gView.setScene(scene)
20
+ HardsploitAPI.instance.setWiringLeds(value: 0x0000000000000000)
21
+ @scene = Qt::GraphicsScene.new
22
+ @wire_helper_gui.lbl_chip.setText("Your chip (#{chip.reference}):")
23
+ Package.find_by(id: chip.package_id).shape.zero? ? draw_square : draw_rect
24
+ @wire_helper_gui.gView.setScene(@scene)
25
+ rescue HardsploitAPI::ERROR::HARDSPLOIT_NOT_FOUND
26
+ ErrorMsg.new.hardsploit_not_found
27
+ rescue HardsploitAPI::ERROR::USB_ERROR
28
+ ErrorMsg.new.usb_error
120
29
  rescue Exception => msg
121
- Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while drawing the chip. Consult the logs for more details').exec
122
- logger = Logger.new($logFilePath)
123
- logger.error msg
30
+ ErrorMsg.new.unknown(msg)
124
31
  end
125
32
 
126
33
  def closeEvent(event)
127
- @api.setWiringLeds(0xFF00FF00FF00FF00)
34
+ HardsploitAPI.instance.setWiringLeds(value: 0xFF00FF00FF00FF00)
35
+ rescue HardsploitAPI::ERROR::HARDSPLOIT_NOT_FOUND
36
+ ErrorMsg.new.hardsploit_not_found
37
+ rescue HardsploitAPI::ERROR::USB_ERROR
38
+ ErrorMsg.new.usb_error
39
+ rescue Exception => msg
40
+ ErrorMsg.new.unknown(msg)
128
41
  end
129
42
 
130
43
  def rotate_scene
@@ -132,13 +45,104 @@ class Wire_helper < Qt::Widget
132
45
  end
133
46
  end
134
47
 
48
+ def draw_square
49
+ total_pin_nbr = Pin.where(chip_id: @chip.id).count
50
+ pin_by_side = total_pin_nbr / 4
51
+ cHeight = 14*(pin_by_side + 4) # Chip's height (+4 because we add a space equal to one pin for each corner)
52
+ @scene.addRect(Qt::RectF.new(0, 0, cHeight, cHeight))
53
+ y = 32
54
+ y2 = cHeight - 38
55
+ x = 32
56
+ x2 = cHeight - 38
57
+ (1..total_pin_nbr).each do |i|
58
+ # Face 1
59
+ if i <= pin_by_side
60
+ ySig = y
61
+ yNum = y
62
+ UniqPin.new(@scene, i, @chip.id, -70, ySig - 12, 0, yNum - 12, 0, y, -20, 6, false)
63
+ y = y + 14 # Space between each pin
64
+ elsif i > pin_by_side && i <= total_pin_nbr / 2
65
+ # Face 2
66
+ xSig2 = x
67
+ xNum2 = x
68
+ UniqPin.new(@scene, i, @chip.id, xSig2 - 12, cHeight + 55, xNum2 - 12, cHeight, x, cHeight, 6, 20, true)
69
+ x = x + 14
70
+ elsif i > total_pin_nbr / 2 && i <= (total_pin_nbr - (pin_by_side))
71
+ # Face 3
72
+ xSig = cHeight + 24
73
+ ySig = y2
74
+ yNum = y2
75
+
76
+ if i < 10
77
+ xNum = cHeight - 20
78
+ elsif i >= 10 && i < 100
79
+ xNum = cHeight - 25
80
+ else
81
+ xNum = cHeight - 35
82
+ end
83
+ UniqPin.new(@scene, i, @chip.id, xSig, ySig - 12, xNum, yNum - 12, cHeight, y2, 20, 6, false)
84
+ y2 = y2 - 14
85
+ else
86
+ # Face 4
87
+ xSig2 = x2
88
+ xNum2 = x2
89
+
90
+ if i < 10
91
+ yNum2 = 20
92
+ elsif i >= 10 && i < 100
93
+ yNum2 = 30
94
+ else
95
+ yNum2 = 40
96
+ end
97
+ UniqPin.new(@scene, i, @chip.id, xSig2 - 12, -20, xNum2 - 12, yNum2, x2, 0, 6, -20, true)
98
+ x2 = x2 - 14
99
+ end
100
+ end
101
+ end
102
+
103
+ def draw_rect
104
+ total_pin_nbr = Pin.where(chip_id: @chip.id).count
105
+ pin_by_side = total_pin_nbr / 2
106
+ cHeight = 14 * (pin_by_side + 2) # +2 because we add a space equal to one pin for each corner
107
+ @scene.addRect(Qt::RectF.new(0, 0, cHeight, cHeight))
108
+ # Add the pins + text
109
+ y = 18
110
+ y2 = cHeight - 24
111
+ (1..total_pin_nbr).each do |i|
112
+ # Face 1
113
+ if i <= total_pin_nbr / 2
114
+ ySig = y
115
+ yNum = y
116
+ UniqPin.new(@scene, i, @chip.id, -70, ySig - 12, 0, yNum - 12, 0, y, -20, 6, false)
117
+ y = y + 14
118
+ # Face 2
119
+ else
120
+ xSig = cHeight + 24
121
+ ySig = y2
122
+ yNum = y2
123
+
124
+ if i < 10
125
+ xNum = cHeight - 20
126
+ elsif i >= 10 && i < 100
127
+ xNum = cHeight - 25
128
+ else
129
+ xNum = cHeight - 35
130
+ end
131
+ UniqPin.new(@scene, i, @chip.id, xSig, ySig - 12, xNum, yNum - 12, cHeight, y2, 20, 6, false)
132
+ y2 = y2 - 14
133
+ end
134
+ end
135
+ end
136
+
137
+
135
138
  #
136
139
  # Custom Item - To trigger events on the graphics text items
137
140
  #
138
141
  class CustomItem < Qt::GraphicsTextItem
139
142
 
140
- def setPin(upin)
143
+ def setPin(upin, api_value)
141
144
  @UPin = upin
145
+ @api_value = api_value
142
146
  end
143
147
 
144
148
  def boundingRect
@@ -149,73 +153,55 @@ class CustomItem < Qt::GraphicsTextItem
149
153
  return rect
150
154
  end
151
155
 
152
- def mouseDoubleClickEvent(event)
153
- begin
156
+ def mousePressEvent(event)
154
157
  pin = self.instance_variable_get('@UPin')
155
158
  pin.setColor
156
- pin.instance_variable_get('@api').signalHelpingWiring(pin.instance_variable_get('@signalId'))
157
159
  pin.instance_variable_get('@signalTxt').clearFocus
158
160
  pin.instance_variable_get('@nbrTxt').clearFocus
159
- rescue
160
- pin.instance_variable_get('@api').setWiringLeds(0x0000000000000000)
161
+ return false if @api_value == 'NA'
162
+ pin_group = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
163
+ hardsploit_pin_number = pin_group.index(@api_value.pin[0]) * 8 + @api_value.pin[1].to_i
164
+ HardsploitAPI.instance.setWiringLeds(value: 2**hardsploit_pin_number)
165
+ rescue HardsploitAPI::ERROR::HARDSPLOIT_NOT_FOUND
166
+ ErrorMsg.new.hardsploit_not_found
167
+ rescue HardsploitAPI::ERROR::USB_ERROR
168
+ ErrorMsg.new.usb_error
169
+ rescue Exception => msg
170
+ HardsploitAPI.instance.setWiringLeds(value: 0x0000000000000000)
161
171
  pin.instance_variable_get('@signalTxt').clearFocus
162
172
  pin.instance_variable_get('@nbrTxt').clearFocus
163
- Qt::MessageBox.new(Qt::MessageBox::Critical, 'Signal not found', 'This signal is not handled by the board').exec
164
173
  end
165
- end
166
174
 
167
- def mousePressEvent(event)
168
- begin
175
+ def mouseDoubleClickEvent(event)
169
176
  pin = self.instance_variable_get('@UPin')
170
- pin.setColor
171
- pin.instance_variable_get('@api').signalHelpingWiring(pin.instance_variable_get('@signalId'))
172
177
  pin.instance_variable_get('@signalTxt').clearFocus
173
178
  pin.instance_variable_get('@nbrTxt').clearFocus
174
- rescue
175
- pin.instance_variable_get('@api').setWiringLeds(0x0000000000000000)
176
- pin.instance_variable_get('@signalTxt').clearFocus
177
- pin.instance_variable_get('@nbrTxt').clearFocus
178
- Qt::MessageBox.new(Qt::MessageBox::Critical, 'Signal not found', 'This signal is not handled by the board').exec
179
179
  end
180
- end
181
180
  end
182
181
 
183
182
  #
184
183
  # UniqPin - Contain all data linked to one pin on the graphic
185
184
  #
186
185
  class UniqPin
187
- def initialize(scene, pinNum, pinChip, xSig, ySig, xNum, yNum, xRect, yRect, wRect, hRect, rotation, api)
188
- currentPin = Pin.where(pin_number: pinNum, pin_chip: pinChip).pluck(:pin_signal)[0]
189
- currentSignal = Signall.where(signal_id: currentPin).pluck(:signal_name)[0]
190
- # Set the signal id
191
- @signalId = currentSignal
192
-
193
- @api = api
194
- # Signal text
195
- @signalTxt = CustomItem.new(currentSignal)
186
+ def initialize(scene, pinNum, pinChip, xSig, ySig, xNum, yNum, xRect, yRect, wRect, hRect, rotation)
187
+ signal_name = Pin.find_by(number: pinNum, chip_id: pinChip).signall
188
+ @signalTxt = CustomItem.new(signal_name.name)
196
189
  @signalTxt.cursor = Qt::Cursor.new(Qt::PointingHandCursor)
197
- @signalTxt.setPin(self)
190
+ @signalTxt.setPin(self, signal_name)
198
191
  @signalTxt.setTextInteractionFlags(Qt::TextSelectableByMouse)
199
192
  @signalTxt.setX(xSig)
200
193
  @signalTxt.setY(ySig)
201
- if rotation
202
- @signalTxt.rotation = 270.00
203
- end
194
+ @signalTxt.rotation = 270.00 if rotation
204
195
  scene.addItem(@signalTxt)
205
196
 
206
- # Number text
207
197
  @nbrTxt = CustomItem.new(pinNum.to_s)
208
198
  @nbrTxt.cursor = Qt::Cursor.new(Qt::PointingHandCursor)
209
- @nbrTxt.setPin(self)
199
+ @nbrTxt.setPin(self, pinNum.to_s)
210
200
  @nbrTxt.setTextInteractionFlags(Qt::TextSelectableByMouse)
211
201
  @nbrTxt.setX(xNum)
212
202
  @nbrTxt.setY(yNum)
213
- if rotation
214
- @nbrTxt.rotation = 270.00
215
- end
203
+ @nbrTxt.rotation = 270.00 if rotation
216
204
  scene.addItem(@nbrTxt)
217
-
218
- # Pin graphic
219
205
  @pinGraphItem = scene.addRect(xRect, yRect, wRect, hRect)
220
206
  end
221
207
 
@@ -223,10 +209,8 @@ class UniqPin
223
209
  # Colors
224
210
  @on = Qt::Color.new(0, 0, 255)
225
211
  @off = Qt::Color.new(0, 0, 0)
226
- # Disable the pin if a pin is already enabled
227
- unless $pinEnabled.nil?
228
- $pinEnabled.unsetColor
229
- end
212
+ # Disable the pin if another pin is already enabled
213
+ $pinEnabled.unsetColor unless $pinEnabled.nil?
230
214
  # Light the new pin
231
215
  @nbrTxt.setDefaultTextColor(@on)
232
216
  @signalTxt.setDefaultTextColor(@on)