cosmos 3.8.2 → 3.8.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 (87) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +5 -5
  3. data/Rakefile +8 -2
  4. data/autohotkey/tools/autohotkey.rb +3 -3
  5. data/data/crc.txt +27 -27
  6. data/demo/Launcher.bat +3 -3
  7. data/demo/config/data/crc.txt +27 -27
  8. data/demo/{procedures → config/targets/INST/procedures}/checks.rb +0 -0
  9. data/demo/{procedures → config/targets/INST/procedures}/collect.rb +2 -2
  10. data/demo/{procedures → config/targets/INST/procedures}/disconnect.rb +0 -0
  11. data/demo/{procedures/clear_util.rb → config/targets/INST/procedures/utilities/clear.rb} +0 -0
  12. data/demo/{procedures/collect_util.rb → config/targets/INST/procedures/utilities/collect.rb} +2 -2
  13. data/demo/config/targets/INST/screens/commanding.txt +3 -3
  14. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +7 -7
  15. data/demo/procedures/plot_test.rb +1 -1
  16. data/demo/tools/CmdExtractor.bat +3 -3
  17. data/demo/tools/CmdSender.bat +3 -3
  18. data/demo/tools/CmdTlmServer.bat +3 -3
  19. data/demo/tools/DataViewer.bat +3 -3
  20. data/demo/tools/ExampleTarget.bat +3 -3
  21. data/demo/tools/HandbookCreator.bat +3 -3
  22. data/demo/tools/Launcher.bat +3 -3
  23. data/demo/tools/LimitsMonitor.bat +3 -3
  24. data/demo/tools/OpenGLBuilder.bat +3 -3
  25. data/demo/tools/PacketViewer.bat +3 -3
  26. data/demo/tools/Replay.bat +3 -3
  27. data/demo/tools/ScpiTarget.bat +3 -3
  28. data/demo/tools/ScriptRunner.bat +3 -3
  29. data/demo/tools/TableManager.bat +3 -3
  30. data/demo/tools/TestRunner.bat +3 -3
  31. data/demo/tools/TlmExtractor.bat +3 -3
  32. data/demo/tools/TlmGrapher.bat +3 -3
  33. data/demo/tools/TlmViewer.bat +3 -3
  34. data/demo/tools/ToolLaunch.bat +3 -6
  35. data/ext/cosmos/ext/packet/packet.c +10 -0
  36. data/install/config/data/crc.txt +17 -17
  37. data/install/tools/CmdExtractor.bat +3 -3
  38. data/install/tools/CmdSender.bat +3 -3
  39. data/install/tools/CmdTlmServer.bat +3 -3
  40. data/install/tools/DataViewer.bat +3 -3
  41. data/install/tools/HandbookCreator.bat +3 -3
  42. data/install/tools/Launcher.bat +3 -3
  43. data/install/tools/LimitsMonitor.bat +3 -3
  44. data/install/tools/OpenGLBuilder.bat +3 -3
  45. data/install/tools/PacketViewer.bat +3 -3
  46. data/install/tools/Replay.bat +3 -3
  47. data/install/tools/ScriptRunner.bat +3 -3
  48. data/install/tools/TableManager.bat +3 -3
  49. data/install/tools/TestRunner.bat +3 -3
  50. data/install/tools/TlmExtractor.bat +3 -3
  51. data/install/tools/TlmGrapher.bat +3 -3
  52. data/install/tools/TlmViewer.bat +3 -3
  53. data/install/tools/ToolLaunch.bat +3 -6
  54. data/lib/cosmos/config/config_parser.rb +10 -2
  55. data/lib/cosmos/gui/qt_tool.rb +6 -0
  56. data/lib/cosmos/gui/utilities/screenshot.rb +8 -0
  57. data/lib/cosmos/gui/utilities/script_module_gui.rb +37 -11
  58. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +3 -3
  59. data/lib/cosmos/interfaces/udp_interface.rb +9 -2
  60. data/lib/cosmos/packet_logs/packet_log_reader.rb +1 -0
  61. data/lib/cosmos/packets/commands.rb +70 -74
  62. data/lib/cosmos/packets/packet.rb +14 -7
  63. data/lib/cosmos/script/scripting.rb +9 -7
  64. data/lib/cosmos/system/system.rb +4 -0
  65. data/lib/cosmos/system/target.rb +2 -0
  66. data/lib/cosmos/tools/cmd_tlm_server/api.rb +10 -10
  67. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
  68. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -1
  69. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +5 -15
  70. data/lib/cosmos/tools/script_runner/script_runner.rb +40 -21
  71. data/lib/cosmos/tools/table_manager/table.rb +2 -2
  72. data/lib/cosmos/tools/table_manager/table_config.rb +18 -10
  73. data/lib/cosmos/tools/table_manager/table_manager.rb +61 -59
  74. data/lib/cosmos/tools/table_manager/table_manager_core.rb +24 -56
  75. data/lib/cosmos/tools/test_runner/test_runner.rb +15 -10
  76. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +9 -2
  77. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +1 -1
  78. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +9 -1
  79. data/lib/cosmos/top_level.rb +5 -5
  80. data/lib/cosmos/version.rb +4 -4
  81. data/spec/config/config_parser_spec.rb +40 -2
  82. data/spec/packet_logs/packet_log_reader_spec.rb +66 -2
  83. data/spec/packets/packet_spec.rb +27 -0
  84. data/spec/script/scripting_spec.rb +7 -2
  85. data/spec/spec_helper.rb +4 -5
  86. data/spec/system/system_spec.rb +18 -0
  87. metadata +7 -7
