openc3-demo 5.0.6

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 (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