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
@@ -41,20 +41,22 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
41
41
  end
42
42
 
43
43
  it "defers to the posix serial driver on nix" do
44
- class PosixSerialDriver
44
+ if RUBY_ENGINE == 'ruby'
45
+ class PosixSerialDriver
46
+ end
47
+ allow(Kernel).to receive(:is_windows?).and_return(false)
48
+ driver = double("PosixSerialDriver")
49
+ expect(driver).to receive(:close)
50
+ expect(driver).to receive(:closed?)
51
+ expect(driver).to receive(:write)
52
+ expect(driver).to receive(:read)
53
+ allow(PosixSerialDriver).to receive(:new).and_return(driver)
54
+ driver = SerialDriver.new('COM1',9600)
55
+ driver.close
56
+ driver.closed?
57
+ driver.write("hi")
58
+ driver.read
45
59
  end
46
- allow(Kernel).to receive(:is_windows?).and_return(false)
47
- driver = double("PosixSerialDriver")
48
- expect(driver).to receive(:close)
49
- expect(driver).to receive(:closed?)
50
- expect(driver).to receive(:write)
51
- expect(driver).to receive(:read)
52
- allow(PosixSerialDriver).to receive(:new).and_return(driver)
53
- driver = SerialDriver.new('COM1',9600)
54
- driver.close
55
- driver.closed?
56
- driver.write("hi")
57
- driver.read
58
60
  end
59
61
  end
60
62
  end
@@ -133,6 +133,34 @@ module Cosmos
133
133
  expect(pkt3.packet_name).to eql 'PKT3'
134
134
  @plr.close
135
135
  end
136
+
137
+ it "opens COSMOS2 log files" do
138
+ pkt = System.telemetry.packet("SYSTEM","LIMITS_CHANGE").clone
139
+ filename = File.join(@log_path,'test.bin')
140
+ File.open(filename,'wb') do |file|
141
+ file.write ("COSMOS2_CMD TEST " + (" " * 83))
142
+ file.write [1000,100,4,"TGT1",4,"PKT1"].pack('NNCA4CA4')
143
+ file.write [pkt.buffer.length].pack('N')
144
+ file.write pkt.buffer
145
+ file.write [1000,100,4,"TGT2",4,"PKT2"].pack('NNCA4CA4')
146
+ file.write [pkt.buffer.length].pack('N')
147
+ file.write pkt.buffer
148
+ file.write [1000,100,4,"TGT3",4,"PKT3"].pack('NNCA4CA4')
149
+ file.write [pkt.buffer.length].pack('N')
150
+ file.write pkt.buffer
151
+ end
152
+ expect(@plr.open(filename)).to eql [false, nil]
153
+ pkt1 = @plr.read
154
+ expect(pkt1.target_name).to eql 'TGT1'
155
+ expect(pkt1.packet_name).to eql 'PKT1'
156
+ pkt2 = @plr.read
157
+ expect(pkt2.target_name).to eql 'TGT2'
158
+ expect(pkt2.packet_name).to eql 'PKT2'
159
+ pkt3 = @plr.read
160
+ expect(pkt3.target_name).to eql 'TGT3'
161
+ expect(pkt3.packet_name).to eql 'PKT3'
162
+ @plr.close
163
+ end
136
164
  end
137
165
 
138
166
  it "handles saved configuration with errors" do
@@ -205,10 +233,10 @@ module Cosmos
205
233
  expect(@plr.log_type).to eql :CMD
206
234
  expect(@plr.configuration_name).not_to be_nil
207
235
  expect(@plr.hostname).to eql Socket.gethostname
208
- header_length = 8 + 1 + 6 + 1 + 12 + 4
209
- meta_header_length = 8 + 1 + 6 + 1 + 4 + 4
236
+ header_length = 1 + 8 + 1 + 6 + 1 + 12 + 4
237
+ meta_header_length = 1 + 8 + 1 + 6 + 1 + 4 + 4
210
238
  meta_length = System.telemetry.packet('SYSTEM', 'META').length