@@ -122,6 +122,11 @@ module Cosmos
122
122
  def set_received_time_fast(received_time)
123
123
  @received_time = received_time
124
124
  @received_time.freeze if @received_time
125
+ if @read_conversion_cache
126
+ synchronize() do
127
+ @read_conversion_cache.clear
128
+ end
129
+ end
125
130
  end
126
131
 
127
132
  # Sets the received count of the packet
@@ -440,11 +445,6 @@ module Cosmos
440
445
  # @param value_type (see #read_item)
441
446
  # @param buffer (see Structure#write_item)
442
447
  def write_item(item, value, value_type = :CONVERTED, buffer = @buffer)
443
- if @read_conversion_cache
444
- synchronize() do
445
- @read_conversion_cache.clear
446
- end
447
- end
448
448
  case value_type
449
449
  when :RAW
450
450
  super(item, value, value_type, buffer)
@@ -473,6 +473,11 @@ module Cosmos
473
473
  else
474
474
  raise ArgumentError, "Unknown value type on write: #{value_type}"
475
475
  end
476
+ if @read_conversion_cache
477
+ synchronize() do
478
+ @read_conversion_cache.clear
479
+ end
480
+ end
476
481
  end
477
482
 
478
483
  # Read an item in the packet by name
@@ -551,9 +556,11 @@ module Cosmos
551
556
  # Restore all items in the packet to their default value
552
557
  #
553
558
  # @param buffer [String] Raw buffer of binary data
554
- def restore_defaults(buffer = @buffer)
559
+ # @param skip_items_names [Array] Array of item names to skip
560
+ def restore_defaults(buffer = @buffer, skip_item_names = nil)
561
+ upcase_skip_item_names = skip_item_names.map(&:upcase) if skip_item_names
555
562
  @sorted_items.each do |item|
556
- write_item(item, item.default, :CONVERTED, buffer)
563
+ write_item(item, item.default, :CONVERTED, buffer) unless (skip_item_names and upcase_skip_item_names.include?(item.name))
557
564
  end
558
565
  end
559
566
 
@@ -23,9 +23,11 @@ module Cosmos
23
23
  end
24
24
 
25
25
  def status_bar(message)
26
- script_runner = nil
27
- ObjectSpace.each_object {|object| if ScriptRunner === object then script_runner = object; break; end}
28
- script_runner.script_set_status(message) if script_runner
26
+ if defined? ScriptRunner
27
+ script_runner = nil
28
+ ObjectSpace.each_object {|object| if ScriptRunner === object then script_runner = object; break; end}
29
+ script_runner.script_set_status(message) if script_runner
30
+ end
29
31
  end
