cosmos 4.2.4-java → 4.3.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/Gemfile +1 -1
  4. data/Manifest.txt +12 -0
  5. data/autohotkey/tools/cmd_sequence.ahk +21 -20
  6. data/autohotkey/tools/cmd_sequence2.ahk +1 -1
  7. data/autohotkey/tools/config_editor.ahk +1 -1
  8. data/autohotkey/tools/launcher.ahk +1 -0
  9. data/autohotkey/tools/packet_viewer.ahk +6 -5
  10. data/autohotkey/tools/test_runner.ahk +8 -8
  11. data/bin/cosmos +37 -0
  12. data/bin/dart_util +0 -0
  13. data/data/config/item_modifiers.yaml +9 -0
  14. data/data/crc.txt +91 -86
  15. data/demo/Rakefile +2 -0
  16. data/demo/config/dart/Gemfile +1 -1
  17. data/demo/config/data/crc.txt +8 -5
  18. data/demo/config/system/system.txt +28 -0
  19. data/demo/config/system/system2.txt +21 -3
  20. data/demo/config/system/system_alt_ports.txt +69 -0
  21. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +1 -0
  22. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server_chain.txt +18 -0
  23. data/demo/procedures/cosmos_api_test.rb +18 -14
  24. data/demo/procedures/local_screen_example.rb +51 -0
  25. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +32 -4
  26. data/ext/cosmos/ext/packet/packet.c +6 -0
  27. data/ext/mkrf_conf.rb +2 -2
  28. data/install/config/dart/Gemfile +1 -1
  29. data/install/config/data/crc.txt +2 -2
  30. data/install/config/system/system.txt +23 -1
  31. data/lib/cosmos/conversions.rb +2 -0
  32. data/lib/cosmos/conversions/packet_time_formatted_conversion.rb +38 -0
  33. data/lib/cosmos/conversions/packet_time_seconds_conversion.rb +38 -0
  34. data/lib/cosmos/core_ext/cosmos_io.rb +2 -1
  35. data/lib/cosmos/dart/Gemfile +1 -1
  36. data/lib/cosmos/dart/examples/dart_stream_client.rb +6 -2
  37. data/lib/cosmos/dart/lib/dart_common.rb +1 -1
  38. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +2 -2
  39. data/lib/cosmos/dart/lib/dart_decommutator.rb +4 -4
  40. data/lib/cosmos/dart/lib/dart_importer.rb +3 -3
  41. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +2 -2
  42. data/lib/cosmos/dart/processes/dart_ingester.rb +2 -0
  43. data/lib/cosmos/dart/processes/dart_util.rb +4 -4
  44. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +3 -3
  45. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +9 -5
  46. data/lib/cosmos/gui/dialogs/details_dialog.rb +29 -29
  47. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +1 -1
  48. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +3 -3
  49. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +2 -2
  50. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +1 -1
  51. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +10 -10
  52. data/lib/cosmos/gui/qt.rb +10 -1
  53. data/lib/cosmos/gui/qt_tool.rb +17 -10
  54. data/lib/cosmos/gui/text/ruby_editor.rb +47 -8
  55. data/lib/cosmos/gui/utilities/classification_banner.rb +60 -0
  56. data/lib/cosmos/gui/utilities/script_module_gui.rb +26 -0
  57. data/lib/cosmos/interfaces.rb +1 -0
  58. data/lib/cosmos/interfaces/interface.rb +4 -0
  59. data/lib/cosmos/interfaces/protocols/ignore_packet_protocol.rb +46 -0
  60. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +68 -23
  61. data/lib/cosmos/packet_logs/packet_log_reader.rb +69 -26
  62. data/lib/cosmos/packet_logs/packet_log_writer.rb +13 -1
  63. data/lib/cosmos/packets/commands.rb +5 -1
  64. data/lib/cosmos/packets/packet.rb +36 -2
  65. data/lib/cosmos/packets/packet_config.rb +0 -1
  66. data/lib/cosmos/packets/parsers/format_string_parser.rb +0 -1
  67. data/lib/cosmos/packets/parsers/xtce_parser.rb +1 -1
  68. data/lib/cosmos/packets/telemetry.rb +4 -0
  69. data/lib/cosmos/script/api_shared.rb +2 -0
  70. data/lib/cosmos/script/limits.rb +4 -0
  71. data/lib/cosmos/script/script.rb +27 -11
  72. data/lib/cosmos/script/telemetry.rb +3 -1
  73. data/lib/cosmos/script/tools.rb +18 -8
  74. data/lib/cosmos/system/system.rb +21 -0
  75. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +26 -24
  76. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +29 -29
  77. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +65 -40
  78. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +6 -6
  79. data/lib/cosmos/tools/cmd_tlm_server/api.rb +13 -0
  80. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +12 -9
  81. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +7 -1
  82. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +8 -8
  83. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +13 -2
  84. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
  85. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +13 -13
  86. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +4 -4
  87. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +8 -8
  88. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +5 -5
  89. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +35 -20
  90. data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +15 -11
  91. data/lib/cosmos/tools/config_editor/config_editor.rb +69 -69
  92. data/lib/cosmos/tools/data_viewer/data_viewer.rb +42 -38
  93. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +1 -0
  94. data/lib/cosmos/tools/data_viewer/dump_component.rb +1 -0
  95. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +4 -4
  96. data/lib/cosmos/tools/launcher/launcher.rb +1 -1
  97. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +28 -24
  98. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +42 -42
  99. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +56 -53
  100. data/lib/cosmos/tools/script_runner/script_runner.rb +112 -95
  101. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +48 -30
  102. data/lib/cosmos/tools/table_manager/table_manager.rb +42 -42
  103. data/lib/cosmos/tools/test_runner/test_runner.rb +45 -27
  104. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +3 -3
  105. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +45 -45
  106. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +4 -4
  107. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +3 -3
  108. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +7 -7
  109. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +10 -10
  110. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +10 -3
  111. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +6 -6
  112. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +14 -14
  113. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +83 -83
  114. data/lib/cosmos/tools/tlm_viewer/screen.rb +73 -13
  115. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +15 -15
  116. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  117. data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +40 -0
  118. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +1 -1
  119. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +6 -1
  120. data/lib/cosmos/top_level.rb +14 -1
  121. data/lib/cosmos/version.rb +5 -5
  122. data/lib/cosmos/win32/excel.rb +63 -12
  123. data/make_gems.sh +10 -0
  124. data/spec/conversions/packet_time_formatted_conversion_spec.rb +58 -0
  125. data/spec/conversions/packet_time_seconds_conversion_spec.rb +60 -0
  126. data/spec/interfaces/protocols/ignore_packet_protocol_spec.rb +243 -0
  127. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +227 -4
  128. data/spec/io/serial_driver_spec.rb +15 -13
  129. data/spec/packet_logs/packet_log_reader_spec.rb +72 -17
  130. data/spec/packets/packet_config_spec.rb +5 -16
  131. data/spec/packets/parsers/format_string_parser_spec.rb +0 -11
  132. data/spec/packets/parsers/macro_parser_spec.rb +36 -36
  133. data/spec/packets/parsers/state_parser_spec.rb +36 -0
  134. data/spec/packets/telemetry_spec.rb +11 -9
  135. data/spec/script/script_spec.rb +2 -3
  136. data/spec/script/scripting_spec.rb +2 -1
  137. data/spec/script/tools_spec.rb +0 -1
  138. data/spec/tools/cmd_tlm_server/api_spec.rb +28 -20
  139. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +33 -0
  140. data/spec/tools/cmd_tlm_server/commanding_spec.rb +25 -1
  141. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +15 -0
  142. data/tasks/gemfile_stats.rake +3 -2
  143. metadata +14 -2
