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.
- checksums.yaml +7 -0
- data/LICENSE.txt +727 -0
- data/README.md +30 -0
- data/Rakefile +42 -0
- data/microservices/EXAMPLE/example_target.rb +123 -0
- data/microservices/TEMPLATED/scpi_target.rb +79 -0
- data/plugin.txt +112 -0
- data/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -0
- data/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -0
- data/targets/EXAMPLE/lib/example_interface.rb +27 -0
- data/targets/EXAMPLE/target.txt +9 -0
- data/targets/INST/cmd_tlm/_ccsds_cmd.txt +9 -0
- data/targets/INST/cmd_tlm/_ccsds_tlm.txt +19 -0
- data/targets/INST/cmd_tlm/inst_cmds.txt +57 -0
- data/targets/INST/cmd_tlm/inst_tlm.txt +162 -0
- data/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
- data/targets/INST/data/attitude.bin +0 -0
- data/targets/INST/data/position.bin +0 -0
- data/targets/INST/lib/example_limits_response.rb +39 -0
- data/targets/INST/lib/sim_inst.rb +354 -0
- data/targets/INST/procedures/checks.rb +11 -0
- data/targets/INST/procedures/collect.rb +18 -0
- data/targets/INST/procedures/disconnect.rb +29 -0
- data/targets/INST/procedures/file_dialog.rb +13 -0
- data/targets/INST/procedures/my_script_suite.rb +46 -0
- data/targets/INST/procedures/my_test_suite.rb +45 -0
- data/targets/INST/procedures/target_file.rb +21 -0
- data/targets/INST/procedures/utilities/clear.rb +7 -0
- data/targets/INST/procedures/utilities/collect.rb +14 -0
- data/targets/INST/public/ground_error.png +0 -0
- data/targets/INST/public/ground_off.png +0 -0
- data/targets/INST/public/ground_on.png +0 -0
- data/targets/INST/public/satellite.png +0 -0
- data/targets/INST/screens/_footer.txt +3 -0
- data/targets/INST/screens/adcs.txt +71 -0
- data/targets/INST/screens/array.txt +15 -0
- data/targets/INST/screens/block.txt +6 -0
- data/targets/INST/screens/commanding.txt +44 -0
- data/targets/INST/screens/graphs.txt +17 -0
- data/targets/INST/screens/ground.txt +46 -0
- data/targets/INST/screens/hs.txt +42 -0
- data/targets/INST/screens/latest.txt +21 -0
- data/targets/INST/screens/limits.txt +82 -0
- data/targets/INST/screens/other.txt +37 -0
- data/targets/INST/screens/params.txt +54 -0
- data/targets/INST/screens/simple.txt +6 -0
- data/targets/INST/screens/tabs.txt +66 -0
- data/targets/INST/screens/web.txt +5 -0
- data/targets/INST/tables/bin/ConfigTables.bin +0 -0
- data/targets/INST/tables/config/ConfigTables_def.txt +7 -0
- data/targets/INST/tables/config/MCConfigurationTable_def.txt +36 -0
- data/targets/INST/tables/config/PPSSelectionTable_def.txt +7 -0
- data/targets/INST/tables/config/TLMMonitoringTable_def.txt +31 -0
- data/targets/INST/tables/procedures/download.rb +16 -0
- data/targets/INST/tables/procedures/upload.rb +19 -0
- data/targets/INST/target.txt +31 -0
- data/targets/SYSTEM/cmd_tlm/limits_groups.txt +6 -0
- data/targets/SYSTEM/cmd_tlm/meta_tlm.txt +10 -0
- data/targets/SYSTEM/cmd_tlm/system_cmds.txt +41 -0
- data/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
- data/targets/SYSTEM/lib/example_background_task.rb +66 -0
- data/targets/SYSTEM/lib/example_target.rb +112 -0
- data/targets/SYSTEM/lib/limits_groups.rb +64 -0
- data/targets/SYSTEM/lib/scpi_target.rb +76 -0
- data/targets/SYSTEM/procedures/example_test.rb +191 -0
- data/targets/SYSTEM/procedures/interactive.rb +38 -0
- data/targets/SYSTEM/procedures/openc3_api_test.rb +286 -0
- data/targets/SYSTEM/procedures/run_example_test.rb +3 -0
- data/targets/SYSTEM/procedures/test.rb +49 -0
- data/targets/SYSTEM/screens/status.txt +12 -0
- data/targets/SYSTEM/target.txt +12 -0
- data/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -0
- data/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -0
- data/targets/TEMPLATED/lib/templated_interface.rb +69 -0
- data/targets/TEMPLATED/target.txt +8 -0
- data/tools/widgets/BigWidget/BigWidget.umd.min.js +4 -0
- data/tools/widgets/BigWidget/BigWidget.umd.min.js.map +1 -0
- data/tools/widgets/HelloworldWidget/HelloworldWidget.umd.min.js +2 -0
- data/tools/widgets/HelloworldWidget/HelloworldWidget.umd.min.js.map +1 -0
- 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
|