211
- expect(packet_offsets).to eql [PacketLogReader::COSMOS2_HEADER_LENGTH, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + header_length + @cmd_packet_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @cmd_packet_length) * 2]
239
+ expect(packet_offsets).to eql [PacketLogReader::COSMOS4_HEADER_LENGTH, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + header_length + @cmd_packet_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @cmd_packet_length) * 2]
212
240
 
213
241
  expect(@plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])).to eql [true, nil]
214
242
  pkt = @plr.read_at_offset(packet_offsets[2])
@@ -223,10 +251,10 @@ module Cosmos
223
251
  expect(@plr.log_type).to eql :TLM
224
252
  expect(@plr.configuration_name).not_to be_nil
225
253
  expect(@plr.hostname).to eql Socket.gethostname
226
- header_length = 8 + 1 + 6 + 1 + 13 + 4
227
- meta_header_length = 8 + 1 + 6 + 1 + 4 + 4
254
+ header_length = 1 + 8 + 1 + 6 + 1 + 13 + 4
255
+ meta_header_length = 1 + 8 + 1 + 6 + 1 + 4 + 4
228
256
  meta_length = System.telemetry.packet('SYSTEM', 'META').length
229
- expect(packet_offsets).to eql [PacketLogReader::COSMOS2_HEADER_LENGTH, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + header_length + @tlm_packet_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @tlm_packet_length) * 2]
257
+ expect(packet_offsets).to eql [PacketLogReader::COSMOS4_HEADER_LENGTH, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + header_length + @tlm_packet_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @tlm_packet_length) * 2]
230
258
 
231
259
  expect(@plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])).to eql [true, nil]
232
260
  pkt = @plr.read_at_offset(packet_offsets[2])
@@ -240,10 +268,10 @@ module Cosmos
240
268
  describe "each" do
241
269
  it "returns packets" do
242
270
  index = 0
243
- meta_header_length = 8 + 1 + 6 + 1 + 4 + 4
271
+ meta_header_length = 1 + 8 + 1 + 6 + 1 + 4 + 4
244
272
  meta_length = System.telemetry.packet('SYSTEM', 'META').length
245
273
  packet_length = System.commands.packet('SYSTEM', 'STARTLOGGING').length
246
- packet_header_length = 8 + 1 + 'SYSTEM'.length + 1 + 'STARTLOGGING'.length + 4
274
+ packet_header_length = 1 + 8 + 1 + 'SYSTEM'.length + 1 + 'STARTLOGGING'.length + 4
247
275
  bytes_read = 128 + packet_header_length + packet_length + meta_header_length + meta_length
248
276
  @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0]) do |packet|
249
277
  next if packet.packet_name == 'META'
@@ -257,7 +285,7 @@ module Cosmos
257
285
  end
258
286
  index = 0
259
287
  packet_length = System.telemetry.packet('SYSTEM', 'LIMITS_CHANGE').length
260
- packet_header_length = 8 + 1 + 'SYSTEM'.length + 1 + 'LIMITS_CHANGE'.length + 4
288
+ packet_header_length = 1 + 8 + 1 + 'SYSTEM'.length + 1 + 'LIMITS_CHANGE'.length + 4
261
289
  bytes_read = 128 + packet_header_length + packet_length + meta_header_length + meta_length
262
290
  @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0]) do |packet|
263
291
  next if packet.packet_name == 'META'
@@ -294,12 +322,20 @@ module Cosmos
294
322
 
295
323
  it "increments the command received count" do
296
324
  plw = PacketLogWriter.new(:CMD,'cnt',true,nil,10000000,nil,false)
