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
@@ -0,0 +1,10 @@
1
+ # export VERSION= before running this
2
+ git checkout master
3
+ git pull
4
+ rbenv global 2.4.4
5
+ rake release VERSION=$VERSION
6
+ rake commit_release VERSION=$VERSION
7
+ mv *.gem ~/share/.
8
+ rbenv global jruby-9.1.12.0
9
+ gem build cosmos.gemspec
10
+ mv *.gem ~/share/.
@@ -0,0 +1,58 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2018 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos/conversions/packet_time_formatted_conversion'
13
+ require 'cosmos/packets/packet'
14
+
15
+ module Cosmos
16
+
17
+ describe PacketTimeFormattedConversion do
18
+
19
+ describe "initialize" do
20
+ it "initializes converted_type and converted_bit_size" do
21
+ gc = PacketTimeFormattedConversion.new()
22
+ expect(gc.converted_type).to eql :STRING
23
+ expect(gc.converted_bit_size).to eql 0
24
+ end
25
+ end
26
+
27
+ describe "call" do
28
+ it "returns the formatted packet time" do
29
+ gc = PacketTimeFormattedConversion.new()
30
+ packet = Packet.new("TGT","PKT")
31
+ packet.received_time = Time.new(2020,1,31,12,15,30)
32
+ expect(gc.call(nil,packet,nil)).to eql "2020/01/31 12:15:30.000"
33
+ end
34
+
35
+ it "returns the formatted packet time from a packet item" do
36
+ gc = PacketTimeFormattedConversion.new()
37
+ packet = Packet.new("TGT","PKT")
38
+ item = packet.define_item("PACKET_TIME", 0, 0, :DERIVED)
39
+ item.read_conversion = GenericConversion.new("Time.new(2020,1,31,12,15,30)")
40
+ packet.received_time = nil
41
+ expect(gc.call(nil,packet,nil)).to eql "2020/01/31 12:15:30.000"
42
+ end
43
+
44
+ it "returns a string if packet time isn't set" do
45
+ gc = PacketTimeFormattedConversion.new()
46
+ packet = Packet.new("TGT","PKT")
47
+ expect(gc.call(nil,packet,nil)).to eql "No Packet Time"
48
+ end
49
+ end
50
+
51
+ describe "to_s" do
52
+ it "returns the class" do
53
+ expect(PacketTimeFormattedConversion.new().to_s).to eql "PacketTimeFormattedConversion"
54
+ end
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,60 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2018 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos/conversions/packet_time_seconds_conversion'
13
+ require 'cosmos/packets/packet'
14
+
15
+ module Cosmos
16
+
17
+ describe PacketTimeSecondsConversion do
18
+
19
+ describe "initialize" do
20
+ it "initializes converted_type and converted_bit_size" do
21
+ gc = PacketTimeSecondsConversion.new()
22
+ expect(gc.converted_type).to eql :FLOAT
23
+ expect(gc.converted_bit_size).to eql 64
24
+ end
25
+ end
26
+
27
+ describe "call" do
28
+ it "returns the formatted packet time" do
29
+ gc = PacketTimeSecondsConversion.new()
30
+ packet = Packet.new("TGT","PKT")
31
+ time = Time.new(2020,1,31,12,15,30)
32
+ packet.received_time = time
33
+ expect(gc.call(nil,packet,nil)).to eql time.to_f
34
+ end
35
+
36
+ it "returns the formatted packet time from a packet item" do
37
+ gc = PacketTimeSecondsConversion.new()
38
+ packet = Packet.new("TGT","PKT")
39
+ item = packet.define_item("PACKET_TIME", 0, 0, :DERIVED)
40
+ time = Time.new(2020,1,31,12,15,30)
41
+ item.read_conversion = GenericConversion.new("Time.new(2020,1,31,12,15,30)")
42
+ packet.received_time = nil
43
+ expect(gc.call(nil,packet,nil)).to eql time.to_f
44
+ end
45
+
46
+ it "returns 0.0 if packet time isn't set" do
47
+ gc = PacketTimeSecondsConversion.new()
48
+ packet = Packet.new("TGT","PKT")
49
+ expect(gc.call(nil,packet,nil)).to eql 0.0
50
+ end
51
+ end
52
+
53
+ describe "to_s" do
54
+ it "returns the class" do
55
+ expect(PacketTimeSecondsConversion.new().to_s).to eql "PacketTimeSecondsConversion"
56
+ end
57
+ end
58
+ end
59
+ end
60
+
@@ -0,0 +1,243 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos/interfaces/protocols/ignore_packet_protocol'
13
+ require 'cosmos/interfaces/interface'
14
+ require 'cosmos/streams/stream'
15
+
16
+ module Cosmos
17
+ describe IgnorePacketProtocol do
18
+ before(:each) do
19
+ $buffer = nil
20
+ @interface = StreamInterface.new
21
+ @interface.target_names = ['SYSTEM', 'INST']
22
+ allow(@interface).to receive(:connected?) { true }
23
+ end
24
+
25
+ class PreStream < Stream
26
+ def connect; end
27
+ def connected?; true; end
28
+ def disconnect; end
29
+ def read; $buffer; end
30
+ def write(data); $buffer = data; end
31
+ end
32
+
33
+ describe "initialize" do
34
+ it "complains if target is not given" do
35
+ expect { @interface.add_protocol(IgnorePacketProtocol, [], :READ_WRITE) }.to raise_error(ArgumentError)
36
+ end
37
+
38
+ it "complains if packet is not given" do
39
+ expect { @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM'], :READ_WRITE) }.to raise_error(ArgumentError)
40
+ end
41
+
42
+ it "complains if the target is not found" do
43
+ expect { @interface.add_protocol(IgnorePacketProtocol, ['BLAH', 'META'], :READ_WRITE) }.to raise_error(/target 'BLAH' does not exist/)
44
+ end
45
+
46
+ it "complains if the target is not found" do
47
+ expect { @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'BLAH'], :READ_WRITE) }.to raise_error(/packet 'SYSTEM BLAH' does not exist/)
48
+ end
49
+ end
50
+
51
+ describe "read" do
52
+ it "ignores the packet specified" do
53
+ @interface.instance_variable_set(:@stream, PreStream.new)
54
+ pkt = System.telemetry.packet("SYSTEM","META")
55
+ # Ensure the ID items are set so this packet can be identified
56
+ pkt.id_items.each do |item|
57
+ pkt.write_item(item, item.id_value)
58
+ end
59
+ pkt.received_time = Time.now
60
+ $buffer = nil
61
+ @interface.write(pkt)
62
+ # Verify the write went out
63
+ expect(pkt.buffer).to eql $buffer
64
+ # Verify we read the packet back
65
+ packet = @interface.read
66
+ expect(packet.buffer).to eql $buffer
67
+
68
+ # Now add the protocol to ignore the packet
69
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :READ)
70
+ $buffer = nil
71
+ @interface.write(pkt)
72
+ packet = nil
73
+ # Try to read the interface
74
+ # We put this in a thread because it calls it continuously
75
+ thread = Thread.new do
76
+ packet = @interface.read
77
+ end
78
+ sleep 0.1
79
+ thread.kill
80
+ sleep 0.2 # Allow thread to die
81
+ expect(packet).to be_nil
82
+ end
83
+
84
+ it "can be added multiple times to ignore different packets" do
85
+ @interface.instance_variable_set(:@stream, PreStream.new)
86
+
87
+ pkt = System.telemetry.packet("INST","HEALTH_STATUS")
88
+ # Ensure the ID items are set so this packet can be identified
89
+ pkt.id_items.each do |item|
90
+ pkt.write_item(item, item.id_value)
91
+ end
92
+ pkt.received_time = Time.now
93
+ $buffer = nil
94
+ @interface.write(pkt)
95
+ expect($buffer).to eql pkt.buffer
96
+
97
+ # Verify we read the packet back
98
+ packet = @interface.read
99
+ expect(packet.buffer).to eql $buffer
100
+
101
+ # Now add the protocol to ignore the packet
102
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'HEALTH_STATUS'], :READ)
103
+ $buffer = nil
104
+ @interface.write(pkt)
105
+ expect($buffer).to eql pkt.buffer
106
+ packet = nil
107
+ # Try to read the interface
108
+ # We put this in a thread because it calls it continuously
109
+ thread = Thread.new do
110
+ packet = @interface.read
111
+ end
112
+ sleep 0.1
113
+ thread.kill
114
+ sleep 0.2 # Allow thread to die
115
+ expect(packet).to be_nil
116
+
117
+ # Add another protocol to ignore another packet
118
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'ADCS'], :READ)
119
+
120
+ pkt = System.telemetry.packet("INST","ADCS")
121
+ # Ensure the ID items are set so this packet can be identified
122
+ pkt.id_items.each do |item|
123
+ pkt.write_item(item, item.id_value)
124
+ end
125
+ pkt.received_time = Time.now
126
+ $buffer = nil
127
+ @interface.write(pkt)
128
+ expect($buffer).to eql pkt.buffer
129
+
130
+ packet = nil
131
+ # Try to read the interface
132
+ # We put this in a thread because it calls it continuously
133
+ thread = Thread.new do
134
+ packet = @interface.read
135
+ end
136
+ sleep 0.1
137
+ thread.kill
138
+ sleep 0.2 # Allow thread to die
139
+ expect(packet).to be_nil
140
+
141
+ pkt = System.telemetry.packet("INST","PARAMS")
142
+ # Ensure the ID items are set so this packet can be identified
143
+ pkt.id_items.each do |item|
144
+ pkt.write_item(item, item.id_value)
145
+ end
146
+ pkt.received_time = Time.now
147
+ $buffer = nil
148
+ @interface.write(pkt)
149
+ # Verify the write went out
150
+ expect($buffer).to eql pkt.buffer
151
+
152
+ packet = @interface.read
153
+ expect(packet.buffer).to eql pkt.buffer
154
+ end
155
+ end
156
+
157
+ describe "write" do
158
+ it "ignores the packet specified" do
159
+ @interface.instance_variable_set(:@stream, PreStream.new)
160
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :WRITE)
161
+ pkt = System.telemetry.packet("SYSTEM","META")
162
+ pkt.write("COSMOS_VERSION", "TEST")
163
+ pkt.received_time = Time.now
164
+ $buffer = nil
165
+ @interface.write(pkt)
166
+ # Verify the write was ignored
167
+ expect($buffer).to be_nil
168
+
169
+ # Verify reading the interface works
170
+ $buffer = pkt.buffer
171
+ packet = @interface.read
172
+ expect(packet.buffer).to eql $buffer
173
+ end
174
+
175
+ it "can be added multiple times to ignore different packets" do
176
+ @interface.instance_variable_set(:@stream, PreStream.new)
177
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'HEALTH_STATUS'], :WRITE)
178
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'ADCS'], :WRITE)
179
+
180
+ pkt = System.telemetry.packet("INST","HEALTH_STATUS")
181
+ pkt.received_time = Time.now
182
+ $buffer = nil
183
+ @interface.write(pkt)
184
+ # Verify the write was ignored
185
+ expect($buffer).to be_nil
186
+
187
+ pkt = System.telemetry.packet("INST","ADCS")
188
+ pkt.received_time = Time.now
189
+ $buffer = nil
190
+ @interface.write(pkt)
191
+ # Verify the write was ignored
192
+ expect($buffer).to be_nil
193
+
194
+ pkt = System.telemetry.packet("INST","PARAMS")
195
+ pkt.received_time = Time.now
196
+ $buffer = nil
197
+ @interface.write(pkt)
198
+ # Verify the write went out
199
+ expect($buffer).to eql pkt.buffer
200
+ end
201
+ end
202
+
203
+ describe "read/write" do
204
+ it "ignores the packet specified" do
205
+ @interface.instance_variable_set(:@stream, PreStream.new)
206
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :READ_WRITE)
207
+ pkt = System.telemetry.packet("SYSTEM","META")
208
+ pkt.write("COSMOS_VERSION", "TEST")
209
+ pkt.received_time = Time.now
210
+ $buffer = nil
211
+ @interface.write(pkt)
212
+ # Verify the write was ignored
213
+ expect($buffer).to be_nil
214
+
215
+ packet = nil
216
+ # Try to read the interface
217
+ thread = Thread.new do
218
+ packet = @interface.read
219
+ end
220
+ sleep 0.1
221
+ thread.kill
222
+ sleep 0.2 # Allow thread to die
223
+ expect(packet).to be_nil
224
+ end
225
+
226
+ it "reads and writes unknown packets" do
227
+ @interface.instance_variable_set(:@stream, PreStream.new)
228
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :READ_WRITE)
229
+ $buffer = nil
230
+ pkt = Packet.new("TGT","PTK")
231
+ pkt.append_item("ITEM", 8, :INT)
232
+ pkt.write("ITEM", 33, :RAW)
233
+ @interface.write(pkt)
234
+ # Verify the write went out
235
+ expect(pkt.buffer).to eql $buffer
236
+
237
+ # Verify the read works
238
+ packet = @interface.read
239
+ expect(packet.buffer).to eq $buffer
240
+ end
241
+ end
242
+ end
243
+ end
@@ -56,6 +56,229 @@ module Cosmos
56
56
  time = Time.new(2020,1,31,12,15,30.5)