@@ -10,16 +10,16 @@
10
10
 
11
11
  require 'cosmos'
12
12
  Cosmos.catch_fatal_exception do
13
- require 'cosmos/script'
14
13
  require 'cosmos/gui/qt_tool'
15
- require 'cosmos/config/config_parser'
16
14
  require 'cosmos/gui/text/completion'
17
15
  require 'cosmos/gui/utilities/script_module_gui'
18
16
  require 'cosmos/gui/dialogs/splash'
19
17
  require 'cosmos/gui/dialogs/cmd_details_dialog'
18
+ require 'cosmos/gui/widgets/full_text_search_line_edit'
20
19
  require 'cosmos/tools/cmd_sender/cmd_sender_text_edit'
21
20
  require 'cosmos/tools/cmd_sender/cmd_param_table_item_delegate'
22
- require 'cosmos/gui/widgets/full_text_search_line_edit'
21
+ require 'cosmos/config/config_parser'
22
+ require 'cosmos/script'
23
23
  end
24
24
 
25
25
  module Cosmos
@@ -27,7 +27,7 @@ module Cosmos
27
27
  module Script
28
28
  def prompt_for_script_abort
29
29
  window = get_cmd_tlm_gui_window()
30
- window.statusBar.showMessage(tr("Hazardous command not sent"))
30
+ window.statusBar.showMessage("Hazardous command not sent")
31
31
  return true # Aborted - Don't retry