297
- plw.write(System.commands.packet("INST","COLLECT").clone)
298
- plw.write(System.commands.packet("INST","ABORT").clone)
299
- plw.write(System.commands.packet("INST","ABORT").clone)
300
- plw.write(System.commands.packet("INST","COLLECT").clone)
301
- plw.write(System.commands.packet("SYSTEM","STOPLOGGING").clone)
302
- plw.write(System.commands.packet("INST","ABORT").clone)
325
+ collect_packet = System.commands.packet("INST","COLLECT").clone
326
+ collect_packet.stored = false
327
+ collect_packet.extra = {"vcid" => 2}
328
+ abort_packet = System.commands.packet("INST","ABORT").clone
329
+ abort_packet.stored = true
330
+ abort_packet.extra = {"test" => 1}
331
+ stop_packet = System.commands.packet("SYSTEM","STOPLOGGING").clone
332
+ stop_packet.stored = true
333
+ plw.write(collect_packet)
334
+ plw.write(abort_packet)
335
+ plw.write(abort_packet)
336
+ plw.write(collect_packet)
337
+ plw.write(stop_packet)
338
+ plw.write(abort_packet)
303
339
  plw.stop
304
340
 
305
341
  cnt = {}
@@ -308,6 +344,15 @@ module Cosmos
308
344
  cnt["#{packet.target_name}_#{packet.packet_name}"] ||= 0
309
345
  cnt["#{packet.target_name}_#{packet.packet_name}"] += 1
310
346
  expect(packet.received_count).to eql cnt["#{packet.target_name}_#{packet.packet_name}"]
347
+ if packet.packet_name == 'ABORT'
348
+ expect(packet.stored).to eql true
349
+ expect(packet.extra).to eql({"test" => 1})
350
+ elsif packet.packet_name == 'COLLECT'
351
+ expect(packet.stored).to eql false
352
+ expect(packet.extra).to eql({"vcid" => 2})
353
+ elsif packet.packet_name == 'STOPLOGGING'
354
+ expect(packet.stored).to eql true
355
+ end
311
356
  end
312
357
 
313
358
  # Resetting a packet should reset only that packet's received_count
@@ -328,10 +373,13 @@ module Cosmos
328
373
 
329
374
  it "increments the telemetry received count" do
330
375
  plw = PacketLogWriter.new(:TLM,'cnt',true,nil,10000000,nil,false)
331
- plw.write(System.telemetry.packet("INST","HEALTH_STATUS").clone)
376
+ hs_packet = System.telemetry.packet("INST","HEALTH_STATUS").clone
377
+ hs_packet.stored = true
378
+ hs_packet.extra = {"vcid" => 2}
379
+ plw.write(hs_packet)
332
380
  plw.write(System.telemetry.packet("INST","ADCS").clone)
333
381
  plw.write(System.telemetry.packet("INST","ADCS").clone)
334
- plw.write(System.telemetry.packet("INST","HEALTH_STATUS").clone)
382
+ plw.write(hs_packet)
335
383
  plw.write(System.telemetry.packet("INST","ADCS").clone)
336
384
  plw.stop
337
385
 
@@ -341,6 +389,13 @@ module Cosmos
341
389
  cnt["#{packet.target_name}_#{packet.packet_name}"] ||= 0
342
390
  cnt["#{packet.target_name}_#{packet.packet_name}"] += 1
343
391
  expect(packet.received_count).to eql cnt["#{packet.target_name}_#{packet.packet_name}"]
392
+ if packet.packet_name == 'HEALTH_STATUS'
393
+ expect(packet.stored).to eql true
394
+ expect(packet.extra).to eql({"vcid" => 2})
395
+ elsif packet.packet_name == 'ADCS'
396
+ expect(packet.stored).to eql false
397
+ expect(packet.extra).to eql nil
398
+ end
344
399
  end
345
400
 
346
401
  # Resetting a packet should reset only that packet's received_count
@@ -324,11 +324,11 @@ module Cosmos
324
324
  tf.close
325
325
  @pc.process_file(tf.path, "TGT1")
