cosmos 3.3.3 → 3.4.0

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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.travis.yml +2 -1
  4. data/Gemfile +4 -3
  5. data/Manifest.txt +22 -0
  6. data/autohotkey/tools/handbook_creator.ahk +9 -0
  7. data/autohotkey/tools/packet_viewer.ahk +4 -0
  8. data/bin/exchndl20-x64.dll +0 -0
  9. data/bin/exchndl20.dll +0 -0
  10. data/bin/exchndl21-x64.dll +0 -0
  11. data/bin/exchndl21.dll +0 -0
  12. data/bin/exchndl22-x64.dll +0 -0
  13. data/bin/exchndl22.dll +0 -0
  14. data/bin/mgwhelp-x64.dll +0 -0
  15. data/bin/mgwhelp.dll +0 -0
  16. data/cosmos.gemspec +1 -0
  17. data/data/crc.txt +30 -24
  18. data/demo/config/data/crc.txt +3 -3
  19. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +3 -1
  20. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +3 -1
  21. data/demo/procedures/cosmos_api_test.rb +1 -1
  22. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +4 -0
  23. data/ext/cosmos/ext/platform/platform.c +22 -2
  24. data/ext/cosmos/ext/structure/structure.c +631 -104
  25. data/ext/cosmos/ext/telemetry/telemetry.c +3 -2
  26. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +71 -92
  27. data/lib/cosmos/gui/line_graph/overview_graph.rb +1 -1
  28. data/lib/cosmos/gui/qt.rb +38 -24
  29. data/lib/cosmos/gui/text/ruby_editor.rb +1 -1
  30. data/lib/cosmos/packets/binary_accessor.rb +1 -288
  31. data/lib/cosmos/packets/telemetry.rb +2 -1
  32. data/lib/cosmos/script/cmd_tlm_server.rb +110 -0
  33. data/lib/cosmos/script/commands.rb +166 -0
  34. data/lib/cosmos/script/extract.rb +2 -2
  35. data/lib/cosmos/script/limits.rb +108 -0
  36. data/lib/cosmos/script/script.rb +28 -1487
  37. data/lib/cosmos/script/scripting.rb +889 -0
  38. data/lib/cosmos/script/telemetry.rb +174 -0
  39. data/lib/cosmos/script/tools.rb +138 -0
  40. data/lib/cosmos/streams/stream_protocol.rb +9 -6
  41. data/lib/cosmos/system/target.rb +55 -38
  42. data/lib/cosmos/tools/cmd_tlm_server/api.rb +6 -3
  43. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +0 -1
  44. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -7
  45. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +15 -4
  46. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +15 -8
  47. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +41 -13
  48. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +18 -1
  49. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +1 -1
  50. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +1 -1
  51. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +1 -1
  52. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +1 -1
  53. data/lib/cosmos/top_level.rb +1 -1
  54. data/lib/cosmos/utilities/ruby_lex_utils.rb +1 -1
  55. data/lib/cosmos/version.rb +5 -5
  56. data/spec/gui/line_graph/line_clip_spec.rb +6 -6
  57. data/spec/gui/qt_spec.rb +102 -0
  58. data/spec/interfaces/interface_spec.rb +9 -9
  59. data/spec/interfaces/linc_interface_spec.rb +72 -15
  60. data/spec/interfaces/serial_interface_spec.rb +9 -9
  61. data/spec/interfaces/simulated_target_interface_spec.rb +7 -7
  62. data/spec/interfaces/stream_interface_spec.rb +4 -4
  63. data/spec/interfaces/tcpip_client_interface_spec.rb +8 -8
  64. data/spec/interfaces/tcpip_server_interface_spec.rb +9 -9
  65. data/spec/interfaces/udp_interface_spec.rb +20 -20
  66. data/spec/io/json_drb_spec.rb +4 -4
  67. data/spec/io/raw_logger_pair_spec.rb +20 -20
  68. data/spec/io/raw_logger_spec.rb +3 -3
  69. data/spec/io/tcpip_server_spec.rb +9 -9
  70. data/spec/io/udp_sockets_spec.rb +2 -2
  71. data/spec/io/win32_serial_driver_spec.rb +2 -2
  72. data/spec/packets/binary_accessor_spec.rb +143 -6
  73. data/spec/packets/commands_spec.rb +5 -5
  74. data/spec/packets/limits_spec.rb +15 -15
  75. data/spec/packets/packet_config_spec.rb +19 -19
  76. data/spec/packets/packet_item_limits_spec.rb +3 -3
  77. data/spec/packets/packet_item_spec.rb +4 -4
  78. data/spec/packets/packet_spec.rb +33 -33
  79. data/spec/packets/structure_item_spec.rb +19 -19
  80. data/spec/packets/telemetry_spec.rb +6 -6
  81. data/spec/script/cmd_tlm_server_spec.rb +110 -0
  82. data/spec/script/commands_disconnect_spec.rb +270 -0
  83. data/spec/script/commands_spec.rb +288 -0
  84. data/spec/script/limits_spec.rb +153 -0
  85. data/spec/script/script_spec.rb +32 -696
  86. data/spec/script/scripting_spec.rb +436 -0
  87. data/spec/script/telemetry_spec.rb +130 -0
  88. data/spec/script/tools_spec.rb +117 -0
  89. data/spec/spec_helper.rb +10 -5
  90. data/spec/streams/preidentified_stream_protocol_spec.rb +4 -4
  91. data/spec/streams/serial_stream_spec.rb +8 -8
  92. data/spec/streams/stream_protocol_spec.rb +4 -4
  93. data/spec/streams/tcpip_client_stream_spec.rb +3 -3
  94. data/spec/streams/tcpip_socket_stream_spec.rb +7 -7
  95. data/spec/streams/template_stream_protocol_spec.rb +1 -1
  96. data/spec/system/system_spec.rb +6 -6
  97. data/spec/system/target_spec.rb +2 -0
  98. data/spec/tools/cmd_tlm_server/api_spec.rb +17 -17
  99. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +5 -5
  100. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +3 -3
  101. data/spec/top_level/top_level_spec.rb +8 -8
  102. data/spec/utilities/csv_spec.rb +3 -3
  103. data/spec/utilities/message_log_spec.rb +3 -3
  104. data/spec/utilities/ruby_lex_utils_spec.rb +7 -7
  105. data/test/performance/config/tools/launcher/launcher_threads.txt +8 -1
  106. data/test/performance/tools/CmdTlmServerMemProf +1 -1
  107. data/test/performance/tools/TlmGrapherMemProf +19 -0
  108. data/test/performance/tools/TlmGrapherMemProf.bat +59 -0
  109. metadata +38 -2