32
32
  end
33
33
  end
@@ -137,59 +137,59 @@ module Cosmos
137
137
  super()
138
138
  # File menu actions
139
139
  @send_raw_action = Qt::Action.new(Cosmos.get_icon('send_file.png'),
140
- tr('&Send Raw'),
140
+ '&Send Raw',
141
141
  self)
142
- @send_raw_action.shortcut = Qt::KeySequence.new(tr('Ctrl+S'))
142
+ @send_raw_action.shortcut = Qt::KeySequence.new('Ctrl+S')
143
143
  tip = 'Send raw data from a file'
144
144
  if @production
145
145
  tip += ' - Disabled in Production Mode'
146
146
  @send_raw_action.setEnabled(false)
147
147
  end
148
- @send_raw_action.statusTip = tr(tip)
148
+ @send_raw_action.statusTip = tip
149
149
  connect(@send_raw_action, SIGNAL('triggered()'), self, SLOT('file_send_raw()'))
150
150
 
151
151
  # Mode menu actions
152
- @ignore_range = Qt::Action.new(tr('&Ignore Range Checks'), self)
152
+ @ignore_range = Qt::Action.new('&Ignore Range Checks', self)
153
153
  tip = 'Ignore range checks when processing command'
154
154
  if @production
155
155
  tip += ' - Disabled in Production Mode'
156
156
  @ignore_range.setEnabled(false)
157
157
  end
158
- @ignore_range.statusTip = tr(tip)
158
+ @ignore_range.statusTip = tip
159
159
  @ignore_range.setCheckable(true)
160
160
  @ignore_range.setChecked(false)
161
161
 
162
- @states_in_hex = Qt::Action.new(tr('&Display State Values in Hex'), self)
163
- @states_in_hex.statusTip = tr('Display states values in hex instead of decimal')
162
+ @states_in_hex = Qt::Action.new('&Display State Values in Hex', self)
163
+ @states_in_hex.statusTip = 'Display states values in hex instead of decimal'
164
164
  @states_in_hex.setCheckable(true)
165
165
  @states_in_hex.setChecked(false)
166
166
  connect(@states_in_hex, SIGNAL('toggled(bool)'), self, SLOT('menu_states_in_hex(bool)'))
167
167
 
168
- @show_ignored = Qt::Action.new(tr('&Show Ignored Parameters'), self)
169
- @show_ignored.statusTip = tr('Show ignored parameters which are normally hidden')
168
+ @show_ignored = Qt::Action.new('&Show Ignored Parameters', self)
169
+ @show_ignored.statusTip = 'Show ignored parameters which are normally hidden'
170
170
  @show_ignored.setCheckable(true)
171
171
  @show_ignored.setChecked(false)
172
172
  connect(@show_ignored, SIGNAL('toggled(bool)'), self, SLOT('update_cmd_params(bool)'))
173
173
 
174
- @cmd_raw = Qt::Action.new(tr('Disable &Parameter Conversions'), self)
174
+ @cmd_raw = Qt::Action.new('Disable &Parameter Conversions', self)
175
175
  tip = 'Send the command without running write or state conversions'
176
176
  if @production
177
177
  tip += ' - Disabled in Production Mode'
178
178
  @cmd_raw.setEnabled(false)
179
179
  end
180
- @cmd_raw.statusTip = tr(tip)
180
+ @cmd_raw.statusTip = tip
181
181
  @cmd_raw.setCheckable(true)