326
326
  pkt = @pc.telemetry["TGT1"]["PKT1"]
327
- expect(pkt.items.length).to eql 6 # 3 plus the RECEIVED_XXX items
327
+ expect(pkt.items.length).to eql 8 # 3 plus the RECEIVED_XXX and PACKET_TIMExxx items
328
328
  expect(pkt.items.keys).to include('BYTE1','BYTE2','BYTE3')
329
- expect(pkt.sorted_items[3].name).to eql 'BYTE1'
330
- expect(pkt.sorted_items[4].name).to eql 'BYTE2'
331
- expect(pkt.sorted_items[5].name).to eql 'BYTE3'
329
+ expect(pkt.sorted_items[5].name).to eql 'BYTE1'
330
+ expect(pkt.sorted_items[6].name).to eql 'BYTE2'
331
+ expect(pkt.sorted_items[7].name).to eql 'BYTE3'
332
332
  tf.unlink
333
333
  end
334
334
  end
@@ -691,17 +691,6 @@ module Cosmos
691
691
  expect(@pc.telemetry["TGT1"]["PKT1"].read("ITEM1",:WITH_UNITS)).to eql "0 V"
692
692
  tf.unlink
693
693
  end
694
-
695
- it "complains if STATE defined" do
696
- tf = Tempfile.new('unittest')
697
- tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
698
- tf.puts ' ITEM item1 0 8 UINT'
699
- tf.puts ' STATE ONE 1'
700
- tf.puts ' UNITS Volts V'
701
- tf.close
702
- expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Items with STATE can't define UNITS/)
703
- tf.unlink
704
- end
705
694
  end
706
695
 
707
696
  context "with META" do
@@ -842,7 +831,7 @@ module Cosmos
842
831
  expect(@pc.telemetry["TGT1"]["PKT1"].items["ITEM1"].data_type).to be :DERIVED
843
832
  tf.unlink
844
833
  end
845
- end
834
+ end
846
835
 
847
836
  end # describe "process_file"
848
837
  end
@@ -53,17 +53,6 @@ module Cosmos
53
53
  tf.unlink
54
54
  end
55
55
 
56
- it "complains if STATE is defined" do
57
- tf = Tempfile.new('unittest')
58
- tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
59
- tf.puts 'ITEM myitem 0 8 UINT "Test Item"'
60
- tf.puts 'STATE ONE 1'
61
- tf.puts "FORMAT_STRING '0x%x'"
62
- tf.close
63
- expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Items with STATE can't define FORMAT_STRING/)
64
- tf.unlink
65
- end
66
-
67
56
  it "complains about invalid format strings" do
68
57
  tf = Tempfile.new('unittest')
69
58
  tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
@@ -69,12 +69,12 @@ module Cosmos
69
69
  tf.close
70
70
  @pc.process_file(tf.path, "TGT1")
71
71
  pkt = @pc.telemetry["TGT1"]["PKT1"]
72
- expect(pkt.items.length).to eql 7 # 4 plus the RECEIVED_XXX items
72
+ expect(pkt.items.length).to eql 9 # 4 plus the RECEIVED_XXX and PACKET_TIMExxx items
73
73
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4')
74
- expect(pkt.sorted_items[3].name).to eql 'BIT4'
75
- expect(pkt.sorted_items[4].name).to eql 'BIT3'
76
- expect(pkt.sorted_items[5].name).to eql 'BIT2'
77
- expect(pkt.sorted_items[6].name).to eql 'BIT1'
74
+ expect(pkt.sorted_items[5].name).to eql 'BIT4'
75
+ expect(pkt.sorted_items[6].name).to eql 'BIT3'
76
+ expect(pkt.sorted_items[7].name).to eql 'BIT2'
77
+ expect(pkt.sorted_items[8].name).to eql 'BIT1'
78
78
  limits_items = []
79
79
  pkt.items.each do |name, item|