30
32
 
31
33
  def ask_string(question, blank_or_default = false, password = false)
@@ -553,21 +555,21 @@ module Cosmos
553
555
 
554
556
  # Require an additional ruby file
555
557
  def load_utility(procedure_name)
556
- cached = true
558
+ not_cached = false
557
559
  if defined? ScriptRunnerFrame and ScriptRunnerFrame.instance
558
560
  saved = ScriptRunnerFrame.instance.use_instrumentation
559
561
  begin
560
562
  ScriptRunnerFrame.instance.use_instrumentation = false
561
- cached = start(procedure_name)
563
+ not_cached = start(procedure_name)
562
564
  ensure
563
565
  ScriptRunnerFrame.instance.use_instrumentation = saved
564
566
  end
565
567
  else # Just call start
566
- cached = start(procedure_name)
568
+ not_cached = start(procedure_name)
567
569
  end
568
570
  # Return whether we had to load and instrument this file, i.e. it was not cached
569
571
  # This is designed to match the behavior of Ruby's require and load keywords
570
- !cached
572
+ not_cached
571
573
  end
572
574
  alias require_utility load_utility
573
575
 
@@ -367,6 +367,10 @@ module Cosmos
367
367
  dirs.each do |dir_filename|
368
368
  if dir_filename[0] != '.'
369
369
  if dir_filename == dir_filename.upcase
370
+ # If any of the targets original directory name matches the
371
+ # current directory then it must have been already processed by
372
+ # DECLARE_TARGET so we skip it.
373
+ next if @targets.select {|name, target| target.original_name == dir_filename }.length > 0
370
374
  if dir_filename == 'SYSTEM'
371
375
  system_found = true
372
376
  next
@@ -168,6 +168,8 @@ module Cosmos
168
168
  end
169
169
  lib_dir = File.join(dir, 'lib')
170
170
  Cosmos.add_to_search_path(lib_dir, false) if File.exist?(lib_dir)
171
+ proc_dir = File.join(dir, 'procedures')
172
+ Cosmos.add_to_search_path(proc_dir, false) if File.exist?(proc_dir)
171
173
  dir
172
174
  end
173
175
 
@@ -500,7 +500,7 @@ module Cosmos
500
500
  def get_tlm_buffer(target_name, packet_name)
501
501
  packet = System.telemetry.packet(target_name, packet_name)
502
502
  return packet.buffer
503
- end
503
+ end
504
504
 
505
505
  # Returns all the values (along with their limits state) for a packet.
506
506
  #
@@ -977,8 +977,16 @@ module Cosmos
977
977
  raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{method_name}()"
978
978
  end
979
979
 
980
+ # Build the command
981
+ begin
982
+ command = System.commands.build_cmd(target_name, cmd_name, cmd_params, range_check, raw)
983
+ rescue => e
984
+ Logger.error e.message
985
+ raise e
986
+ end
987
+
980
988
  if hazardous_check
981
- hazardous, hazardous_description = System.commands.cmd_hazardous?(target_name, cmd_name, cmd_params)
989
+ hazardous, hazardous_description = System.commands.cmd_pkt_hazardous?(command)
982
990
  if hazardous
983
991
  error = HazardousError.new
984
992
  error.target_name = target_name
@@ -989,14 +997,6 @@ module Cosmos
989
997
  end
990
998
  end
991
999
 
992
- # Build the command
993
- begin
994
- command = System.commands.build_cmd(target_name, cmd_name, cmd_params, range_check, raw)
995
- rescue Exception => e
996
- Logger.error e.message
997
- raise e
998
- end
999
-
1000
1000
  # Send the command
1001
1001
  @disconnect = false unless defined? @disconnect
1002
1002
  CmdTlmServer.commanding.send_command_to_target(target_name, command) unless @disconnect
@@ -154,7 +154,7 @@ module Cosmos
154
154
  button = Qt::PushButton.new(button_text)
155
155
  if name == ROUTERS
156
156
  button.connect(SIGNAL('clicked()')) do
