cosmos 4.2.4-java → 4.3.0-java

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 (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
@@ -19,7 +19,8 @@ module Cosmos
19
19
  # Packet adds is the ability to apply formatting to PacketItem values as well
20
20
  # as managing PacketItem's limit states.
21
21
  class Packet < Structure
22
- RESERVED_ITEM_NAMES = ['RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
22
+ RESERVED_ITEM_NAMES = ['PACKET_TIMESECONDS'.freeze, 'PACKET_TIMEFORMATTED'.freeze, 'RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
23
+ CATCH_ALL_STATE = 'ANY'
23
24
 
24
25
  # @return [String] Name of the target this packet is associated with
25
26
  attr_reader :target_name
@@ -66,6 +67,12 @@ module Cosmos
66
67
  # @return [Boolean] Whether or not this is a 'abstract' packet
67
68
  attr_accessor :abstract
68
69
 
70
+ # @return [Boolean] Whether or not this was a stored packet
71
+ attr_accessor :stored
72
+
73
+ # @return [Hash] Extra data to be logged/transferred with packet
74
+ attr_accessor :extra
75
+
69
76
  # Valid format types
70
77
  VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
71
78
 
@@ -100,6 +107,8 @@ module Cosmos
100
107
  @meta = nil
101
108
  @hidden = false
102
109
  @disabled = false
110
+ @stored = false
111
+ @extra = nil
103
112
  end
104
113
 
105
114
  # Sets the target name this packet is associated with. Unidentified packets
@@ -207,6 +216,17 @@ module Cosmos
207
216
  end
208
217
  end # if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
209
218
 
219
+ # Returns @received_time unless a packet item called PACKET_TIME exists that returns
220
+ # a Ruby Time object that represents a different timestamp for the packet
221
+ def packet_time
222
+ item = @items['PACKET_TIME'.freeze]
223
+ if item
224
+ return read_item(item, :CONVERTED, @buffer)
225
+ else
226
+ return @received_time
227
+ end
228
+ end
229
+
210
230
  # Calculates a unique MD5Sum that changes if the parts of the packet configuration change that could affect
211
231
  # the "shape" of the packet. This value is cached and that packet should not be changed if this method is being used
212
232
  def config_name
@@ -529,6 +549,8 @@ module Cosmos
529
549
  value = value.map do |val, index|
530
550
  if item.states.key(val)
531
551
  item.states.key(val)
552
+ elsif item.states.values.include?(CATCH_ALL_STATE)
553
+ item.states.key(CATCH_ALL_STATE)
532
554
  else
533
555
  apply_format_string_and_units(item, val, value_type)
534
556
  end
@@ -537,6 +559,8 @@ module Cosmos
537
559
  state_value = item.states.key(value)
538
560
  if state_value
539
561
  value = state_value
562
+ elsif item.states.values.include?(CATCH_ALL_STATE)
563
+ value = item.states.key(CATCH_ALL_STATE)
540
564
  else
541
565
  value = apply_format_string_and_units(item, value, value_type)
542
566
  end
@@ -670,6 +694,12 @@ module Cosmos
670
694
 
671
695
  # Define the reserved items on the current telemetry packet
672
696
  def define_reserved_items
697
+ item = define_item('PACKET_TIMESECONDS', 0, 0, :DERIVED, nil, @default_endianness,
698
+ :ERROR, '%0.6f', PacketTimeSecondsConversion.new)
699
+ item.description = 'COSMOS Packet Time (UTC, Floating point, Unix epoch)'
700
+ item = define_item('PACKET_TIMEFORMATTED', 0, 0, :DERIVED, nil, @default_endianness,
701
+ :ERROR, nil, PacketTimeFormattedConversion.new)
702
+ item.description = 'COSMOS Packet Time (Local time zone, Formatted string)'
673
703
  item = define_item('RECEIVED_TIMESECONDS', 0, 0, :DERIVED, nil, @default_endianness,
674
704
  :ERROR, '%0.6f', ReceivedTimeSecondsConversion.new)
675
705
  item.description = 'COSMOS Received Time (UTC, Floating point, Unix epoch)'
@@ -750,7 +780,8 @@ module Cosmos
750
780
  def check_limits(limits_set = :DEFAULT, ignore_persistence = false)
751
781
  # If check_limits is being called, then a new packet has arrived and
752
782
  # this packet is no longer stale
753
- if @stale
783
+ # Stored telemetry doesn't affect the current value table and such doesn't affect stale
784
+ if @stale and !@stored
754
785
  @stale = false
755
786
  set_all_limits_states(nil)
756
787
  end
@@ -786,6 +817,8 @@ module Cosmos
786
817
 
787
818
  @received_time = nil
788
819
  @received_count = 0
820
+ @stored = false
821
+ @extra = nil
789
822
  if @read_conversion_cache
790
823
  synchronize() do
791
824
  @read_conversion_cache.clear
@@ -811,6 +844,7 @@ module Cosmos
811
844
  end
812
845
  end
813
846
  packet.instance_variable_set("@read_conversion_cache".freeze, nil)
847
+ packet.extra = JSON.parse(packet.extra.to_json) if packet.extra # Deep copy using JSON
814
848
  packet
815
849
  end
816
850
  alias dup clone
@@ -472,7 +472,6 @@ module Cosmos
472
472
 
473
473
  # Define the units of the current telemetry item
474
474
  when 'UNITS'
475
- raise parser.error("Items with STATE can't define UNITS") if @current_item.states
476
475
  usage = "UNITS <FULL UNITS NAME> <ABBREVIATED UNITS NAME>"
477
476
  parser.verify_num_parameters(2, 2, usage)
478
477
  @current_item.units_full = params[0]
@@ -14,7 +14,6 @@ module Cosmos
14
14
  # @param parser [ConfigParser] Configuration parser
15
15
  # @param item [Packet] The current item
16
16
  def self.parse(parser, item)
17
- raise parser.error("Items with STATE can't define FORMAT_STRING") if item.states
18
17
  @parser = FormatStringParser.new(parser)
19
18
  @parser.verify_parameters()
20
19
  @parser.create_format_string(item)
@@ -650,7 +650,7 @@ module Cosmos
650
650
  if base_packet
651
651
  count = 0
652
652
  base_packet.sorted_items.each do |item|
653
- unless ['RECEIVED_TIMESECONDS', 'RECEIVED_TIMEFORMATTED', 'RECEIVED_COUNT'].include?(item.name)
653
+ unless ['PACKET_TIMESECONDS', 'PACKET_TIMEFORMATTED', 'RECEIVED_TIMESECONDS', 'RECEIVED_TIMEFORMATTED', 'RECEIVED_COUNT'].include?(item.name)
654
654
  begin
655
655
  @current_packet.get_item(item.name)
656
656
  rescue
@@ -290,6 +290,8 @@ module Cosmos
290
290
  identified_packet = identified_packet.clone
291
291
  identified_packet.buffer = packet.buffer
292
292
  identified_packet.received_time = packet.received_time
293
+ identified_packet.stored = packet.stored
294
+ identified_packet.extra = packet.extra
293
295
  return identified_packet
294
296
  end
295
297
 
@@ -302,6 +304,8 @@ module Cosmos
302
304
  identified_packet = identified_packet.clone
303
305
  identified_packet.buffer = packet.buffer
304
306
  identified_packet.received_time = packet.received_time
307
+ identified_packet.stored = packet.stored
308
+ identified_packet.extra = packet.extra
305
309
  return identified_packet
306
310
  end
307
311
 
@@ -789,6 +789,8 @@ module Cosmos
789
789
  def cosmos_script_sleep(sleep_time = nil)
790
790
  return false if $disconnected_targets
791
791
  if defined? ScriptRunnerFrame and ScriptRunnerFrame.instance
792
+ ScriptRunnerFrame.instance.active_script_highlight('green')
793
+
792
794
  sleep_time = 30000000 unless sleep_time # Handle infinite wait
793
795
  if sleep_time > 0.0
794
796
  end_time = Time.now.sys + sleep_time
@@ -98,6 +98,10 @@ module Cosmos
98
98
  if result[0] == :LIMITS_CHANGE
99
99
  result[1][3] = result[1][3].to_s.intern if result[1][3]
100
100
  result[1][4] = result[1][4].to_s.intern if result[1][4]
101
+ if result[1][5] and result[1][6]
102
+ result[1][5] = Time.at(result[1][5], result[1][6]).sys
103
+ result[1].delete_at(6)
104
+ end
101
105
  elsif result[0] == :LIMITS_SETTINGS
102
106
  result[1][3] = result[1][3].to_s.intern if result[1][3]
103
107
  elsif result[0] == :STALE_PACKET
@@ -21,6 +21,7 @@ require 'cosmos/script/tools'
21
21
 
22
22
  $cmd_tlm_server = nil
23
23
  $disconnected_targets = nil
24
+ $disconnect_all_targets = false
24
25
  $cmd_tlm_replay_mode = false
25
26
 
26
27
  module Cosmos
@@ -58,16 +59,6 @@ module Cosmos
58
59
  # us to proxy the methods to either the disconnected CmdTlmServer object
59
60
  # or to the real server through the JsonDRbObject.
60
61
  def method_missing(method_name, *method_params)
61
- if $disconnected_targets && method_params[0].is_a?(String)
62
- if method_params.length == 1
63
- target = method_params[0].split(" ")[0]
64
- else
65
- target = method_params[0]
66
- end
67
- if $disconnected_targets.include?(target)
68
- return @disconnected.send(method_name, *method_params)
69
- end
70
- end
71
62
  # Must call shutdown and disconnect on the JsonDrbObject itself
72
63
  # to avoid it being sent to the CmdTlmServer
73
64
  case method_name
@@ -77,6 +68,28 @@ module Cosmos
77
68
  when :disconnect
78
69
  @cmd_tlm_server.disconnect
79
70
  else
71
+ if $disconnect_all_targets
72
+ return @disconnected.send(method_name, *method_params)
73
+ elsif $disconnected_targets
74
+ name_string = nil
75
+ if method_params[0].is_a?(String)
76
+ name_string = method_params[0]
77
+ elsif method_params[0].is_a?(Array)
78
+ if method_params[0][0].is_a?(Array)
79
+ if method_params[0][0][0].is_a?(String)
80
+ name_string = method_params[0][0][0]
81
+ end
82
+ elsif method_params[0][0].is_a?(String)
83
+ name_string = method_params[0][0]
84
+ end
85
+ end
86
+ if name_string
87
+ target = name_string.split(" ")[0]
88
+ if $disconnected_targets.include?(target)
89
+ return @disconnected.send(method_name, *method_params)
90
+ end
91
+ end
92
+ end
80
93
  @cmd_tlm_server.method_missing(method_name, *method_params)
81
94
  end
82
95
  end
@@ -95,6 +108,7 @@ module Cosmos
95
108
  # Called when this module is mixed in using "include Cosmos::Script"
96
109
  def self.included(base)
97
110
  $disconnected_targets = nil
111
+ $disconnect_all_targets = false
98
112
  $cmd_tlm_replay_mode = false
99
113
  $cmd_tlm_server = nil
100
114
  initialize_script_module()
@@ -109,8 +123,9 @@ module Cosmos
109
123
  $cmd_tlm_server.shutdown if $cmd_tlm_server
110
124
  end
111
125
 
112
- def set_disconnected_targets(targets, config_file = CmdTlmServer::DEFAULT_CONFIG_FILE)
126
+ def set_disconnected_targets(targets, all = false, config_file = CmdTlmServer::DEFAULT_CONFIG_FILE)
113
127
  $disconnected_targets = targets
128
+ $disconnect_all_targets = all
114
129
  initialize_script_module(config_file)
115
130
  end
116
131
 
@@ -120,6 +135,7 @@ module Cosmos
120
135
 
121
136
  def clear_disconnected_targets
122
137
  $disconnected_targets = nil
138
+ $disconnect_all_targets = false
123
139
  end
124
140
 
125
141
  def script_disconnect
@@ -203,12 +203,14 @@ module Cosmos
203
203
  packet = nil
204
204
  # The get_packet_data above returns a Ruby time after the packet_name.
205
205
  # This is different from the API.s
206
- buffer, target_name, packet_name, time, rx_count = get_packet_data(id, non_block)
206
+ buffer, target_name, packet_name, time, rx_count, stored, extra = get_packet_data(id, non_block)
207
207
  if buffer
208
208
  packet = System.telemetry.packet(target_name, packet_name).clone
209
209
  packet.buffer = buffer
210
210
  packet.received_time = time
211
211
  packet.received_count = rx_count
212
+ packet.stored = stored
213
+ packet.extra = extra
212
214
  end
213
215
  packet
214
216
  end
@@ -67,20 +67,20 @@ module Cosmos
67
67
  # Methods for debugging
68
68
  #######################################
69
69
 
70
- def insert_return(*params)
71
- _ensure_script_runner_frame do
72
- ScriptRunnerFrame.instance.inline_return = true
73
- ScriptRunnerFrame.instance.inline_return_params = params
74
- end
75
- end
76
-
77
70
  def step_mode
78
71
  if defined? ScriptRunnerFrame
72
+ # Ensure the Frame has toggled to debug so the user can see the Step button
73
+ _ensure_script_runner_frame do
74
+ Qt.execute_in_main_thread do
75
+ ScriptRunnerFrame.instance.toggle_debug(true)
76
+ end
77
+ end
79
78
  ScriptRunnerFrame.step_mode = true
80
79
  end
81
80
  end
82
81
 
83
82
  def run_mode
83
+ # Run mode simply disables step mode. Debug frame may or may not be displayed.
84
84
  if defined? ScriptRunnerFrame
85
85
  ScriptRunnerFrame.step_mode = false
86
86
  end
@@ -104,7 +104,17 @@ module Cosmos
104
104
  # Get a specific screen definition
105
105
  def get_screen_definition(screen_full_name, config_filename = nil, force_refresh = false)
106
106
  $cmd_tlm_server.get_screen_definition(screen_full_name, config_filename, force_refresh)
107
- end
107
+ end
108
+
109
+ # Show a local telemetry screen
110
+ def local_screen(title = 'Local Screen', screen_def = nil, x_pos = nil, y_pos = nil, &block)
111
+ # See script_module_gui.rb
112
+ end
113
+
114
+ # Close all local telemetry screens
115
+ def close_local_screens
116
+ # See script_module_gui.rb
117
+ end
108
118
 
109
119
  end # module Script
110
120
 
@@ -71,6 +71,8 @@ module Cosmos
71
71
  # calculation in addition to the cmd/tlm definition files that are
72
72
  # automatically included
73
73
  instance_attr_reader :additional_md5_files
74
+ # @return [Hash<String,String>] Hash of the text/color to use for the classificaiton banner
75
+ instance_attr_reader :classificiation_banner
74
76
 
75
77
  # Known COSMOS ports
76
78
  KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED', 'CTS_CMD_ROUTER', 'REPLAY_API', 'REPLAY_PREIDENTIFIED', 'REPLAY_CMD_ROUTER', 'DART_STREAM', 'DART_DECOM']
@@ -337,6 +339,25 @@ module Cosmos
337
339
  raise "Missing expected file: #{parameters[0]}"
338
340
  end
339
341
 
342
+ when 'CLASSIFICATION'
343
+ parser.verify_num_parameters(2, 4, "#{keyword} <Display_Text> <Color Name|Red> <Green> <Blue>")
344
+ # Determine if the COSMOS color already exists, otherwise create a new one
345
+ if Cosmos.constants.include? parameters[1].upcase.to_sym
346
+ # We were given a named color that already exists in COSMOS
347
+ color = eval("Cosmos::#{parameters[1].upcase}")
348
+ else
349
+ if parameters.length < 4
350
+ # We were given a named color, but it didn't exist in COSMOS already
351
+ color = Cosmos::getColor(parameters[1].upcase)
352
+ else
353
+ # We were given RGB values
354
+ color = Cosmos::getColor(parameters[1], parameters[2], parameters[3])
355
+ end
356
+ end
357
+
358
+ @classificiation_banner = {'display_text' => parameters[0],
359
+ 'color' => color}
360
+
340
361
  else
341
362
  # blank lines will have a nil keyword and should not raise an exception
342
363
  raise parser.error("Unknown keyword '#{keyword}'") if keyword
@@ -62,25 +62,25 @@ module Cosmos
62
62
  super()
63
63
 
64
64
  # File Menu Actions
65
- @analyze_log = Qt::Action.new(tr('&Analyze Logs'), self)
66
- @analyze_log.statusTip = tr('Analyze log file packet counts')
65
+ @analyze_log = Qt::Action.new('&Analyze Logs', self)
66
+ @analyze_log.statusTip = 'Analyze log file packet counts'
67
67
  @analyze_log.connect(SIGNAL('triggered()')) { analyze_log_files() }
68
68
 
69
69
  # Mode Menu Actions
70
- @include_raw = Qt::Action.new(tr('Include &Raw Data'), self)
71
- @include_raw_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
70
+ @include_raw = Qt::Action.new('Include &Raw Data', self)
71
+ @include_raw_keyseq = Qt::KeySequence.new('Ctrl+R')
72
72
  @include_raw.shortcut = @include_raw_keyseq
73
- @include_raw.statusTip = tr('Include raw packet data in the text output')
73
+ @include_raw.statusTip = 'Include raw packet data in the text output'
74
74
  @include_raw.setCheckable(true)
75
75
  end
76
76
 
77
77
  # Create the File and Mode menus and initialize the Help menu
78
78
  def initialize_menus
79
- @file_menu = menuBar.addMenu(tr('&File'))
79
+ @file_menu = menuBar.addMenu('&File')
80
80
  @file_menu.addAction(@analyze_log)
81
81
  @file_menu.addSeparator()
82
82
  @file_menu.addAction(@exit_action)
83
- @mode_menu = menuBar.addMenu(tr('&Mode'))
83
+ @mode_menu = menuBar.addMenu('&Mode')
84
84
  @mode_menu.addAction(@include_raw)
85
85
  @about_string = "Command Extractor extracts commands from a binary command log file into a human readable text file."
86
86
  initialize_help_menu()
@@ -102,20 +102,20 @@ module Cosmos
102
102
  @data_source_layout.addWidget(label)
103
103
  @log_file_radio = Qt::RadioButton.new("Log File", self)
104
104
  @log_file_radio.setChecked(true)
105
- @log_file_radio.connect(SIGNAL('clicked()')) do
105
+ @log_file_radio.connect(SIGNAL('clicked()')) do
106
106
  @packet_log_frame.show_log_fields(true)
107
107
  @packet_log_frame.output_filename = ""
108
- @dart_meta_frame.hide
108
+ @dart_meta_frame.hide
109
109
  @resize_timer.start(100)
110
110
  end
111
111
  @data_source_layout.addWidget(@log_file_radio)
112
112
  @dart_radio = Qt::RadioButton.new("DART Database", self)
113
- @dart_radio.connect(SIGNAL('clicked()')) do
113
+ @dart_radio.connect(SIGNAL('clicked()')) do
114
114
  @packet_log_frame.show_log_fields(false)
115
115
  @packet_log_frame.output_filename = ""
116
116
  @dart_meta_frame.show
117
117
  @resize_timer.start(100)
118
- end
118
+ end
119
119
  @data_source_layout.addWidget(@dart_radio)
120
120
  @data_source_layout.addStretch()
121
121
  @top_layout.addLayout(@data_source_layout)
@@ -176,14 +176,14 @@ module Cosmos
176
176
  @time_start = @packet_log_frame.time_start
177
177
  @time_end = @packet_log_frame.time_end
178
178
  @packet_log_reader = @packet_log_frame.packet_log_reader
179
- @input_filenames = @packet_log_frame.filenames.sort
179
+ @input_filenames = @packet_log_frame.filenames.sort
180
180
  @output_filename = @packet_log_frame.output_filename
181
181
  @output_filename = nil if @output_filename.strip.empty?
182
182
  @meta_filters = @dart_meta_frame.meta_filters
183
183
 
184
184
  return unless pre_process_tests()
185
185
 
186
- include_raw = @include_raw.isChecked
186
+ include_raw = @include_raw.isChecked
187
187
  if @log_file_radio.isChecked
188
188
  begin
189
189
  ProgressDialog.execute(self, # parent
@@ -214,8 +214,8 @@ module Cosmos
214
214
  ProgressDialog.execute(self, # parent
215
215
  'Log File Progress', # title
216
216
  600, # width, height
217
- 300,
218
- true, # Overall progress, no step progress
217
+ 300,
218
+ true, # Overall progress, no step progress
219
219
  false) do |progress_dialog|
220
220
  progress_dialog.cancel_callback = method(:cancel_callback)
221
221
  progress_dialog.enable_cancel_button
@@ -227,7 +227,7 @@ module Cosmos
227
227
  @interface.disconnect
228
228
  request_packet = Cosmos::Packet.new('DART', 'DART')
229
229
  request_packet.define_item('REQUEST', 0, 0, :BLOCK)
230
-
230
+
231
231
  @time_start ||= Time.utc(1970, 1, 1)
232
232
  @time_end ||= Time.now
233
233
  @time_delta = @time_end - @time_start
@@ -239,7 +239,7 @@ module Cosmos
239
239
  request['cmd_tlm'] = 'CMD'
240
240
  request['meta_filters'] = @meta_filters unless @meta_filters.empty?
241
241
  request_packet.write('REQUEST', JSON.dump(request))
242
-
242
+
243
243
  progress_dialog.append_text("Connecting to DART Database...")
244
244
  @interface.connect
245
245
  progress_dialog.append_text("Sending DART Database Query...")
@@ -260,11 +260,11 @@ module Cosmos
260
260
  # Switch to correct configuration from SYSTEM META when needed
261
261
  if packet.target_name == 'SYSTEM'.freeze and packet.packet_name == 'META'.freeze
262
262
  meta_packet = System.commands.packet('SYSTEM', 'META')
263
- meta_packet.buffer = packet.buffer
263
+ meta_packet.buffer = packet.buffer
264
264
  Cosmos::System.load_configuration(meta_packet.read('CONFIG'))
265
265
  elsif first
266
266
  first = false
267
- @time_start = packet.received_time
267
+ @time_start = packet.packet_time
268
268
  @time_delta = @time_end - @time_start
269
269
  end
270
270
 
@@ -273,6 +273,7 @@ module Cosmos
273
273
  defined_packet.received_time = packet.received_time
274
274
 
275
275
  output_file.puts "#{defined_packet.target_name} #{defined_packet.packet_name}"
276
+ output_file.puts " PACKET_TIMEFORMATTED: #{defined_packet.packet_time.formatted}"
276
277
  output_file.puts " RECEIVED_TIMEFORMATTED: #{defined_packet.received_time.formatted}"
277
278
  output_file.puts defined_packet.formatted(:WITH_UNITS, 2)
278
279
  if include_raw or !defined_packet.identified? or !defined_packet.defined?
@@ -281,10 +282,10 @@ module Cosmos
281
282
  end
282
283
  output_file.puts
283
284
 
284
- progress = ((@time_delta - (@time_end - defined_packet.received_time)).to_f / @time_delta.to_f)
285
+ progress = ((@time_delta - (@time_end - defined_packet.packet_time)).to_f / @time_delta.to_f)
285
286
  progress_dialog.set_overall_progress(progress) if !@cancel
286
287
  end
287
-
288
+
288
289
  end
289
290
  end
290
291
 
@@ -295,12 +296,12 @@ module Cosmos
295
296
  @open_button.setEnabled(true)
296
297
  end
297
298
  end
298
- end
299
+ end
299
300
  rescue => error
300
301
  Qt::MessageBox.critical(self, 'Error!', "Error Querying DART Database\n#{error.formatted}")
301
302
  ensure
302
303
  @interface.disconnect
303
- end
304
+ end
304
305
  end
305
306
  end # def process_data
306
307
 
@@ -333,8 +334,9 @@ module Cosmos
333
334
 
334
335
  break if @cancel
335
336
  progress_dialog.set_step_progress(@packet_log_reader.bytes_read / file_size)
337
+ output_file.puts "#{packet.target_name} #{packet.packet_name}"
336
338
  if packet.received_time
337
- output_file.puts "#{packet.target_name} #{packet.packet_name}"
339
+ output_file.puts " PACKET_TIMEFORMATTED: #{packet.packet_time.formatted}"
338
340
  output_file.puts " RECEIVED_TIMEFORMATTED: #{packet.received_time.formatted}"
339
341
  end
340
342
  output_file.puts packet.formatted(:WITH_UNITS, 2)