80
80
  limits_items << item if name.include?('BIT')
@@ -117,24 +117,24 @@ module Cosmos
117
117
  tf.close
118
118
  @pc.process_file(tf.path, "TGT1")
119
119
  pkt = @pc.telemetry["TGT1"]["PKT1"]
120
- expect(pkt.items.length).to eql 11 # 8 plus the RECEIVED_XXX items
120
+ expect(pkt.items.length).to eql 13 # 8 plus the RECEIVED_XXX and PACKET_TIMExxx items
121
121
  expect(pkt.items.keys).to include('WORD1','WORD2','WORD3','WORD4','DWORD1','DWORD2','DWORD3','DWORD4')
122
- expect(pkt.sorted_items[3].name).to eql 'WORD1'
123
- expect(pkt.sorted_items[3].bit_offset).to eql 0
124
- expect(pkt.sorted_items[4].name).to eql 'DWORD1'
125
- expect(pkt.sorted_items[4].bit_offset).to eql 16
126
- expect(pkt.sorted_items[5].name).to eql 'WORD2'
127
- expect(pkt.sorted_items[5].bit_offset).to eql 48
128
- expect(pkt.sorted_items[6].name).to eql 'DWORD2'
129
- expect(pkt.sorted_items[6].bit_offset).to eql 64
130
- expect(pkt.sorted_items[7].name).to eql 'WORD3'
131
- expect(pkt.sorted_items[7].bit_offset).to eql 96
132
- expect(pkt.sorted_items[8].name).to eql 'DWORD3'
133
- expect(pkt.sorted_items[8].bit_offset).to eql 112
134
- expect(pkt.sorted_items[9].name).to eql 'WORD4'
135
- expect(pkt.sorted_items[9].bit_offset).to eql 144
136
- expect(pkt.sorted_items[10].name).to eql 'DWORD4'
137
- expect(pkt.sorted_items[10].bit_offset).to eql 160
122
+ expect(pkt.sorted_items[5].name).to eql 'WORD1'
123
+ expect(pkt.sorted_items[5].bit_offset).to eql 0
124
+ expect(pkt.sorted_items[6].name).to eql 'DWORD1'
125
+ expect(pkt.sorted_items[6].bit_offset).to eql 16
126
+ expect(pkt.sorted_items[7].name).to eql 'WORD2'
127
+ expect(pkt.sorted_items[7].bit_offset).to eql 48
128
+ expect(pkt.sorted_items[8].name).to eql 'DWORD2'
129
+ expect(pkt.sorted_items[8].bit_offset).to eql 64
130
+ expect(pkt.sorted_items[9].name).to eql 'WORD3'
131
+ expect(pkt.sorted_items[9].bit_offset).to eql 96
132
+ expect(pkt.sorted_items[10].name).to eql 'DWORD3'
133
+ expect(pkt.sorted_items[10].bit_offset).to eql 112
134
+ expect(pkt.sorted_items[11].name).to eql 'WORD4'
135
+ expect(pkt.sorted_items[11].bit_offset).to eql 144
136
+ expect(pkt.sorted_items[12].name).to eql 'DWORD4'
137
+ expect(pkt.sorted_items[12].bit_offset).to eql 160
138
138
  tf.unlink
139
139
  end
140
140
 
@@ -149,18 +149,18 @@ module Cosmos
149
149
  tf.close
150
150
  @pc.process_file(tf.path, "TGT1")
151
151
  pkt = @pc.telemetry["TGT1"]["PKT1"]