57
57
  pkt.received_time = time
58
58
  @interface.write(pkt)
59
+ expect($buffer[0..0].unpack('C')[0]).to eql 0
60
+ expect($buffer[1..4].unpack('N')[0]).to eql time.to_f.to_i
61
+ expect($buffer[5..8].unpack('N')[0]).to eql 500000
62
+ offset = 9
63
+ tgt_name_length = $buffer[offset].unpack('C')[0]
64
+ offset += 1 # for the length field
65
+ expect($buffer[offset...(offset+tgt_name_length)]).to eql 'SYSTEM'
66
+ offset += tgt_name_length
67
+ pkt_name_length = $buffer[offset].unpack('C')[0]
68
+ offset += 1 # for the length field
69
+ expect($buffer[offset...(offset+pkt_name_length)]).to eql 'META'
70
+ offset += pkt_name_length
71
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql pkt.buffer.length
72
+ offset += 4
73
+ expect($buffer[offset..-1]).to eql pkt.buffer
74
+ end
75
+
76
+ it "creates a packet header with stored" do
77
+ @interface.instance_variable_set(:@stream, PreStream.new)
78
+ @interface.add_protocol(PreidentifiedProtocol, [nil, 5], :READ_WRITE)
79
+ pkt = System.telemetry.packet("SYSTEM","META").clone
80
+ time = Time.new(2020,1,31,12,15,30.5)
81
+ pkt.received_time = time
82
+ pkt.stored = true
83
+ @interface.write(pkt)
84
+ expect($buffer[0..0].unpack('C')[0]).to eql 0x80
85
+ expect($buffer[1..4].unpack('N')[0]).to eql time.to_f.to_i
86
+ expect($buffer[5..8].unpack('N')[0]).to eql 500000
87
+ offset = 9
88
+ tgt_name_length = $buffer[offset].unpack('C')[0]
89
+ offset += 1 # for the length field
90
+ expect($buffer[offset...(offset+tgt_name_length)]).to eql 'SYSTEM'
91
+ offset += tgt_name_length
92
+ pkt_name_length = $buffer[offset].unpack('C')[0]
93
+ offset += 1 # for the length field
94
+ expect($buffer[offset...(offset+pkt_name_length)]).to eql 'META'
95
+ offset += pkt_name_length
96
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql pkt.buffer.length
97
+ offset += 4
98
+ expect($buffer[offset..-1]).to eql pkt.buffer
99
+ end
100
+
101
+ it "creates a packet header with extra" do
102
+ @interface.instance_variable_set(:@stream, PreStream.new)
103
+ @interface.add_protocol(PreidentifiedProtocol, [nil, 5], :READ_WRITE)
104
+ pkt = System.telemetry.packet("SYSTEM","META").clone
105
+ time = Time.new(2020,1,31,12,15,30.5)
106
+ pkt.received_time = time
107
+ pkt.stored = false
108
+ extra_data = {"vcid" => 2}
109
+ pkt.extra = extra_data
110
+ @interface.write(pkt)
111
+ offset = 0
112
+ expect($buffer[0..0].unpack('C')[0]).to eql 0x40
113
+ json_extra = extra_data.to_json
114
+ offset += 1
115
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql json_extra.length
116
+ offset += 4
117
+ expect($buffer[offset..(offset + json_extra.length - 1)]).to eql json_extra
118
+ offset += json_extra.length
119
+ expect($buffer[offset..(offset + 3)].unpack('N')[0]).to eql time.to_f.to_i
120
+ expect($buffer[(offset + 4)..(offset + 7)].unpack('N')[0]).to eql 500000
121
+ offset = offset += 8 # time fields
122
+ tgt_name_length = $buffer[offset].unpack('C')[0]
123
+ offset += 1 # for the length field
124
+ expect($buffer[offset...(offset+tgt_name_length)]).to eql 'SYSTEM'
125
+ offset += tgt_name_length
126
+ pkt_name_length = $buffer[offset].unpack('C')[0]
127
+ offset += 1 # for the length field
128
+ expect($buffer[offset...(offset+pkt_name_length)]).to eql 'META'
129
+ offset += pkt_name_length
130
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql pkt.buffer.length
131
+ offset += 4
132
+ expect($buffer[offset..-1]).to eql pkt.buffer
133
+ end
134
+
135
+ it "creates a packet header with stored and extra" do
136
+ @interface.instance_variable_set(:@stream, PreStream.new)
137
+ @interface.add_protocol(PreidentifiedProtocol, [nil, 5], :READ_WRITE)
138
+ pkt = System.telemetry.packet("SYSTEM","META").clone
139
+ time = Time.new(2020,1,31,12,15,30.5)
140
+ pkt.received_time = time
141
+ pkt.stored = true
142
+ extra_data = {"vcid" => 2}
143
+ pkt.extra = extra_data
144
+ @interface.write(pkt)
145
+ offset = 0
146
+ expect($buffer[0..0].unpack('C')[0]).to eql 0xC0
147
+ json_extra = extra_data.to_json
148
+ offset += 1
149
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql json_extra.length
150
+ offset += 4
151
+ expect($buffer[offset..(offset + json_extra.length - 1)]).to eql json_extra
152
+ offset += json_extra.length
153
+ expect($buffer[offset..(offset + 3)].unpack('N')[0]).to eql time.to_f.to_i
154
+ expect($buffer[(offset + 4)..(offset + 7)].unpack('N')[0]).to eql 500000
155
+ offset = offset += 8 # time fields
156
+ tgt_name_length = $buffer[offset].unpack('C')[0]
157
+ offset += 1 # for the length field
158
+ expect($buffer[offset...(offset+tgt_name_length)]).to eql 'SYSTEM'
159
+ offset += tgt_name_length
160
+ pkt_name_length = $buffer[offset].unpack('C')[0]
161
+ offset += 1 # for the length field
162
+ expect($buffer[offset...(offset+pkt_name_length)]).to eql 'META'
163
+ offset += pkt_name_length
164
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql pkt.buffer.length
165
+ offset += 4
166
+ expect($buffer[offset..-1]).to eql pkt.buffer
167
+ end
168
+
169
+ it "handles a sync pattern" do
170
+ @interface.instance_variable_set(:@stream, PreStream.new)
171
+ @interface.add_protocol(PreidentifiedProtocol, ["DEAD"], :READ_WRITE)
172
+ pkt = System.telemetry.packet("SYSTEM","META")
173
+ time = Time.new(2020,1,31,12,15,30.5)
174
+ pkt.received_time = time
175
+ @interface.write(pkt)
176
+ expect($buffer[0..1]).to eql("\xDE\xAD")
177
+ expect($buffer[2..2].unpack('C')[0]).to eql 0
178
+ expect($buffer[3..6].unpack('N')[0]).to eql time.to_f.to_i
179
+ expect($buffer[7..10].unpack('N')[0]).to eql 500000
180
+ offset = 11
181
+ tgt_name_length = $buffer[offset].unpack('C')[0]
182
+ offset += 1 # for the length field
183
+ expect($buffer[offset...(offset+tgt_name_length)]).to eql 'SYSTEM'
184
+ offset += tgt_name_length
185
+ pkt_name_length = $buffer[offset].unpack('C')[0]
186
+ offset += 1 # for the length field
187
+ expect($buffer[offset...(offset+pkt_name_length)]).to eql 'META'
188
+ offset += pkt_name_length
189
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql pkt.buffer.length
190
+ offset += 4
191
+ expect($buffer[offset..-1]).to eql pkt.buffer
192
+ end
193
+
194
+ it "handles a sync pattern with stored and extra" do
195
+ @interface.instance_variable_set(:@stream, PreStream.new)
196
+ @interface.add_protocol(PreidentifiedProtocol, ["DEAD", 5], :READ_WRITE)
197
+ pkt = System.telemetry.packet("SYSTEM","META").clone
198
+ time = Time.new(2020,1,31,12,15,30.5)
199
+ pkt.received_time = time
200
+ pkt.stored = true
201
+ extra_data = {"vcid" => 2}
202
+ pkt.extra = extra_data
203
+ @interface.write(pkt)
204
+ expect($buffer[0..1]).to eql("\xDE\xAD")
205
+ offset = 2
206
+ expect($buffer[2..2].unpack('C')[0]).to eql 0xC0
207
+ json_extra = extra_data.to_json
208
+ offset += 1
209
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql json_extra.length
210
+ offset += 4
211
+ expect($buffer[offset..(offset + json_extra.length - 1)]).to eql json_extra
212
+ offset += json_extra.length
213
+ expect($buffer[offset..(offset + 3)].unpack('N')[0]).to eql time.to_f.to_i
214
+ expect($buffer[(offset + 4)..(offset + 7)].unpack('N')[0]).to eql 500000
215
+ offset = offset += 8 # time fields
216
+ tgt_name_length = $buffer[offset].unpack('C')[0]
217
+ offset += 1 # for the length field
218
+ expect($buffer[offset...(offset+tgt_name_length)]).to eql 'SYSTEM'
219
+ offset += tgt_name_length
220
+ pkt_name_length = $buffer[offset].unpack('C')[0]
221
+ offset += 1 # for the length field
222
+ expect($buffer[offset...(offset+pkt_name_length)]).to eql 'META'
223
+ offset += pkt_name_length
224
+ expect($buffer[offset..(offset+3)].unpack('N')[0]).to eql pkt.buffer.length
225
+ offset += 4
226
+ expect($buffer[offset..-1]).to eql pkt.buffer
227
+ end
228
+ end
229
+
230
+ describe "read" do
231
+ it "handles a sync pattern" do
232
+ @interface.instance_variable_set(:@stream, PreStream.new)
233
+ @interface.add_protocol(PreidentifiedProtocol, ["0x1234"], :READ_WRITE)
234
+ pkt = System.telemetry.packet("SYSTEM","META")
235
+ pkt.write("COSMOS_VERSION", "TEST")
236
+ time = Time.new(2020,1,31,12,15,30.5)
237
+ pkt.received_time = time
238
+ @interface.write(pkt)
239
+ expect($buffer[0]).to eql "\x12"
240
+ expect($buffer[1]).to eql "\x34"
241
+ packet = @interface.read
242
+ expect(packet.target_name).to eql 'SYSTEM'
243
+ expect(packet.packet_name).to eql 'META'
244
+ expect(packet.identified?).to be true
245
+ expect(packet.defined?).to be false
246
+
247
+ pkt2 = System.telemetry.update!("SYSTEM","META",packet.buffer)
248
+ expect(pkt2.read('COSMOS_VERSION')).to eql 'TEST'
249
+ expect(pkt2.identified?).to be true
250
+ expect(pkt2.defined?).to be true
251
+ end
252
+
253
+ it "returns a packet" do
254
+ @interface.instance_variable_set(:@stream, PreStream.new)
255
+ @interface.add_protocol(PreidentifiedProtocol, [], :READ_WRITE)
256
+ pkt = System.telemetry.packet("SYSTEM","META")
257
+ pkt.write("COSMOS_VERSION", "TEST")
258
+ time = Time.new(2020,1,31,12,15,30.5)
259
+ pkt.received_time = time
260
+ @interface.write(pkt)
261
+ packet = @interface.read
262
+ expect(packet.target_name).to eql 'SYSTEM'
263
+ expect(packet.packet_name).to eql 'META'
264
+ expect(packet.identified?).to be true
265
+ expect(packet.defined?).to be false
266
+
267
+ pkt2 = System.telemetry.update!("SYSTEM","META",packet.buffer)
268
+ expect(pkt2.read('COSMOS_VERSION')).to eql 'TEST'
269
+ expect(pkt2.identified?).to be true
270
+ expect(pkt2.defined?).to be true
271
+ end
272
+ end
273
+
274
+ describe "write in mode 2" do
275
+ it "creates a packet header" do
276
+ @interface.instance_variable_set(:@stream, PreStream.new)
277
+ @interface.add_protocol(PreidentifiedProtocol, [nil, 5, 2], :READ_WRITE)
278
+ pkt = System.telemetry.packet("SYSTEM","META")
279
+ time = Time.new(2020,1,31,12,15,30.5)
280
+ pkt.received_time = time
281
+ @interface.write(pkt)
59
282
  expect($buffer[0..3].unpack('N')[0]).to eql time.to_f.to_i
