hardsploit_gui 2.0 → 2.1

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/Firmware/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  3. data/lib/HardsploitAPI/HardsploitAPI.rb +5 -6
  4. data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +1 -1
  5. data/lib/HardsploitAPI/HardsploitAPI_ERROR.rb +38 -0
  6. data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +3 -3
  7. data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +145 -3
  8. data/lib/HardsploitAPI/HardsploitAPI_PROGRESS.rb +28 -0
  9. data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +195 -5
  10. data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +0 -1
  11. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +1 -1
  12. data/lib/class/Generic_commands.rb +31 -36
  13. data/lib/class/HardsploitGUI.rb +5 -4
  14. data/lib/class/I2C/I2c_export.rb +6 -9
  15. data/lib/class/I2C/I2c_import.rb +15 -28
  16. data/lib/class/I2C/I2c_settings.rb +20 -8
  17. data/lib/class/Progress_bar.rb +31 -0
  18. data/lib/class/SPI/Spi_export.rb +6 -9
  19. data/lib/class/SPI/Spi_import.rb +33 -32
  20. data/lib/class/SPI/Spi_settings.rb +50 -4
  21. data/lib/db/hs.db +0 -0
  22. data/lib/gui/gui_chip_editor.rb +120 -127
  23. data/lib/gui/gui_i2c_settings.rb +34 -5
  24. data/lib/gui/gui_progress_bar.rb +84 -0
  25. data/lib/gui/gui_spi_settings.rb +175 -49
  26. data/lib/gui_designer/gui_chip_editor.ui +134 -141
  27. data/lib/gui_designer/gui_i2c_settings.ui +35 -4
  28. data/lib/gui_designer/gui_progress_bar.ui +83 -0
  29. data/lib/gui_designer/gui_spi_settings.ui +159 -34
  30. data/lib/hardsploit.rb +12 -3
  31. data/lib/logs/error.log +1 -0
  32. data/lib/startHardsploit.rb +10 -0
  33. metadata +8 -3
  34. data/lib/gui_designer/gui_processing.ui +0 -81
@@ -75,7 +75,6 @@ public
75
75
  end
76
76
 
77
77
 
78
- protected
79
78
  # Send data and wait to receive response
80
79
  # * +packet_send+:: array of byte
81
80
  # * +timeout+:: timeout to read response (ms)
@@ -18,7 +18,7 @@ attr_accessor :stm32
18
18
 
19
19
  resetSWD()
20
20
  # Cortex M4 0x410FC241
21
- # Cortex M3 411FC231
21
+ # Cortex M3 0x411FC231
22
22
  end
23
23
 
24
24
  def obtainCodes
@@ -79,9 +79,9 @@ class Generic_commands < Qt::Widget
79
79
  '0.50' => 150,
80
80
  '0.29' => 255
81
81
  }
82
- @generic_command_gui.cbx_action.insertItem(3, 'Concatenate')
83
82
  when 'I2C'
84
83
  @chip_settings = I2C.find_by(i2c_chip: @chip.chip_id)
84
+ @generic_command_gui.cbx_action.insertItem(3, 'Concatenate')
85
85
  end
86
86
  end
87
87
 
@@ -175,39 +175,34 @@ class Generic_commands < Qt::Widget
175
175
  bytesCmd1 = Byte.where(byte_cmd: Cmd.find_by(cmd_name: @generic_command_gui.tbl_cmd.selectedItems[0].text).cmd_id)
176
176
  bytesCmd2 = Byte.where(byte_cmd: Cmd.find_by(cmd_name: @generic_command_gui.tbl_cmd.selectedItems[1].text).cmd_id)
177
177
  if check_concatenation_size(bytesCmd1, bytesCmd2)
