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,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,39 @@
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 implements a class to handle responses to limits state changes.
21
+
22
+ require 'openc3/packets/limits_response'
23
+
24
+ # ExampleLimitsResponse class
25
+ #
26
+ # This class handles a limits response
27
+ #
28
+ class ExampleLimitsResponse < OpenC3::LimitsResponse
29
+
30
+ def call(packet, item, old_limits_state)
31
+ case item.limits.state
32
+ when :RED_HIGH
33
+ cmd('<%= target_name %>', 'COLLECT', 'TYPE' => 'NORMAL', 'DURATION' => 5, scope: 'DEFAULT')
34
+ when :RED_LOW
35
+ cmd_no_hazardous_check('<%= target_name %>', 'CLEAR', scope: 'DEFAULT')
36
+ end
37
+ end
38
+
39
+ end # class ExampleLimitsResponse
@@ -0,0 +1,354 @@
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
+ # Provides a demonstration of a Simulated Target
21
+
22
+ require 'openc3'
23
+ require 'stringio'
24
+
25
+ module OpenC3
26
+ # Simulated instrument for the demo. Populates several packets and cycles
27
+ # the telemetry to simulate an active target.
28
+ class SimInst < SimulatedTarget
29
+ SOLAR_PANEL_DFLTS = [-179.0, 179.0, -179.0, 179.0, -95.0] unless defined? SOLAR_PANEL_DFLTS
30
+
31
+ def initialize(target_name)
32
+ super(target_name)
33
+
34
+ @target = System.targets[target_name]
35
+ position_filename = File.join(@target.dir, 'data', 'position.bin')
36
+ attitude_filename = File.join(@target.dir, 'data', 'attitude.bin')
37
+ position_data = File.read(position_filename, mode: "rb")
38
+ attitude_data = File.read(attitude_filename, mode: "rb")
39
+ @position_file = StringIO.new(position_data)
40
+ @position_file_size = position_data.length
41
+ @attitude_file = StringIO.new(attitude_data)
42
+ @attitude_file_size = attitude_data.length
43
+ @position_file_bytes_read = 0
44
+ @attitude_file_bytes_read = 0
45
+
46
+ @pos_packet = Structure.new(:BIG_ENDIAN)
47
+ @pos_packet.append_item('DAY', 16, :UINT)
48
+ @pos_packet.append_item('MSOD', 32, :UINT)
49
+ @pos_packet.append_item('USOMS', 16, :UINT)
50
+ @pos_packet.append_item('POSX', 32, :FLOAT)
51
+ @pos_packet.append_item('POSY', 32, :FLOAT)
52
+ @pos_packet.append_item('POSZ', 32, :FLOAT)
53
+ @pos_packet.append_item('SPARE1', 16, :UINT)
54
+ @pos_packet.append_item('SPARE2', 32, :UINT)
55
+ @pos_packet.append_item('SPARE3', 16, :UINT)
56
+ @pos_packet.append_item('VELX', 32, :FLOAT)
57
+ @pos_packet.append_item('VELY', 32, :FLOAT)
58
+ @pos_packet.append_item('VELZ', 32, :FLOAT)
59
+ @pos_packet.append_item('SPARE4', 32, :UINT)
60
+ @pos_packet.enable_method_missing
61
+
62
+ @att_packet = Structure.new(:BIG_ENDIAN)
63
+ @att_packet.append_item('DAY', 16, :UINT)
64
+ @att_packet.append_item('MSOD', 32, :UINT)
65
+ @att_packet.append_item('USOMS', 16, :UINT)
66
+ @att_packet.append_item('Q1', 32, :FLOAT)
67
+ @att_packet.append_item('Q2', 32, :FLOAT)
68
+ @att_packet.append_item('Q3', 32, :FLOAT)
69
+ @att_packet.append_item('Q4', 32, :FLOAT)
70
+ @att_packet.append_item('BIASX', 32, :FLOAT)
71
+ @att_packet.append_item('BIASY', 32, :FLOAT)
72
+ @att_packet.append_item('BIASZ', 32, :FLOAT)
73
+ @att_packet.append_item('SPARE', 32, :FLOAT)
74
+ @att_packet.enable_method_missing
75
+
76
+ packet = @tlm_packets['HEALTH_STATUS']
77
+ packet.enable_method_missing
78
+ packet.CcsdsSeqFlags = 'NOGROUP'
79
+ packet.CcsdsLength = packet.buffer.length - 7
80
+ packet.temp1 = 50.0
81
+ packet.temp2 = -20.0
82
+ packet.temp3 = 85.0
83
+ packet.temp4 = 0.0
84
+ packet.duration = 10.0
85
+ packet.collect_type = 'NORMAL'
86
+
87
+ packet = @tlm_packets['ADCS']
88
+ packet.enable_method_missing
89
+ packet.CcsdsSeqFlags = 'NOGROUP'
90
+ packet.CcsdsLength = packet.buffer.length - 7
91
+
92
+ packet = @tlm_packets['PARAMS']
93
+ packet.enable_method_missing
94
+ packet.CcsdsSeqFlags = 'NOGROUP'
95
+ packet.CcsdsLength = packet.buffer.length - 7
96
+ packet.value1 = 0
97
+ packet.value2 = 1
98
+ packet.value3 = 2
99
+ packet.value4 = 1
100
+ packet.value5 = 0
101
+
102
+ packet = @tlm_packets['IMAGE']
103
+ packet.enable_method_missing
104
+ packet.CcsdsSeqFlags = 'NOGROUP'
105
+ packet.CcsdsLength = packet.buffer.length - 7
106
+
107
+ packet = @tlm_packets['MECH']
108
+ packet.enable_method_missing
109
+ packet.CcsdsSeqFlags = 'NOGROUP'
110
+ packet.CcsdsLength = packet.buffer.length - 7
111
+
112
+ @solar_panel_positions = SOLAR_PANEL_DFLTS.dup
113
+ @solar_panel_thread = nil
114
+ @solar_panel_thread_cancel = false
115
+
116
+ @trackStars = Array.new
117
+ @trackStars[0] = 1237
118
+ @trackStars[1] = 1329
119
+ @trackStars[2] = 1333
120
+ @trackStars[3] = 1139
121
+ @trackStars[4] = 1161
122
+ @trackStars[5] = 682
123
+ @trackStars[6] = 717
124
+ @trackStars[7] = 814
125
+ @trackStars[8] = 583
126
+ @trackStars[9] = 622
127
+
128
+ @get_count = 0
129
+ @bad_temp2 = false
130
+ @last_temp2 = 0
131
+ end
132
+
133
+ def set_rates
134
+ set_rate('ADCS', 10)
135
+ set_rate('HEALTH_STATUS', 100)
136
+ set_rate('PARAMS', 100)
137
+ set_rate('IMAGE', 100)
138
+ set_rate('MECH', 10)
139
+ end
140
+
141
+ def tick_period_seconds
142
+ return 0.1 # Override this method to optimize
143
+ end
144
+
145
+ def tick_increment
146
+ return 10 # Override this method to optimize
147
+ end
148
+
149
+ def write(packet)
150
+ name = packet.packet_name.upcase
151
+
152
+ hs_packet = @tlm_packets['HEALTH_STATUS']
153
+ params_packet = @tlm_packets['PARAMS']
154
+
155
+ case name
156
+ when 'COLLECT'
157
+ hs_packet.collects += 1
158
+ hs_packet.duration = packet.read('duration')
159
+ hs_packet.collect_type = packet.read("type")
160
+ when 'CLEAR'
161
+ hs_packet.collects = 0
162
+ when 'MEMLOAD'
163
+ hs_packet.blocktest = packet.read('data')
164
+ when 'SETPARAMS'
165
+ params_packet.value1 = packet.read('value1')
166
+ params_packet.value2 = packet.read('value2')
167
+ params_packet.value3 = packet.read('value3')
168
+ params_packet.value4 = packet.read('value4')
169
+ params_packet.value5 = packet.read('value5')
170
+ when 'ASCIICMD'
171
+ hs_packet.asciicmd = packet.read('string')
172
+ when 'SLRPNLDEPLOY'
173
+ return if @solar_panel_thread and @solar_panel_thread.alive?
174
+ @solar_panel_thread = Thread.new do
175
+ @solar_panel_thread_cancel = false
176
+ (0..@solar_panel_positions.size - 1).to_a.reverse_each do |i|
177
+ while (@solar_panel_positions[i] > 0.1) or (@solar_panel_positions[i] < - 0.1)
178
+ if @solar_panel_positions[i] > 3.0
179
+ @solar_panel_positions[i] -= 3.0
180
+ elsif @solar_panel_positions[i] < -3.0
181
+ @solar_panel_positions[i] += 3.0
182
+ else
183
+ @solar_panel_positions[i] = 0.0
184
+ end
185
+ sleep(0.10)
186
+ break if @solar_panel_thread_cancel
187
+ end
188
+ if @solar_panel_thread_cancel
189
+ @solar_panel_thread_cancel = false
190
+ break
191
+ end
192
+ end
193
+ end
194
+ when 'SLRPNLRESET'
195
+ OpenC3.kill_thread(self, @solar_panel_thread)
196
+ @solar_panel_positions = SOLAR_PANEL_DFLTS.dup
197
+ end
198
+ end
199
+
200
+ def graceful_kill
201
+ @solar_panel_thread_cancel = true
202
+ end
203
+
204
+ def read(count_100hz, time)
205
+ pending_packets = get_pending_packets(count_100hz)
206
+
207
+ pending_packets.each do |packet|
208
+ case packet.packet_name
209
+ when 'ADCS'
210
+ # Read 44 Bytes for Position Data
211
+ pos_data = nil
212
+ begin
213
+ pos_data = @position_file.read(44)
214
+ @position_file_bytes_read += 44
215
+ rescue
216
+ # Do Nothing
217
+ end
218
+
219
+ if pos_data.nil? or pos_data.length == 0
220
+ # Assume end of file - close and reopen
221
+ @position_file.rewind
222
+ pos_data = @position_file.read(44)
223
+ @position_file_bytes_read = 44
224
+ end
225
+
226
+ @pos_packet.buffer = pos_data
227
+ packet.posx = @pos_packet.posx
228
+ packet.posy = @pos_packet.posy
229
+ packet.posz = @pos_packet.posz
230
+ packet.velx = @pos_packet.velx
231
+ packet.vely = @pos_packet.vely
232
+ packet.velz = @pos_packet.velz
233
+
234
+ # Read 40 Bytes for Attitude Data
235
+ att_data = nil
236
+ begin
237
+ att_data = @attitude_file.read(40)
238
+ @attitude_file_bytes_read += 40
239
+ rescue
240
+ # Do Nothing
241
+ end
242
+
243
+ if att_data.nil? or att_data.length == 0
244
+ @attitude_file.rewind
245
+ att_data = @attitude_file.read(40)
246
+ @attitude_file_bytes_read = 40
247
+ end
248
+
249
+ @att_packet.buffer = att_data
250
+ packet.q1 = @att_packet.q1
251
+ packet.q2 = @att_packet.q2
252
+ packet.q3 = @att_packet.q3
253
+ packet.q4 = @att_packet.q4
254
+ packet.biasx = @att_packet.biasx
255
+ packet.biasy = @att_packet.biasy
256
+ packet.biasy = @att_packet.biasz
257
+
258
+ packet.star1id = @trackStars[((@get_count / 100) + 0) % 10]
259
+ packet.star2id = @trackStars[((@get_count / 100) + 1) % 10]
260
+ packet.star3id = @trackStars[((@get_count / 100) + 2) % 10]
261
+ packet.star4id = @trackStars[((@get_count / 100) + 3) % 10]
262
+ packet.star5id = @trackStars[((@get_count / 100) + 4) % 10]
263
+
264
+ packet.posprogress = (@position_file_bytes_read.to_f / @position_file_size.to_f) * 100.0
265
+ packet.attprogress = (@attitude_file_bytes_read.to_f / @attitude_file_size.to_f) * 100.0
266
+
267
+ packet.timesec = time.tv_sec
268
+ packet.timeus = time.tv_usec
269
+ packet.ccsdsseqcnt += 1
270
+
271
+ when 'HEALTH_STATUS'
272
+ cycle_tlm_item(packet, 'temp1', -95.0, 95.0, 5.0)
273
+ if @bad_temp2
274
+ packet.write('temp2', @last_temp2)
275
+ @bad_temp2 = false
276
+ end
277
+ @last_temp2 = cycle_tlm_item(packet, 'temp2', -50.0, 50.0, -1.0)
278
+ if (packet.temp2.abs - 30).abs < 2
279
+ packet.write('temp2', Float::NAN)
280
+ @bad_temp2 = true
281
+ elsif (packet.temp2.abs - 20).abs < 2
282
+ packet.write('temp2', -Float::INFINITY)
283
+ @bad_temp2 = true
284
+ elsif (packet.temp2.abs - 10).abs < 2
285
+ packet.write('temp2', Float::INFINITY)
286
+ @bad_temp2 = true
287
+ end
288
+ cycle_tlm_item(packet, 'temp3', -30.0, 80.0, 2.0)
289
+ cycle_tlm_item(packet, 'temp4', 0.0, 20.0, -0.1)
290
+
291
+ packet.timesec = time.tv_sec
292
+ packet.timeus = time.tv_usec
293
+ packet.ccsdsseqcnt += 1
294
+
295
+ ary = []
296
+ 10.times do |index|
297
+ ary << index
298
+ end
299
+ packet.ary = ary
300
+
301
+ if @get_count % 1000 == 0
302
+ if packet.ground1status == 'CONNECTED'
303
+ packet.ground1status = 'UNAVAILABLE'
304
+ else
305
+ packet.ground1status = 'CONNECTED'
306
+ end
307
+ end
308
+
309
+ if @get_count % 500 == 0
310
+ if packet.ground2status == 'CONNECTED'
311
+ packet.ground2status = 'UNAVAILABLE'
312
+ else
313
+ packet.ground2status = 'CONNECTED'
314
+ end
315
+ end
316
+
317
+ when 'PARAMS'
318
+ packet.timesec = time.tv_sec
319
+ packet.timeus = time.tv_usec
320
+ packet.ccsdsseqcnt += 1
321
+
322
+ when 'IMAGE'
323
+ packet.timesec = time.tv_sec
324
+ packet.timeus = time.tv_usec
325
+ # Create an Array the size of the packet and then initialize
326
+ # using a sample of all possible hex values (0..15)
327
+ # finally pack it into binary using the Character 'C' specifier
328
+ data = Array.new(packet.image.length) { Array(0..15).sample }.pack("C*")
329
+ packet.image = data
330
+ packet.ccsdsseqcnt += 1
331
+
332
+ when 'MECH'
333
+ packet.timesec = time.tv_sec
334
+ packet.timeus = time.tv_usec
335
+ packet.ccsdsseqcnt += 1
336
+ packet.slrpnl1 = @solar_panel_positions[0]
337
+ packet.slrpnl2 = @solar_panel_positions[1]
338
+ packet.slrpnl3 = @solar_panel_positions[2]
339
+ packet.slrpnl4 = @solar_panel_positions[3]
340
+ packet.slrpnl5 = @solar_panel_positions[4]
341
+ end
342
+ end
343
+
344
+ # Every 10s throw an unknown packet at the server just to demo that
345
+ data = Array.new(10) { rand(0..255) }.pack("C*")
346
+ if @get_count % 1000 == 999
347
+ pending_packets << Packet.new(nil, nil, :BIG_ENDIAN, nil, data)
348
+ end
349
+
350
+ @get_count += 1
351
+ pending_packets
352
+ end
353
+ end
354
+ 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,13 @@
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.read
5
+ file.delete
6
+
7
+ files = open_files_dialog("Open multiple files") # message is optional
8
+ puts files # Array of File objects (even if you select only one)
9
+ files.each do |file|
10
+ puts file
11
+ puts file.read
12
+ file.delete
13
+ end