openc3-cosmos-demo 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +729 -0
- data/README.md +30 -0
- data/Rakefile +45 -0
- data/microservices/EXAMPLE/example_target.rb +126 -0
- data/microservices/TEMPLATED/scpi_target.rb +82 -0
- data/plugin.txt +117 -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 +30 -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 +63 -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 +42 -0
- data/targets/INST/lib/sim_inst.rb +376 -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 +15 -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 +16 -0
- data/targets/INST/screens/block.txt +7 -0
- data/targets/INST/screens/commanding.txt +47 -0
- data/targets/INST/screens/graphs.txt +23 -0
- data/targets/INST/screens/ground.txt +45 -0
- data/targets/INST/screens/hs.txt +42 -0
- data/targets/INST/screens/latest.txt +21 -0
- data/targets/INST/screens/launcher.txt +10 -0
- data/targets/INST/screens/limits.txt +82 -0
- data/targets/INST/screens/other.txt +22 -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 +69 -0
- data/targets/SYSTEM/lib/example_target.rb +115 -0
- data/targets/SYSTEM/lib/limits_groups.rb +67 -0
- data/targets/SYSTEM/lib/scpi_target.rb +79 -0
- data/targets/SYSTEM/procedures/example_test.rb +191 -0
- data/targets/SYSTEM/procedures/interactive.rb +38 -0
- data/targets/SYSTEM/procedures/limits_api_test.rb +89 -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 +72 -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 +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
|