178
- return 0
179
- end
180
- # Save cmd
181
- cmd = Cmd.new
182
- cmd.cmd_name = 'New concatenation'
183
- cmd.cmd_desc = "Concatenation of #{@generic_command_gui.tbl_cmd.selectedItems[0].text} and #{@generic_command_gui.tbl_cmd.selectedItems[1].text} commands"
184
- cmd.cmd_bus = @bus_id
185
- cmd.cmd_chip = @chip.chip_id
186
- cmd.save
187
- # Save cmd bytes
188
- bytesCmd1.each do |b1|
189
- byte = Byte.new
190
- byte.byte_index = b1.byte_index
191
- byte.byte_value = b1.byte_value
192
- checkSize.push(b1.byte_value)
193
- byte.byte_description = b1.byte_description
194
- byte.byte_iteration = b1.byte_iteration
195
- byte.byte_cmd = Cmd.ids.last
196
- byte.byte_type = 1
197
- byte.save
198
- end
199
- bytesCmd2.each do |b2|
200
- byte2 = Byte.new
201
- byte2.byte_index = Byte.last.byte_index + 1
202
- byte2.byte_value = b2.byte_value
203
- checkSize.push(b2.byte_value)
204
- byte2.byte_description = b2.byte_description
205
- byte2.byte_iteration = b2.byte_iteration
206
- byte2.byte_cmd = Cmd.ids.last
207
- byte2.byte_type = 1
208
- byte2.save
178
+ # Save cmd
179
+ cmd = Cmd.new
180
+ cmd.cmd_name = 'New concatenation'
181
+ cmd.cmd_desc = "Concatenation of #{@generic_command_gui.tbl_cmd.selectedItems[0].text} and #{@generic_command_gui.tbl_cmd.selectedItems[1].text} commands"
182
+ cmd.cmd_bus = @bus_id
183
+ cmd.cmd_chip = @chip.chip_id
184
+ cmd.save
185
+ # Save cmd bytes
186
+ bytesCmd1.each do |b1|
187
+ byte = Byte.new
188
+ byte.byte_index = b1.byte_index
189
+ byte.byte_value = b1.byte_value
190
+ byte.byte_description = b1.byte_description
191
+ byte.byte_iteration = b1.byte_iteration
192
+ byte.byte_cmd = Cmd.ids.last
193
+ byte.save
194
+ end
195
+ bytesCmd2.each do |b2|
196
+ byte2 = Byte.new
197
+ byte2.byte_index = Byte.last.byte_index + 1
198
+ byte2.byte_value = b2.byte_value
199
+ byte2.byte_description = b2.byte_description
200
+ byte2.byte_iteration = b2.byte_iteration
201
+ byte2.byte_cmd = Cmd.ids.last
202
+ byte2.save
203
+ end
204
+ feed_cmd_array
209
205
  end
210
- feed_cmd_array
211
206
  rescue Exception => msg
212
207
  logger = Logger.new($logFilePath)
213
208
  logger.error msg
@@ -215,7 +210,7 @@ class Generic_commands < Qt::Widget
215
210
  end
216
211
 
217
212
  def check_concatenation_size(bytesCmd1, bytesCmd2)
218
- checkSize = Array.new
213
+ checkSize = []
219
214
  bytesCmd1.each do |b1|
220
215
  checkSize.push(b1.byte_value)
221
216
  end
@@ -228,9 +223,9 @@ class Generic_commands < Qt::Widget
228
223
  lowByte = checkSize[i]
229
224
  highByte = checkSize[i + 1]
230
225
  commandType = checkSize[i + 2]
231
- count = count + (@api.BytesToInt(lowByte.to_i(16), highByte.to_i(16)))
226
+ count += (lowByte.to_i(16) + (highByte.to_i(16)<<8))
232
227
  if commandType.to_i(16) % 2 == 0 #WRITE
233
- i = (i + ((@api.BytesToInt(lowByte.to_i(16), highByte.to_i(16))) + 3))
228
+ i += ((lowByte.to_i(16) + (highByte.to_i(16)<<8)) + 3)
234
229
  else #READ
235
230
  i = (i + 3)
236
231
  end
@@ -7,7 +7,7 @@
7
7
 
8
8
  require_relative '../HardsploitAPI/HardsploitAPI'
9
9
  class HardsploitGUI < Qt::MainWindow
10
- VERSION = "2.0"
10
+ VERSION = "2.1"
11
11
  slots 'load_tree(int, int)'
12
12
  slots 'load_chip_action(QTreeWidgetItem*, int)'
13
13
  slots 'feed_chip_array()'
@@ -155,9 +155,10 @@ class HardsploitGUI < Qt::MainWindow
155
155
  settings_lvl = Qt::TreeWidgetItem.new