182
182
  @cmd_raw.setChecked(false)
183
183
  end
184
184
 
185
185
  # Create the File and Mode menus and initialize the help menu
186
186
  def initialize_menus
187
- file_menu = menuBar.addMenu(tr('&File'))
187
+ file_menu = menuBar.addMenu('&File')
188
188
  file_menu.addAction(@send_raw_action)
189
189
  file_menu.addAction(@exit_action)
190
190
  file_menu.insertSeparator(@exit_action)
191
191
 
192
- mode_menu = menuBar.addMenu(tr('&Mode'))
192
+ mode_menu = menuBar.addMenu('&Mode')
193
193
  mode_menu.addAction(@ignore_range)
194
194
  mode_menu.addAction(@states_in_hex)
195
195
  mode_menu.addAction(@show_ignored)
@@ -244,14 +244,14 @@ module Cosmos
244
244
  @target_select = Qt::ComboBox.new
245
245
  @target_select.setMaxVisibleItems(6)
246
246
  connect(@target_select, SIGNAL('activated(const QString&)'), self, SLOT('target_changed(const QString&)'))
247
- target_label = Qt::Label.new(tr("&Target:"))
247
+ target_label = Qt::Label.new("&Target:")
248
248
  target_label.setBuddy(@target_select)
249
249
 
250
250
  # Set the comamnd combobox selection
251
251
  @cmd_select = Qt::ComboBox.new
252
252
  @cmd_select.setMaxVisibleItems(20)
253
253
  connect(@cmd_select, SIGNAL('activated(const QString&)'), self, SLOT('cmd_changed(const QString&)'))
254
- cmd_label = Qt::Label.new(tr("&Command:"))
254
+ cmd_label = Qt::Label.new("&Command:")
255
255
  cmd_label.setBuddy(@cmd_select)
256
256
 
257
257
  # Button to send command
@@ -273,7 +273,7 @@ module Cosmos
273
273
  top_layout.addWidget(sep1)
274
274
 
275
275
  # Command Description Label
276
- dec_label = Qt::Label.new(tr("Description:"))
276
+ dec_label = Qt::Label.new("Description:")
277
277
  @description = Qt::Label.new('')
278
278
  @description.setWordWrap(true)
279
279
  desc_layout = Qt::HBoxLayout.new
@@ -287,7 +287,7 @@ module Cosmos
287
287
  top_layout.addWidget(sep2)
288
288
 
289
289
  # Parameters Label
290
- param_label = Qt::Label.new(tr("Parameters:"))
290
+ param_label = Qt::Label.new("Parameters:")
291
291
  top_layout.addWidget(param_label)
292
292
 
293
293
  # Grid Layout for Parameters
@@ -362,13 +362,13 @@ module Cosmos
362
362
  interfaces.addItems(get_interface_names())
363
363
  interfaces.setMaxVisibleItems(30)
364
364
  layout.addWidget(interfaces, 0, 1)
365
- int_label = Qt::Label.new(tr("&Interface:"))
365
+ int_label = Qt::Label.new("&Interface:")
366
366
  int_label.setBuddy(interfaces)
367
367
  layout.addWidget(int_label, 0, 0)
368
368
 
369
369
  file_line = Qt::LineEdit.new(@send_raw_dir)
370
370
  file_line.setMinimumSize(250, 0)
371
- file_label = Qt::Label.new(tr("&Filename:"))
371
+ file_label = Qt::Label.new("&Filename:")
372
372
  file_label.setBuddy(file_line)
373
373
  get_file = Qt::PushButton.new("Select")
374
374
  file_layout = Qt::BoxLayout.new(Qt::Horizontal)
@@ -376,7 +376,7 @@ module Cosmos
376
376
  file_layout.addWidget(file_line)
377
377
  get_file.connect(SIGNAL('clicked()')) do
378
378
  Cosmos.set_working_dir do
379
- file_line.text = Qt::FileDialog::getOpenFileName(self, "Select File", @send_raw_dir, tr("Binary Files (*.bin);;All Files (*)"))
379
+ file_line.text = Qt::FileDialog::getOpenFileName(self, "Select File", @send_raw_dir, "Binary Files (*.bin);;All Files (*)")
380
380
  end