157
- if interface.thread
157
+ if CmdTlmServer.routers.all[interface_name].thread
158
158
  Logger.info "User disconnecting router #{interface_name}"
159
159
  CmdTlmServer.instance.disconnect_router(interface_name)
160
160
  else
@@ -164,7 +164,7 @@ module Cosmos
164
164
  end
165
165
  else
166
166
  button.connect(SIGNAL('clicked()')) do
167
- if interface.thread
167
+ if CmdTlmServer.interfaces.all[interface_name].thread
168
168
  Logger.info "User disconnecting interface #{interface_name}"
169
169
  CmdTlmServer.instance.disconnect_interface(interface_name)
170
170
  else
@@ -222,7 +222,7 @@ module Cosmos
222
222
  if err
223
223
  Logger.info "Connection Lost for #{@interface.name}: #{err.formatted(false, false)}"
224
224
  case err
225
- when Errno::ECONNABORTED, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EBADF, IOError
225
+ when Errno::ECONNABORTED, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EBADF, Errno::ENOTSOCK, IOError
226
226
  # Do not write an exception file for these extremely common cases
227
227
  else
228
228
  Logger.error err.formatted
@@ -125,8 +125,6 @@ module Cosmos
125
125
  @derived_last_action.connect(SIGNAL('triggered()')) { update_tlm_items() }
126
126
 
127
127
  @formatted_tlm_units_action = Qt::Action.new(tr('Formatted Telemetry With &Units'), self)
128
- @formatted_tlm_units_keyseq = Qt::KeySequence.new(tr('Ctrl+U'))
129
- @formatted_tlm_units_action.shortcut = @formatted_tlm_units_keyseq
130
128
  @formatted_tlm_units_action.statusTip = tr('Formatted Telemetry with Units')
131
129
  @formatted_tlm_units_action.setCheckable(true)
132
130
  @formatted_tlm_units_action.setChecked(true)
@@ -136,8 +134,6 @@ module Cosmos
136
134
  end
137
135
 
138
136
  @formatted_tlm_action = Qt::Action.new(tr('&Formatted Telemetry'), self)
139
- @formatted_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
140
- @formatted_tlm_action.shortcut = @formatted_tlm_keyseq
141
137
  @formatted_tlm_action.statusTip = tr('Formatted Telemetry')
142
138
  @formatted_tlm_action.setCheckable(true)
143
139
  @formatted_tlm_action.connect(SIGNAL('triggered()')) do
@@ -146,8 +142,6 @@ module Cosmos
146
142
  end
147
143
 
148
144
  @normal_tlm_action = Qt::Action.new(tr('Normal &Converted Telemetry'), self)
149
- @normal_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+C'))
150
- @normal_tlm_action.shortcut = @normal_tlm_keyseq
151
145
  @normal_tlm_action.statusTip = tr('Normal Converted Telemetry')
152
146
  @normal_tlm_action.setCheckable(true)
153
147
  @normal_tlm_action.connect(SIGNAL('triggered()')) do
@@ -156,8 +150,6 @@ module Cosmos
156
150
  end
157
151
 
158
152
  @raw_tlm_action = Qt::Action.new(tr('&Raw Telemetry'), self)
159
- @raw_tlm_keyseq = Qt::KeySequence.new(tr('Ctrl+A'))
160
- @raw_tlm_action.shortcut = @raw_tlm_keyseq
161
153
  @raw_tlm_action.statusTip = tr('Raw Unprocessed Telemetry')
162
154
  @raw_tlm_action.setCheckable(true)
163
155
  @raw_tlm_action.connect(SIGNAL('triggered()')) do
@@ -319,9 +311,6 @@ module Cosmos
319
311
  return
320
312
  end
321
313
 
322
- # Clear Status Bar
323
- statusBar.clearMessage()
324
-
325
314
  # Update Telemetry Description
326
315
  @description.text = ""
327
316
  @packets.each do |name, description|
@@ -351,7 +340,7 @@ module Cosmos
351
340
  @derived_row += 1
352
341
  end
353
342
  end