156
156
  settings_lvl.setText(0, "Settings")
157
157
  parent_node.addChild(settings_lvl)
158
- import_lvl = Qt::TreeWidgetItem.new
159
- import_lvl.setText(0, "Import")
160
- parent_node.addChild(import_lvl)
158
+ # Not implemented yet
159
+ #import_lvl = Qt::TreeWidgetItem.new
160
+ #import_lvl.setText(0, "Import")
161
+ #parent_node.addChild(import_lvl)
161
162
  export_lvl = Qt::TreeWidgetItem.new
162
163
  export_lvl.setText(0, "Export")
163
164
  parent_node.addChild(export_lvl)
@@ -54,15 +54,16 @@ class I2c_export < Qt::Widget
54
54
  return 0 if control_export_settings('partial').zero?
55
55
  end
56
56
  Firmware.new(@api, 'I2C')
57
- time = Time.new
57
+ $pgb = Progress_bar.new("I²C: Exporting...")
58
+ $pgb.show
58
59
  if sender.objectName == 'btn_full_export'
59
60
  @api.i2c_Generic_Dump(@chip_settings.i2c_frequency, @chip_settings.i2c_address_w.to_i(16), 0, @chip_settings.i2c_total_size - 1, @chip_settings.i2c_total_size)
60
61
  close_file
61
- control_export_result('full', @chip_settings.i2c_total_size - 1, time)
62
+ control_export_result('full', @chip_settings.i2c_total_size - 1)
62
63
  else
63
64
  @api.i2c_Generic_Dump(@chip_settings.i2c_frequency, @chip_settings.i2c_address_w.to_i(16), @i2c_export_gui.lie_start.text.to_i, @i2c_export_gui.lie_stop.text.to_i, @chip_settings.i2c_total_size)
64
65
  close_file
65
- control_export_result('partial', @i2c_export_gui.lie_stop.text.to_i, time)
66
+ control_export_result('partial', @i2c_export_gui.lie_stop.text.to_i)
66
67
  end
67
68
  @i2c_export_gui.btn_export.setEnabled(false)
68
69
  @i2c_export_gui.btn_full_export.setEnabled(false)
@@ -72,20 +73,16 @@ class I2c_export < Qt::Widget
72
73
  Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while full export operation. Consult the logs for more details').exec
73
74
  end
74
75
 
75
- def control_export_result(type, stop, time)
76
- time = Time.new - time
76
+ def control_export_result(type, stop)
77
77
  if type == 'partial'
78
78
  toCompare = ((stop - @i2c_export_gui.lie_start.text.to_i) + 1)
79
79
  else
80
80
  toCompare = @chip_settings.i2c_total_size
81
81
  end
82
82
  file_size = File.size(@filepath)
83
- if toCompare == file_size
84
- Qt::MessageBox.new(Qt::MessageBox::Information, 'Information', "Dump finished at #{((file_size / time)).round(2)}Bytes/s (#{(file_size)} Bytes in #{time.round(4)} s)").exec
85
- else
83
+ if toCompare != file_size
86
84
  Qt::MessageBox.new(Qt::MessageBox::Critical, 'Error', 'Dump error: Size does not match').exec
87
85
  end
88
- p "DUMP #{((file_size / time)).round(2)}Bytes/s (#{(file_size)}Bytes in #{time.round(4)} s)"
89
86
  end
90
87
 
91
88
  def control_export_settings(type)
@@ -20,13 +20,13 @@ class I2c_import < Qt::Widget
20
20
  @i2c_import_gui.lbl_chip.setText(chip.chip_reference)
21
21
  inputRestrict(@i2c_import_gui.lie_start, 0)
22
22
  @api = api
23
+ @chip = chip
23
24
  @chip_settings = I2C.find_by(i2c_chip: chip.chip_id)
24
25
  end
25
26
 
26
27
  def select_import_file
27
28
  @filepath = Qt::FileDialog.getOpenFileName(self, tr('Select a file'), '/', tr('Bin file (*.bin)'))
28
29
  unless @filepath.nil?
29
- $file = File.open("#{@filepath}", 'w')
30
30
  @i2c_import_gui.btn_import.setEnabled(true)
31
31
  end
32
32
  rescue Exception => msg