152
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
152
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
153
153
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
154
- expect(pkt.sorted_items[3].name).to eql 'BIT1'
155
- expect(pkt.sorted_items[3].bit_offset).to eql 0
156
- expect(pkt.sorted_items[4].name).to eql 'BIT2'
157
- expect(pkt.sorted_items[4].bit_offset).to eql 16
158
- expect(pkt.sorted_items[5].name).to eql 'BIT3'
159
- expect(pkt.sorted_items[5].bit_offset).to eql 32
160
- expect(pkt.sorted_items[6].name).to eql 'BIT4'
161
- expect(pkt.sorted_items[6].bit_offset).to eql 48
162
- expect(pkt.sorted_items[7].name).to eql 'BIT5'
163
- expect(pkt.sorted_items[7].bit_offset).to eql 64
154
+ expect(pkt.sorted_items[5].name).to eql 'BIT1'
155
+ expect(pkt.sorted_items[5].bit_offset).to eql 0
156
+ expect(pkt.sorted_items[6].name).to eql 'BIT2'
157
+ expect(pkt.sorted_items[6].bit_offset).to eql 16
158
+ expect(pkt.sorted_items[7].name).to eql 'BIT3'
159
+ expect(pkt.sorted_items[7].bit_offset).to eql 32
160
+ expect(pkt.sorted_items[8].name).to eql 'BIT4'
161
+ expect(pkt.sorted_items[8].bit_offset).to eql 48
162
+ expect(pkt.sorted_items[9].name).to eql 'BIT5'
163
+ expect(pkt.sorted_items[9].bit_offset).to eql 64
164
164
  limits_items = []
165
165
  pkt.items.each do |name, item|
166
166
  limits_items << item if name.include?('BIT')
@@ -179,7 +179,7 @@ module Cosmos
179
179
  tf.close
180
180
  @pc.process_file(tf.path, "TGT1")
181
181
  pkt = @pc.telemetry["TGT1"]["PKT1"]
182
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
182
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
183
183
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
184
184
  expect(pkt.limits_items.collect{|item| item.name}).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
185
185
  tf.unlink
@@ -194,7 +194,7 @@ module Cosmos
194
194
  tf.close
195
195
  @pc.process_file(tf.path, "TGT1")
196
196
  pkt = @pc.telemetry["TGT1"]["PKT1"]
197
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
197
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
198
198
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
199
199
  expect(pkt.limits_items).to be_empty
200
200
  tf.unlink
@@ -209,7 +209,7 @@ module Cosmos
209
209
  tf.close
210
210
  @pc.process_file(tf.path, "TGT1")
211
211
  pkt = @pc.telemetry["TGT1"]["PKT1"]
212
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
212
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
213
213
  expect(pkt.items.keys).to include('08_BIT','09_BIT','10_BIT','11_BIT','12_BIT')
214
214
  expect(pkt.limits_items).to be_empty
215
215
  tf.unlink
@@ -119,6 +119,42 @@ module Cosmos
119
119
  end
120
120
 
121
121
  context "with telemetry" do
122
+ it "defines states on ARRAY items" do
123
+ tf = Tempfile.new('unittest')
124
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
125
+ tf.puts ' APPEND_ARRAY_ITEM item1 8 UINT 40 "state item"'
126
+ tf.puts ' STATE FALSE 0'
127
+ tf.puts ' STATE TRUE 1'
128
+ tf.puts ' STATE ERROR ANY'
129
+ tf.close
130
+ @pc.process_file(tf.path, "TGT1")
131
+ tlm = Telemetry.new(@pc)
132
+ pkt = tlm.packet("TGT1", "PKT1")
133
+ pkt.write("ITEM1", [0,1,2,1,0])
134
+ expect(pkt.read("ITEM1")).to eql ["FALSE","TRUE","ERROR","TRUE","FALSE"]
135
+ tf.unlink
136
+ end
137
+
138
+ it "allows an 'ANY' state" do
139
+ tf = Tempfile.new('unittest')
140
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
141
+ tf.puts ' APPEND_ITEM item1 8 UINT "state item"'
142
+ tf.puts ' STATE FALSE 0'
143
+ tf.puts ' STATE TRUE 1'
144
+ tf.puts ' STATE ERROR ANY'
145
+ tf.close
146
+ @pc.process_file(tf.path, "TGT1")
147
+ tlm = Telemetry.new(@pc)
148
+ pkt = tlm.packet("TGT1", "PKT1")
149
+ pkt.write("ITEM1", 0)
150
+ expect(pkt.read("ITEM1")).to eql "FALSE"
151
+ pkt.write("ITEM1", 1)
152
+ expect(pkt.read("ITEM1")).to eql "TRUE"
153
+ pkt.write("ITEM1", 2)
154
+ expect(pkt.read("ITEM1")).to eql "ERROR"
155
+ tf.unlink
156
+ end
157
+
122
158
  it "only allows GREEN YELLOW or RED" do