@@ -0,0 +1,153 @@
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'
13
+ require 'cosmos/script/script'
14
+ require 'tempfile'
15
+
16
+ module Cosmos
17
+
18
+ describe Script do
19
+
20
+ before(:all) do
21
+ cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
22
+ FileUtils.mkdir_p(File.dirname(cts))
23
+ File.open(cts,'w') do |file|
24
+ file.puts 'INTERFACE INST_INT interface.rb'
25
+ file.puts 'TARGET INST'
26
+ end
27
+ System.class_eval('@@instance = nil')
28
+
29
+ require 'cosmos/script'
30
+ end
31
+
32
+ after(:all) do
33
+ clean_config()
34
+ FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
35
+ end
36
+
37
+ before(:each) do
38
+ allow_any_instance_of(Interface).to receive(:connected?).and_return(true)
39
+ allow_any_instance_of(Interface).to receive(:disconnect)
40
+ allow_any_instance_of(Interface).to receive(:write)
41
+ allow_any_instance_of(Interface).to receive(:read)
42
+
43
+ @server = CmdTlmServer.new
44
+ shutdown_cmd_tlm()
45
+ initialize_script_module()
46
+ sleep 0.1
47
+ end
48
+
49
+ after(:each) do
50
+ @server.stop
51
+ shutdown_cmd_tlm()
52
+ sleep(0.1)
53
+ end
54
+
55
+ describe "get_out_of_limits" do
56
+ it "gets all out of limits items" do
57
+ set_tlm_raw("INST HEALTH_STATUS TEMP1 = 0")
58
+ expect(get_out_of_limits).to include(["INST","HEALTH_STATUS","TEMP1",:RED_LOW])
59
+ end
60
+ end
61
+
62
+ describe "get_overall_limits_state" do
63
+ it "gets the overall limits state of the system" do
64
+ set_tlm_raw("INST HEALTH_STATUS TEMP1 = 0")
65
+ expect(get_overall_limits_state).to eql :RED
66
+ end
67
+
68
+ it "ignores specified items" do
69
+ ignore = []
70
+ ignore << %w(INST HEALTH_STATUS TEMP1)
71
+ ignore << %w(INST HEALTH_STATUS TEMP2)
72
+ ignore << %w(INST HEALTH_STATUS TEMP3)
73
+ ignore << %w(INST HEALTH_STATUS TEMP4)
74
+ ignore << %w(INST HEALTH_STATUS GROUND1STATUS)
75
+ ignore << %w(INST HEALTH_STATUS GROUND2STATUS)
76
+ expect(get_overall_limits_state(ignore)).to eql :STALE
77
+ end
78
+ end
79
+
80
+ describe "limits_enabled?, disable_limits, enable_limits" do
81
+ it "enables, disable, and check limits for an item" do
82
+ expect(limits_enabled?("INST HEALTH_STATUS TEMP1")).to be true
83
+ disable_limits("INST HEALTH_STATUS TEMP1")
84
+ expect(limits_enabled?("INST HEALTH_STATUS TEMP1")).to be false
85
+ enable_limits("INST HEALTH_STATUS TEMP1")
86
+ expect(limits_enabled?("INST HEALTH_STATUS TEMP1")).to be true
87
+ end
88
+ end
89
+
90
+ describe "get_limits, set_limits" do
91
+ it "gets and set limits for an item" do
92
+ expect(get_limits("INST", "HEALTH_STATUS", "TEMP1")).to eql [:DEFAULT, 1, true, -80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
93
+ expect(set_limits("INST", "HEALTH_STATUS", "TEMP1", 1, 2, 5, 6, 3, 4)).to eql [:CUSTOM, 1, true, 1.0, 2.0, 5.0, 6.0, 3.0, 4.0]
94
+ end
95
+ end
96
+
97
+ describe "get_limits_groups, enable_limits_group, disable_limits_group" do
98
+ it "enables, disable, and get groups" do
99
+ expect(get_limits_groups).to include("FIRST")
100
+ enable_limits_group("FIRST")
101
+ disable_limits_group("FIRST")
102
+ end
103
+ end
104
+
105
+ describe "get_limits_sets, enable_limits_set, disable_limits_set" do
106
+ it "enables, disable, and get sets CTS-16" do
107
+ if get_limits_sets.include?(:CUSTOM)
108
+ expect(get_limits_sets).to eql [:DEFAULT,:TVAC,:CUSTOM]
109
+ else
110
+ expect(get_limits_sets).to eql [:DEFAULT,:TVAC]
111
+ end
112
+ set_limits_set(:TVAC)
113
+ expect(get_limits_set).to eql :TVAC
114
+ set_limits_set(:DEFAULT)
115
+ expect(get_limits_set).to eql :DEFAULT
116
+ end
117
+ end
118
+
119
+ describe "subscribe_limits_events, get_limits_event, unsubscribe_limits_events" do
120
+ it "raises an error if non_block and the queue is empty" do
121
+ id = subscribe_limits_events
122
+ expect { get_limits_event(id, true) }.to raise_error(ThreadError, "queue empty")
123
+ unsubscribe_limits_events(id)
124
+ end
125
+
126
+ it "subscribes and get limits change events" do
127
+ id = subscribe_limits_events
128
+ CmdTlmServer.instance.post_limits_event(:LIMITS_CHANGE, ['TGT','PKT','ITEM',:YELLOW,:RED])
129
+ result = get_limits_event(id, true)
130
+ expect(result[0]).to eql :LIMITS_CHANGE
131
+ unsubscribe_limits_events(id)
132
+ end
133
+
134
+ it "subscribes and get limits settings events" do
135
+ id = subscribe_limits_events
136
+ CmdTlmServer.instance.post_limits_event(:LIMITS_SETTINGS, ['TGT','PKT','ITEM',:DEFAULT])
137
+ result = get_limits_event(id, true)
138
+ expect(result[0]).to eql :LIMITS_SETTINGS
139
+ unsubscribe_limits_events(id)
140
+ end
141
+
142
+ it "handles unknown limits events" do
143
+ id = subscribe_limits_events
144
+ CmdTlmServer.instance.post_limits_event(:UNKNOWN, "This is a test")
145
+ result = get_limits_event(id, true)
146
+ expect(result[0]).to eql :UNKNOWN
147
+ unsubscribe_limits_events(id)
148
+ end
149
+ end
150
+
151
+ end
152
+ end
153
+
@@ -10,7 +10,7 @@
10
10
 
11
11
  require 'spec_helper'
12
12
  require 'cosmos'
13
- require 'cosmos/script/script'
13
+ require 'cosmos/script'
14
14
  require 'tempfile'
15
15
 
16
16
  module Cosmos
@@ -34,714 +34,50 @@ module Cosmos
34
34
  FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
35
35
  end
36
36
 
37
- before(:each) do
38
- allow_any_instance_of(Interface).to receive(:connected?).and_return(true)
39
- allow_any_instance_of(Interface).to receive(:disconnect)
40
- allow_any_instance_of(Interface).to receive(:write)
41
- allow_any_instance_of(Interface).to receive(:read)
42
-
43
- @server = CmdTlmServer.new
44
- shutdown_cmd_tlm()
45
- initialize_script_module()
46
- sleep 0.1
47
- end
48
-
49
- after(:each) do
50
- @server.stop
51
- shutdown_cmd_tlm()
52
- sleep(0.1)
53
- end
54
-
55
- describe "cmd" do
56
- it "sends a command" do
57
- capture_io do |stdout|
58
- cmd("INST ABORT")
59
- expect(stdout.string).to match /cmd\(\'INST ABORT\'\)/ #'
60
- end
61
- end
62
-
63
- it "checks parameter ranges" do
64
- expect { cmd("INST COLLECT with TYPE NORMAL, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
65
- end
66
-
67
- it "prompts for a hazardous command" do
68
- capture_io do |stdout|
69
- expect(self).to receive(:gets) { 'y' } # Send hazardous command
70
- cmd("INST COLLECT with TYPE SPECIAL")
71
-
72
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
73
- expect(stdout.string).to match /cmd\(\'INST COLLECT/ # '
74
- stdout.rewind
75
-
76
- expect(self).to receive(:gets) { 'n' } # Don't send hazardous
77
- expect(self).to receive(:gets) { 'y' } # Stop running script
78
- cmd("INST COLLECT with TYPE SPECIAL")
79
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
80
- end
81
- end
82
- end
83
-
84
- describe "cmd_no_range_check" do
85
- it "sends an out of range command" do
86
- expect { cmd_no_range_check("INST COLLECT with TYPE NORMAL, DURATION 20") }.to_not raise_error
87
- end
88
-
89
- it "prompts for a hazardous command" do
90
- capture_io do |stdout|
91
- expect(self).to receive(:gets) { 'y' } # Send hazardous command
92
- cmd_no_range_check("INST COLLECT with TYPE SPECIAL")
93
-
94
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
95
- expect(stdout.string).to match /cmd\(\'INST COLLECT/ # '
96
- stdout.rewind
97
-
98
- expect(self).to receive(:gets) { 'n' } # Don't send hazardous
99
- expect(self).to receive(:gets) { 'y' } # Stop running script
100
- cmd_no_range_check("INST COLLECT with TYPE SPECIAL")
101
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
102
- end
103
- end
104
- end
105
-
106
- describe "cmd_no_hazardous_check" do
107
- it "checks parameter ranges" do
108
- expect { cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
109
- end
110
-
111
- it "sends a hazardous command without prompting" do
112
- capture_io do |stdout|
113
- cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL")
114
-
115
- expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
116
- expect(stdout.string).to match /cmd\(\'INST COLLECT/ # '
117
- end
118
- end
119
- end
120
-
121
- describe "cmd_no_checks" do
122
- it "sends an out of range hazardous command without prompting" do
123
- capture_io do |stdout|
124
- cmd_no_checks("INST COLLECT with TYPE SPECIAL, DURATION 20")
125
-
126
- expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
127
- expect(stdout.string).to match /cmd\(\'INST COLLECT/ # '
128
- end
129
- end
130
- end
131
-
132
- describe "cmd_raw" do
133
- it "sends a command" do
134
- capture_io do |stdout|
135
- cmd_raw("INST ABORT")
136
- expect(stdout.string).to match /cmd_raw\(\'INST ABORT\'\)/ # '
137
- end
138
- end
139
-
140
- it "checks parameter ranges" do
141
- expect { cmd_raw("INST COLLECT with TYPE 0, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/) # '
142
- end
143
-
144
- it "prompts for a hazardous command" do
145
- capture_io do |stdout|
146
- expect(self).to receive(:gets) { 'y' } # Send hazardous command
147
- cmd_raw("INST COLLECT with TYPE 1")
148
-
149
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
150
- expect(stdout.string).to match /cmd_raw\(\'INST COLLECT/ # '
151
- stdout.rewind
152
-
153
- expect(self).to receive(:gets) { 'n' } # Don't send hazardous
154
- expect(self).to receive(:gets) { 'y' } # Stop running script
155
- cmd_raw("INST COLLECT with TYPE 1")
156
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
157
- end
158
- end
159
- end
160
-
161
- describe "cmd_raw_no_range_check" do
162
- it "sends an out of range command" do
163
- expect { cmd_raw_no_range_check("INST COLLECT with TYPE 0, DURATION 20") }.to_not raise_error
164
- end
165
-
166
- it "prompts for a hazardous command" do
167
- capture_io do |stdout|
168
- expect(self).to receive(:gets) { 'y' } # Send hazardous command
169
- cmd_raw_no_range_check("INST COLLECT with TYPE 1")
170
-
171
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
172
- expect(stdout.string).to match /cmd_raw\(\'INST COLLECT/ # '
173
- stdout.rewind
174
-
175
- expect(self).to receive(:gets) { 'n' } # Don't send hazardous
176
- expect(self).to receive(:gets) { 'y' } # Stop running script
177
- cmd_raw_no_range_check("INST COLLECT with TYPE 1")
178
- expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
179
- end
180
- end
181
- end
182
-
183
- describe "cmd_raw_no_hazardous_check" do
184
- it "checks parameter ranges" do
185
- expect { cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
186
- end
187
-
188
- it "sends a hazardous command without prompting" do
189
- capture_io do |stdout|
190
- cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1")
191
- expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
192
- expect(stdout.string).to match /cmd_raw\(\'INST COLLECT/ #'
193
- end
194
- end
195
- end
196
-
197
- describe "cmd_raw_no_checks" do
198
- it "sends an out of range hazardous command without prompting" do
199
- capture_io do |stdout|
200
- cmd_raw_no_checks("INST COLLECT with TYPE 1, DURATION 20")
201
- expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
202
- expect(stdout.string).to match /cmd_raw\(\'INST COLLECT/ #'
203
- end
204
- end
205
- end
206
-
207
- describe "send_raw" do
208
- it "sends data to the write_raw interface method" do
209
- expect_any_instance_of(Interface).to receive(:write_raw).with('\x00')
210
- send_raw('INST_INT', '\x00')
211
- end
212
- end
213
-
214
- describe "send_raw_file" do
215
- it "sends file data to the write_raw interface method" do
216
- file = File.open('raw_test_file.bin','wb')
217
- file.write '\x00\x01\x02\x03'
218
- file.close
219
-
220
- expect_any_instance_of(Interface).to receive(:write_raw).with('\x00\x01\x02\x03')
221
-
222
- send_raw_file('INST_INT', 'raw_test_file.bin')
223
-
224
- File.delete('raw_test_file.bin')
225
- end
226
- end
227
-
228
- describe "get_cmd_list" do
229
- it "returns all the target commands" do
230
- list = get_cmd_list("INST")
231
- # Only check for the collect command to make this test list dependent
232
- # on the demo INST command definition file
233
- expect(list).to include(["COLLECT", "Starts a collect on the instrument"])
234
- end
235
- end
236
-
237
- describe "get_cmd_param_list" do
238
- it "returns all the parameters for a command" do
239
- list = get_cmd_param_list("INST", "COLLECT")
240
- expect(list).to include(["TYPE", 0, {"NORMAL"=>0, "SPECIAL"=>1}, "Collect type", nil, nil, true])
241
- end
242
- end
243
-
244
- describe "get_cmd_hazardous" do
245
- it "returns whether a command is hazardous" do
246
- expect(get_cmd_hazardous("INST", "COLLECT", {"TYPE"=>"NORMAL"})).to be_falsey
247
- expect(get_cmd_hazardous("INST", "COLLECT", {"TYPE"=>"SPECIAL"})).to be_truthy
248
- end
249
- end
250
-
251
- describe "tlm, tlm_raw, tlm_formatted, tlm_with_units, tlm_variable, set_tlm, set_tlm_raw" do
252
- it "passes through to the cmd_tlm_server" do
253
- expect {
254
- expect(tlm("INST HEALTH_STATUS TEMP1")).to eql -100.0
255
- expect(tlm_raw("INST HEALTH_STATUS TEMP1")).to eql 0
256
- expect(tlm_formatted("INST HEALTH_STATUS TEMP1")).to eql "-100.000"
257
- expect(tlm_with_units("INST HEALTH_STATUS TEMP1")).to eql "-100.000 C"
258
- expect(tlm_variable("INST HEALTH_STATUS TEMP1", :RAW)).to eql 0
259
- set_tlm("INST HEALTH_STATUS TEMP1 = 1")
260
- set_tlm_raw("INST HEALTH_STATUS TEMP1 = 0")
261
- }.to_not raise_error
262
- end
263
- end
264
-
265
- describe "get_tlm_packet" do
266
- it "gets the packet values" do
267
- expect(get_tlm_packet("INST", "HEALTH_STATUS", :RAW)).to include(["TEMP1", 0, :RED_LOW])
268
- end
269
- end
270
-
271
- describe "get_tlm_values" do
272
- it "gets the given values" do
273
- vals = get_tlm_values([["INST", "HEALTH_STATUS", "TEMP1"], ["INST", "HEALTH_STATUS", "TEMP2"]])
274
- expect(vals[0][0]).to eql -100.0
275
- expect(vals[1][0]).to eql :RED_LOW
276
- expect(vals[2][0]).to eql [-80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
277
- expect(vals[3]).to eql :DEFAULT
278
- end
279
- end
280
-
281
- describe "get_tlm_list" do
282
- it "gets packets for a given target" do
283
- expect(get_tlm_list("INST")).to include(["HEALTH_STATUS", "Health and status from the instrument"])
284
- end
285
- end
286
-
287
- describe "get_tlm_item_list" do
288
- it "gets telemetry for a given packet" do
289
- expect(get_tlm_item_list("INST", "HEALTH_STATUS")).to include(["TEMP1",nil,"Temperature #1"])
290
- end
291
- end
292
-
293
- describe "get_tlm_details" do
294
- it "gets telemetry for a given packet" do
295
- details = get_tlm_details([["INST", "HEALTH_STATUS", "TEMP1"], ["INST", "HEALTH_STATUS", "TEMP2"]])
296
- expect(details[0]["name"]).to eql "TEMP1"
297
- expect(details[1]["name"]).to eql "TEMP2"
298
- end
299
- end
300
-
301
- describe "get_out_of_limits" do
302
- it "gets all out of limits items" do
303
- expect(get_out_of_limits).to include(["INST","HEALTH_STATUS","TEMP1",:RED_LOW])
304
- end
305
- end
306
-
307
- describe "get_overall_limits_state" do
308
- it "gets the overall limits state of the system" do
309
- expect(get_overall_limits_state).to eql :RED
310
- end
311
-
312
- it "ignores specified items" do
313
- ignore = []
314
- ignore << %w(INST HEALTH_STATUS TEMP1)
315
- ignore << %w(INST HEALTH_STATUS TEMP2)
316
- ignore << %w(INST HEALTH_STATUS TEMP3)
317
- ignore << %w(INST HEALTH_STATUS TEMP4)
318
- ignore << %w(INST HEALTH_STATUS GROUND1STATUS)
319
- ignore << %w(INST HEALTH_STATUS GROUND2STATUS)
320
- expect(get_overall_limits_state(ignore)).to eql :STALE
321
- end
322
- end
323
-
324
- describe "limits_enabled?, disable_limits, enable_limits" do
325
- it "enables, disable, and check limits for an item" do
326
- expect(limits_enabled?("INST HEALTH_STATUS TEMP1")).to be_truthy
327
- disable_limits("INST HEALTH_STATUS TEMP1")
328
- expect(limits_enabled?("INST HEALTH_STATUS TEMP1")).to be_falsey
329
- enable_limits("INST HEALTH_STATUS TEMP1")
330
- expect(limits_enabled?("INST HEALTH_STATUS TEMP1")).to be_truthy
331
- end
332
- end
333
-
334
- describe "get_limits, set_limits" do
335
- it "gets and set limits for an item" do
336
- expect(get_limits("INST", "HEALTH_STATUS", "TEMP1")).to eql [:DEFAULT, 1, true, -80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
337
- expect(set_limits("INST", "HEALTH_STATUS", "TEMP1", 1, 2, 5, 6, 3, 4)).to eql [:CUSTOM, 1, true, 1.0, 2.0, 5.0, 6.0, 3.0, 4.0]
338
- end
339
- end
340
-
341
- describe "get_limits_groups, enable_limits_group, disable_limits_group" do
342
- it "enables, disable, and get groups" do
343
- expect(get_limits_groups).to include("FIRST")
344
- enable_limits_group("FIRST")
345
- disable_limits_group("FIRST")
346
- end
347
- end
348
-
349
- describe "get_limits_sets, enable_limits_set, disable_limits_set" do
350
- it "enables, disable, and get sets CTS-16" do
351
- if get_limits_sets.include?(:CUSTOM)
352
- expect(get_limits_sets).to eql [:DEFAULT,:TVAC,:CUSTOM]
353
- else
354
- expect(get_limits_sets).to eql [:DEFAULT,:TVAC]
355
- end
356
- set_limits_set(:TVAC)
357
- expect(get_limits_set).to eql :TVAC
358
- set_limits_set(:DEFAULT)
359
- expect(get_limits_set).to eql :DEFAULT
360
- end
361
- end
362
-
363
- describe "get_target_list" do
364
- it "returns the list of targets" do
365
- expect(get_target_list).to include("INST")
366
- end
367
- end
368
-
369
- describe "subscribe_limits_events, get_limits_event, unsubscribe_limits_events" do
370
- it "raises an error if non_block and the queue is empty" do
371
- id = subscribe_limits_events
372
- expect { get_limits_event(id, true) }.to raise_error(ThreadError, "queue empty")
373
- unsubscribe_limits_events(id)
374
- end
375
-
376
- it "subscribes and get limits change events" do
377
- id = subscribe_limits_events
378
- CmdTlmServer.instance.post_limits_event(:LIMITS_CHANGE, ['TGT','PKT','ITEM',:YELLOW,:RED])
379
- result = get_limits_event(id, true)
380
- expect(result[0]).to eql :LIMITS_CHANGE
381
- unsubscribe_limits_events(id)
382
- end
383
-
384
- it "subscribes and get limits settings events" do
385
- id = subscribe_limits_events
386
- CmdTlmServer.instance.post_limits_event(:LIMITS_SETTINGS, ['TGT','PKT','ITEM',:DEFAULT])
387
- result = get_limits_event(id, true)
388
- expect(result[0]).to eql :LIMITS_SETTINGS
389
- unsubscribe_limits_events(id)
390
- end
391
-
392
- it "handles unknown limits events" do
393
- id = subscribe_limits_events
394
- CmdTlmServer.instance.post_limits_event(:UNKNOWN, "This is a test")
395
- result = get_limits_event(id, true)
396
- expect(result[0]).to eql :UNKNOWN
397
- unsubscribe_limits_events(id)
398
- end
399
- end
400
-
401
- describe "subscribe_packet_data, get_packet, unsubscribe_packet_data" do
402
- it "raises an error if non_block and the queue is empty" do
403
- id = subscribe_packet_data([["INST","HEALTH_STATUS"]])
404
- expect { get_packet(id, true) }.to raise_error(ThreadError, "queue empty")
405
- unsubscribe_packet_data(id)
406
- end
407
-
408
- it "subscribes and get limits events" do
409
- id = subscribe_packet_data([["INST","HEALTH_STATUS"]])
410
- CmdTlmServer.instance.post_packet(System.telemetry.packet("INST","HEALTH_STATUS"))
411
- packet = get_packet(id, true)
412
- expect(packet.target_name).to eql "INST"
413
- expect(packet.packet_name).to eql "HEALTH_STATUS"
414
- unsubscribe_packet_data(id)
415
- end
416
- end
417
-
418
- describe "play_wav_file" do
419
- it "plays a wav file if Qt is available" do
420
- module Qt
421
- def self.execute_in_main_thread(bool); yield; end
422
- class CoreApplication; def self.instance; true; end; end;
423
- class Sound; def self.isAvailable; true; end; end
424
- end
425
- expect(Qt::Sound).to receive(:play).with("sound.wav")
426
- play_wav_file("sound.wav")
427
- end
428
- end
429
-
430
- describe "status_bar" do
431
- it "sets the ScriptRunner status bar" do
432
- class ScriptRunner; end
433
- sc = ScriptRunner.new
434
- expect(sc).to receive(:script_set_status).with("HI")
435
- status_bar("HI")
436
- end
437
- end
438
-
439
- describe "ask_string, ask" do
440
- it "gets user input" do
441
- $stdout = StringIO.new
442
- expect(self).to receive(:gets) { '10' }
443
- expect(ask_string("")).to eql '10'
444
- expect(self).to receive(:gets) { '10' }
445
- expect(ask("")).to eql 10
446
- $stdout = STDOUT
447
- end
448
- end
449
-
450
- describe "prompt, prompt_message_box" do
451
- it "prompts the user for input" do
452
- $stdout = StringIO.new
453
- expect(self).to receive(:gets) { 'message' }
454
- expect(prompt("")).to eql 'message'
455
- expect(self).to receive(:gets) { 'b1' }
456
- expect(message_box("",["b1","b2"])).to eql 'b1'
457
- $stdout = STDOUT
458
- end
459
- end
460
-
461
- describe "check, check_formatted, check_with_units, check_raw" do
462
- it "checks a telemetry item vs a condition" do
463
- capture_io do |stdout|
464
- check("INST HEALTH_STATUS TEMP1 == -100")
465
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == -100 success"
466
- stdout.rewind
467
-
468
- check("INST","HEALTH_STATUS","TEMP1","== -100")
469
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == -100 success"
470
- stdout.rewind
471
-
472
- check_formatted("INST HEALTH_STATUS TEMP1 == '-100.000'")
473
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == '-100.000' success"
474
- stdout.rewind
475
-
476
- check_formatted("INST","HEALTH_STATUS","TEMP1","== '-100.000'")
477
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == '-100.000' success"
478
- stdout.rewind
479
-
480
- check_with_units("INST HEALTH_STATUS TEMP1 == '-100.000 C'")
481
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == '-100.000 C' success"
482
- stdout.rewind
483
-
484
- check_with_units("INST","HEALTH_STATUS","TEMP1","== '-100.000 C'")
485
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == '-100.000 C' success"
486
- stdout.rewind
487
-
488
- check_raw("INST HEALTH_STATUS TEMP1")
489
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == 0"
490
- end
491
-
492
- check("INST HEALTH_STATUS TEMP1 < 0")
493
- expect { check("INST HEALTH_STATUS TEMP1 > 0") }.to raise_error(Cosmos::CheckError)
494
- end
495
- end
496
-
497
- describe "check_tolerance, check_tolerance_raw" do
498
- it "checks a telemetry item vs tolerance" do
499
- capture_io do |stdout|
500
- check_tolerance("INST HEALTH_STATUS TEMP1", -100.0, 1)
501
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 was within range"
502
- stdout.rewind
503
-
504
- expect { check_tolerance("INST HEALTH_STATUS TEMP1", -200.0, 1) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS TEMP1 failed to be within range/)
505
- stdout.rewind
506
-
507
- check_tolerance_raw("INST HEALTH_STATUS TEMP1", 0, 1)
508
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 was within range"
509
- stdout.rewind
510
-
511
- expect { check_tolerance_raw("INST HEALTH_STATUS TEMP1", 100, 1) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS TEMP1 failed to be within range/)
512
- stdout.rewind
513
- end
514
- end
515
- end
516
-
517
- describe "check_expression" do
518
- it "checks an arbitrary expression" do
519
- capture_io do |stdout|
520
- check_expression("true == true")
521
- expect(stdout.string).to match "CHECK: true == true is TRUE"
522
- end
523
-
524
- expect { check_expression("true == false") }.to raise_error(CheckError, "CHECK: true == false is FALSE")
525
- end
526
- end
527
-
528
- describe "wait, wait_raw, wait_tolerance, wait_tolerance_raw" do
529
- it "waits for telemetry check to be true" do
530
- capture_io do |stdout|
531
- # Success
532
- wait("INST HEALTH_STATUS TEMP1 == -100.0", 5)
533
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 == -100.0"
534
- stdout.rewind
535
- wait_raw("INST HEALTH_STATUS TEMP1 == 0", 5)
536
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 == 0"
537
- stdout.rewind
538
- wait_tolerance("INST HEALTH_STATUS TEMP1", -100.0, 1, 5)
539
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 was within"
540
- stdout.rewind
541
- wait_tolerance_raw("INST HEALTH_STATUS TEMP1", 0, 1, 5)
542
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 was within"
543
- stdout.rewind
544
-
545
- # Failure
546
- wait("INST HEALTH_STATUS TEMP1 == -200.0", 0.1)
547
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 == -200.0 failed"
548
- stdout.rewind
549
- wait_raw("INST HEALTH_STATUS TEMP1 == 100", 0.1)
550
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 == 100 failed"
551
- stdout.rewind
552
- wait_tolerance("INST HEALTH_STATUS TEMP1", -200.0, 1, 0.1)
553
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 failed to be within"
554
- stdout.rewind
555
- wait_tolerance_raw("INST HEALTH_STATUS TEMP1", 100, 1, 0.1)
556
- expect(stdout.string).to match "WAIT: INST HEALTH_STATUS TEMP1 failed to be within"
557
- stdout.rewind
558
- end
559
- end
560
- end
561
-
562
- describe "wait_expression" do
563
- it "waits for an expression to be true" do
564
- capture_io do |stdout|
565
- # Success
566
- wait_expression("true == true", 5)
567
- expect(stdout.string).to match "WAIT: true == true is TRUE"
568
- stdout.rewind
569
-
570
- # Failure
571
- wait_expression("true == false", 0.1)
572
- expect(stdout.string).to match "WAIT: true == false is FALSE"
573
- stdout.rewind
574
- end
575
- end
576
- end
577
-
578
- describe "wait_check, wait_check_raw, wait_check_tolerance, wait_check_tolerance_raw" do
579
- it "waits for telemetry check to be true" do
580
- capture_io do |stdout|
581
- # Success
582
- wait_check("INST HEALTH_STATUS TEMP1 == -100.0", 5)
583
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == -100.0"
584
- stdout.rewind
585
- wait_check_raw("INST HEALTH_STATUS TEMP1 == 0", 5)
586
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 == 0"
587
- stdout.rewind
588
- wait_check_tolerance("INST HEALTH_STATUS TEMP1", -100.0, 1, 5)
589
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 was within"
590
- stdout.rewind
591
- wait_check_tolerance_raw("INST HEALTH_STATUS TEMP1", 0, 1, 5)
592
- expect(stdout.string).to match "CHECK: INST HEALTH_STATUS TEMP1 was within"
593
- stdout.rewind
594
- end
595
-
596
- # Failure
597
- expect { wait_check("INST HEALTH_STATUS TEMP1 == -200.0", 0.1) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS TEMP1 == -200.0 failed/)
598
- expect { wait_check_raw("INST HEALTH_STATUS TEMP1 == 100", 0.1) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS TEMP1 == 100 failed/)
599
- expect { wait_check_tolerance("INST HEALTH_STATUS TEMP1", -200.0, 1, 0.1) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS TEMP1 failed to be within/)
600
-
601
- expect { wait_check_tolerance_raw("INST HEALTH_STATUS TEMP1", 100, 1, 0.1) }.to raise_error(CheckError, /CHECK: INST HEALTH_STATUS TEMP1 failed to be within/)
602
-
603
- end
604
- end
605
-
606
- describe "wait_check_expression" do
607
- it "waits for an expression to be true" do
608
- capture_io do |stdout|
609
- # Success
610
- wait_check_expression("true == true", 5)
611
- expect(stdout.string).to match "CHECK: true == true is TRUE"
612
- stdout.rewind
613
- end
614
-
615
- # Failure
616
- expect { wait_check_expression("true == false", 0.1) }.to raise_error(CheckError, /CHECK: true == false is FALSE/)
37
+ describe "require cosmos/script.rb" do
38
+ it "should raise when inside CmdTlmServer" do
39
+ save = $0
40
+ $0 = "CmdTlmServer"
41
+ expect { load 'cosmos/script.rb' }.to raise_error(/must not be required/)
42
+ $0 = save
617
43
  end
618
- end
619
44
 
620
- describe "wait_packet, wait_check_packet" do
621
- it "waits for a certain number of packets" do
622
- capture_io do |stdout|
623
- wait_packet("INST","HEALTH_STATUS",1,0.1)
624
- end
625
-
626
- expect { wait_check_packet("INST","HEALTH_STATUS",1,0.1) }.to raise_error(CheckError, /INST HEALTH_STATUS expected to be received 1 times but only received 0 times/)
45
+ it "should raise when inside Replay" do
46
+ save = $0
47
+ $0 = "Replay"
48
+ expect { load 'cosmos/script.rb' }.to raise_error(/must not be required/)
49
+ $0 = save
627
50
  end
628
51
  end
629
52
 
630
- describe "get_interface_names" do
631
- it "returns all interfaces" do
632
- expect(get_interface_names).to include("INST_INT")
53
+ describe "shutdown_cmd_tlm" do
54
+ it "should call shutdown on the server" do
55
+ set_cmd_tlm_disconnect(false)
56
+ expect($cmd_tlm_server).to receive(:shutdown)
57
+ shutdown_cmd_tlm()
633
58
  end
634
- end
635
-
636
- describe "connect_interface, disconnect_interface, interface_state" do
637
- it "connects, disconnect and return the state of the interface CTS-3" do
638
- connect_interface("INST_INT")
639
- expect(interface_state("INST_INT")).to eql "CONNECTED"
640
- disconnect_interface("INST_INT")
641
- end
642
- end
643
59
 
644
- describe "map_target_to_interface" do
645
- it "maps a target name to an interface" do
646
- map_target_to_interface("INST","INST_INT")
60
+ it "should not call shutdown in disconnect mode" do
61
+ set_cmd_tlm_disconnect(true)
62
+ expect($cmd_tlm_server).to_not receive(:shutdown)
63
+ shutdown_cmd_tlm()
64
+ set_cmd_tlm_disconnect(false)
647
65
  end
648
66
  end
649
67
 
650
- describe "connect_router, disconnect_router, get_router_names, router_state" do
651
- it "returns connect, disconnect, and list the routers CTS-11" do
652
- expect(get_router_names).to include("PREIDENTIFIED_ROUTER")
653
- connect_router("PREIDENTIFIED_ROUTER")
654
- expect(router_state("PREIDENTIFIED_ROUTER")).to eql "CONNECTED"
655
- disconnect_router("PREIDENTIFIED_ROUTER")
68
+ describe "script_disconnect" do
69
+ it "should disconnect from the server" do
70
+ expect($cmd_tlm_server).to receive(:disconnect)
71
+ script_disconnect()
656
72
  end
657
73
  end
658
74
 
659
- describe "logging methods" do
660
- it "starts and stop logging and get filenames CTS-14" do
661
- start_logging
662
- stop_logging
663
- get_cmd_log_filename
664
- get_tlm_log_filename
665
- start_cmd_log
666
- start_tlm_log
667
- get_cmd_log_filename
668
- get_tlm_log_filename
669
- stop_cmd_log
670
- stop_tlm_log
671
- get_cmd_log_filename
672
- get_tlm_log_filename
673
- start_raw_logging_interface
674
- start_raw_logging_router
675
- stop_raw_logging_interface
676
- stop_raw_logging_router
677
-
678
- start_new_server_message_log
679
- sleep 0.1
680
- filename = get_server_message_log_filename
681
- expect(filename).to match /server_messages.txt/
682
- end
683
- end
684
-
685
- describe "display" do
686
- it "displays a telemetry viewer screen" do
687
- expect { display("HI") }.to raise_error(RuntimeError, /HI could not be displayed/)
688
- end
689
- end
690
- describe "clear" do
691
- it "closes a telemetry viewer screen" do
692
- expect { clear("HI") }.to raise_error(RuntimeError, /HI could not be cleared/)
693
- end
694
- end
695
-
696
- describe "ScriptRunnerFrame methods" do
697
- it "calls various ScriptRunnerFrame methods" do
698
- class Dummy; def method_missing(meth, *args, &block); end; end
699
- class ScriptRunnerFrame
700
- def self.method_missing(meth, *args, &block); end
701
- def self.instance; Dummy.new; end
702
- end
703
- set_line_delay(1.0)
704
- get_line_delay
705
- get_scriptrunner_message_log_filename
706
- start_new_scriptrunner_message_log
707
- disable_instrumentation do
708
- value = 1
709
- end
710
- set_stdout_max_lines(1000)
711
- insert_return
712
- step_mode
713
- run_mode
714
- show_backtrace
715
- end
716
- end
717
-
718
- describe "start" do
719
- it "starts a script locally" do
720
- class ScriptRunnerFrame; def self.instance; false; end; end
721
- start("cosmos.rb")
722
- end
723
-
724
- it "starts a script without the .rb extension" do
725
- class ScriptRunnerFrame; def self.instance; false; end; end
726
- start("cosmos")
727
- end
728
-
729
- it "raises an error if the script can't be found" do
730
- class ScriptRunnerFrame; def self.instance; false; end; end
731
- expect { start("unknown_script.rb") }.to raise_error(RuntimeError)
732
- end
733
-
734
- it "starts a script within ScriptRunnerFrame" do
735
- class ScriptRunnerFrame
736
- @@instrumented_cache = {}
737
- def self.instance; true; end
738
- def self.instrumented_cache; @@instrumented_cache; end
739
- def self.instrumented_cache=(value); @@instrumented_cache = value; end
740
- def self.instrument_script(file_text, path, bool); "#"; end
741
- end
742
- start("cosmos.rb")
743
- # This one should use the cached version
744
- start("cosmos.rb")
75
+ describe "set_cmd_tlm_disconnect and get_cmd_tlm_disconnect" do
76
+ it "set and get the disconnect status" do
77
+ set_cmd_tlm_disconnect(true)
78
+ expect(get_cmd_tlm_disconnect()).to be true
79
+ set_cmd_tlm_disconnect(false)
80
+ expect(get_cmd_tlm_disconnect()).to be false
745
81
  end
746
82
  end
747
83