@@ -35,22 +35,13 @@ class I2c_import < Qt::Widget
35
35
  Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while openning the export file. Consult the logs for more details').exec
36
36
  end
37
37
 
38
- def close_file
39
- unless $file.nil?
40
- $file.close
41
- end
42
- rescue Exception => msg
43
- logger = Logger.new($logFilePath)
44
- logger.error msg
45
- Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while closing the export file. Consult the logs for more details').exec
46
- end
47
-
48
38
  def import
49
39
  return 0 if control_import_settings.zero?
50
40
  start = @i2c_import_gui.lie_start.text.to_i
51
41
  Firmware.new(@api, 'I2C')
52
- time = Time.new
53
- # I2C API IMPORT COMMAND GOES HERE
42
+ $pgb = Progress_bar.new("I2C: Importing...")
43
+ $pgb.show
44
+ @api.i2c_Generic_Import(@chip_settings.i2c_frequency, @chip_settings.i2c_address_w.to_i(16), start, @chip_settings.i2c_page_size, @chip_settings.i2c_total_size, @filepath, @chip_settings.i2c_write_page_latency/1000.0)
54
45
  rescue Exception => msg
55
46
  logger = Logger.new($logFilePath)
56
47
  logger.error msg
@@ -58,33 +49,29 @@ class I2c_import < Qt::Widget
58
49
  end
59
50
 
60
51
  def control_import_settings
61
- file_size = File.size("#{@filepath}")
52
+ @chip_settings = I2C.find_by(i2c_chip: @chip.chip_id)
62
53
  if @chip_settings.nil?
63
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C settings', 'No settings saved for this chip').exec
54
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C setting', 'No settings saved for this chip').exec
64
55
  return 0
65
56
  end
66
57
  if @chip_settings.i2c_total_size.nil?
67
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C settings', 'Total size setting missing').exec
68
- return 0
69
- end
70
- if @chip_settings.i2c_frequency.nil? || @chip_settings.i2c_address_w.nil?
71
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C settings', 'Write base address or frequency settings missing').exec
58
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C setting', 'Total size setting missing').exec
72
59
  return 0
73
60
  end
74
- if @chip_settings.i2c_mode.nil?
75
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C setting', 'Mode setting missing').exec
61
+ if @chip_settings.i2c_page_size.nil?
62
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C setting', 'Page size setting missing').exec
76
63
  return 0
77
64
  end
78
- if @i2c_import_gui.lie_start.text.empty?
79
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing start address', 'Please fill the Start address field').exec
65
+ if @chip_settings.i2c_write_page_latency.nil?
66
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C setting', 'Write page latency setting missing').exec
80
67
  return 0
81
68
  end
82
- if file_size > @chip_settings.i2c_total_size
83
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'The file size is superior to the chip capacity').exec
69
+ if @chip_settings.i2c_frequency.nil? || @chip_settings.i2c_address_w.nil?
70
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing I2C setting', 'Write base address or frequency settings missing').exec
84
71
  return 0
85
72
  end
86
- if file_size > (@chip_settings.i2c_total_size - @i2c_import_gui.lie_start)
87
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'Starting at this address, the file size is superior to the chip capacity').exec
73
+ if @i2c_import_gui.lie_start.text.empty?
74
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing start address', 'Please fill the Start address field').exec
88
75
  return 0
89
76
  end
90
77
  return 1
@@ -18,6 +18,8 @@ class I2c_settings < Qt::Widget
18
18
  @i2c_settings_gui.setupUi(self)
19
19
  @i2c_settings_gui.lbl_chip.setText(chip.chip_reference)
20
20
  inputRestrict(@i2c_settings_gui.lie_total_size, 0)
21
+ inputRestrict(@i2c_settings_gui.lie_page_size, 0)
22
+ inputRestrict(@i2c_settings_gui.lie_write_page_latency, 0)
21
23
  inputRestrict(@i2c_settings_gui.lie_address_r, 3)
22
24
  inputRestrict(@i2c_settings_gui.lie_address_w, 3)
23
25
  @i2c_settings_gui.tbl_bus_scan.resizeColumnsToContents
@@ -40,9 +42,11 @@ class I2c_settings < Qt::Widget
40
42
 
41
43
  def feed_settings_form