381
381
  end
382
382
 
@@ -569,7 +569,7 @@ module Cosmos
569
569
  end
570
570
 
571
571
  # Clear Status Bar
572
- statusBar.showMessage(tr(""))
572
+ statusBar.showMessage("")
573
573
 
574
574
  target_name = @target_select.text
575
575
  target = System.targets[target_name]
@@ -755,15 +755,15 @@ module Cosmos
755
755
  if target_name.length > 0 && packet_name.length > 0 && item_name.length > 0
756
756
  menu = Qt::Menu.new()
757
757
 
758
- details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
759
- details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
758
+ details_action = Qt::Action.new("Details #{target_name} #{packet_name} #{item_name}", self)
759
+ details_action.statusTip = "Popup details about #{target_name} #{packet_name} #{item_name}"
760
760
  details_action.connect(SIGNAL('triggered()')) do
761
761
  CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
762
762
  end
763
763
  menu.addAction(details_action)
764
764
 
765
- file_chooser_action = Qt::Action.new(tr("Insert Filename"), self)
766
- file_chooser_action.statusTip = tr("Select a file and place its name into this parameter")
765
+ file_chooser_action = Qt::Action.new("Insert Filename", self)
766
+ file_chooser_action.statusTip = "Select a file and place its name into this parameter"
767
767
  file_chooser_action.connect(SIGNAL('triggered()')) do
768
768
  filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
769
769
  if filename && !filename.empty?
@@ -11,14 +11,15 @@
11
11
  require 'time'
12
12
  require 'cosmos'
13
13
  Cosmos.catch_fatal_exception do
14
- require 'cosmos/script'
15
- require 'cosmos/config/config_parser'
16
14
  require 'cosmos/gui/qt_tool'
17
15
  require 'cosmos/gui/utilities/script_module_gui'
18
16
  require 'cosmos/gui/dialogs/splash'
19
17
  require 'cosmos/gui/widgets/realtime_button_bar'
20
18
  require 'cosmos/gui/choosers/file_chooser'
19
+ require 'cosmos/config/config_parser'
21
20
  require 'cosmos/tools/cmd_sequence/sequence_list'
21
+ require 'cosmos/gui/widgets/full_text_search_line_edit'
22
+ require 'cosmos/script'
22
23
  end
23
24
 
24
25
  module Cosmos
@@ -85,6 +86,20 @@ module Cosmos
85
86
  @target_select.setCurrentText(options.packet[0]) if options.packet
86
87
  update_commands()
87
88
  @cmd_select.setCurrentText(options.packet[1]) if options.packet
89
+
90
+ # Handle searching entries
91
+ @search_box.completion_list = System.commands.all_packet_strings(true, splash)
92
+ @search_box.callback = lambda do |cmd|
93
+ split_cmd = cmd.split(" ")
94
+ if split_cmd.length == 2
95
+ target_name = split_cmd[0].upcase
96
+ @target_select.setCurrentText(target_name)
97
+ update_commands()
98
+ command_name = split_cmd[1]
99
+ @cmd_select.setCurrentText(command_name)
100
+ add_command()
101
+ end
102
+ end
88
103
  end
89
104
  # Unconfigure CosmosConfig to interact with splash screen
90
105
  ConfigParser.splash = nil
@@ -96,59 +111,59 @@ module Cosmos
96
111
  def initialize_actions
97
112
  super()
98
113
 
99
- @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), tr('&New'), self)
100
- @file_new_keyseq = Qt::KeySequence.new(tr('Ctrl+N'))
114
+ @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), '&New', self)
115
+ @file_new_keyseq = Qt::KeySequence.new('Ctrl+N')
101
116
  @file_new.shortcut = @file_new_keyseq
102
- @file_new.statusTip = tr('Start a new sequence')
117
+ @file_new.statusTip = 'Start a new sequence'
103
118
  @file_new.connect(SIGNAL('triggered()')) { file_new() }
104
119
 
105
- @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save'), self)
106
- @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
120
+ @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), '&Save', self)
121
+ @file_save_keyseq = Qt::KeySequence.new('Ctrl+S')
107
122
  @file_save.shortcut = @file_save_keyseq
