openc3-cosmos-demo 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +729 -0
  3. data/README.md +30 -0
  4. data/Rakefile +45 -0
  5. data/microservices/EXAMPLE/example_target.rb +126 -0
  6. data/microservices/TEMPLATED/scpi_target.rb +82 -0
  7. data/plugin.txt +117 -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 +30 -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 +63 -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 +42 -0
  20. data/targets/INST/lib/sim_inst.rb +376 -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 +15 -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 +16 -0
  37. data/targets/INST/screens/block.txt +7 -0
  38. data/targets/INST/screens/commanding.txt +47 -0
  39. data/targets/INST/screens/graphs.txt +23 -0
  40. data/targets/INST/screens/ground.txt +45 -0
  41. data/targets/INST/screens/hs.txt +42 -0
  42. data/targets/INST/screens/latest.txt +21 -0
  43. data/targets/INST/screens/launcher.txt +10 -0
  44. data/targets/INST/screens/limits.txt +82 -0
  45. data/targets/INST/screens/other.txt +22 -0
  46. data/targets/INST/screens/params.txt +54 -0
  47. data/targets/INST/screens/simple.txt +6 -0
  48. data/targets/INST/screens/tabs.txt +66 -0
  49. data/targets/INST/screens/web.txt +5 -0
  50. data/targets/INST/tables/bin/ConfigTables.bin +0 -0
  51. data/targets/INST/tables/config/ConfigTables_def.txt +7 -0
  52. data/targets/INST/tables/config/MCConfigurationTable_def.txt +36 -0
  53. data/targets/INST/tables/config/PPSSelectionTable_def.txt +7 -0
  54. data/targets/INST/tables/config/TLMMonitoringTable_def.txt +31 -0
  55. data/targets/INST/tables/procedures/download.rb +16 -0
  56. data/targets/INST/tables/procedures/upload.rb +19 -0
  57. data/targets/INST/target.txt +31 -0
  58. data/targets/SYSTEM/cmd_tlm/limits_groups.txt +6 -0
  59. data/targets/SYSTEM/cmd_tlm/meta_tlm.txt +10 -0
  60. data/targets/SYSTEM/cmd_tlm/system_cmds.txt +41 -0
  61. data/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  62. data/targets/SYSTEM/lib/example_background_task.rb +69 -0
  63. data/targets/SYSTEM/lib/example_target.rb +115 -0
  64. data/targets/SYSTEM/lib/limits_groups.rb +67 -0
  65. data/targets/SYSTEM/lib/scpi_target.rb +79 -0
  66. data/targets/SYSTEM/procedures/example_test.rb +191 -0
  67. data/targets/SYSTEM/procedures/interactive.rb +38 -0
  68. data/targets/SYSTEM/procedures/limits_api_test.rb +89 -0
  69. data/targets/SYSTEM/procedures/openc3_api_test.rb +286 -0
  70. data/targets/SYSTEM/procedures/run_example_test.rb +3 -0
  71. data/targets/SYSTEM/procedures/test.rb +49 -0
  72. data/targets/SYSTEM/screens/status.txt +12 -0
  73. data/targets/SYSTEM/target.txt +12 -0
  74. data/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -0
  75. data/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -0
  76. data/targets/TEMPLATED/lib/templated_interface.rb +72 -0
  77. data/targets/TEMPLATED/target.txt +8 -0
  78. data/tools/widgets/BigWidget/BigWidget.umd.min.js +4 -0
  79. data/tools/widgets/BigWidget/BigWidget.umd.min.js.map +1 -0
  80. data/tools/widgets/HelloworldWidget/HelloworldWidget.umd.min.js +2 -0
  81. data/tools/widgets/HelloworldWidget/HelloworldWidget.umd.min.js.map +1 -0
  82. metadata +128 -0