42
44
  unless @chip_settings.nil?
43
- @i2c_settings_gui.cbx_frequency.setCurrentIndex(@i2c_settings_gui.cbx_frequency.findText(@chip_settings.i2c_frequency.to_s))
44
- @i2c_settings_gui.lie_address_r.setText(@chip_settings.i2c_address_r)
45
45
  @i2c_settings_gui.lie_address_w.setText(@chip_settings.i2c_address_w)
46
+ @i2c_settings_gui.lie_address_r.setText(@chip_settings.i2c_address_r)
47
+ @i2c_settings_gui.cbx_frequency.setCurrentIndex(@i2c_settings_gui.cbx_frequency.findText(@chip_settings.i2c_frequency.to_s))
48
+ @i2c_settings_gui.lie_write_page_latency.setText(@chip_settings.i2c_write_page_latency.to_s)
49
+ @i2c_settings_gui.lie_page_size.setText(@chip_settings.i2c_page_size.to_s)
46
50
  @i2c_settings_gui.lie_total_size.setText(@chip_settings.i2c_total_size.to_s)
47
51
  end
48
52
  rescue Exception => msg
@@ -53,9 +57,11 @@ class I2c_settings < Qt::Widget
53
57
 
54
58
  def create
55
59
  @chip_settings = I2C.create(
56
- i2c_frequency: @i2c_settings_gui.cbx_frequency.currentText,
57
- i2c_address_r: @i2c_settings_gui.lie_address_r.text,
58
60
  i2c_address_w: @i2c_settings_gui.lie_address_w.text,
61
+ i2c_address_r: @i2c_settings_gui.lie_address_r.text,
62
+ i2c_frequency: @i2c_settings_gui.cbx_frequency.currentText,
63
+ i2c_write_page_latency: @i2c_settings_gui.lie_write_page_latency.text,
64
+ i2c_page_size: @i2c_settings_gui.lie_page_size.text,
59
65
  i2c_total_size: @i2c_settings_gui.lie_total_size.text,
60
66
  i2c_chip: @chip.chip_id
61
67
  )
@@ -67,14 +73,20 @@ class I2c_settings < Qt::Widget
67
73
  end
68
74
 
69
75
  def update
70
- if @chip_settings.i2c_frequency != @i2c_settings_gui.cbx_frequency.currentText.to_i
71
- @chip_settings.update(i2c_frequency: @i2c_settings_gui.cbx_frequency.currentText.to_i)
76
+ if @chip_settings.i2c_address_w != @i2c_settings_gui.lie_address_w.text
77
+ @chip_settings.update(i2c_address_w: @i2c_settings_gui.lie_address_w.text)
72
78
  end
73
79
  if @chip_settings.i2c_address_r != @i2c_settings_gui.lie_address_r.text
74
80
  @chip_settings.update(i2c_address_r: @i2c_settings_gui.lie_address_r.text)
75
81
  end
76
- if @chip_settings.i2c_address_w != @i2c_settings_gui.lie_address_w.text
77
- @chip_settings.update(i2c_address_w: @i2c_settings_gui.lie_address_w.text)
82
+ if @chip_settings.i2c_frequency != @i2c_settings_gui.cbx_frequency.currentText.to_i
83
+ @chip_settings.update(i2c_frequency: @i2c_settings_gui.cbx_frequency.currentText.to_i)
84
+ end
85
+ if @chip_settings.i2c_write_page_latency != @i2c_settings_gui.lie_write_page_latency.text
86
+ @chip_settings.update(i2c_write_page_latency: @i2c_settings_gui.lie_write_page_latency.text)
87
+ end
88
+ if @chip_settings.i2c_page_size != @i2c_settings_gui.lie_page_size.text
89
+ @chip_settings.update(i2c_page_size: @i2c_settings_gui.lie_page_size.text)
78
90
  end
79
91
  if @chip_settings.i2c_total_size != @i2c_settings_gui.lie_total_size.text
80
92
  @chip_settings.update(i2c_total_size: @i2c_settings_gui.lie_total_size.text)