354
- tlm_items.concat(derived) # Tack the derived onto the end
343
+ tlm_items.concat(derived) # Tack the derived onto the end
355
344
  else
356
345
  System.telemetry.items(target_name, packet_name).each do |item|
357
346
  tlm_items << [item.name, item.states, item.description]
@@ -411,15 +400,16 @@ module Cosmos
411
400
 
412
401
  begin
413
402
  tlm_items = get_tlm_packet(target_name || '', packet_name || '', @mode)
414
- rescue DRb::DRbConnError => err
403
+ rescue DRb::DRbConnError => error
415
404
  Qt.execute_in_main_thread(true) do
416
405
  statusBar.showMessage(tr("Error Connecting to Command and Telemetry Server"))
417
406
  end
418
407
  tlm_items = nil
419
408
  update_needed = false
420
- rescue RuntimeError => err
409
+ rescue RuntimeError => error
421
410
  Qt.execute_in_main_thread(true) do
422
- statusBar.showMessage(tr("Packet #{target_name} #{packet_name} does not exist"))
411
+ Cosmos.handle_critical_exception(error)
412
+ statusBar.showMessage(tr("Packet #{target_name} #{packet_name} Error: #{error}"))
423
413
  end
424
414
  tlm_items = nil
425
415
  update_needed = true
@@ -79,12 +79,6 @@ module Cosmos
79
79
  @file_new.statusTip = tr('Start a new script')
80
80
  @file_new.connect(SIGNAL('triggered()')) { file_new() }
81
81
 
82
- @file_open = Qt::Action.new(Cosmos.get_icon('open.png'), tr('&Open'), self)
83
- @file_open_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
84
- @file_open.shortcut = @file_open_keyseq
85
- @file_open.statusTip = tr('Open a script')
86
- @file_open.connect(SIGNAL('triggered()')) { file_open() }
87
-
88
82
  @file_close = Qt::Action.new(tr('&Close'), self)
89
83
  @file_close_keyseq = Qt::KeySequence.new(tr('Ctrl+W'))
90
84
  @file_close.shortcut = @file_close_keyseq
@@ -249,18 +243,43 @@ module Cosmos
249
243
 
250
244
  def initialize_menus
251
245
  # File Menu
252
- file_menu = menuBar.addMenu(tr('&File'))
253
- file_menu.addAction(@file_new)
254
- file_menu.addAction(@file_open)
255
- file_menu.addAction(@file_close)
256
- file_menu.addAction(@file_reload)
257
- file_menu.addSeparator()
258
- file_menu.addAction(@file_save)
259
- file_menu.addAction(@file_save_as)
260
- file_menu.addSeparator()
261
- file_menu.addAction(@file_options)
262
- file_menu.addSeparator()
263
- file_menu.addAction(@exit_action)
246
+ @file_menu = menuBar.addMenu(tr('&File'))
247
+ @file_menu.addAction(@file_new)
248
+
249
+ open_action = Qt::Action.new(self)
250
+ open_action.shortcut = Qt::KeySequence.new(tr('Ctrl+O'))
251
+ open_action.connect(SIGNAL('triggered()')) { file_open(@procedure_dir) }
252
+ self.addAction(open_action)
253
+
254
+ @file_open = @file_menu.addMenu(tr('&Open'))
255
+ @file_open.setIcon(Cosmos.get_icon('open.png'))
256
+ System.paths['PROCEDURES'].each do |path|
257
+ next unless File.exist? path
258
+ path_context = path.split('/')[-2..-1].join('/')
259
+ action = Qt::Action.new(tr(path_context), self)
260
+ action.statusTip = "Open #{path}"
261
+ action.connect(SIGNAL('triggered()')) { file_open(path) }
262
+ @file_open.addAction(action)
263
+ end
264
+ @file_open.addSeparator()
265
+ System.targets.each do |target_name, target|
266
+ proc_dir = File.join(target.dir, 'procedures')
267
+ next unless File.exist? proc_dir
268
+ action = Qt::Action.new(tr("#{target_name}/procedures"), self)
269
+ action.statusTip = "Open #{proc_dir}"
270
+ action.connect(SIGNAL('triggered()')) { file_open(File.join(target.dir, 'procedures')) }
271
+ @file_open.addAction(action)
272
+ end
273
+
274
+ @file_menu.addAction(@file_close)
275
+ @file_menu.addAction(@file_reload)
276
+ @file_menu.addSeparator()
277
+ @file_menu.addAction(@file_save)
278
+ @file_menu.addAction(@file_save_as)
279
+ @file_menu.addSeparator()
280
+ @file_menu.addAction(@file_options)
281
+ @file_menu.addSeparator()
282
+ @file_menu.addAction(@exit_action)
264
283
 