108
- @file_save.statusTip = tr('Save the sequence')
123
+ @file_save.statusTip = 'Save the sequence'
109
124
  @file_save.connect(SIGNAL('triggered()')) { file_save(false) }
110
125
 
111
- @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), tr('Save &As'), self)
112
- @file_save_as.statusTip = tr('Save the sequence')
126
+ @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), 'Save &As', self)
127
+ @file_save_as.statusTip = 'Save the sequence'
113
128
  @file_save_as.connect(SIGNAL('triggered()')) { file_save(true) }
114
129
 
115
- @file_export = Qt::Action.new(tr('&Export Sequence'), self)
116
- @file_export.shortcut = Qt::KeySequence.new(tr('Ctrl+E'))
117
- @file_export.statusTip = tr('Export the current sequence to a custom binary format')
130
+ @file_export = Qt::Action.new('&Export Sequence', self)
131
+ @file_export.shortcut = Qt::KeySequence.new('Ctrl+E')
132
+ @file_export.statusTip = 'Export the current sequence to a custom binary format'
118
133
  @file_export.connect(SIGNAL('triggered()')) { file_export() }
119
134
 
120
- @show_ignored = Qt::Action.new(tr('&Show Ignored Parameters'), self)
121
- @show_ignored.statusTip = tr('Show ignored parameters which are normally hidden')
135
+ @show_ignored = Qt::Action.new('&Show Ignored Parameters', self)
136
+ @show_ignored.statusTip = 'Show ignored parameters which are normally hidden'
122
137
  @show_ignored.setCheckable(true)
123
138
  @show_ignored.setChecked(false)
124
139
  @show_ignored.connect(SIGNAL('toggled(bool)')) do |bool|
125
140
  @sequence_list.map {|item| item.show_ignored(bool) }
126
141
  end
127
142
 
128
- @states_in_hex = Qt::Action.new(tr('&Display State Values in Hex'), self)
129
- @states_in_hex.statusTip = tr('Display states values in hex instead of decimal')
143
+ @states_in_hex = Qt::Action.new('&Display State Values in Hex', self)
144
+ @states_in_hex.statusTip = 'Display states values in hex instead of decimal'
130
145
  @states_in_hex.setCheckable(true)
131
146
  @states_in_hex.setChecked(false)
132
147
  @states_in_hex.connect(SIGNAL('toggled(bool)')) do |bool|
133
148
  @sequence_list.map {|item| item.states_in_hex(bool) }
134
149
  end
135
150
 
136
- @expand_action = Qt::Action.new(tr('&Expand All'), self)
137
- @expand_action.statusTip = tr('Expand all currently visible commands')
151
+ @expand_action = Qt::Action.new('&Expand All', self)
152
+ @expand_action.statusTip = 'Expand all currently visible commands'
138
153
  @expand_action.connect(SIGNAL('triggered()')) do
139
154
  @sequence_list.map {|item| item.expand }
140
155
  end
141
156
 
142
- @collapse_action = Qt::Action.new(tr('&Collapse All'), self)
143
- @collapse_action.statusTip = tr('Collapse all currently visible commands')
157
+ @collapse_action = Qt::Action.new('&Collapse All', self)
158
+ @collapse_action.statusTip = 'Collapse all currently visible commands'
144
159
  @collapse_action.connect(SIGNAL('triggered()')) do
145
160
  @sequence_list.map {|item| item.collapse }
146
161
  end
147
162
 
148
- @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), tr('&Toggle Disconnect'), self)
149
- @script_disconnect_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
163
+ @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), '&Toggle Disconnect', self)
164
+ @script_disconnect_keyseq = Qt::KeySequence.new('Ctrl+T')
150
165
  @script_disconnect.shortcut = @script_disconnect_keyseq
151
- @script_disconnect.statusTip = tr('Toggle disconnect from the server')
166
+ @script_disconnect.statusTip = 'Toggle disconnect from the server'
152
167
  @script_disconnect.connect(SIGNAL('triggered()')) do
153
168
  @server_config_file ||= CmdTlmServer::DEFAULT_CONFIG_FILE
154
169
  @server_config_file = toggle_disconnect(@server_config_file)