123
159
  tf = Tempfile.new('unittest')
124
160
  tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
@@ -114,21 +114,23 @@ module Cosmos
114
114
 
115
115
  it "returns all items from packet TGT1/PKT1" do
116
116
  items = @tlm.items("TGT1","PKT1")
117
- expect(items.length).to eql 7
118
- expect(items[0].name).to eql "RECEIVED_TIMESECONDS"
119
- expect(items[1].name).to eql "RECEIVED_TIMEFORMATTED"
120
- expect(items[2].name).to eql "RECEIVED_COUNT"
121
- expect(items[3].name).to eql "ITEM1"
122
- expect(items[4].name).to eql "ITEM2"
123
- expect(items[5].name).to eql "ITEM3"
124
- expect(items[6].name).to eql "ITEM4"
117
+ expect(items.length).to eql 9
118
+ expect(items[0].name).to eql "PACKET_TIMESECONDS"
119
+ expect(items[1].name).to eql "PACKET_TIMEFORMATTED"
120
+ expect(items[2].name).to eql "RECEIVED_TIMESECONDS"
121
+ expect(items[3].name).to eql "RECEIVED_TIMEFORMATTED"
122
+ expect(items[4].name).to eql "RECEIVED_COUNT"
123
+ expect(items[5].name).to eql "ITEM1"
124
+ expect(items[6].name).to eql "ITEM2"
125
+ expect(items[7].name).to eql "ITEM3"
126
+ expect(items[8].name).to eql "ITEM4"
125
127
  end
126
128
  end
127
129
 
128
130
  describe "item_names" do
129
131
  it "returns all the items for a given target and packet" do
130
132
  items = @tlm.item_names("TGT1","PKT1")
131
- expect(items).to contain_exactly('RECEIVED_TIMEFORMATTED','RECEIVED_TIMESECONDS','RECEIVED_COUNT','ITEM1','ITEM2','ITEM3','ITEM4')
133
+ expect(items).to contain_exactly('PACKET_TIMEFORMATTED', 'PACKET_TIMESECONDS', 'RECEIVED_TIMEFORMATTED','RECEIVED_TIMESECONDS','RECEIVED_COUNT','ITEM1','ITEM2','ITEM3','ITEM4')
132
134
 
133
135
  items = @tlm.item_names("TGT1","LATEST")
134
136
  expect(items).to contain_exactly('ITEM1','ITEM2','ITEM3','ITEM4')
@@ -67,9 +67,8 @@ module Cosmos
67
67
  expect { get_limits_groups() }.to raise_error(DRb::DRbConnError)
68
68
  expect { set_limits_set("DEFAULT") }.to raise_error(DRb::DRbConnError)
69
69
  ignore = []
70
- ignore << %w(INST HEALTH_STATUS TEMP1)
71
- ignore << %w(INST HEALTH_STATUS TEMP2)
72
- ignore << %w(INST HEALTH_STATUS GROUND2STATUS)
70
+ ignore << %w(SYSTEM META COMPUTER)
71
+ ignore << %w(SYSTEM META VERSION)
73
72
  expect { get_overall_limits_state(ignore) }.to raise_error(DRb::DRbConnError)
74
73
 
75
74
  clear_disconnected_targets()