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
@@ -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)