@@ -0,0 +1,31 @@
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_progress_bar'
9
+ class Progress_bar < Qt::Widget
10
+
11
+ def initialize(status)
12
+ super()
13
+ @pgb_ui = Ui_Progress_bar.new
14
+ centerWindow(self)
15
+ @pgb_ui.setupUi(self)
16
+ self.update_status(status)
17
+ self.display_time("Total duration:")
18
+ end
19
+
20
+ def update_status(status)
21
+ @pgb_ui.lbl_status.setText(status)
22
+ end
23
+
24
+ def update_value(value)
25
+ @pgb_ui.pgb.setValue(value) if value <= 100 && value >= 0
26
+ end
27
+
28
+ def display_time(time)
29
+ @pgb_ui.lbl_time.setText(time)
30
+ end
31
+ end
@@ -70,15 +70,16 @@ class Spi_export < Qt::Widget
70
70
  return 0 if control_export_settings('partial').zero?
71
71
  end
72
72
  Firmware.new(@api, 'SPI')
73
- time = Time.new
73
+ $pgb = Progress_bar.new("SPI: Exporting...")
74
+ $pgb.show
74
75
  if sender.objectName == 'btn_full_export'
75
76
  @api.spi_Generic_Dump(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], @chip_settings.spi_command_read, 0, @chip_settings.spi_total_size - 1, @chip_settings.spi_total_size.to_i)
76
77
  close_file
77
- control_export_result('full', @chip_settings.spi_total_size - 1, time)
78
+ control_export_result('full', @chip_settings.spi_total_size - 1)
78
79
  else
79
80
  @api.spi_Generic_Dump(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], @chip_settings.spi_command_read, @spi_export_gui.lie_start.text.to_i, @spi_export_gui.lie_stop.text.to_i, @chip_settings.spi_total_size.to_i)
80
81
  close_file
81
- control_export_result('partial', @spi_export_gui.lie_stop.text.to_i, time)
82
+ control_export_result('partial', @spi_export_gui.lie_stop.text.to_i)
82
83
  end
83
84
  @spi_export_gui.btn_export.setEnabled(false)
84
85
  @spi_export_gui.btn_full_export.setEnabled(false)
@@ -88,20 +89,16 @@ class Spi_export < Qt::Widget
88
89
  Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while full export operation. Consult the logs for more details').exec
89
90
  end
90
91
 
91
- def control_export_result(type, stop, time)
92
- time = Time.new - time
92
+ def control_export_result(type, stop)
93
93
  if type == 'partial'
94
94
  toCompare = ((stop - @spi_export_gui.lie_start.text.to_i) + 1)
95
95
  else
96
96
  toCompare = @chip_settings.spi_total_size
97
97
  end
98
98
  file_size = File.size(@filepath)
99
- if toCompare == file_size
100
- Qt::MessageBox.new(Qt::MessageBox::Information, 'Information', "Dump finished at #{((file_size / time)).round(2)}Bytes/s (#{(file_size)} Bytes in #{time.round(4)} s)").exec
101
- else
99
+ if toCompare != file_size
102
100
  Qt::MessageBox.new(Qt::MessageBox::Critical, 'Error', 'Dump error: Size does not match').exec
103
101
  end
104
- p "DUMP #{((file_size / time)).round(2)}Bytes/s (#{(file_size)}Bytes in #{time.round(4)} s)"
105
102
  end
106
103
 
107
104
  def control_export_settings(type)
@@ -20,6 +20,7 @@ class Spi_import < Qt::Widget
20
20
  @spi_import_gui.lbl_chip.setText(chip.chip_reference)
21
21
  inputRestrict(@spi_import_gui.lie_start, 0)
22
22
  @api = api
23
+ @chip = chip
23
24
  @chip_settings = Spi.find_by(spi_chip: chip.chip_id)