265
284
  # Edit Menu
266
285
  mode_menu = menuBar.addMenu(tr('&Edit'))
@@ -366,8 +385,8 @@ module Cosmos
366
385
 
367
386
  # File->Open
368
387
  def file_open(filename = nil)
369
- if !filename
370
- filename = Qt::FileDialog.getOpenFileName(self, "Select Script", @procedure_dir)
388
+ if File.directory?(filename)
389
+ filename = Qt::FileDialog.getOpenFileName(self, "Select Script", filename)
371
390
  end
372
391
  unless filename.nil? || filename.empty?
373
392
  # If the user opens a file we already have open
@@ -905,7 +924,7 @@ module Cosmos
905
924
  option_parser, options = create_default_options()
906
925
  options.width = 750
907
926
  options.height = 600
908
- options.title = "Script Runner : Untitiled"
927
+ options.title = "Script Runner : Untitled"
909
928
  options.auto_size = false
910
929
  options.config_file = "script_runner.txt"
911
930
  options.server_config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
@@ -37,9 +37,9 @@ module Cosmos
37
37
 
38
38
  # Calls define_item in Packet but also incrememts @num_columns
39
39
  # if this table is a REPEATING table.
40
- def create_param(name, bit_offset, bit_size, type, description, range, default, display_type, editable)
40
+ def create_param(name, bit_offset, bit_size, type, description, range, default, display_type, editable, endianness)
41
41
  @num_columns += 1 if @type == :TWO_DIMENSIONAL
42
- item = define_item(name, bit_offset, bit_size, type)
42
+ item = define_item(name, bit_offset, bit_size, type, nil, endianness)
43
43
  item.description = description
44
44
  item.range = range
45
45
  item.default = default
@@ -115,8 +115,8 @@ module Cosmos
115
115
  end
116
116
 
117
117
  when 'PARAMETER'
118
- usage = "PARAMETER <Parameter Name> <Parameter Description> <Data Type> <Bit Size> <Display Type> <Minimum Value> <Maximum Value> <Default Value - Only in ONE_DIMENTIONAL>"
119
- parser.verify_num_parameters(7, 8, usage)
118
+ usage = "PARAMETER <Parameter Name> <Parameter Description> <Data Type> <Bit Size> <Display Type> <Minimum Value> <Maximum Value> <Default Value (Only in ONE_DIMENTIONAL)> <ENDIANNESS (Optional)>"
119
+ parser.verify_num_parameters(6, 9, usage)
120
120
  finish_parameter()
121
121
  if @current_table
122
122
  @current_table.num_rows += 1
@@ -134,21 +134,29 @@ module Cosmos
134
134
  type = read_item_type(parameters[2])
135
135
  bit_size = parameters[3].to_i
136
136
  display_type, editable = read_display_type(parameters[4], type)
137
- if type == :BLOCK
137
+ if type == :STRING || type == :BLOCK
138
138
  range = nil
139
- elsif type == :STRING
140
- range = convert_to_range(parameters[5], parameters[6], :UINT, 0)
141
139
  else
142
140
  range = convert_to_range(parameters[5], parameters[6], type, bit_size)
143
141
  end
144
142
  if @current_table.type == :ONE_DIMENSIONAL
145
- default = convert_to_type(parameters[7], type)
143
+ if type == :STRING || type == :BLOCK
144
+ default = convert_to_type(parameters[5], type)
145
+ else
146
+ default = convert_to_type(parameters[7], type)
147
+ end
146
148
  else # TWO_DIMENSIONAL defaults are set by the DEFAULT keyword
