openc3-demo 5.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +727 -0
  3. data/README.md +30 -0
  4. data/Rakefile +42 -0
  5. data/microservices/EXAMPLE/example_target.rb +123 -0
  6. data/microservices/TEMPLATED/scpi_target.rb +79 -0
  7. data/plugin.txt +112 -0
  8. data/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -0
  9. data/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -0
  10. data/targets/EXAMPLE/lib/example_interface.rb +27 -0
  11. data/targets/EXAMPLE/target.txt +9 -0
  12. data/targets/INST/cmd_tlm/_ccsds_cmd.txt +9 -0
  13. data/targets/INST/cmd_tlm/_ccsds_tlm.txt +19 -0
  14. data/targets/INST/cmd_tlm/inst_cmds.txt +57 -0
  15. data/targets/INST/cmd_tlm/inst_tlm.txt +162 -0
  16. data/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
  17. data/targets/INST/data/attitude.bin +0 -0
  18. data/targets/INST/data/position.bin +0 -0
  19. data/targets/INST/lib/example_limits_response.rb +39 -0
  20. data/targets/INST/lib/sim_inst.rb +354 -0
  21. data/targets/INST/procedures/checks.rb +11 -0
  22. data/targets/INST/procedures/collect.rb +18 -0
  23. data/targets/INST/procedures/disconnect.rb +29 -0
  24. data/targets/INST/procedures/file_dialog.rb +13 -0
  25. data/targets/INST/procedures/my_script_suite.rb +46 -0
  26. data/targets/INST/procedures/my_test_suite.rb +45 -0
  27. data/targets/INST/procedures/target_file.rb +21 -0
  28. data/targets/INST/procedures/utilities/clear.rb +7 -0
  29. data/targets/INST/procedures/utilities/collect.rb +14 -0
  30. data/targets/INST/public/ground_error.png +0 -0
  31. data/targets/INST/public/ground_off.png +0 -0
  32. data/targets/INST/public/ground_on.png +0 -0
  33. data/targets/INST/public/satellite.png +0 -0
  34. data/targets/INST/screens/_footer.txt +3 -0
  35. data/targets/INST/screens/adcs.txt +71 -0
  36. data/targets/INST/screens/array.txt +15 -0
  37. data/targets/INST/screens/block.txt +6 -0
  38. data/targets/INST/screens/commanding.txt +44 -0
  39. data/targets/INST/screens/graphs.txt +17 -0
  40. data/targets/INST/screens/ground.txt +46 -0
  41. data/targets/INST/screens/hs.txt +42 -0
  42. data/targets/INST/screens/latest.txt +21 -0
  43. data/targets/INST/screens/limits.txt +82 -0
  44. data/targets/INST/screens/other.txt +37 -0
  45. data/targets/INST/screens/params.txt +54 -0
  46. data/targets/INST/screens/simple.txt +6 -0
  47. data/targets/INST/screens/tabs.txt +66 -0
  48. data/targets/INST/screens/web.txt +5 -0
  49. data/targets/INST/tables/bin/ConfigTables.bin +0 -0
  50. data/targets/INST/tables/config/ConfigTables_def.txt +7 -0
  51. data/targets/INST/tables/config/MCConfigurationTable_def.txt +36 -0
  52. data/targets/INST/tables/config/PPSSelectionTable_def.txt +7 -0
  53. data/targets/INST/tables/config/TLMMonitoringTable_def.txt +31 -0
  54. data/targets/INST/tables/procedures/download.rb +16 -0
  55. data/targets/INST/tables/procedures/upload.rb +19 -0
  56. data/targets/INST/target.txt +31 -0
  57. data/targets/SYSTEM/cmd_tlm/limits_groups.txt +6 -0
  58. data/targets/SYSTEM/cmd_tlm/meta_tlm.txt +10 -0
  59. data/targets/SYSTEM/cmd_tlm/system_cmds.txt +41 -0
  60. data/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  61. data/targets/SYSTEM/lib/example_background_task.rb +66 -0
  62. data/targets/SYSTEM/lib/example_target.rb +112 -0
  63. data/targets/SYSTEM/lib/limits_groups.rb +64 -0
  64. data/targets/SYSTEM/lib/scpi_target.rb +76 -0
  65. data/targets/SYSTEM/procedures/example_test.rb +191 -0
  66. data/targets/SYSTEM/procedures/interactive.rb +38 -0
  67. data/targets/SYSTEM/procedures/openc3_api_test.rb +286 -0
  68. data/targets/SYSTEM/procedures/run_example_test.rb +3 -0
  69. data/targets/SYSTEM/procedures/test.rb +49 -0
  70. data/targets/SYSTEM/screens/status.txt +12 -0
  71. data/targets/SYSTEM/target.txt +12 -0
  72. data/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -0
  73. data/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -0
  74. data/targets/TEMPLATED/lib/templated_interface.rb +69 -0
  75. data/targets/TEMPLATED/target.txt +8 -0
  76. data/tools/widgets/BigWidget/BigWidget.umd.min.js +4 -0
  77. data/tools/widgets/BigWidget/BigWidget.umd.min.js.map +1 -0
  78. data/tools/widgets/HelloworldWidget/HelloworldWidget.umd.min.js +2 -0
  79. data/tools/widgets/HelloworldWidget/HelloworldWidget.umd.min.js.map +1 -0
  80. metadata +126 -0