60
283
  expect($buffer[4..7].unpack('N')[0]).to eql 500000
61
284
  offset = 8
@@ -74,7 +297,7 @@ module Cosmos
74
297
 
75
298
  it "handles a sync pattern" do
76
299
  @interface.instance_variable_set(:@stream, PreStream.new)
77
- @interface.add_protocol(PreidentifiedProtocol, ["DEAD"], :READ_WRITE)
300
+ @interface.add_protocol(PreidentifiedProtocol, ["DEAD", nil, 2], :READ_WRITE)
78
301
  pkt = System.telemetry.packet("SYSTEM","META")
79
302
  time = Time.new(2020,1,31,12,15,30.5)
80
303
  pkt.received_time = time
@@ -97,10 +320,10 @@ module Cosmos
97
320
  end
98
321
  end
99
322
 
100
- describe "read" do
323
+ describe "read in mode 2" do
101
324
  it "handles a sync pattern" do
102
325
  @interface.instance_variable_set(:@stream, PreStream.new)
103
- @interface.add_protocol(PreidentifiedProtocol, ["0x1234"], :READ_WRITE)
326
+ @interface.add_protocol(PreidentifiedProtocol, ["0x1234", nil, 2], :READ_WRITE)
104
327
  pkt = System.telemetry.packet("SYSTEM","META")
105
328
  pkt.write("COSMOS_VERSION", "TEST")
106
329
  time = Time.new(2020,1,31,12,15,30.5)
@@ -122,7 +345,7 @@ module Cosmos
122
345
 
123
346
  it "returns a packet" do
124
347
  @interface.instance_variable_set(:@stream, PreStream.new)
125
- @interface.add_protocol(PreidentifiedProtocol, [], :READ_WRITE)
348
+ @interface.add_protocol(PreidentifiedProtocol, [nil, nil, 2], :READ_WRITE)
126
349
  pkt = System.telemetry.packet("SYSTEM","META")
127
350
  pkt.write("COSMOS_VERSION", "TEST")
128
351
  time = Time.new(2020,1,31,12,15,30.5)