147
149
  default = 0
148
150
  end
149
151
 
150
- @current_parameter = @current_table.create_param(name, @cur_bit_offset,
151
- bit_size, type, description, range, default, display_type, editable)
152
+ endianness = parameters[-1].to_s.upcase.intern
153
+ if endianness != :BIG_ENDIAN && endianness != :LITTLE_ENDIAN
154
+ endianness = @current_table.default_endianness
155
+ end
156
+
157
+ @current_parameter = @current_table.create_param(
158
+ name, @cur_bit_offset, bit_size, type, description,
159
+ range, default, display_type, editable, endianness)
152
160
  @cur_bit_offset += parameters[3].to_i
153
161
  rescue ArgumentError => err
154
162
  raise parser.error("#{err.message} with #{keyword}.\nUSAGE: #{usage}")
@@ -664,8 +672,8 @@ module Cosmos
664
672
  # backwards and that the minimum and maximum values make sense for the given
665
673
  # type and bit_size. For example, a maximum of 256 doesn't make sense for a UINT8.
666
674
  def convert_to_range(min, max, type, bit_size)
667
- min = convert_to_type(min, type)
668
- max = convert_to_type(max, type)
675
+ min = ConfigParser.handle_defined_constants(min.convert_to_value, type, bit_size)
676
+ max = ConfigParser.handle_defined_constants(max.convert_to_value, type, bit_size)
669
677
  range = min..max
670
678
 
671
679
  # First check for backwards ranges
@@ -463,7 +463,7 @@ module Cosmos
463
463
  title = @currently_displayed_table_name
464
464
  end
465
465
  dialog.set_title_and_text("#{title} Hex Dump", str)
466
- dialog.set_size(550, 400)
466
+ dialog.set_size(650, 400)
467
467
  dialog.exec
468
468
  dialog.dispose
469
469
  rescue => err
@@ -804,6 +804,10 @@ module Cosmos
804
804
 
805
805
  when :STATE
806
806
  x = item_def.states[gui_table.item(r,c).text]
807
+
808
+ when :STRING, :NONE
809
+ x = gui_table.item(r,c).text
810
+
807
811
  end
808
812
 
809
813
  # If there is a read conversion we first read the converted value before writing.
@@ -820,9 +824,7 @@ module Cosmos
820
824
  # in this case force the range check to fail
821
825
  rescue => error
822
826
  text = gui_table.item(r,c).text
823
- result << "Error saving #{item_def.name} value of #{text} due to #{error.message}.\nReverting to default of #{item_def.default}\n"
824
- table.write(item_def.name, item_def.default)
825
- update_gui_item(name, table, item_def, r, c)
827
+ result << "Error saving #{item_def.name} value of '#{text}' due to #{error.message}.\nDefault value is '#{item_def.default}'\n"
826
828
  end
827
829
  end # end each table column
828
830
  end # end each table row
@@ -889,64 +891,64 @@ module Cosmos
889
891
  gui_table = @gui_tables[table_name]
890
892
 
891
893
  case item_def.display_type
892
- when :STATE
893
- item = Qt::TableWidgetItem.new
894
- item.setData(Qt::DisplayRole, Qt::Variant.new(table_def.read(item_def.name)))
895
- gui_table.setItem(table_row, table_column, item)
896
- if item_def.editable
897
- gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
898
- else
899
- gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
900
- end
894
+ when :STATE
895
+ item = Qt::TableWidgetItem.new
896
+ item.setData(Qt::DisplayRole, Qt::Variant.new(table_def.read(item_def.name)))
897
+ gui_table.setItem(table_row, table_column, item)
898
+ if item_def.editable
899
+ gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
900
+ else
901
+ gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
902
+ end
901
903
 