@@ -157,15 +172,15 @@ module Cosmos
157
172
 
158
173
  # Create the application menus and assign the actions
159
174
  def initialize_menus
160
- file_menu = menuBar.addMenu(tr('&File'))
175
+ file_menu = menuBar.addMenu('&File')
161
176
  file_menu.addAction(@file_new)
162
177
 
163
178
  open_action = Qt::Action.new(self)
164
- open_action.shortcut = Qt::KeySequence.new(tr('Ctrl+O'))
179
+ open_action.shortcut = Qt::KeySequence.new('Ctrl+O')
165
180
  open_action.connect(SIGNAL('triggered()')) { file_open(@sequence_dir) }
166
181
  self.addAction(open_action)
167
182
 
168
- file_open = file_menu.addMenu(tr('&Open'))
183
+ file_open = file_menu.addMenu('&Open')
169
184
  file_open.setIcon(Cosmos.get_icon('open.png'))
170
185
  target_dirs_action(file_open, System.paths['SEQUENCES'], 'sequences', method(:file_open))
171
186
 
@@ -178,7 +193,7 @@ module Cosmos
178
193
  file_menu.addSeparator()
179
194
  file_menu.addAction(@exit_action)
180
195
 
181
- action_menu = menuBar.addMenu(tr('&Actions'))
196
+ action_menu = menuBar.addMenu('&Actions')
182
197
  action_menu.addAction(@show_ignored)
183
198
  action_menu.addAction(@states_in_hex)
184
199
  action_menu.addSeparator()
@@ -205,27 +220,25 @@ module Cosmos
205
220
  @realtime_button_bar.state = 'Stopped'
206
221
  central_layout.addWidget(@realtime_button_bar)
207
222
 
223
+ # Mnemonic Search Box
224
+ @search_box = FullTextSearchLineEdit.new(self)
225
+ central_layout.addWidget(@search_box)
226
+
208
227
  @target_select = Qt::ComboBox.new
209
228
  @target_select.setMaxVisibleItems(6)
210
229
  @target_select.connect(SIGNAL('activated(const QString&)')) do |target|
211
230
  target_changed()
212
231
  end
213
- target_label = Qt::Label.new(tr("&Target:"))
232
+ target_label = Qt::Label.new("&Target:")
214
233
  target_label.setBuddy(@target_select)
215
234
 
216
235
  @cmd_select = Qt::ComboBox.new
217
236
  @cmd_select.setMaxVisibleItems(20)
218
- cmd_label = Qt::Label.new(tr("&Command:"))
237
+ cmd_label = Qt::Label.new("&Command:")
219
238
  cmd_label.setBuddy(@cmd_select)
220
239
 
221
240
  add = Qt::PushButton.new("Add")
222
- add.connect(SIGNAL('clicked()')) do
223
- command = System.commands.packet(@target_select.text, @cmd_select.text).dup
224
- command.restore_defaults
225
- item = @sequence_list.add(command)
226
- item.show_ignored(@show_ignored.isChecked())
227
- item.states_in_hex(@states_in_hex.isChecked())
228
- end
241
+ add.connect(SIGNAL('clicked()')) { add_command() }
229
242
 
230
243
  # Layout the target and command selection with Add button
231
244
  select_layout = Qt::HBoxLayout.new
@@ -264,10 +277,22 @@ module Cosmos
264
277
  splitter.setStretchFactor(1,0)
265
278
  end
266
279
 
280
+ def add_command
281
+ command = System.commands.packet(@target_select.text, @cmd_select.text).dup
282
+ command.restore_defaults
283
+ item = @sequence_list.add(command)
284
+ item.show_ignored(@show_ignored.isChecked())
285
+ item.states_in_hex(@states_in_hex.isChecked())
286
+ end
287
+
267
288
  # Export the sequence list into a custom binary format
268
289
  def file_export
269
290
  return if @sequence_list.empty? || @exporter.nil?
270
- @exporter.export(@filename, @sequence_dir, @sequence_list)
291
+ begin
292
+ @exporter.export(@filename, @sequence_dir, @sequence_list)
293
+ rescue => error
294
+ ExceptionDialog.new(self, error, 'Export Error', false)
295
+ end
271
296
  end