@@ -0,0 +1,191 @@
1
+ load 'openc3/tools/test_runner/test.rb'
2
+
3
+ # This Test demonstrates the usage of the setup and teardown methods
4
+ # as well as defining two tests. Notice that the setup and teardown
5
+ # methods must be called exactly that. Other test methods must start
6
+ # with 'test_' to be processed.
7
+ class ExampleTest < OpenC3::Test
8
+ def initialize
9
+ super()
10
+ end
11
+
12
+ # Setup the test case by doing stuff
13
+ def setup
14
+ status_bar("setup")
15
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
16
+ wait(2)
17
+ end
18
+
19
+ # test_1 verifies requirement 1
20
+ def test_case_with_long_name_1
21
+ status_bar("test_case_with_long_name_1")
22
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
23
+ OpenC3::Test.puts "This test verifies requirement 1"
24
+ wait(2)
25
+ end
26
+
27
+ # test_2 verifies requirement 2
28
+ def test_2
29
+ status_bar("test_2")
30
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
31
+ OpenC3::Test.puts "This test verifies requirement 2"
32
+ if $manual
33
+ answer = ask "Are you sure?"
34
+ else
35
+ answer = 'y'
36
+ end
37
+ wait(2)
38
+ end
39
+
40
+ def test_3xx
41
+ status_bar("test_3xx")
42
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
43
+ wait 1
44
+ end
45
+
46
+ # Teardown the test case by doing other stuff
47
+ def teardown
48
+ status_bar("teardown")
49
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
50
+ wait(2)
51
+ end
52
+
53
+ def helper_method
54
+ end
55
+ end
56
+
57
+ # This is an ExampleTestSuite which only runs ExampleTest
58
+ class ExampleTestSuite < OpenC3::TestSuite
59
+ def initialize
60
+ super()
61
+ add_test('ExampleTest')
62
+ end
63
+ end
64
+
65
+ # ExampleTest2 runs test_3 and test_4.
66
+ class ExampleTest2 < OpenC3::Test
67
+ def setup
68
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
69
+ wait(2)
70
+ end
71
+
72
+ # ExampleTest2::test_2 is different from ExampleTest::test_2
73
+ def test_2
74
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
75
+ raise "BAD"
76
+ puts "continuing past the exception"
77
+ wait 2
78
+ end
79
+
80
+ def test_3
81
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
82
+ raise SkipTestCase, "test_3 unimplemented"
83
+ wait(2)
84
+ end
85
+
86
+ def test_4
87
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
88
+ if non_existent
89
+ puts "can't get here"
90
+ else
91
+ puts "can't get here either"
92
+ end
93
+ wait(2)
94
+ end
95
+
96
+ def teardown
97
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
98
+ wait(2)
99
+ end
100
+ end
101
+
102
+ class ExampleTestSuite2 < OpenC3::TestSuite
103
+ def initialize
104
+ super()
105
+ add_test('ExampleTest2')
106
+ end
107
+ end
108
+
109
+ class ExampleTestSuite3 < OpenC3::TestSuite
110
+ # This setup applies to the entire test suite
111
+ def setup
112
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
113
+ wait(2)
114
+ end
115
+
116
+ def initialize
117
+ super()
118
+ add_test_setup('ExampleTest')
119
+ # This line raises a runtime error because ExampleTest3 has no setup method
120
+ # add_test_setup('ExampleTest3')
121
+ # This line raises a runtime error because ExampleTest3 has no test_50 method
122
+ # add_test_case('ExampleTest3', 'test_50')
123
+ add_test('ExampleTest')
124
+ add_test('ExampleTest2')
125
+ add_test_teardown('ExampleTest')
126
+ end
127
+
128
+ # This teardown applies to the entire test suite
129
+ def teardown
130
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
131
+ wait(2)
132
+ end
133
+ end
134
+
135
+ class ExampleTest3 < OpenC3::Test
136
+ def test_5
137
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
138
+ puts "\000\001\002"
139
+ check_expression("false == true")
140
+ wait(2)
141
+ end
142
+
143
+ def test_6
144
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
145
+ wait(2)
146
+ end
147
+ end
148
+
149
+ class ExampleTestSuite4 < OpenC3::TestSuite
150
+ # This setup applies to the entire test suite
151
+ def setup
152
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
153
+ wait(2)
154
+ end
155
+
156
+ def initialize
157
+ super()
158
+ add_test_setup('ExampleTest')
159
+ add_test_case('ExampleTest', 'test_2')
160
+ add_test_case('ExampleTest', 'test_3xx')
161
+ add_test_teardown('ExampleTest')
162
+ end
163
+
164
+ # This teardown applies to the entire test suite
165
+ def teardown
166
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
167
+ wait(2)
168
+ end
169
+ end
170
+
171
+ class ExampleTestSuite5 < OpenC3::TestSuite
172
+ def initialize
173
+ super()
174
+ add_test_teardown('ExampleTest')
175
+ end
176
+
177
+ # This teardown applies to the entire test suite
178
+ def teardown
179
+ puts "Running #{OpenC3::Test.current_test_suite}:#{OpenC3::Test.current_test}:#{OpenC3::Test.current_test_case}"
180
+ wait(2)
181
+ end
182
+ end
183
+
184
+ class EmptyTestSuite < OpenC3::TestSuite
185
+ def initialize
186
+ super()
187
+ end
188
+ end
189
+
190
+ class EmptyTest < OpenC3::Test
191
+ end
@@ -0,0 +1,38 @@
1
+ # This script checks all the interactive APIs
2
+ prompt("Would you like to continue?")
3
+ answer = combo_box("This is a plain combo box", 'one', 'two', 'three', informative: nil)
4
+ puts "answer:#{answer}"
5
+ answer = combo_box("This is a combo box with info", 'one', 'two', 'three', informative: 'This is informative')
6
+ puts "answer:#{answer}"
7
+ answer = combo_box("This is a combo box with details", 'one', 'two', 'three', informative: nil, details: 'This is some details')
8
+ puts "answer:#{answer}"
9
+ answer = combo_box("This is a combo box with info & details", 'one', 'two', 'three', informative: 'This is informative', details: 'Details details details!')
10
+ puts "answer:#{answer}"
11
+ answer = combo_box("This is a combo box", 'one', 'two', 'three', text_color: 'blue', background_color: 'grey', font_size: 20, font_family: 'courier', details: "Some more stuff")
12
+ puts "answer:#{answer}"
13
+ answer = prompt("This is a test", text_color: 'blue', background_color: 'grey', font_size: 20, font_family: 'courier', informative: "Informative text", details: "Some more stuff")
14
+ puts "answer:#{answer}"
15
+ answer = prompt("This is a test", font_size: 30, details: "Some more stuff", informative: nil)
16
+ puts "answer:#{answer}"
17
+ answer = message_box('This is a message box', 'one', 'two', 'three', text_color: 'blue', background_color: 'grey', font_size: 20, font_family: 'courier', informative: "Informative stuff", details: "Some more stuff")
18
+ puts "answer:#{answer}"
19
+ answer = vertical_message_box('This is a message box', 'one', 'two', 'three', text_color: 'blue', background_color: 'grey', font_size: 20, font_family: 'courier', informative: "Informative stuff", details: "Some more stuff")
20
+ puts "answer:#{answer}"
21
+ answer = ask("Let me ask you a question", "default")
22
+ puts "answer:#{answer} class:#{answer.class}"
23
+ raise "Not a string" unless answer.is_a? String
24
+ answer = ask("Let me ask you a question", 10)
25
+ puts "answer:#{answer} class:#{answer.class}"
26
+ raise "Not an integer" unless answer.is_a? Integer
27
+ answer = ask("Let me ask you a question", 10.5)
28
+ puts "answer:#{answer} class:#{answer.class}"
29
+ raise "Not a float" unless answer.is_a? Float
30
+ answer = ask_string("Let me ask you a question", "default")
31
+ puts "answer:#{answer} class:#{answer.class}"
32
+ answer = ask_string("Let me ask you a question", 10)
33
+ puts "answer:#{answer} class:#{answer.class}"
34
+ raise "Not a string" unless answer.is_a? String
35
+ answer = ask("Enter a blank (return)", true) # allow blank
36
+ puts "answer:#{answer}"
37
+ answer = ask("Password", false, true) # password required
38
+ puts "answer:#{answer}"
@@ -0,0 +1,286 @@
1
+ # cmd
2
+ cmd("INST ABORT")
3
+ cmd("INST ARYCMD with ARRAY []")
4
+ cmd("INST CLEAR")
5
+ cmd("INST COLLECT with DURATION 1.0, TEMP 0.0, TYPE 'NORMAL'")
6
+ cmd("INST FLTCMD with FLOAT32 0.0, FLOAT64 0.0")
7
+ cmd("INST SETPARAMS with VALUE1 0, VALUE2 0, VALUE3 0, VALUE4 0, VALUE5 0")
8
+ cmd("INST SLRPNLDEPLOY")
9
+ cmd("INST SLRPNLRESET")
10
+ cmd("INST ASCIICMD with STRING 'ARM LASER'")
11
+
12
+ cmd("INST", "ABORT")
13
+ cmd("INST", "ARYCMD", "ARRAY" => [])
14
+ cmd("INST", "CLEAR")
15
+ cmd("INST", "COLLECT", "DURATION" => 1.0, "TEMP" => 0.0, "TYPE" => 'NORMAL')
16
+ cmd("INST", "FLTCMD", "FLOAT32" => 0.0, "FLOAT64" => 0.0)
17
+ cmd("INST", "SETPARAMS", "VALUE1" => 0, "VALUE2" => 0, "VALUE3" => 0, "VALUE4" => 0, "VALUE5" => 0)
18
+ cmd("INST", "SLRPNLDEPLOY")
19
+ cmd("INST", "SLRPNLRESET")
20
+ cmd("INST", "ASCIICMD", "STRING" => 'ARM LASER')
21
+
22
+ # cmd should fail
23
+ begin
24
+ cmd("INST COLLECT with DURATION 11, TYPE 'NORMAL'")
25
+ rescue RuntimeError => e
26
+ raise "Fail" if e.message != "Command parameter 'INST COLLECT DURATION' = 11 not in valid range of 0.0 to 10.0"
27
+ rescue
28
+ raise "Fail"
29
+ end
30
+
31
+ cmd()
32
+ cmd("BOB")
33
+ cmd("BOB", "ABORT")
34
+ cmd("INST", "BOB")
35
+ cmd("INST", "ABORT", "BOB" => "BOB")
36
+ cmd("INST", "ABORT", "TED", "BOB" => "BOB")
37
+ cmd("BOB")
38
+ cmd("BOB ABORT")
39
+ cmd("INST BOB")
40
+
41
+ # cmd_no_range_check
42
+ cmd_no_range_check("INST ABORT")
43
+ cmd_no_range_check("INST ARYCMD with ARRAY []")
44
+ cmd_no_range_check("INST CLEAR")
45
+ cmd_no_range_check("INST COLLECT with DURATION 1.0, TEMP 0.0, TYPE 'NORMAL'")
46
+ cmd_no_range_check("INST FLTCMD with FLOAT32 0.0, FLOAT64 0.0")
47
+ cmd_no_range_check("INST SETPARAMS with VALUE1 0, VALUE2 0, VALUE3 0, VALUE4 0, VALUE5 0")
48
+ cmd_no_range_check("INST SLRPNLDEPLOY")
49
+ cmd_no_range_check("INST SLRPNLRESET")
50
+ cmd_no_range_check("INST ASCIICMD with STRING 'ARM LASER'")
51
+ cmd_no_range_check("INST COLLECT with DURATION 11, TYPE 'NORMAL'")
52
+
53
+ cmd_no_range_check("INST", "ABORT")
54
+ cmd_no_range_check("INST", "ARYCMD", "ARRAY" => [])
55
+ cmd_no_range_check("INST", "CLEAR")
56
+ cmd_no_range_check("INST", "COLLECT", "DURATION" => 1.0, "TEMP" => 0.0, "TYPE" => 'NORMAL')
57
+ cmd_no_range_check("INST", "FLTCMD", "FLOAT32" => 0.0, "FLOAT64" => 0.0)
58
+ cmd_no_range_check("INST", "SETPARAMS", "VALUE1" => 0, "VALUE2" => 0, "VALUE3" => 0, "VALUE4" => 0, "VALUE5" => 0)
59
+ cmd_no_range_check("INST", "SLRPNLDEPLOY")
60
+ cmd_no_range_check("INST", "SLRPNLRESET")
61
+ cmd_no_range_check("INST", "ASCIICMD", "STRING" => 'ARM LASER')
62
+ cmd_no_range_check("INST", "COLLECT", "DURATION" => 11, "TYPE" => 'NORMAL')
63
+
64
+ # cmd_no_range_check should fail
65
+ cmd_no_range_check()
66
+ cmd_no_range_check("BOB")
67
+ cmd_no_range_check("BOB", "ABORT")
68
+ cmd_no_range_check("INST", "BOB")
69
+ cmd_no_range_check("INST", "ABORT", "BOB" => "BOB")
70
+ cmd_no_range_check("INST", "ABORT", "TED", "BOB" => "BOB")
71
+ cmd_no_range_check("BOB")
72
+ cmd_no_range_check("BOB ABORT")
73
+ cmd_no_range_check("INST BOB")
74
+
75
+ # cmd_no_hazardous_check
76
+ cmd_no_hazardous_check("INST ABORT")
77
+ cmd_no_hazardous_check("INST ARYCMD with ARRAY []")
78
+ cmd_no_hazardous_check("INST CLEAR")
79
+ cmd_no_hazardous_check("INST COLLECT with DURATION 1.0, TEMP 0.0, TYPE 'NORMAL'")
80
+ cmd_no_hazardous_check("INST FLTCMD with FLOAT32 0.0, FLOAT64 0.0")
81
+ cmd_no_hazardous_check("INST SETPARAMS with VALUE1 0, VALUE2 0, VALUE3 0, VALUE4 0, VALUE5 0")
82
+ cmd_no_hazardous_check("INST SLRPNLDEPLOY")
83
+ cmd_no_hazardous_check("INST SLRPNLRESET")
84
+ cmd_no_hazardous_check("INST ASCIICMD with STRING 'ARM LASER'")
85
+
86
+ cmd_no_hazardous_check("INST", "ABORT")
87
+ cmd_no_hazardous_check("INST", "ARYCMD", "ARRAY" => [])
88
+ cmd_no_hazardous_check("INST", "CLEAR")
89
+ cmd_no_hazardous_check("INST", "COLLECT", "DURATION" => 1.0, "TEMP" => 0.0, "TYPE" => 'NORMAL')
90
+ cmd_no_hazardous_check("INST", "FLTCMD", "FLOAT32" => 0.0, "FLOAT64" => 0.0)
91
+ cmd_no_hazardous_check("INST", "SETPARAMS", "VALUE1" => 0, "VALUE2" => 0, "VALUE3" => 0, "VALUE4" => 0, "VALUE5" => 0)
92
+ cmd_no_hazardous_check("INST", "SLRPNLDEPLOY")
93
+ cmd_no_hazardous_check("INST", "SLRPNLRESET")
94
+ cmd_no_hazardous_check("INST", "ASCIICMD", "STRING" => 'ARM LASER')
95
+
96
+ # cmd_no_hazardous_check should fail
97
+ cmd_no_hazardous_check("INST COLLECT with DURATION 11, TYPE 'NORMAL'")
98
+ cmd_no_hazardous_check()
99
+ cmd_no_hazardous_check("BOB")
100
+ cmd_no_hazardous_check("BOB", "ABORT")
101
+ cmd_no_hazardous_check("INST", "BOB")
102
+ cmd_no_hazardous_check("INST", "ABORT", "BOB" => "BOB")
103
+ cmd_no_hazardous_check("INST", "ABORT", "TED", "BOB" => "BOB")
104
+ cmd_no_hazardous_check("BOB")
105
+ cmd_no_hazardous_check("BOB ABORT")
106
+ cmd_no_hazardous_check("INST BOB")
107
+
108
+ # cmd_no_checks
109
+ cmd_no_checks("INST ABORT")
110
+ cmd_no_checks("INST ARYCMD with ARRAY []")
111
+ cmd_no_checks("INST CLEAR")
112
+ cmd_no_checks("INST COLLECT with DURATION 1.0, TEMP 0.0, TYPE 'NORMAL'")
113
+ cmd_no_checks("INST FLTCMD with FLOAT32 0.0, FLOAT64 0.0")
114
+ cmd_no_checks("INST SETPARAMS with VALUE1 0, VALUE2 0, VALUE3 0, VALUE4 0, VALUE5 0")
115
+ cmd_no_checks("INST SLRPNLDEPLOY")
116
+ cmd_no_checks("INST SLRPNLRESET")
117
+ cmd_no_checks("INST ASCIICMD with STRING 'ARM LASER'")
118
+ cmd_no_checks("INST COLLECT with DURATION 11, TYPE 'NORMAL'")
119
+
120
+ cmd_no_checks("INST", "ABORT")
121
+ cmd_no_checks("INST", "ARYCMD", "ARRAY" => [])
122
+ cmd_no_checks("INST", "CLEAR")
123
+ cmd_no_checks("INST", "COLLECT", "DURATION" => 1.0, "TEMP" => 0.0, "TYPE" => 'NORMAL')
124
+ cmd_no_checks("INST", "FLTCMD", "FLOAT32" => 0.0, "FLOAT64" => 0.0)
125
+ cmd_no_checks("INST", "SETPARAMS", "VALUE1" => 0, "VALUE2" => 0, "VALUE3" => 0, "VALUE4" => 0, "VALUE5" => 0)
126
+ cmd_no_checks("INST", "SLRPNLDEPLOY")
127
+ cmd_no_checks("INST", "SLRPNLRESET")
128
+ cmd_no_checks("INST", "ASCIICMD", "STRING" => 'ARM LASER')
129
+ cmd_no_checks("INST", "COLLECT", "DURATION" => 11, "TYPE" => 'NORMAL')
130
+
131
+ # cmd_no_checks should fail
132
+ cmd_no_checks()
133
+ cmd_no_checks("BOB")
134
+ cmd_no_checks("BOB", "ABORT")
135
+ cmd_no_checks("INST", "BOB")
136
+ cmd_no_checks("INST", "ABORT", "BOB" => "BOB")
137
+ cmd_no_checks("INST", "ABORT", "TED", "BOB" => "BOB")
138
+ cmd_no_checks("BOB")
139
+ cmd_no_checks("BOB ABORT")
140
+ cmd_no_checks("INST BOB")
141
+
142
+ # send_raw should fail (on demo cmd/tlm server)
143
+ send_raw()
144
+ send_raw("INT1")
145
+ send_raw("INT1", "\x00\x00")
146
+ send_raw("INT1", "\x00\x00", "\x00\x00")
147
+
148
+ # get_all_commands
149
+ expected_cmds = %w(ABORT ARYCMD ASCIICMD CLEAR COLLECT FLTCMD SETPARAMS SLRPNLDEPLOY SLRPNLRESET)
150
+ commands = get_all_commands("INST")
151
+ puts commands.inspect
152
+
153
+ # get_all_commands should fail
154
+ get_all_commands()
155
+ get_all_commands("BOB")
156
+ get_all_commands("BOB", "TED")
157
+
158
+ # get_cmd_hazardous
159
+ hazardous = get_cmd_hazardous("INST", "COLLECT", "TYPE" => "SPECIAL")
160
+ puts hazardous
161
+ hazardous = get_cmd_hazardous("INST", "COLLECT", "TYPE" => "NORMAL")
162
+ puts hazardous
163
+ hazardous = get_cmd_hazardous("INST", "ABORT")
164
+ puts hazardous
165
+ hazardous = get_cmd_hazardous("INST", "CLEAR")
166
+ puts hazardous
167
+
168
+ # get_cmd_hazardous should fail
169
+ get_cmd_hazardous()
170
+ get_cmd_hazardous("INST")
171
+ get_cmd_hazardous("INST", "COLLECT", "BOB" => 5)
172
+ get_cmd_hazardous("INST", "COLLECT", 5)
173
+
174
+ # tlm
175
+ tlm("INST HEALTH_STATUS ARY")
176
+ tlm("INST HEALTH_STATUS ASCIICMD")
177
+ tlm("INST HEALTH_STATUS CCSDSAPID")
178
+ tlm("INST HEALTH_STATUS TEMP1")
179
+
180
+ tlm("INST", "HEALTH_STATUS", "ARY")
181
+ tlm("INST", "HEALTH_STATUS", "ASCIICMD")
182
+ tlm("INST", "HEALTH_STATUS", "CCSDSAPID")
183
+ tlm("INST", "HEALTH_STATUS", "TEMP1")
184
+
185
+ # tlm should fail
186
+ tlm()
187
+ tlm("BOB")
188
+ tlm("INST")
189
+ tlm("INST BOB")
190
+ tlm("INST HEALTH_STATUS")
191
+ tlm("INST HEALTH_STATUS BOB")
192
+ tlm("INST HEALTH_STATUS ARY BOB")
193
+ tlm("INST", "BOB")
194
+ tlm("INST", "HEALTH_STATUS")
195
+ tlm("INST", "HEALTH_STATUS", "BOB")
196
+ tlm("INST", "HEALTH_STATUS", "ARY", "BOB")
197
+
198
+ # tlm_raw
199
+ tlm_raw("INST HEALTH_STATUS ARY")
200
+ tlm_raw("INST HEALTH_STATUS ASCIICMD")
201
+ tlm_raw("INST HEALTH_STATUS CCSDSAPID")
202
+ tlm_raw("INST HEALTH_STATUS TEMP1")
203
+
204
+ tlm_raw("INST", "HEALTH_STATUS", "ARY")
205
+ tlm_raw("INST", "HEALTH_STATUS", "ASCIICMD")
206
+ tlm_raw("INST", "HEALTH_STATUS", "CCSDSAPID")
207
+ tlm_raw("INST", "HEALTH_STATUS", "TEMP1")
208
+
209
+ # tlm_raw should fail
210
+ tlm_raw()
211
+ tlm_raw("BOB")
212
+ tlm_raw("INST")
213
+ tlm_raw("INST BOB")
214
+ tlm_raw("INST HEALTH_STATUS")
215
+ tlm_raw("INST HEALTH_STATUS BOB")
216
+ tlm_raw("INST HEALTH_STATUS ARY BOB")
217
+ tlm_raw("INST", "BOB")
218
+ tlm_raw("INST", "HEALTH_STATUS")
219
+ tlm_raw("INST", "HEALTH_STATUS", "BOB")
220
+ tlm_raw("INST", "HEALTH_STATUS", "ARY", "BOB")
221
+
222
+ # tlm_formatted
223
+ tlm_formatted("INST HEALTH_STATUS ARY")
224
+ tlm_formatted("INST HEALTH_STATUS ASCIICMD")
225
+ tlm_formatted("INST HEALTH_STATUS CCSDSAPID")
226
+ tlm_formatted("INST HEALTH_STATUS TEMP1")
227
+
228
+ tlm_formatted("INST", "HEALTH_STATUS", "ARY")
229
+ tlm_formatted("INST", "HEALTH_STATUS", "ASCIICMD")
230
+ tlm_formatted("INST", "HEALTH_STATUS", "CCSDSAPID")
231
+ tlm_formatted("INST", "HEALTH_STATUS", "TEMP1")
232
+
233
+ # tlm_formatted should fail
234
+ tlm_formatted()
235
+ tlm_formatted("BOB")
236
+ tlm_formatted("INST")
237
+ tlm_formatted("INST BOB")
238
+ tlm_formatted("INST HEALTH_STATUS")
239
+ tlm_formatted("INST HEALTH_STATUS BOB")
240
+ tlm_formatted("INST HEALTH_STATUS ARY BOB")
241
+ tlm_formatted("INST", "BOB")
242
+ tlm_formatted("INST", "HEALTH_STATUS")
243
+ tlm_formatted("INST", "HEALTH_STATUS", "BOB")
244
+ tlm_formatted("INST", "HEALTH_STATUS", "ARY", "BOB")
245
+
246
+ # tlm_with_units
247
+ tlm_with_units("INST HEALTH_STATUS ARY")
248
+ tlm_with_units("INST HEALTH_STATUS ASCIICMD")
249
+ tlm_with_units("INST HEALTH_STATUS CCSDSAPID")
250
+ tlm_with_units("INST HEALTH_STATUS TEMP1")
251
+
252
+ tlm_with_units("INST", "HEALTH_STATUS", "ARY")
253
+ tlm_with_units("INST", "HEALTH_STATUS", "ASCIICMD")
254
+ tlm_with_units("INST", "HEALTH_STATUS", "CCSDSAPID")
255
+ tlm_with_units("INST", "HEALTH_STATUS", "TEMP1")
256
+
257
+ # tlm_with_units should fail
258
+ tlm_with_units()
259
+ tlm_with_units("BOB")
260
+ tlm_with_units("INST")
261
+ tlm_with_units("INST BOB")
262
+ tlm_with_units("INST HEALTH_STATUS")
263
+ tlm_with_units("INST HEALTH_STATUS BOB")
264
+ tlm_with_units("INST HEALTH_STATUS ARY BOB")
265
+ tlm_with_units("INST", "BOB")
266
+ tlm_with_units("INST", "HEALTH_STATUS")
267
+ tlm_with_units("INST", "HEALTH_STATUS", "BOB")
268
+ tlm_with_units("INST", "HEALTH_STATUS", "ARY", "BOB")
269
+
270
+ # override_tlm
271
+ override_tlm("INST HEALTH_STATUS ARY = [0,0,0,0,0,0,0,0,0,0]")
272
+ override_tlm("INST HEALTH_STATUS ASCIICMD = 'HI'")
273
+ override_tlm("INST HEALTH_STATUS CCSDSAPID = 1000")
274
+ override_tlm("INST HEALTH_STATUS TEMP1 = 15")
275
+
276
+ # override_tlm_raw
277
+ override_tlm_raw("INST HEALTH_STATUS ARY = [0,0,0,0,0,0,0,0,0,0]")
278
+ override_tlm_raw("INST HEALTH_STATUS ASCIICMD = 'HI'")
279
+ override_tlm_raw("INST HEALTH_STATUS CCSDSAPID = 1000")
280
+ override_tlm_raw("INST HEALTH_STATUS TEMP1 = 10000")
281
+
282
+ # normalize_tlm
283
+ normalize_tlm("INST HEALTH_STATUS ARY")
284
+ normalize_tlm("INST HEALTH_STATUS ASCIICMD")
285
+ normalize_tlm("INST HEALTH_STATUS CCSDSAPID")
286
+ normalize_tlm("INST HEALTH_STATUS TEMP1")
@@ -0,0 +1,3 @@
1
+ load_utility 'SYSTEM/procedures/example_test.rb'
2
+
3
+ ExampleTest3.new.run { |result| puts "#{result.test}:#{result.test_case}:#{result.result}" }
@@ -0,0 +1,49 @@
1
+ puts "1"
2
+ puts "2"
3
+ puts "3"
4
+ puts "4"
5
+ puts "5"
6
+ puts "6"
7
+ puts "7"
8
+ puts "8"
9
+ puts "9"
10
+ puts "10"
11
+
12
+ value = ask('Enter the value')
13
+
14
+ cmd("INST CLEAR")
15
+
16
+ 5.times do |index|
17
+ puts index
18
+ end
19
+
20
+ if false
21
+ puts false
22
+ else
23
+ puts true
24
+ end
25
+
26
+ wait_expression('false', 10)
27
+ wait(10)
28
+
29
+ a = [10,
30
+ 11,
31
+ 12,
32
+ 13,
33
+ 14,
34
+ 15]
35
+
36
+ { :X1 => 1,
37
+ :X2 => 2
38
+ }.each {|x, y| puts x}
39
+
40
+
41
+ puts "brown cow"
42
+ yep
43
+ puts "howdy"
44
+
45
+ if yep
46
+ puts "uh oh"
47
+ end
48
+
49
+ puts "done"
@@ -0,0 +1,12 @@
1
+ SCREEN AUTO AUTO 0.5
2
+
3
+ VERTICAL
4
+
5
+ TITLE "Status"
6
+
7
+ LABELVALUE SYSTEM META OPENC3_VERSION
8
+ LABELVALUE INST HEALTH_STATUS COLLECTS
9
+ LABELVALUE INST2 HEALTH_STATUS COLLECTS
10
+ END
11
+
12
+
@@ -0,0 +1,12 @@
1
+ # Ignored Parameters
2
+ IGNORE_PARAMETER PKTID
3
+ IGNORE_PARAMETER CONFIG
4
+ IGNORE_PARAMETER OPENC3_VERSION
5
+ IGNORE_PARAMETER USER_VERSION
6
+ IGNORE_PARAMETER RUBY_VERSION
7
+
8
+ # Ignored Items
9
+ IGNORE_ITEM PKTID
10
+ IGNORE_ITEM RECEIVED_COUNT
11
+ IGNORE_ITEM RECEIVED_TIMESECONDS
12
+ IGNORE_ITEM RECEIVED_TIMEFORMATTED
@@ -0,0 +1,13 @@
1
+ COMMAND <%= target_name %> SETPT_VOLTAGE BIG_ENDIAN "Templated string command"
2
+ APPEND_ID_PARAMETER CMD_ID 8 UINT 0 0 0 "Command Id"
3
+ APPEND_PARAMETER VOLTAGE 64 FLOAT MIN_FLOAT64 MAX_FLOAT64 3.14 "Voltage setting"
4
+ APPEND_PARAMETER CHANNEL 8 UINT 1 4 1 "Desired channel"
5
+ APPEND_PARAMETER CMD_TEMPLATE 1024 STRING "SOUR:VOLT <VOLTAGE>, (@<CHANNEL>)"
6
+
7
+ COMMAND <%= target_name %> GET_SETPT_VOLTAGE BIG_ENDIAN "Templated string command with response"
8
+ DISABLE_MESSAGES
9
+ APPEND_ID_PARAMETER CMD_ID 8 UINT 1 1 1 "Command Id"
10
+ APPEND_PARAMETER CHANNEL 8 UINT 1 4 1 "Desired channel"
11
+ APPEND_PARAMETER CMD_TEMPLATE 512 STRING "SOUR:VOLT?, (@<CHANNEL>)"
12
+ APPEND_PARAMETER RSP_TEMPLATE 512 STRING "<VOLTAGE>"
13
+ APPEND_PARAMETER RSP_PACKET 512 STRING "READ_VOLTAGE"
@@ -0,0 +1,3 @@
1
+ TELEMETRY <%= target_name %> READ_VOLTAGE BIG_ENDIAN "Telemetry response"
2
+ APPEND_ID_ITEM PKT_ID 8 UINT 0 "Packet Id"
3
+ APPEND_ITEM VOLTAGE 64 FLOAT "Voltage"
@@ -0,0 +1,69 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 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 Affero 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
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # Modified by OpenC3, Inc.
17
+ # All changes Copyright 2022, OpenC3, Inc.
18
+ # All Rights Reserved
19
+
20
+ require 'openc3'
21
+
22
+ module OpenC3
23
+
24
+ class TemplatedInterface < TcpipClientInterface
25
+ def initialize(*args)
26
+ super(*args)
27
+ @polling_thread = nil
28
+ @sleeper = Sleeper.new
29
+ end
30
+
31
+ def connect
32
+ super()
33
+
34
+ # Start a thread to poll telemetry
35
+ Thread.new do |thread|
36
+ OpenC3.kill_thread(self, @polling_thread)
37
+ @sleeper = Sleeper.new
38
+ @polling_thread = Thread.current
39
+ begin
40
+ # Wait for the connection to actually occur
41
+ while !connected?
42
+ @sleeper.sleep(1)
43
+ end
44
+ loop do
45
+ cmd("#{@target_names[0]} GET_SETPT_VOLTAGE", scope: ENV['OPENC3_SCOPE'])
46
+ break if @sleeper.sleep(1)
47
+ end
48
+ rescue Errno::ECONNRESET
49
+ # This typically means the target disconnected
50
+ rescue Exception => err
51
+ Logger.error "Polling Thread Unexpectedly Died.\n#{err.formatted}"
52
+ raise err
53
+ end
54
+ end
55
+ end
56
+
57
+ def disconnect
58
+ super()
59
+ # Note: This must be after super or the disconnect process
60
+ # will be interrupted by killing the thread
61
+ OpenC3.kill_thread(self, @polling_thread) if Thread.current != @polling_thread
62
+ @polling_thread = nil
63
+ end
64
+
65
+ def graceful_kill
66
+ @sleeper.cancel
67
+ end
68
+ end
69
+ end