902
- when :CHECK
903
- gui_table.setItem(table_row, table_column, Qt::TableWidgetItem.new(table_def.read(item_def.name)))
904
- # the ItemData will be 0 for unchecked (corresponds with min value),
905
- # and 1 for checked (corresponds with max value)
906
- if table_def.read(item_def.name) == item_def.range.begin
907
- gui_table.item(table_row, table_column).setCheckState(Qt::Unchecked)
908
- else
909
- gui_table.item(table_row, table_column).setCheckState(Qt::Checked)
910
- end
911
- if item_def.editable
912
- gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable)
913
- else
914
- gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
915
- end
904
+ when :CHECK
905
+ gui_table.setItem(table_row, table_column, Qt::TableWidgetItem.new(table_def.read(item_def.name)))
906
+ # the ItemData will be 0 for unchecked (corresponds with min value),
907
+ # and 1 for checked (corresponds with max value)
908
+ if table_def.read(item_def.name) == item_def.range.begin
909
+ gui_table.item(table_row, table_column).setCheckState(Qt::Unchecked)
910
+ else
911
+ gui_table.item(table_row, table_column).setCheckState(Qt::Checked)
912
+ end
913
+ if item_def.editable
914
+ gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable)
915
+ else
916
+ gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
917
+ end
916
918
 
917
- when :DEC
918
- gui_table.setItem(table_row, table_column, Qt::TableWidgetItem.new(tr(table_def.read(item_def.name).to_s)))
919
- if item_def.editable
920
- gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled)
921
- else
922
- gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
923
- end
919
+ when :STRING, :NONE, :DEC
920
+ gui_table.setItem(table_row, table_column, Qt::TableWidgetItem.new(tr(table_def.read(item_def.name).to_s)))
921
+ if item_def.editable
922
+ gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled)
923
+ else
924
+ gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
925
+ end
924
926
 
925
- when :HEX
926
- case item_def.bit_size
927
- when 8
928
- x = sprintf("%02X", table_def.read(item_def.name).to_s)
929
- # if the number was negative x will have .. and possibly another
930
- # F in the string which we remove by taking the last 4 digits
931
- x = /\w{2}$/.match(x)[0]
932
- when 16
933
- x = sprintf("%04X", table_def.read(item_def.name).to_s)
934
- # if the number was negative x will have .. and possibly another
935
- # F in the string which we remove by taking the last 4 digits
936
- x = /\w{4}$/.match(x)[0]
937
- else
938
- x = sprintf("%08X", table_def.read(item_def.name).to_s)
939
- # if the number was negative x will have .. and possibly another
940
- # F in the string which we remove by taking the last 8 digits
941
- x = /\w{8}$/.match(x)[0]
942
- end
943
- x = Integer("0x#{x}") # convert to Integer
944
- gui_table.setItem(table_row, table_column, Qt::TableWidgetItem.new(tr("0x%X" % x)))
945
- if item_def.editable
946
- gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled)
947
- else
948
- gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
949
- end
927
+ when :HEX
928
+ case item_def.bit_size
929
+ when 8
930
+ x = sprintf("%02X", table_def.read(item_def.name).to_s)
931
+ # if the number was negative x will have .. and possibly another
932
+ # F in the string which we remove by taking the last 4 digits
933
+ x = /\w{2}$/.match(x)[0]
934
+ when 16
935
+ x = sprintf("%04X", table_def.read(item_def.name).to_s)
936
+ # if the number was negative x will have .. and possibly another
937
+ # F in the string which we remove by taking the last 4 digits
938
+ x = /\w{4}$/.match(x)[0]
939
+ else
940
+ x = sprintf("%08X", table_def.read(item_def.name).to_s)
941
+ # if the number was negative x will have .. and possibly another
942
+ # F in the string which we remove by taking the last 8 digits
943
+ x = /\w{8}$/.match(x)[0]
944
+ end
945
+ x = Integer("0x#{x}") # convert to Integer
946
+ gui_table.setItem(table_row, table_column, Qt::TableWidgetItem.new(tr("0x%X" % x)))
947
+ if item_def.editable
948
+ gui_table.item(table_row, table_column).setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled)
949
+ else
950
+ gui_table.item(table_row, table_column).setFlags(Qt::NoItemFlags)
951
+ end
950
952
  end
951
953
  end
952
954