272
297
 
273
298
  # Clears the sequence list
@@ -341,7 +366,7 @@ module Cosmos
341
366
  # process when creating the disconnected server
342
367
  def toggle_disconnect(config_file, ask_for_config_file = true)
343
368
  dialog = Qt::Dialog.new(self, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
344
- dialog.setWindowTitle(tr("Disconnect Settings"))
369
+ dialog.setWindowTitle("Disconnect Settings")
345
370
  dialog_layout = Qt::VBoxLayout.new
346
371
  dialog_layout.addWidget(Qt::Label.new("Targets checked will be disconnected."))
347
372
 
@@ -431,7 +456,7 @@ module Cosmos
431
456
  Splash.execute(self) do |splash|
432
457
  ConfigParser.splash = splash
433
458
  splash.message = "Initializing Command and Telemetry Server"
434
- set_disconnected_targets(targets, config_file)
459
+ set_disconnected_targets(targets, targets.length == all_targets.length, config_file)
435
460
  ConfigParser.splash = nil
436
461
  end
437
462
  end
@@ -246,7 +246,7 @@ module Cosmos
246
246
  @parameters = Qt::Widget.new
247
247
  parameters_layout = Qt::VBoxLayout.new
248
248
  # Command Description Label
249
- dec_label = Qt::Label.new(tr("Description:"))
249
+ dec_label = Qt::Label.new("Description:")
250
250
  description = Qt::Label.new(@command.description)
251
251
  description.setWordWrap(true)
252
252
  desc_layout = Qt::HBoxLayout.new
@@ -254,7 +254,7 @@ module Cosmos
254
254
  desc_layout.addWidget(description, 1)
255
255
  parameters_layout.addLayout(desc_layout)
256
256
 
257
- param_label = Qt::Label.new(tr("Parameters:"))
257
+ param_label = Qt::Label.new("Parameters:")
258
258
  parameters_layout.addWidget(param_label)
259
259
  @table_layout = Qt::VBoxLayout.new
260
260
  parameters_layout.addLayout(@table_layout, 500)
@@ -456,15 +456,15 @@ module Cosmos
456
456
  if target_name.length > 0 && packet_name.length > 0 && item_name.length > 0
457
457
  menu = Qt::Menu.new()
458
458
 
459
- details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
460
- details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
459
+ details_action = Qt::Action.new("Details #{target_name} #{packet_name} #{item_name}", self)
460
+ details_action.statusTip = "Popup details about #{target_name} #{packet_name} #{item_name}"
461
461
  details_action.connect(SIGNAL('triggered()')) do
462
462
  CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
463
463
  end
464
464
  menu.addAction(details_action)
465
465
 
466
- file_chooser_action = Qt::Action.new(tr("Insert Filename"), self)
467
- file_chooser_action.statusTip = tr("Select a file and place its name into this parameter")
466
+ file_chooser_action = Qt::Action.new("Insert Filename", self)
467
+ file_chooser_action.statusTip = "Select a file and place its name into this parameter"
468
468
  file_chooser_action.connect(SIGNAL('triggered()')) do
469
469
  filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
470
470
  if filename && !filename.empty?
@@ -349,7 +349,20 @@ module Cosmos
349
349
  def get_cmd_value(target_name, command_name, parameter_name, value_type = :CONVERTED)
350
350
  packet = System.commands.packet(target_name, command_name)
351
351
  # Virtually support RECEIVED_TIMEFORMATTED, RECEIVED_TIMESECONDS, RECEIVED_COUNT
352
+ # Also PACKET_TIMEFORMATTED and PACKET_TIMESECONDS
352
353
  case parameter_name.to_s.upcase
354
+ when 'PACKET_TIMEFORMATTED'
355
+ if packet.packet_time
356
+ return packet.packet_time.formatted
357
+ else
358
+ return 'No Packet Time'
359
+ end
360
+ when 'PACKET_TIMESECONDS'
361
+ if packet.packet_time
362
+ return packet.packet_time.to_f
363
+ else
364
+ return 0.0
365
+ end
353
366
  when 'RECEIVED_TIMEFORMATTED'
354
367
  if packet.received_time
355
368
  return packet.received_time.formatted