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,5 @@
1
+ SCREEN AUTO AUTO 1.0
2
+
3
+ VERTICAL
4
+ IFRAME https://openc3.com 900 450
5
+ END
@@ -0,0 +1,7 @@
1
+ # This file references table definitions contained in stand alone
2
+ # files. The syntax is:
3
+ # TABLEFILE "FileName_def.txt"
4
+
5
+ TABLEFILE "MCConfigurationTable_def.txt"
6
+ TABLEFILE "TLMMonitoringTable_def.txt"
7
+ TABLEFILE "PPSSelectionTable_def.txt"
@@ -0,0 +1,36 @@
1
+ TABLE "MC_Configuration" BIG_ENDIAN KEY_VALUE "Memory Control Configuration Table"
2
+ APPEND_PARAMETER "Scrub_Region_1_Start_Addr" 32 UINT 0 0x03FFFFFB 0
3
+ FORMAT_STRING "0x%0X"
4
+ APPEND_PARAMETER "Scrub_Region_1_End_Addr" 32 UINT 0 0x03FFFFFF 0x03FFFFFF
5
+ FORMAT_STRING "0x%0X"
6
+ APPEND_PARAMETER "Scrub_Region_2_Start_Addr" 32 UINT 0 0x03FFFFB 0
7
+ FORMAT_STRING "0x%0X"
8
+ APPEND_PARAMETER "Scrub_Region_2_End_Addr" 32 UINT 0 0x03FFFFF 0x03FFFFF
9
+ FORMAT_STRING "0x%0X"
10
+ APPEND_PARAMETER "Dump_Packet_Throttle_(sec)" 32 UINT 0 0x0FFFFFFFF 2 "Number of seconds to wait between dumping large packets"
11
+ APPEND_PARAMETER "Memory_Scrubbing" 8 UINT 0 1 1
12
+ STATE DISABLE 0
13
+ STATE ENABLE 1
14
+ APPEND_PARAMETER "SIOC_Memory_Config" 8 UINT 1 3 3
15
+ GENERIC_WRITE_CONVERSION_START
16
+ if packet.read("Memory_Scrubbing") == 'DISABLE'
17
+ packet.get_item("SIOC_Memory_Config").range = (10..20)
18
+ else
19
+ packet.get_item("SIOC_Memory_Config").range = (1..3)
20
+ end
21
+ value
22
+ GENERIC_WRITE_CONVERSION_END
23
+ APPEND_PARAMETER "Uneditable_Text" 32 UINT MIN MAX 0xDEADBEEF "Uneditable field"
24
+ FORMAT_STRING "0x%0X"
25
+ UNEDITABLE
26
+ APPEND_PARAMETER "Uneditable_State" 16 UINT MIN MAX 0 "Uneditable field"
27
+ STATE DISABLE 0
28
+ STATE ENABLE 1
29
+ UNEDITABLE
30
+ APPEND_PARAMETER "Uneditable_Check" 16 UINT MIN MAX 1 "Uneditable field"
31
+ STATE UNCHECKED 0
32
+ STATE CHECKED 1
33
+ UNEDITABLE
34
+ APPEND_PARAMETER "Binary" 32 STRING 0xDEADBEEF "Binary string"
35
+ APPEND_PARAMETER "Pad" 16 UINT 0 0 0
36
+ HIDDEN
@@ -0,0 +1,7 @@
1
+ TABLE "PPS_Selection" BIG_ENDIAN KEY_VALUE "Payload Clock Control Pulse Per Second Selection Table"
2
+ APPEND_PARAMETER "Primary_PPS" 8 UINT 0 1 1
3
+ STATE CHECKED 1
4
+ STATE UNCHECKED 0
5
+ APPEND_PARAMETER "Redundant_PPS" 8 UINT 0 1 0
6
+ STATE UNCHECKED 0
7
+ STATE CHECKED 1
@@ -0,0 +1,31 @@
1
+ TABLE "TLM_Monitoring" BIG_ENDIAN ROW_COLUMN 100 "Telemetry Monitoring Table"
2
+ APPEND_PARAMETER "Threshold" 32 UINT MIN MAX 0 "Telemetry item threshold at which point persistance is incremented"
3
+ APPEND_PARAMETER "Offset" 32 UINT MIN MAX 0 "Offset into the telemetry packet to monitor"
4
+ APPEND_PARAMETER "Data_Size" 32 UINT 0 3 0 "Amount of data to monitor (bytes)"
5
+ STATE BITS 0
6
+ STATE BYTE 1
7
+ STATE WORD 2
8
+ STATE LONGWORD 3
9
+ APPEND_PARAMETER "Bit_Mask" 32 UINT MIN MAX 0 "Bit Mask to apply to the Data Size before the value is compared ot the Threshold"
10
+ APPEND_PARAMETER "Persistence" 32 UINT MIN MAX 0 "Number of times the Threshold must be exceeded before Action is triggered"
11
+ APPEND_PARAMETER "Type" 32 UINT 0 3 0 "How the Threshold is compared against"
12
+ STATE LESS_THAN 0
13
+ STATE GREATER_THAN 1
14
+ STATE EQUAL_TO 2
15
+ STATE NOT_EQUAL_TO 3
16
+ APPEND_PARAMETER "Action" 32 UINT 0 4 0 "Action to take when Persistance is met"
17
+ STATE NO_ACTION_REQUIRED 0
18
+ STATE INITIATE_RESET 1
19
+ STATE CHANGE_MODE_SAFE 2
20
+ APPEND_PARAMETER "Group" 32 UINT 1 4 1 "Telemetry group this monitor item belongs to. Groups are automatically enabled due to payload events."
21
+ STATE ALL_MODES 1
22
+ STATE SAFE_MODE 2
23
+ APPEND_PARAMETER "Signed" 8 UINT 0 2 0 "Whether to treat the Data Size data as signed or unsigned when comparing to the Threshold"
24
+ STATE NOT_APPLICABLE 0
25
+ STATE UNSIGNED 1
26
+ STATE SIGNED 2
27
+
28
+ # Note we're creating 100 DEFAULT rows to match our 100 row table
29
+ <% 100.times do %>
30
+ DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
31
+ <% end %>
@@ -0,0 +1,16 @@
1
+ # TBL_FILENAME is set to the name of the table file to overwrite
2
+ puts "file:#{ENV['TBL_FILENAME']}"
3
+ # Download the file
4
+ # Implement custom commanding logic to download the table
5
+ # You probably want to do something like:
6
+ buffer = ''
7
+ # i = 1
8
+ # num_segments = 5 # calculate based on TBL_FILENAME
9
+ # table_id = 1 # calculate based on TBL_FILENAME
10
+ # while i < num_segments
11
+ # # Request a part of the table buffer
12
+ # cmd("TGT DUMP with TABLE_ID #{table_id}, SEGMENT #{i}")
13
+ # buffer += tlm("TGT DUMP_PKT DATA")
14
+ # i += 1
15
+ # end
16
+ put_target_file(ENV['TBL_FILENAME'], buffer)
@@ -0,0 +1,19 @@
1
+ # TBL_FILENAME is set to the name of the table file
2
+ puts "file:#{ENV['TBL_FILENAME']}"
3
+ # Open the file
4
+ file = get_target_file(ENV['TBL_FILENAME'])
5
+ buffer = file.read
6
+ # puts buffer.formatted
7
+ # Implement custom commanding logic to upload the table
8
+ # Note that buffer is a Ruby string of bytes
9
+ # You probably want to do something like:
10
+ # buf_size = 512 # Size of a buffer in the upload command
11
+ # i = 0
12
+ # while i < buffer.length
13
+ # # Send a part of the buffer
14
+ # # NOTE: triple dots means start index, up to but not including, end index
15
+ # # while double dots means start index, up to AND including, end index
16
+ # cmd("TGT", "UPLOAD", "DATA" => buffer[i...(i + buf_size)])
17
+ # i += buf_size
18
+ # end
19
+ file.delete
@@ -0,0 +1,31 @@
1
+ # Requires for limits responses and custom conversion classes
2
+ REQUIRE example_limits_response.rb
3
+ REQUIRE sim_inst.rb
4
+
5
+ # Ignored Parameters
6
+ # IGNORE_PARAMETER parameter_name
7
+ IGNORE_PARAMETER CCSDSVER
8
+ IGNORE_PARAMETER CCSDSTYPE
9
+ IGNORE_PARAMETER CCSDSSHF
10
+ IGNORE_PARAMETER CCSDSAPID
11
+ IGNORE_PARAMETER CCSDSSEQFLAGS
12
+ IGNORE_PARAMETER CCSDSSEQCNT
13
+ IGNORE_PARAMETER CCSDSLENGTH
14
+ IGNORE_PARAMETER PKTID
15
+
16
+ # Ignored Items
17
+ # IGNORE_ITEM item_name
18
+ IGNORE_ITEM CCSDSVER
19
+ IGNORE_ITEM CCSDSTYPE
20
+ IGNORE_ITEM CCSDSSHF
21
+ IGNORE_ITEM CCSDSAPID
22
+ IGNORE_ITEM CCSDSSEQFLAGS
23
+ IGNORE_ITEM CCSDSSEQCNT
24
+ IGNORE_ITEM CCSDSLENGTH
25
+
26
+ # Explicitly define command and telemetry files
27
+ # If not given then all the files in cmd/tlm will be processed in
28
+ # alphabetical order
29
+ COMMANDS inst_cmds.txt
30
+ TELEMETRY inst_tlm.txt
31
+ TELEMETRY inst_tlm_override.txt
@@ -0,0 +1,6 @@
1
+ LIMITS_GROUP INST2_TEMP2
2
+ LIMITS_GROUP_ITEM INST2 HEALTH_STATUS TEMP2
3
+
4
+ LIMITS_GROUP INST2_GROUND
5
+ LIMITS_GROUP_ITEM INST2 HEALTH_STATUS GROUND1STATUS
6
+ LIMITS_GROUP_ITEM INST2 HEALTH_STATUS GROUND2STATUS
@@ -0,0 +1,10 @@
1
+ TELEMETRY SYSTEM META BIG_ENDIAN "System Meta Data Telemetry Packet"
2
+ APPEND_ID_ITEM PKTID 8 UINT 1 "Packet Id"
3
+ APPEND_ITEM CONFIG 256 STRING "Configuration Name"
4
+ APPEND_ITEM OPENC3_VERSION 240 STRING "OpenC3 Version"
5
+ META READ_ONLY
6
+ APPEND_ITEM USER_VERSION 240 STRING "User Project Version"
7
+ META READ_ONLY
8
+ APPEND_ITEM RUBY_VERSION 240 STRING "Ruby Version"
9
+ META READ_ONLY
10
+ APPEND_ITEM OPERATOR_NAME 512 STRING "Operator Name"
@@ -0,0 +1,41 @@
1
+ COMMAND SYSTEM STARTLOGGING BIG_ENDIAN "Starts logging both commands and telemetry for an interface"
2
+ APPEND_PARAMETER SYNC 32 UINT 0x1ACFFC1D 0x1ACFFC1D 0x1ACFFC1D "OpenC3 Command Sync Pattern"
3
+ APPEND_ID_PARAMETER OPCODE 32 UINT 2 2 2 "OpenC3 Command Opcode"
4
+ APPEND_PARAMETER LENGTH 32 UINT 0 65536 3 "OpenC3 Command Length of Command Data in Bytes"
5
+ APPEND_PARAMETER INTERFACE 256 STRING "ALL" "Interface to start logging on - ALL starts logging on all interfaces"
6
+ APPEND_PARAMETER LABEL 0 STRING "" "Optional label to place on log files"
7
+
8
+ COMMAND SYSTEM STARTCMDLOG BIG_ENDIAN "Starts logging commands for an interface"
9
+ APPEND_PARAMETER SYNC 32 UINT 0x1ACFFC1D 0x1ACFFC1D 0x1ACFFC1D "OpenC3 Command Sync Pattern"
10
+ APPEND_ID_PARAMETER OPCODE 32 UINT 3 3 3 "OpenC3 Command Opcode"
11
+ APPEND_PARAMETER LENGTH 32 UINT 0 65536 3 "OpenC3 Command Length of Command Data in Bytes"
12
+ APPEND_PARAMETER INTERFACE 256 STRING "ALL" "Interface to start logging on - ALL starts logging on all interfaces"
13
+ APPEND_PARAMETER LABEL 0 STRING "" "Optional label to place on log files"
14
+
15
+ COMMAND SYSTEM STARTTLMLOG BIG_ENDIAN "Starts logging telemetry for an interface"
16
+ APPEND_PARAMETER SYNC 32 UINT 0x1ACFFC1D 0x1ACFFC1D 0x1ACFFC1D "OpenC3 Command Sync Pattern"
17
+ APPEND_ID_PARAMETER OPCODE 32 UINT 4 4 4 "OpenC3 Command Opcode"
18
+ APPEND_PARAMETER LENGTH 32 UINT 0 65536 3 "OpenC3 Command Length of Command Data in Bytes"
19
+ APPEND_PARAMETER INTERFACE 256 STRING "ALL" "Interface to start logging on - ALL starts logging on all interfaces"
20
+ APPEND_PARAMETER LABEL 0 STRING "" "Optional label to place on log files"
21
+
22
+ COMMAND SYSTEM STOPLOGGING BIG_ENDIAN "Stops logging both commands and telemetry for an interface"
23
+ APPEND_PARAMETER SYNC 32 UINT 0x1ACFFC1D 0x1ACFFC1D 0x1ACFFC1D "OpenC3 Command Sync Pattern"
24
+ APPEND_ID_PARAMETER OPCODE 32 UINT 5 5 5 "OpenC3 Command Opcode"
25
+ APPEND_PARAMETER LENGTH 32 UINT 0 65536 3 "OpenC3 Command Length of Command Data in Bytes"
26
+ APPEND_PARAMETER INTERFACE 256 STRING "ALL" "Interface to stop logging on - ALL stops logging on all interfaces"
27
+ APPEND_PARAMETER LABEL 0 STRING "" "Optional label to place on log files"
28
+
29
+ COMMAND SYSTEM STOPCMDLOG BIG_ENDIAN "Stops logging commands for an interface"
30
+ APPEND_PARAMETER SYNC 32 UINT 0x1ACFFC1D 0x1ACFFC1D 0x1ACFFC1D "OpenC3 Command Sync Pattern"
31
+ APPEND_ID_PARAMETER OPCODE 32 UINT 6 6 6 "OpenC3 Command Opcode"
32
+ APPEND_PARAMETER LENGTH 32 UINT 0 65536 3 "OpenC3 Command Length of Command Data in Bytes"
33
+ APPEND_PARAMETER INTERFACE 256 STRING "ALL" "Interface to stop logging on - ALL stops logging on all interfaces"
34
+ APPEND_PARAMETER LABEL 0 STRING "" "Optional label to place on log files"
35
+
36
+ COMMAND SYSTEM STOPTLMLOG BIG_ENDIAN "Stops logging telemetry for an interface"
37
+ APPEND_PARAMETER SYNC 32 UINT 0x1ACFFC1D 0x1ACFFC1D 0x1ACFFC1D "OpenC3 Command Sync Pattern"
38
+ APPEND_ID_PARAMETER OPCODE 32 UINT 7 7 7 "OpenC3 Command Opcode"
39
+ APPEND_PARAMETER LENGTH 32 UINT 0 65536 3 "OpenC3 Command Length of Command Data in Bytes"
40
+ APPEND_PARAMETER INTERFACE 256 STRING "ALL" "Interface to stop logging on - ALL stops logging on all interfaces"
41
+ APPEND_PARAMETER LABEL 0 STRING "" "Optional label to place on log files"
@@ -0,0 +1,7 @@
1
+ TELEMETRY SYSTEM LIMITS_CHANGE BIG_ENDIAN "OpenC3 limits change"
2
+ APPEND_ID_ITEM PKT_ID 8 UINT 2 "Packet Id"
3
+ APPEND_ITEM TARGET 240 STRING "Target name"
4
+ APPEND_ITEM PACKET 240 STRING "Packet name"
5
+ APPEND_ITEM ITEM 240 STRING "Item that changed limits state"
6
+ APPEND_ITEM OLD_STATE 240 STRING "The old limit state"
7
+ APPEND_ITEM NEW_STATE 240 STRING "The new limit state"
@@ -0,0 +1,66 @@
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 an example background task
21
+
22
+ require 'openc3/tools/cmd_tlm_server/background_task'
23
+
24
+ module OpenC3
25
+ # Starts by sleeping 5 seconds then sends up to three collect commands
26
+ class ExampleBackgroundTask < BackgroundTask
27
+ def initialize
28
+ super()
29
+ @name = 'Example Background Task'
30
+ # Create Sleeper here in case the task is stopped before call is executed
31
+ @sleeper = Sleeper.new
32
+ end
33
+
34
+ def call
35
+ sent_count = 0
36
+ @sleeper = Sleeper.new
37
+ @status = "Sleeping for 5 seconds"
38
+ return if @sleeper.sleep(5) # allow interfaces time to start
39
+ initial_count = tlm('INST', 'HEALTH_STATUS', 'COLLECTS')
40
+ loop do
41
+ # Start up with at least 3 collects
42
+ count = tlm('INST', 'HEALTH_STATUS', 'COLLECTS')
43
+ if count < (initial_count + 3)
44
+ begin
45
+ cmd('INST', 'COLLECT', 'TYPE' => 'NORMAL', 'DURATION' => 1)
46
+ sent_count += 1
47
+ @status = "Sent COLLECT ##{sent_count} at #{Time.now.sys.formatted}"
48
+ wait("INST HEALTH_STATUS COLLECTS > #{count}", 5)
49
+ @status = "Tlm Updated at #{Time.now.sys.formatted}"
50
+ rescue
51
+ # Oh well - probably disconnected
52
+ end
53
+ else
54
+ break
55
+ end
56
+ return if @sleeper.sleep(1)
57
+ end
58
+ @status = "Finished at #{Time.now.sys.formatted}"
59
+ end
60
+
61
+ def stop
62
+ @sleeper.cancel
63
+ @status = "Stopped at #{Time.now.sys.formatted}"
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,112 @@
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
+ require 'openc3'
21
+ require 'openc3/interfaces'
22
+ require 'openc3/tools/cmd_tlm_server/interface_thread'
23
+
24
+ module OpenC3
25
+ class ExampleTarget
26
+ class ExampleServerInterface < TcpipServerInterface
27
+ PORT = 9999
28
+
29
+ def initialize
30
+ super(PORT, PORT, 5.0, nil, 'LENGTH', 0, 32, 4, 1, 'BIG_ENDIAN', 4, nil, nil, true)
31
+ end
32
+ end
33
+
34
+ class ExampleInterfaceThread < InterfaceThread
35
+ protected
36
+ def handle_packet(packet)
37
+ identified_packet = System.commands.identify(packet.buffer, ['EXAMPLE'])
38
+ if identified_packet
39
+ Logger.info "Received command: #{identified_packet.target_name} #{identified_packet.packet_name}"
40
+ else
41
+ Logger.info "Received UNKNOWN command"
42
+ end
43
+ end
44
+ end
45
+
46
+ class ExampleTelemetryThread
47
+ attr_reader :thread
48
+
49
+ def initialize(interface)
50
+ @interface = interface
51
+ @sleeper = Sleeper.new
52
+ end
53
+
54
+ def start
55
+ packet = System.telemetry.packet('EXAMPLE', 'STATUS')
56
+ @thread = Thread.new do
57
+ @stop_thread = false
58
+ begin
59
+ loop do
60
+ packet.write('PACKET_ID', 1)
61
+ packet.write('STRING', "The time is now: #{Time.now.sys.formatted}")
62
+ @interface.write(packet)
63
+ break if @sleeper.sleep(1)
64
+ end
65
+ rescue Exception => err
66
+ Logger.error "ExampleTelemetryThread unexpectedly died\n#{err.formatted}"
67
+ end
68
+ end
69
+ end
70
+
71
+ def stop
72
+ OpenC3.kill_thread(self, @thread)
73
+ end
74
+
75
+ def graceful_kill
76
+ @sleeper.cancel
77
+ end
78
+ end
79
+
80
+ def initialize
81
+ # Create interface to receive commands and send telemetry
82
+ @interface = ExampleServerInterface.new
83
+ @interface_thread = nil
84
+ @telemetry_thread = nil
85
+ end
86
+
87
+ def start
88
+ @interface_thread = ExampleInterfaceThread.new(@interface)
89
+ @interface_thread.start
90
+ @telemetry_thread = ExampleTelemetryThread.new(@interface)
91
+ @telemetry_thread.start
92
+ end
93
+
94
+ def stop
95
+ @telemetry_thread.stop if @telemetry_thread
96
+ @interface_thread.stop if @interface_thread
97
+ end
98
+
99
+ def self.run
100
+ Logger.level = Logger::INFO
101
+ target = self.new
102
+ begin
103
+ target.start
104
+ while true
105
+ sleep 1
106
+ end
107
+ rescue SystemExit, Interrupt
108
+ target.stop
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,64 @@
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
+ require 'openc3/tools/cmd_tlm_server/limits_groups_background_task'
21
+
22
+ module OpenC3
23
+ # Inheriting from the LimitsGroupsBackgroundTask provides a framework for
24
+ # automatically enabling and disabling limits groups based on telemetry.
25
+ class LimitsGroups < LimitsGroupsBackgroundTask
26
+ def initialize(initial_delay = 0, task_delay = 0.5)
27
+ # Initial delay upon starting the server before staring the group checks
28
+ # followed by the background task delay between check iterations
29
+ super(initial_delay, task_delay)
30
+ # Creating a Proc allows for arbitrary code to be executed when a group
31
+ # is enabled or disabled.
32
+ @temp2_enable_code = Proc.new do
33
+ enable_limits_group('INST2_GROUND') # Enable the INST2_GROUND group
34
+ end
35
+ @temp2_disable_code = Proc.new do
36
+ disable_limits_group('INST2_GROUND') # Disable the INST2_GROUND group
37
+ end
38
+ end
39
+
40
+ # This method name is important. It must begin with 'check_' and end with
41
+ # the name of a Limits Group defined by the LIMITS_GROUP keyword. In the
42
+ # demo this is defined in config/targets/SYSTEM/cmd_tlm/limits_groups.txt.
43
+ # Note that there is a LIMITS_GROUP INST2_TEMP2 so we have a match.
44
+ def check_inst2_temp2
45
+ # Inside this method you must call process_group. The first parameter is
46
+ # the number of seconds to delay before enabling the group when the telemetry
47
+ # check is true. When the telemetry check is false the group is instantly
48
+ # disabled. The next two parameters are Proc objects which are called with
49
+ # the group is enabled and disabled respectively. We defined our Proc objects
50
+ # in the constructor to enable and disable the GROUND group.
51
+ process_group(0, @temp2_enable_code, @temp2_disable_code) do
52
+ val = tlm("INST2 HEALTH_STATUS TEMP2")
53
+ # The expression returns TRUE (to enable the group) when the value is
54
+ # not NAN and not Infinite. If the value is NAN or Infinite the group
55
+ # is disabled. Note that this can't prevent false positives because the
56
+ # value has to change to something invalid before we can turn off the group
57
+ # at which point it is too late. Typically you enable or disable a group
58
+ # based on some external telemetry point such as a power supply output
59
+ # to enable a group of items powered by the supply.
60
+ !val.nan? && !val.infinite?
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,76 @@
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
+ require 'openc3'
21
+ require 'openc3/interfaces'
22
+ require 'openc3/tools/cmd_tlm_server/interface_thread'
23
+
24
+ module OpenC3
25
+ class ScpiTarget
26
+ class ScpiServerInterface < TcpipServerInterface
27
+ PORT = 5025
28
+
29
+ def initialize
30
+ super(PORT, PORT, 5.0, nil, 'TERMINATED', '0xA', '0xA')
31
+ end
32
+ end
33
+
34
+ class ScpiInterfaceThread < InterfaceThread
35
+ def initialize(interface)
36
+ super(interface)
37
+ @index = 0
38
+ end
39
+
40
+ protected
41
+ def handle_packet(packet)
42
+ Logger.info "Received command: #{packet.buffer}"
43
+ if packet.buffer.include?('?')
44
+ @interface.write_raw(@index.to_s + "\x0A")
45
+ end
46
+ @index += 1
47
+ end
48
+ end
49
+
50
+ def initialize
51
+ # Create interface to receive commands and send telemetry
52
+ @target_interface = ScpiServerInterface.new
53
+ @interface_thread = nil
54
+ end
55
+
56
+ def start
57
+ @interface_thread = ScpiInterfaceThread.new(@target_interface)
58
+ @interface_thread.start
59
+ end
60
+
61
+ def stop
62
+ @interface_thread.stop if @interface_thread
63
+ end
64
+
65
+ def self.run
66
+ Logger.level = Logger::INFO
67
+ target = self.new
68
+ begin
69
+ target.start
70
+ loop { sleep 1 }
71
+ rescue SystemExit, Interrupt
72
+ target.stop
73
+ end
74
+ end
75
+ end
76
+ end