@@ -0,0 +1,162 @@
1
+ TELEMETRY <%= target_name %> HEALTH_STATUS BIG_ENDIAN "Health and status from the <%= target_name %> target"
2
+ <%= render "_ccsds_tlm.txt", locals: {apid: 1} %>
3
+ APPEND_ITEM COLLECTS 16 UINT "Number of collects"
4
+ APPEND_ITEM TEMP1 16 UINT "Temperature #1"
5
+ POLY_READ_CONVERSION -100.0 0.00305
6
+ POLY_WRITE_CONVERSION 32768.885246 327.86885
7
+ UNITS CELSIUS C
8
+ FORMAT_STRING "%0.3f"
9
+ LIMITS DEFAULT 1 ENABLED -80.0 -70.0 60.0 80.0 -20.0 20.0
10
+ LIMITS TVAC 1 ENABLED -80.0 -30.0 30.0 80.0
11
+ LIMITS_RESPONSE example_limits_response.rb
12
+ APPEND_ITEM TEMP2 32 FLOAT "Temperature #2"
13
+ POLY_READ_CONVERSION -100.0 0.00305
14
+ POLY_WRITE_CONVERSION 32768.885246 327.86885
15
+ UNITS CELSIUS C
16
+ FORMAT_STRING "%0.3f"
17
+ LIMITS DEFAULT 1 ENABLED -60.0 -55.0 30.0 35.0
18
+ LIMITS TVAC 1 ENABLED -60.0 20.0 30.0 35.0
19
+ APPEND_ITEM TEMP3 16 UINT "Temperature #3"
20
+ POLY_READ_CONVERSION -100.0 0.00305
21
+ POLY_WRITE_CONVERSION 32768.885246 327.86885
22
+ UNITS CELSIUS C
23
+ FORMAT_STRING "%0.3f"
24
+ LIMITS DEFAULT 1 ENABLED -25.0 -10.0 50.0 55.0
25
+ LIMITS TVAC 1 ENABLED -15.0 -10.0 20.0 30.0
26
+ APPEND_ITEM TEMP4 16 UINT "Temperature #4"
27
+ POLY_READ_CONVERSION -100.0 0.00305
28
+ POLY_WRITE_CONVERSION 32768.885246 327.86885
29
+ UNITS CELSIUS C
30
+ FORMAT_STRING "%0.3f"
31
+ LIMITS DEFAULT 1 ENABLED -80.0 -70.0 60.0 80.0
32
+ APPEND_ARRAY_ITEM ARY 8 UINT 80 "Array data"
33
+ UNITS VOLTS V
34
+ APPEND_ITEM DURATION 32 FLOAT "Most recent collect duration"
35
+ APPEND_ITEM COLLECT_TYPE 16 UINT "Most recent collect type"
36
+ STATE NORMAL 0
37
+ STATE SPECIAL 1
38
+ STATE ERROR ANY
39
+ APPEND_ARRAY_ITEM ARY2 64 FLOAT 640 "Double array"
40
+ UNITS CELSIUS C
41
+ APPEND_ITEM ASCIICMD 2048 STRING "Most recent ASCIICMD string"
42
+ STATE "NOOP" "NOOP"
43
+ STATE "FIRE LASER" "FIRE LASER"
44
+ STATE "ARM LASER" "ARM LASER"
45
+ APPEND_ITEM GROUND1STATUS 8 UINT "Ground station #1 status"
46
+ STATE CONNECTED 1 GREEN
47
+ STATE UNAVAILABLE 0 YELLOW
48
+ APPEND_ITEM GROUND2STATUS 8 UINT "Ground station #2 status"
49
+ STATE CONNECTED 1 GREEN
50
+ STATE UNAVAILABLE 0 YELLOW
51
+ APPEND_ITEM BLOCKTEST 80 BLOCK "Block data"
52
+ ITEM TIMESECONDS 0 0 DERIVED "Derived floating-point time since epoch in seconds"
53
+ READ_CONVERSION unix_time_seconds_conversion.rb TIMESEC TIMEUS
54
+ FORMAT_STRING '%0.6f'
55
+ ITEM TIMEFORMATTED 0 0 DERIVED "Derived time since epoch as formatted string"
56
+ READ_CONVERSION unix_time_formatted_conversion.rb TIMESEC TIMEUS
57
+ ITEM TEMP1HIGH 0 0 DERIVED "High-water mark for TEMP1"
58
+ READ_CONVERSION processor_conversion.rb TEMP1WATER HIGH_WATER
59
+ ITEM TEMP1LOW 0 0 DERIVED "Low-water mark for TEMP1"
60
+ READ_CONVERSION processor_conversion.rb TEMP1WATER LOW_WATER
61
+ ITEM TEMP1MAX 0 0 DERIVED "Maximum of most recent 100 samples for TEMP1"
62
+ READ_CONVERSION processor_conversion.rb TEMP1STAT MAX
63
+ ITEM TEMP1MIN 0 0 DERIVED "Minimum of most recent 100 samples for TEMP1"
64
+ READ_CONVERSION processor_conversion.rb TEMP1STAT MIN
65
+ ITEM TEMP1MEAN 0 0 DERIVED "Mean of most recent 100 samples for TEMP1"
66
+ READ_CONVERSION processor_conversion.rb TEMP1STAT MEAN
67
+ ITEM TEMP1STDDEV 0 0 DERIVED "Stddev of most recent 100 samples for TEMP1"
68
+ READ_CONVERSION processor_conversion.rb TEMP1STAT STDDEV
69
+ PROCESSOR TEMP1STAT statistics_processor.rb TEMP1 100
70
+ PROCESSOR TEMP1WATER watermark_processor.rb TEMP1
71
+
72
+ TELEMETRY <%= target_name %> ADCS BIG_ENDIAN "Position and attitude data"
73
+ META TYPE 'struct adcs'
74
+ <%= render "_ccsds_tlm.txt", locals: {apid: 2} %>
75
+ ITEM POSX 128 32 FLOAT "Position X"
76
+ UNITS METERS M
77
+ ITEM POSY 160 32 FLOAT "Position Y"
78
+ UNITS METERS M
79
+ ITEM POSZ 192 32 FLOAT "Position Z"
80
+ UNITS METERS M
81
+ ITEM VELX 224 32 FLOAT "Velocity X"
82
+ UNITS METERS_PER_SECOND MPS
83
+ ITEM VELY 256 32 FLOAT "Velocity Y"
84
+ UNITS METERS_PER_SECOND MPS
85
+ ITEM VELZ 288 32 FLOAT "Velocity Z"
86
+ UNITS METERS_PER_SECOND MPS
87
+ ITEM Q1 320 32 FLOAT "Quaternion param 1"
88
+ FORMAT_STRING "%0.6f"
89
+ META TYPE 'float32'
90
+ ITEM Q2 352 32 FLOAT "Quaternion param 2"
91
+ FORMAT_STRING "%0.6f"
92
+ META TYPE 'float32'
93
+ ITEM Q3 384 32 FLOAT "Quaternion param 3"
94
+ FORMAT_STRING "%0.6f"
95
+ META TYPE 'float32'
96
+ ITEM Q4 416 32 FLOAT "Quaternion param 4"
97
+ FORMAT_STRING "%0.6f"
98
+ META TYPE 'float32'
99
+ ITEM BIASX 448 32 FLOAT "Body X rate bias"
100
+ FORMAT_STRING "%0.6f"
101
+ ITEM BIASY 480 32 FLOAT "Body Y rate bias"
102
+ FORMAT_STRING "%0.6f"
103
+ ITEM BIASZ 512 32 FLOAT "Body Z rate bias"
104
+ FORMAT_STRING "%0.6f"
105
+ <% (1..5).each do |i| %>
106
+ APPEND_ITEM STAR<%= i %>ID 16 UINT "Star <%= i %> id"
107
+ <% end %>
108
+ ITEM POSPROGRESS 624 32 FLOAT "Position file progress"
109
+ FORMAT_STRING "%0.2f"
110
+ ITEM ATTPROGRESS 656 32 FLOAT "Attitude file progress"
111
+ FORMAT_STRING "%0.2f"
112
+ ITEM TIMESECONDS 0 0 DERIVED "Derived floating-point time since epoch in seconds"
113
+ READ_CONVERSION unix_time_seconds_conversion.rb TIMESEC TIMEUS
114
+ FORMAT_STRING '%0.6f'
115
+ ITEM TIMEFORMATTED 0 0 DERIVED "Derived time since epoch as formatted string"
116
+ READ_CONVERSION unix_time_formatted_conversion.rb TIMESEC TIMEUS
117
+
118
+ TELEMETRY <%= target_name %> PARAMS BIG_ENDIAN "Params set by SETPARAMS command"
119
+ <%= render "_ccsds_tlm.txt", locals: {apid: 3} %>
120
+ # ERB syntax:
121
+ <% (1..5).each do |i| %>
122
+ APPEND_ITEM VALUE<%= i %> 16 UINT "Value <%= i %> setting"
123
+ STATE GOOD 0 GREEN
124
+ STATE BAD 1 RED
125
+ <% end %>
126
+
127
+ ITEM TIMESECONDS 0 0 DERIVED "Derived floating-point time since epoch in seconds"
128
+ READ_CONVERSION unix_time_seconds_conversion.rb TIMESEC TIMEUS
129
+ FORMAT_STRING '%0.6f'
130
+ ITEM TIMEFORMATTED 0 0 DERIVED "Derived time since epoch as formatted string"
131
+ READ_CONVERSION unix_time_formatted_conversion.rb TIMESEC TIMEUS
132
+
133
+ TELEMETRY <%= target_name %> IMAGE BIG_ENDIAN "Packet with image data"
134
+ <%= render "_ccsds_tlm.txt", locals: {apid: 4} %>
135
+ ITEM BYTES 128 32 UINT "First bytes"
136
+ FORMAT_STRING '0x%08x'
137
+ ITEM IMAGE 128 131072 BLOCK "10x10 Image Data"
138
+ OVERLAP # Notify OpenC3 that this is intentionally overlapping the BYTES field
139
+ ITEM TIMESECONDS 0 0 DERIVED "Derived floating-point time since epoch in seconds"
140
+ READ_CONVERSION unix_time_seconds_conversion.rb TIMESEC TIMEUS
141
+ FORMAT_STRING '%0.6f'
142
+ ITEM TIMEFORMATTED 0 0 DERIVED "Derived time since epoch as formatted string"
143
+ READ_CONVERSION unix_time_formatted_conversion.rb TIMESEC TIMEUS
144
+
145
+ TELEMETRY <%= target_name %> MECH BIG_ENDIAN "Mechanism status"
146
+ <%= render "_ccsds_tlm.txt", locals: {apid: 5} %>
147
+ APPEND_ITEM EXTRA 32 FLOAT "Extra item to be deleted"
148
+ APPEND_ITEM SLRPNL1 32 FLOAT "Solar panel 1 angle"
149
+ UNITS DEGREES DEG
150
+ APPEND_ITEM SLRPNL2 32 FLOAT "Solar panel 2 angle"
151
+ UNITS DEGREES DEG
152
+ APPEND_ITEM SLRPNL3 32 FLOAT "Solar panel 3 angle"
153
+ UNITS DEGREES DEG
154
+ APPEND_ITEM SLRPNL4 32 FLOAT "Solar panel 4 angle"
155
+ UNITS DEGREES DEG
156
+ APPEND_ITEM SLRPNL5 32 FLOAT "Solar panel 5 angle"
157
+ UNITS DEGREES DEG
158
+ ITEM TIMESECONDS 0 0 DERIVED "Derived floating-point time since epoch in seconds"
159
+ READ_CONVERSION unix_time_seconds_conversion.rb TIMESEC TIMEUS
160
+ FORMAT_STRING '%0.6f'
161
+ ITEM TIMEFORMATTED 0 0 DERIVED "Derived time since epoch as formatted string"
162
+ READ_CONVERSION unix_time_formatted_conversion.rb TIMESEC TIMEUS
@@ -0,0 +1,12 @@
1
+ # NOTE: Telemetry definitions are processed in alphabetical order by default.
2
+ # However, this can be overridden by explicitly calling them out in target.txt.
3
+ # Thus it's recommended to create a file like this with an extension
4
+ # such as inst_tlm_override.txt which will be processed AFTER inst_tlm.txt.
5
+
6
+ # Existing telemetry packets can be selected and items modified
7
+ SELECT_TELEMETRY <%= target_name %> MECH
8
+ # Existing items can be selected and modified by adding conversions, limits, etc
9
+ SELECT_ITEM SLRPNL1
10
+ LIMITS DEFAULT 1 ENABLED -180.0 -170.0 170.0 180.0
11
+ # Delete an item so it doesn't appear in the packet
12
+ DELETE_ITEM EXTRA
Binary file
Binary file
@@ -0,0 +1,42 @@
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
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
22
+
23
+ # This file implements a class to handle responses to limits state changes.
24
+
25
+ require 'openc3/packets/limits_response'
26
+
27
+ # ExampleLimitsResponse class
28
+ #
29
+ # This class handles a limits response
30
+ #
31
+ class ExampleLimitsResponse < OpenC3::LimitsResponse
32
+
33
+ def call(packet, item, old_limits_state)
34
+ case item.limits.state
35
+ when :RED_HIGH
36
+ cmd('<%= target_name %>', 'COLLECT', 'TYPE' => 'NORMAL', 'DURATION' => 5)
37
+ when :RED_LOW
38
+ cmd_no_hazardous_check('<%= target_name %>', 'CLEAR')
39
+ end
40
+ end
41
+
42
+ end # class ExampleLimitsResponse
@@ -0,0 +1,376 @@
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
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
22
+
23
+ # Provides a demonstration of a Simulated Target
24
+
25
+ require 'openc3'
26
+ require 'stringio'
27
+
28
+ module OpenC3
29
+ # Simulated instrument for the demo. Populates several packets and cycles
30
+ # the telemetry to simulate an active target.
31
+ class SimInst < SimulatedTarget
32
+ SOLAR_PANEL_DFLTS = [-179.0, 179.0, -179.0, 179.0, -95.0] unless defined? SOLAR_PANEL_DFLTS
33
+
34
+ def initialize(target_name)
35
+ super(target_name)
36
+
37
+ @target = System.targets[target_name]
38
+ position_filename = File.join(@target.dir, 'data', 'position.bin')
39
+ attitude_filename = File.join(@target.dir, 'data', 'attitude.bin')
40
+ position_data = File.read(position_filename, mode: "rb")
41
+ attitude_data = File.read(attitude_filename, mode: "rb")
42
+ @position_file = StringIO.new(position_data)
43
+ @position_file_size = position_data.length
44
+ @attitude_file = StringIO.new(attitude_data)
45
+ @attitude_file_size = attitude_data.length
46
+ @position_file_bytes_read = 0
47
+ @attitude_file_bytes_read = 0
48
+
49
+ @pos_packet = Structure.new(:BIG_ENDIAN)
50
+ @pos_packet.append_item('DAY', 16, :UINT)
51
+ @pos_packet.append_item('MSOD', 32, :UINT)
52
+ @pos_packet.append_item('USOMS', 16, :UINT)
53
+ @pos_packet.append_item('POSX', 32, :FLOAT)
54
+ @pos_packet.append_item('POSY', 32, :FLOAT)
55
+ @pos_packet.append_item('POSZ', 32, :FLOAT)
56
+ @pos_packet.append_item('SPARE1', 16, :UINT)
57
+ @pos_packet.append_item('SPARE2', 32, :UINT)
58
+ @pos_packet.append_item('SPARE3', 16, :UINT)
59
+ @pos_packet.append_item('VELX', 32, :FLOAT)
60
+ @pos_packet.append_item('VELY', 32, :FLOAT)
61
+ @pos_packet.append_item('VELZ', 32, :FLOAT)
62
+ @pos_packet.append_item('SPARE4', 32, :UINT)
63
+ @pos_packet.enable_method_missing
64
+
65
+ @att_packet = Structure.new(:BIG_ENDIAN)
66
+ @att_packet.append_item('DAY', 16, :UINT)
67
+ @att_packet.append_item('MSOD', 32, :UINT)
68
+ @att_packet.append_item('USOMS', 16, :UINT)
69
+ @att_packet.append_item('Q1', 32, :FLOAT)
70
+ @att_packet.append_item('Q2', 32, :FLOAT)
71
+ @att_packet.append_item('Q3', 32, :FLOAT)
72
+ @att_packet.append_item('Q4', 32, :FLOAT)
73
+ @att_packet.append_item('BIASX', 32, :FLOAT)
74
+ @att_packet.append_item('BIASY', 32, :FLOAT)
75
+ @att_packet.append_item('BIASZ', 32, :FLOAT)
76
+ @att_packet.append_item('SPARE', 32, :FLOAT)
77
+ @att_packet.enable_method_missing
78
+
79
+ packet = @tlm_packets['HEALTH_STATUS']
80
+ packet.enable_method_missing
81
+ packet.CcsdsSeqFlags = 'NOGROUP'
82
+ packet.CcsdsLength = packet.buffer.length - 7
83
+ packet.temp1 = 50.0
84
+ packet.temp2 = -20.0
85
+ packet.temp3 = 85.0
86
+ packet.temp4 = 0.0
87
+ packet.duration = 10.0
88
+ packet.collect_type = 'NORMAL'
89
+
90
+ packet = @tlm_packets['ADCS']
91
+ packet.enable_method_missing
92
+ packet.CcsdsSeqFlags = 'NOGROUP'
93
+ packet.CcsdsLength = packet.buffer.length - 7
94
+
95
+ packet = @tlm_packets['PARAMS']
96
+ packet.enable_method_missing
97
+ packet.CcsdsSeqFlags = 'NOGROUP'
98
+ packet.CcsdsLength = packet.buffer.length - 7
99
+ packet.value1 = 0
100
+ packet.value2 = 1
101
+ packet.value3 = 2
102
+ packet.value4 = 1
103
+ packet.value5 = 0
104
+
105
+ packet = @tlm_packets['IMAGE']
106
+ packet.enable_method_missing
107
+ packet.CcsdsSeqFlags = 'NOGROUP'
108
+ packet.CcsdsLength = packet.buffer.length - 7
109
+
110
+ packet = @tlm_packets['MECH']
111
+ packet.enable_method_missing
112
+ packet.CcsdsSeqFlags = 'NOGROUP'
113
+ packet.CcsdsLength = packet.buffer.length - 7
114
+
115
+ @solar_panel_positions = SOLAR_PANEL_DFLTS.dup
116
+ @solar_panel_thread = nil
117
+ @solar_panel_thread_cancel = false
118
+
119
+ @trackStars = Array.new
120
+ @trackStars[0] = 1237
121
+ @trackStars[1] = 1329
122
+ @trackStars[2] = 1333
123
+ @trackStars[3] = 1139
124
+ @trackStars[4] = 1161
125
+ @trackStars[5] = 682
126
+ @trackStars[6] = 717
127
+ @trackStars[7] = 814
128
+ @trackStars[8] = 583
129
+ @trackStars[9] = 622
130
+
131
+ @get_count = 0
132
+ @bad_temp2 = false
133
+ @last_temp2 = 0
134
+ @quiet = false
135
+ end
136
+
137
+ def set_rates
138
+ set_rate('ADCS', 10)
139
+ set_rate('HEALTH_STATUS', 100)
140
+ set_rate('PARAMS', 100)
141
+ set_rate('IMAGE', 100)
142
+ set_rate('MECH', 10)
143
+ end
144
+
145
+ def tick_period_seconds
146
+ return 0.1 # Override this method to optimize
147
+ end
148
+
149
+ def tick_increment
150
+ return 10 # Override this method to optimize
151
+ end
152
+
153
+ def write(packet)
154
+ name = packet.packet_name.upcase
155
+
156
+ hs_packet = @tlm_packets['HEALTH_STATUS']
157
+ params_packet = @tlm_packets['PARAMS']
158
+
159
+ case name
160
+ when 'COLLECT'
161
+ hs_packet.collects += 1
162
+ hs_packet.duration = packet.read('duration')
163
+ hs_packet.collect_type = packet.read("type")
164
+ when 'CLEAR'
165
+ hs_packet.collects = 0
166
+ when 'MEMLOAD'
167
+ hs_packet.blocktest = packet.read('data')
168
+ when 'QUIET'
169
+ if packet.read('state') == 'TRUE'
170
+ @quiet = true
171
+ else
172
+ @quiet = false
173
+ end
174
+ when 'SETPARAMS'
175
+ params_packet.value1 = packet.read('value1')
176
+ params_packet.value2 = packet.read('value2')
177
+ params_packet.value3 = packet.read('value3')
178
+ params_packet.value4 = packet.read('value4')
179
+ params_packet.value5 = packet.read('value5')
180
+ when 'ASCIICMD'
181
+ hs_packet.asciicmd = packet.read('string')
182
+ when 'SLRPNLDEPLOY'
183
+ return if @solar_panel_thread and @solar_panel_thread.alive?
184
+ @solar_panel_thread = Thread.new do
185
+ @solar_panel_thread_cancel = false
186
+ (0..@solar_panel_positions.size - 1).to_a.reverse_each do |i|
187
+ while (@solar_panel_positions[i] > 0.1) or (@solar_panel_positions[i] < - 0.1)
188
+ if @solar_panel_positions[i] > 3.0
189
+ @solar_panel_positions[i] -= 3.0
190
+ elsif @solar_panel_positions[i] < -3.0
191
+ @solar_panel_positions[i] += 3.0
192
+ else
193
+ @solar_panel_positions[i] = 0.0
194
+ end
195
+ sleep(0.10)
196
+ break if @solar_panel_thread_cancel
197
+ end
198
+ if @solar_panel_thread_cancel
199
+ @solar_panel_thread_cancel = false
200
+ break
201
+ end
202
+ end
203
+ end
204
+ when 'SLRPNLRESET'
205
+ OpenC3.kill_thread(self, @solar_panel_thread)
206
+ @solar_panel_positions = SOLAR_PANEL_DFLTS.dup
207
+ end
208
+ end
209
+
210
+ def graceful_kill
211
+ @solar_panel_thread_cancel = true
212
+ end
213
+
214
+ def read(count_100hz, time)
215
+ pending_packets = get_pending_packets(count_100hz)
216
+
217
+ pending_packets.each do |packet|
218
+ case packet.packet_name
219
+ when 'ADCS'
220
+ # Read 44 Bytes for Position Data
221
+ pos_data = nil
222
+ begin
223
+ pos_data = @position_file.read(44)
224
+ @position_file_bytes_read += 44
225
+ rescue
226
+ # Do Nothing
227
+ end
228
+
229
+ if pos_data.nil? or pos_data.length == 0
230
+ # Assume end of file - close and reopen
231
+ @position_file.rewind
232
+ pos_data = @position_file.read(44)
233
+ @position_file_bytes_read = 44
234
+ end
235
+
236
+ @pos_packet.buffer = pos_data
237
+ packet.posx = @pos_packet.posx
238
+ packet.posy = @pos_packet.posy
239
+ packet.posz = @pos_packet.posz
240
+ packet.velx = @pos_packet.velx
241
+ packet.vely = @pos_packet.vely
242
+ packet.velz = @pos_packet.velz
243
+
244
+ # Read 40 Bytes for Attitude Data
245
+ att_data = nil
246
+ begin
247
+ att_data = @attitude_file.read(40)
248
+ @attitude_file_bytes_read += 40
249
+ rescue
250
+ # Do Nothing
251
+ end
252
+
253
+ if att_data.nil? or att_data.length == 0
254
+ @attitude_file.rewind
255
+ att_data = @attitude_file.read(40)
256
+ @attitude_file_bytes_read = 40
257
+ end
258
+
259
+ @att_packet.buffer = att_data
260
+ packet.q1 = @att_packet.q1
261
+ packet.q2 = @att_packet.q2
262
+ packet.q3 = @att_packet.q3
263
+ packet.q4 = @att_packet.q4
264
+ packet.biasx = @att_packet.biasx
265
+ packet.biasy = @att_packet.biasy
266
+ packet.biasy = @att_packet.biasz
267
+
268
+ packet.star1id = @trackStars[((@get_count / 100) + 0) % 10]
269
+ packet.star2id = @trackStars[((@get_count / 100) + 1) % 10]
270
+ packet.star3id = @trackStars[((@get_count / 100) + 2) % 10]
271
+ packet.star4id = @trackStars[((@get_count / 100) + 3) % 10]
272
+ packet.star5id = @trackStars[((@get_count / 100) + 4) % 10]
273
+
274
+ packet.posprogress = (@position_file_bytes_read.to_f / @position_file_size.to_f) * 100.0
275
+ packet.attprogress = (@attitude_file_bytes_read.to_f / @attitude_file_size.to_f) * 100.0
276
+
277
+ packet.timesec = time.tv_sec
278
+ packet.timeus = time.tv_usec
279
+ packet.ccsdsseqcnt += 1
280
+
281
+ when 'HEALTH_STATUS'
282
+ if @quiet
283
+ @bad_temp2 = false
284
+ cycle_tlm_item(packet, 'temp1', -15.0, 15.0, 5.0)
285
+ cycle_tlm_item(packet, 'temp2', -50.0, 25.0, -1.0)
286
+ cycle_tlm_item(packet, 'temp3', 0.0, 50.0, 2.0)
287
+ else
288
+ cycle_tlm_item(packet, 'temp1', -95.0, 95.0, 5.0)
289
+ if @bad_temp2
290
+ packet.write('temp2', @last_temp2)
291
+ @bad_temp2 = false
292
+ end
293
+ @last_temp2 = cycle_tlm_item(packet, 'temp2', -50.0, 50.0, -1.0)
294
+ if (packet.temp2.abs - 30).abs < 2
295
+ packet.write('temp2', Float::NAN)
296
+ @bad_temp2 = true
297
+ elsif (packet.temp2.abs - 20).abs < 2
298
+ packet.write('temp2', -Float::INFINITY)
299
+ @bad_temp2 = true
300
+ elsif (packet.temp2.abs - 10).abs < 2
301
+ packet.write('temp2', Float::INFINITY)
302
+ @bad_temp2 = true
303
+ end
304
+ cycle_tlm_item(packet, 'temp3', -30.0, 80.0, 2.0)
305
+ end
306
+ cycle_tlm_item(packet, 'temp4', 0.0, 20.0, -0.1)
307
+
308
+ packet.timesec = time.tv_sec
309
+ packet.timeus = time.tv_usec
310
+ packet.ccsdsseqcnt += 1
311
+
312
+ ary = []
313
+ 10.times do |index|
314
+ ary << index
315
+ end
316
+ packet.ary = ary
317
+
318
+ if @quiet
319
+ packet.ground1status = 'CONNECTED'
320
+ packet.ground2status = 'CONNECTED'
321
+ else
322
+ if @get_count % 1000 == 0
323
+ if packet.ground1status == 'CONNECTED'
324
+ packet.ground1status = 'UNAVAILABLE'
325
+ else
326
+ packet.ground1status = 'CONNECTED'
327
+ end
328
+ end
329
+
330
+ if @get_count % 500 == 0
331
+ if packet.ground2status == 'CONNECTED'
332
+ packet.ground2status = 'UNAVAILABLE'
333
+ else
334
+ packet.ground2status = 'CONNECTED'
335
+ end
336
+ end
337
+ end
338
+
339
+ when 'PARAMS'
340
+ packet.timesec = time.tv_sec
341
+ packet.timeus = time.tv_usec
342
+ packet.ccsdsseqcnt += 1
343
+
344
+ when 'IMAGE'
345
+ packet.timesec = time.tv_sec
346
+ packet.timeus = time.tv_usec
347
+ # Create an Array the size of the packet and then initialize
348
+ # using a sample of all possible hex values (0..15)
349
+ # finally pack it into binary using the Character 'C' specifier
350
+ data = Array.new(packet.image.length) { Array(0..15).sample }.pack("C*")
351
+ packet.image = data
352
+ packet.ccsdsseqcnt += 1
353
+
354
+ when 'MECH'
355
+ packet.timesec = time.tv_sec
356
+ packet.timeus = time.tv_usec
357
+ packet.ccsdsseqcnt += 1
358
+ packet.slrpnl1 = @solar_panel_positions[0]
359
+ packet.slrpnl2 = @solar_panel_positions[1]
360
+ packet.slrpnl3 = @solar_panel_positions[2]
361
+ packet.slrpnl4 = @solar_panel_positions[3]
362
+ packet.slrpnl5 = @solar_panel_positions[4]
363
+ end
364
+ end
365
+
366
+ # Every 10s throw an unknown packet at the server just to demo that
367
+ data = Array.new(10) { rand(0..255) }.pack("C*")
368
+ if @get_count % 1000 == 999
369
+ pending_packets << Packet.new(nil, nil, :BIG_ENDIAN, nil, data)
370
+ end
371
+
372
+ @get_count += tick_increment
373
+ pending_packets
374
+ end
375
+ end
376
+ end
@@ -0,0 +1,11 @@
1
+ collect_cnt = tlm("<%= target_name %> HEALTH_STATUS COLLECTS")
2
+ cmd("<%= target_name %> COLLECT with DURATION 11, TYPE NORMAL")
3
+ cmd_no_range_check("<%= target_name %> COLLECT with DURATION 11, TYPE NORMAL")
4
+ cmd_no_hazardous_check("<%= target_name %> COLLECT with DURATION 11, TYPE NORMAL")
5
+ cmd_no_checks("<%= target_name %> COLLECT with DURATION 11, TYPE NORMAL")
6
+ wait_check("<%= target_name %> HEALTH_STATUS COLLECTS == #{collect_cnt + 2}", 10)
7
+ cmd("<%= target_name %> CLEAR")
8
+ cmd_no_range_check("<%= target_name %> CLEAR")
9
+ cmd_no_hazardous_check("<%= target_name %> CLEAR")
10
+ cmd_no_checks("<%= target_name %> CLEAR")
11
+ puts tlm("<%= target_name %> HEALTH_STATUS COLLECTS")
@@ -0,0 +1,18 @@
1
+ load_utility '<%= target_name %>/procedures/utilities/collect.rb'
2
+ load_utility '<%= target_name %>/procedures/utilities/clear.rb'
3
+
4
+ number = ask("Enter a number.")
5
+ raise "Bad return" unless number.is_a? Numeric
6
+ number = ask_string("Enter a number.")
7
+ raise "Bad return" unless number.is_a? String
8
+
9
+ result = message_box("Click something.", "CHOICE1", "CHOICE2")
10
+ raise "Bad return" unless result == 'CHOICE1' or result == 'CHOICE2'
11
+
12
+ prompt("Press Ok to start NORMAL Collect")
13
+ collect('NORMAL', 1)
14
+ prompt("Press Ok to start SPECIAL Collect")
15
+ collect('SPECIAL', 2, true)
16
+ clear()
17
+
18
+ wait_check("<%= target_name %> HEALTH_STATUS COLLECTS == 0", 10)
@@ -0,0 +1,29 @@
1
+ cmd("<%= target_name %> ABORT")
2
+ cmd_no_range_check("<%= target_name %> COLLECT with TYPE NORMAL, TEMP 100")
3
+ cmd_no_hazardous_check("<%= target_name %> CLEAR")
4
+ cmd_no_checks("<%= target_name %> COLLECT with TYPE SPECIAL, TEMP 100.0")
5
+ cmd_raw("<%= target_name %> ABORT")
6
+ cmd_raw_no_range_check("<%= target_name %> COLLECT with TYPE 0, TEMP 100")
7
+ cmd_raw_no_hazardous_check("<%= target_name %> CLEAR")
8
+ cmd_raw_no_checks("<%= target_name %> COLLECT with TYPE 1, TEMP 100.0")
9
+ check("<%= target_name %> ADCS BIASX == 100")
10
+ check_formatted("<%= target_name %> ADCS BIASX == 100")
11
+ check_with_units("<%= target_name %> ADCS BIASX == 100")
12
+ check_raw("<%= target_name %> ADCS BIASX == 100")
13
+ check_tolerance("<%= target_name %> ADCS BIASX", 5, 0.5)
14
+ check_tolerance_raw("<%= target_name %> ADCS BIASX", 5, 0.5)
15
+ check_expression("true == false")
16
+ wait
17
+ wait 5
18
+ wait("<%= target_name %> ADCS BIASX > 100", 5)
19
+ wait_raw("<%= target_name %> ADCS BIASX > 100", 5)
20
+ wait_tolerance("<%= target_name %> ADCS BIASX", 5, 0.5, 5)
21
+ wait_tolerance_raw("<%= target_name %> ADCS BIASX", 5, 0.5, 5)
22
+ wait_expression("true == false", 5)
23
+ wait_packet("<%= target_name %>","ADCS", 2, 5)
24
+ wait_check("<%= target_name %> ADCS BIASX == 100", 5)
25
+ wait_check_raw("<%= target_name %> ADCS BIASX == 100", 5)
26
+ wait_check_tolerance("<%= target_name %> ADCS BIASX", 5, 0.5, 5)
27
+ wait_check_tolerance_raw("<%= target_name %> ADCS BIASX", 5, 0.5, 5)
28
+ wait_check_expression("true == false", 5)
29
+ wait_check_packet("<%= target_name %>","ADCS", 2, 5)
@@ -0,0 +1,15 @@
1
+ # Specify the title and message and filter to txt files
2
+ file = open_file_dialog("Open a single file", "Choose something interesting", filter: ".txt")
3
+ puts file # Ruby File object
4
+ puts file.path # Path of the tempfile (generally not used)
5
+ puts file.filename # Filename that was selected in the dialog
6
+ puts file.read
7
+ file.delete
8
+
9
+ files = open_files_dialog("Open multiple files") # message is optional
10
+ puts files # Array of File objects (even if you select only one)
11
+ files.each do |file|
12
+ puts file.filename
13
+ puts file.read
14
+ file.delete
15
+ end