24
25
  @speeds = {
25
26
  '25.00' => 3,
@@ -41,70 +42,70 @@ class Spi_import < Qt::Widget
41
42
 
42
43
  def select_import_file
43
44
  @filepath = Qt::FileDialog.getOpenFileName(self, tr('Select a file'), '/', tr('Bin file (*.bin)'))
44
- unless @filepath.nil?
45
- $file = File.open("#{@filepath}", 'w')
46
- @spi_import_gui.btn_import.setEnabled(true)
47
- end
45
+ @spi_import_gui.btn_import.setEnabled(true) unless @filepath.nil?
48
46
  rescue Exception => msg
49
47
  logger = Logger.new($logFilePath)
50
48
  logger.error msg
51
49
  Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while openning the export file. Consult the logs for more details').exec
52
50
  end
53
51
 
54
- def close_file
55
- unless $file.nil?
56
- $file.close
57
- end
58
- rescue Exception => msg
59
- logger = Logger.new($logFilePath)
60
- logger.error msg
61
- Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while closing the export file. Consult the logs for more details').exec
62
- end
63
-
64
52
  def import
65
53
  return 0 if control_import_settings.zero?
66
54
  start = @spi_import_gui.lie_start.text.to_i
67
55
  Firmware.new(@api, 'SPI')
68
- time = Time.new
69
- @api.spi_Generic_Dump(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], @chip_settings.spi_command_read, @spi_import_gui.lie_start.text.to_i, @chip_settings.spi_total_size.to_i)
56
+ $pgb = Progress_bar.new("SPI: Importing...")
57
+ $pgb.show
58
+ if @chip_settings.spi_is_flash.zero?
59
+ flash = false
60
+ else
61
+ flash = true
62
+ end
63
+ @api.spi_Generic_Import(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], start, @chip_settings.spi_page_size, @chip_settings.spi_total_size, @filepath, @chip_settings.spi_command_write, @chip_settings.spi_write_page_latency/1000.0, @chip_settings.spi_command_write_enable, @chip_settings.spi_command_erase, @chip_settings.spi_erase_time, flash)
70
64
  rescue Exception => msg
71
65
  logger = Logger.new($logFilePath)
72
66
  logger.error msg
73
67
  Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while partial import operation. Consult the logs for more details').exec
74
68
  end
75
69
 
76
- def control_import_result(type, stop, pathfile, time)
77
- # TO COME
78
- end
79
-
80
70
  def control_import_settings
81
- file_size = File.size("#{@filepath}")
71
+ @chip_settings = Spi.find_by(spi_chip: @chip.chip_id)
82
72
  if @chip_settings.nil?
83
73
  Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'No settings saved for this chip').exec
84
74
  return 0
85
75
  end
86
76
  if @chip_settings.spi_total_size.nil? || @chip_settings.spi_page_size.nil?
87
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Total size or page size settings missing').exec
77
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Total size or page size missing').exec
88
78
  return 0
89
79
  end
90
- if @chip_settings.spi_read_command.nil? || @chip_settings.spi_frequency.nil?
91
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Read command or frequency settings missing').exec
80
+ if @chip_settings.spi_command_read.nil? || @chip_settings.spi_frequency.nil?
81
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Read command or frequency missing').exec
92
82
  return 0
93
83
  end
94
- if @chip_settings.spi_mode.nil?
95
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI setting', 'Mode setting missing').exec
84
+ if @chip_settings.spi_command_write.nil?
85
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Write command missing').exec
96
86
  return 0
97
87
  end
98
- if @spi_import_gui.lie_start.text.empty?
99
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing start address', 'Please fill the Start address field').exec
88
+ if @chip_settings.spi_write_page_latency.nil?
89
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI setting', 'SPI write page latency missing').exec
100
90
  return 0
101
91
  end
102
- if file_size > @chip_settings.spi_total_size
103
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'The file size is superior to the chip capacity').exec
92
+ if @chip_settings.spi_is_flash.nil?
93
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI setting', 'SPI flash nature missing').exec
104
94
  return 0
95
+ else
96
+ if @chip_settings.spi_is_flash == 1
97
+ if @chip_settings.spi_erase_time.nil? || @chip_settings.spi_command_erase.nil?
98
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI setting', 'SPI erase time or command missing').exec
99
+ return 0
100
+ end
101
+ end
105
102
  end
106
- if file_size > (@chip_settings.spi_total_size - @spi_import_gui.lie_start)
107
- Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'Starting at this address, the file size is superior to the chip capacity').exec
103
+ if @chip_settings.spi_mode.nil?
104
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI setting', 'Mode missing').exec
105
+ return 0
106
+ end
107
+ if @spi_import_gui.lie_start.text.empty?
108
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing start address', 'Please fill the Start address field').exec
108
109
  return 0
109
110
  end
110
111
  return 1