openc3 5.20.0 → 6.0.0
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 +4 -4
- data/bin/openc3cli +12 -120
- data/data/config/command_modifiers.yaml +13 -1
- data/data/config/interface_modifiers.yaml +21 -4
- data/data/config/item_modifiers.yaml +1 -1
- data/data/config/microservice.yaml +15 -2
- data/data/config/param_item_modifiers.yaml +1 -1
- data/data/config/parameter_modifiers.yaml +1 -1
- data/data/config/table_manager.yaml +2 -2
- data/data/config/target.yaml +11 -0
- data/data/config/telemetry_modifiers.yaml +17 -1
- data/data/config/tool.yaml +12 -0
- data/data/config/widgets.yaml +13 -17
- data/lib/openc3/accessors/form_accessor.rb +4 -3
- data/lib/openc3/accessors/html_accessor.rb +3 -3
- data/lib/openc3/accessors/http_accessor.rb +13 -13
- data/lib/openc3/accessors/xml_accessor.rb +16 -4
- data/lib/openc3/api/target_api.rb +0 -30
- data/lib/openc3/config/config_parser.rb +6 -3
- data/lib/openc3/core_ext/array.rb +0 -16
- data/lib/openc3/core_ext.rb +0 -1
- data/lib/openc3/interfaces/file_interface.rb +198 -0
- data/lib/openc3/interfaces/http_client_interface.rb +71 -39
- data/lib/openc3/interfaces/http_server_interface.rb +0 -7
- data/lib/openc3/interfaces/interface.rb +2 -0
- data/lib/openc3/interfaces/mqtt_interface.rb +32 -15
- data/lib/openc3/interfaces/mqtt_stream_interface.rb +19 -4
- data/lib/openc3/interfaces/protocols/crc_protocol.rb +7 -0
- data/lib/openc3/interfaces/serial_interface.rb +1 -0
- data/lib/openc3/interfaces.rb +2 -4
- data/lib/openc3/microservices/multi_microservice.rb +3 -3
- data/lib/openc3/migrations/20241208080000_no_critical_cmd.rb +31 -0
- data/lib/openc3/migrations/20241208080001_no_trigger_group.rb +46 -0
- data/lib/openc3/models/interface_model.rb +9 -3
- data/lib/openc3/models/microservice_model.rb +8 -1
- data/lib/openc3/models/plugin_model.rb +6 -1
- data/lib/openc3/models/python_package_model.rb +6 -1
- data/lib/openc3/models/reaction_model.rb +14 -10
- data/lib/openc3/models/scope_model.rb +60 -42
- data/lib/openc3/models/target_model.rb +17 -1
- data/lib/openc3/models/timeline_model.rb +17 -5
- data/lib/openc3/models/tool_model.rb +15 -3
- data/lib/openc3/models/trigger_group_model.rb +6 -3
- data/lib/openc3/operators/microservice_operator.rb +8 -0
- data/lib/openc3/packets/commands.rb +17 -6
- data/lib/openc3/packets/limits.rb +0 -12
- data/lib/openc3/packets/packet.rb +1 -1
- data/lib/openc3/packets/packet_item.rb +30 -36
- data/lib/openc3/packets/structure_item.rb +2 -2
- data/lib/openc3/script/script.rb +0 -10
- data/lib/openc3/script/web_socket_api.rb +2 -2
- data/lib/openc3/streams/mqtt_stream.rb +41 -33
- data/lib/openc3/streams/serial_stream.rb +27 -27
- data/lib/openc3/streams/stream.rb +17 -17
- data/lib/openc3/streams/tcpip_client_stream.rb +1 -1
- data/lib/openc3/streams/tcpip_socket_stream.rb +19 -19
- data/lib/openc3/system/system.rb +1 -1
- data/lib/openc3/system.rb +2 -3
- data/lib/openc3/tools/table_manager/table.rb +2 -2
- data/lib/openc3/tools/table_manager/table_parser.rb +1 -1
- data/lib/openc3/top_level.rb +0 -5
- data/lib/openc3/topics/command_decom_topic.rb +0 -7
- data/lib/openc3/utilities/bucket_utilities.rb +1 -1
- data/lib/openc3/utilities/cli_generator.rb +0 -1
- data/lib/openc3/version.rb +6 -6
- data/templates/plugin/README.md +1 -1
- data/templates/target/targets/TARGET/lib/target.rb +1 -1
- data/templates/tool_angular/package.json +8 -8
- data/templates/tool_angular/src/app/app.component.html +4 -13
- data/templates/tool_angular/src/app/app.component.scss +5 -13
- data/templates/tool_angular/src/app/app.component.ts +5 -4
- data/templates/tool_angular/src/app/custom-overlay-container.ts +2 -2
- data/templates/tool_angular/src/app/openc3-api.d.ts +1 -1
- data/templates/tool_angular/src/main.single-spa.ts +1 -1
- data/templates/tool_react/package.json +1 -0
- data/templates/tool_react/src/root.component.js +1 -1
- data/templates/tool_svelte/package.json +11 -9
- data/templates/tool_svelte/rollup.config.js +2 -0
- data/templates/tool_svelte/src/App.svelte +2 -2
- data/templates/tool_vue/eslint.config.mjs +68 -0
- data/templates/tool_vue/jsconfig.json +1 -1
- data/templates/tool_vue/package.json +26 -43
- data/templates/tool_vue/src/App.vue +3 -5
- data/templates/tool_vue/src/main.js +12 -23
- data/templates/tool_vue/src/router.js +19 -18
- data/templates/tool_vue/src/tools/tool_name/tool_name.vue +2 -2
- data/templates/tool_vue/vite.config.js +52 -0
- data/templates/widget/package.json +19 -26
- data/templates/widget/src/Widget.vue +13 -15
- data/templates/widget/vite.config.js +26 -0
- metadata +10 -41
- data/lib/openc3/core_ext/hash.rb +0 -40
- data/lib/openc3/core_ext/httpclient.rb +0 -11
- data/lib/openc3/interfaces/linc_interface.rb +0 -480
- data/lib/openc3/interfaces/protocols/override_protocol.rb +0 -4
- data/lib/openc3/microservices/critical_cmd_microservice.rb +0 -74
- data/lib/openc3/microservices/reaction_microservice.rb +0 -607
- data/lib/openc3/microservices/timeline_microservice.rb +0 -398
- data/lib/openc3/microservices/trigger_group_microservice.rb +0 -698
- data/lib/openc3/migrations/20230615000000_autonomic.rb +0 -86
- data/lib/openc3/migrations/20240915000000_activity_uuid.rb +0 -28
- data/lib/openc3/migrations/20241016000000_scope_critical_cmd.rb +0 -24
- data/lib/openc3/system/system_config.rb +0 -413
- data/templates/tool_svelte/src/services/api.js +0 -92
- data/templates/tool_svelte/src/services/axios.js +0 -85
- data/templates/tool_svelte/src/services/cable.js +0 -65
- data/templates/tool_svelte/src/services/config-parser.js +0 -198
- data/templates/tool_svelte/src/services/openc3-api.js +0 -606
- data/templates/tool_vue/.eslintrc.js +0 -43
- data/templates/tool_vue/babel.config.json +0 -11
- data/templates/tool_vue/vue.config.js +0 -38
- data/templates/widget/.eslintrc.js +0 -43
- data/templates/widget/babel.config.json +0 -11
- data/templates/widget/vue.config.js +0 -28
- /data/templates/tool_vue/{.prettierrc.js → .prettierrc.cjs} +0 -0
- /data/templates/widget/{.prettierrc.js → .prettierrc.cjs} +0 -0
|
@@ -112,8 +112,6 @@ module OpenC3
|
|
|
112
112
|
@messages_disabled = nil
|
|
113
113
|
@state_colors = nil
|
|
114
114
|
@limits = PacketItemLimits.new
|
|
115
|
-
@persistence_setting = 1
|
|
116
|
-
@persistence_count = 0
|
|
117
115
|
@meta = nil
|
|
118
116
|
end
|
|
119
117
|
|
|
@@ -426,15 +424,13 @@ module OpenC3
|
|
|
426
424
|
config << self.read_conversion.to_config(:READ) if self.read_conversion
|
|
427
425
|
config << self.write_conversion.to_config(:WRITE) if self.write_conversion
|
|
428
426
|
|
|
429
|
-
if self.limits
|
|
430
|
-
|
|
431
|
-
self.limits.
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
config << "\n"
|
|
437
|
-
end
|
|
427
|
+
if self.limits.values
|
|
428
|
+
self.limits.values.each do |limits_set, limits_values|
|
|
429
|
+
config << " LIMITS #{limits_set} #{self.limits.persistence_setting} #{self.limits.enabled ? 'ENABLED' : 'DISABLED'} #{limits_values[0]} #{limits_values[1]} #{limits_values[2]} #{limits_values[3]}"
|
|
430
|
+
if limits_values[4] && limits_values[5]
|
|
431
|
+
config << " #{limits_values[4]} #{limits_values[5]}\n"
|
|
432
|
+
else
|
|
433
|
+
config << "\n"
|
|
438
434
|
end
|
|
439
435
|
end
|
|
440
436
|
config << self.limits.response.to_config if self.limits.response
|
|
@@ -489,35 +485,33 @@ module OpenC3
|
|
|
489
485
|
config['read_conversion'] = self.read_conversion.as_json(*a) if self.read_conversion
|
|
490
486
|
config['write_conversion'] = self.write_conversion.as_json(*a) if self.write_conversion
|
|
491
487
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
488
|
+
config['limits'] ||= {}
|
|
489
|
+
if self.limits.enabled
|
|
490
|
+
config['limits']['enabled'] = true
|
|
491
|
+
elsif self.limits.values || (self.state_colors && self.state_colors.length > 0)
|
|
492
|
+
# Only set to false if there are limits or state colors
|
|
493
|
+
# to avoid items without limits acting like they can be enabled
|
|
494
|
+
config['limits']['enabled'] = false
|
|
495
|
+
end
|
|
496
|
+
if self.limits.values
|
|
497
|
+
# Only set these if there are limits.values because persistence_setting has a default
|
|
498
|
+
# and we don't want keys on the 'limits' hash if there aren't any limits
|
|
499
|
+
config['limits']['persistence_setting'] = self.limits.persistence_setting if self.limits.persistence_setting
|
|
500
|
+
config['limits']['response'] = self.limits.response.to_s if self.limits.response
|
|
501
|
+
self.limits.values.each do |limits_set, limits_values|
|
|
502
|
+
limits = {}
|
|
503
|
+
limits['red_low'] = limits_values[0]
|
|
504
|
+
limits['yellow_low'] = limits_values[1]
|
|
505
|
+
limits['yellow_high'] = limits_values[2]
|
|
506
|
+
limits['red_high'] = limits_values[3]
|
|
507
|
+
limits['green_low'] = limits_values[4] if limits_values[4]
|
|
508
|
+
limits['green_high'] = limits_values[5] if limits_values[5]
|
|
509
|
+
config['limits'][limits_set] = limits
|
|
498
510
|
end
|
|
499
|
-
if self.limits.values
|
|
500
|
-
config['limits'] ||= {}
|
|
501
|
-
config['limits']['persistence_setting'] = self.limits.persistence_setting
|
|
502
|
-
config['limits']['response'] = self.limits.response.to_s if self.limits.response
|
|
503
|
-
self.limits.values.each do |limits_set, limits_values|
|
|
504
|
-
limits = {}
|
|
505
|
-
limits['red_low'] = limits_values[0]
|
|
506
|
-
limits['yellow_low'] = limits_values[1]
|
|
507
|
-
limits['yellow_high'] = limits_values[2]
|
|
508
|
-
limits['red_high'] = limits_values[3]
|
|
509
|
-
limits['green_low'] = limits_values[4] if limits_values[4]
|
|
510
|
-
limits['green_high'] = limits_values[5] if limits_values[5]
|
|
511
|
-
config['limits'][limits_set] = limits
|
|
512
|
-
end
|
|
513
|
-
end
|
|
514
|
-
config['limits_response'] = self.limits.response.as_json(*a) if self.limits.response
|
|
515
511
|
end
|
|
516
512
|
|
|
517
513
|
config['meta'] = @meta if @meta
|
|
518
|
-
if @variable_bit_size
|
|
519
|
-
config['variable_bit_size'] = @variable_bit_size
|
|
520
|
-
end
|
|
514
|
+
config['variable_bit_size'] = @variable_bit_size if @variable_bit_size
|
|
521
515
|
config
|
|
522
516
|
end
|
|
523
517
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
# GNU Affero General Public License for more details.
|
|
15
15
|
|
|
16
16
|
# Modified by OpenC3, Inc.
|
|
17
|
-
# All changes Copyright
|
|
17
|
+
# All changes Copyright 2024, OpenC3, Inc.
|
|
18
18
|
# All Rights Reserved
|
|
19
19
|
#
|
|
20
20
|
# This file may also be used under the terms of a commercial license
|
|
@@ -141,7 +141,7 @@ module OpenC3
|
|
|
141
141
|
end
|
|
142
142
|
|
|
143
143
|
def key=(key)
|
|
144
|
-
raise ArgumentError, "key must be a String but is a #{
|
|
144
|
+
raise ArgumentError, "key must be a String but is a #{key.class}" unless String === key
|
|
145
145
|
raise ArgumentError, "key must contain at least one character" if key.empty?
|
|
146
146
|
|
|
147
147
|
@key = key
|
data/lib/openc3/script/script.rb
CHANGED
|
@@ -133,16 +133,6 @@ module OpenC3
|
|
|
133
133
|
$disconnect = true
|
|
134
134
|
end
|
|
135
135
|
|
|
136
|
-
# DEPRECATED
|
|
137
|
-
def play_wav_file(wav_filename)
|
|
138
|
-
# NOOP
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
# DEPRECATED
|
|
142
|
-
def status_bar(message)
|
|
143
|
-
# NOOP
|
|
144
|
-
end
|
|
145
|
-
|
|
146
136
|
def ask_string(question, blank_or_default = false, password = false)
|
|
147
137
|
answer = ''
|
|
148
138
|
default = ''
|
|
@@ -240,7 +240,7 @@ module OpenC3
|
|
|
240
240
|
end
|
|
241
241
|
end
|
|
242
242
|
|
|
243
|
-
# Autonomic Events WebSocket
|
|
243
|
+
# Autonomic Events WebSocket (Enterprise Only)
|
|
244
244
|
class AutonomicEventsWebSocketApi < CmdTlmWebSocketApi
|
|
245
245
|
def initialize(history_count: 0, url: nil, write_timeout: 10.0, read_timeout: 10.0, connect_timeout: 5.0, authentication: nil, scope: $openc3_scope)
|
|
246
246
|
@identifier = {
|
|
@@ -251,7 +251,7 @@ module OpenC3
|
|
|
251
251
|
end
|
|
252
252
|
end
|
|
253
253
|
|
|
254
|
-
# Calendar Events WebSocket
|
|
254
|
+
# Calendar Events WebSocket (Enterprise Only)
|
|
255
255
|
class CalendarEventsWebSocketApi < CmdTlmWebSocketApi
|
|
256
256
|
def initialize(history_count: 0, url: nil, write_timeout: 10.0, read_timeout: 10.0, connect_timeout: 5.0, authentication: nil, scope: $openc3_scope)
|
|
257
257
|
@identifier = {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: ascii-8bit
|
|
2
2
|
|
|
3
|
-
# Copyright
|
|
3
|
+
# Copyright 2024 OpenC3, Inc.
|
|
4
4
|
# All Rights Reserved.
|
|
5
5
|
#
|
|
6
6
|
# This program is free software; you can modify and/or redistribute it
|
|
@@ -33,7 +33,7 @@ module OpenC3
|
|
|
33
33
|
attr_accessor :key
|
|
34
34
|
attr_accessor :ca_file
|
|
35
35
|
|
|
36
|
-
def initialize(hostname, port = 1883, ssl = false, write_topic = nil, read_topic = nil)
|
|
36
|
+
def initialize(hostname, port = 1883, ssl = false, write_topic = nil, read_topic = nil, ack_timeout = 5)
|
|
37
37
|
super()
|
|
38
38
|
|
|
39
39
|
@hostname = hostname
|
|
@@ -41,7 +41,7 @@ module OpenC3
|
|
|
41
41
|
@ssl = ConfigParser.handle_true_false(ssl)
|
|
42
42
|
@write_topic = ConfigParser.handle_nil(write_topic)
|
|
43
43
|
@read_topic = ConfigParser.handle_nil(read_topic)
|
|
44
|
-
@
|
|
44
|
+
@ack_timeout = Float(ack_timeout)
|
|
45
45
|
|
|
46
46
|
@username = nil
|
|
47
47
|
@password = nil
|
|
@@ -49,11 +49,47 @@ module OpenC3
|
|
|
49
49
|
@key = nil
|
|
50
50
|
@ca_file = nil
|
|
51
51
|
|
|
52
|
-
# Mutex on write is needed to protect from commands coming in from more
|
|
53
|
-
# than one tool
|
|
52
|
+
# Mutex on write is needed to protect from commands coming in from more than one tool
|
|
54
53
|
@write_mutex = Mutex.new
|
|
55
54
|
end
|
|
56
55
|
|
|
56
|
+
# Connect the stream
|
|
57
|
+
def connect
|
|
58
|
+
@client = MQTT::Client.new
|
|
59
|
+
@client.ack_timeout = @ack_timeout
|
|
60
|
+
@client.host = @hostname
|
|
61
|
+
@client.port = @port
|
|
62
|
+
@client.ssl = @ssl
|
|
63
|
+
@client.username = @username if @username
|
|
64
|
+
@client.password = @password if @password
|
|
65
|
+
if @cert and @key
|
|
66
|
+
@client.ssl = true
|
|
67
|
+
@client.cert_file = @cert.path
|
|
68
|
+
@client.key_file = @key.path
|
|
69
|
+
end
|
|
70
|
+
if @ca_file
|
|
71
|
+
@client.ssl = true
|
|
72
|
+
@client.ca_file = @ca_file.path
|
|
73
|
+
end
|
|
74
|
+
@client.connect
|
|
75
|
+
@client.subscribe(@read_topic) if @read_topic
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def connected?
|
|
79
|
+
if @client
|
|
80
|
+
return @client.connected?
|
|
81
|
+
else
|
|
82
|
+
return false
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def disconnect
|
|
87
|
+
if @client
|
|
88
|
+
@client.disconnect
|
|
89
|
+
@client = nil
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
57
93
|
# @return [String] Returns a binary string of data from the read_topic
|
|
58
94
|
def read
|
|
59
95
|
raise "Attempt to read from write only stream" unless @read_topic
|
|
@@ -77,33 +113,5 @@ module OpenC3
|
|
|
77
113
|
@client.publish(@write_topic, data)
|
|
78
114
|
end
|
|
79
115
|
end
|
|
80
|
-
|
|
81
|
-
# Connect the stream
|
|
82
|
-
def connect
|
|
83
|
-
@client = MQTT::Client.new
|
|
84
|
-
@client.host = @hostname
|
|
85
|
-
@client.port = @port
|
|
86
|
-
@client.ssl = @ssl
|
|
87
|
-
@client.username = @username if @username
|
|
88
|
-
@client.password = @password if @password
|
|
89
|
-
@client.cert = @cert if @cert
|
|
90
|
-
@client.key = @key if @key
|
|
91
|
-
@client.ca_file = @ca_file.path if @ca_file
|
|
92
|
-
@client.connect
|
|
93
|
-
@client.subscribe(@read_topic) if @read_topic
|
|
94
|
-
@connected = true
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def connected?
|
|
98
|
-
@connected
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def disconnect
|
|
102
|
-
if @connected
|
|
103
|
-
@client.disconnect
|
|
104
|
-
@client = nil
|
|
105
|
-
@connected = false
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
116
|
end
|
|
109
117
|
end
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
# GNU Affero General Public License for more details.
|
|
15
15
|
|
|
16
16
|
# Modified by OpenC3, Inc.
|
|
17
|
-
# All changes Copyright
|
|
17
|
+
# All changes Copyright 2024, OpenC3, Inc.
|
|
18
18
|
# All Rights Reserved
|
|
19
19
|
#
|
|
20
20
|
# This file may also be used under the terms of a commercial license
|
|
@@ -115,31 +115,6 @@ module OpenC3
|
|
|
115
115
|
@write_mutex = Mutex.new
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
# @return [String] Returns a binary string of data from the serial port
|
|
119
|
-
def read
|
|
120
|
-
raise "Attempt to read from write only stream" unless @read_serial_port
|
|
121
|
-
|
|
122
|
-
# No read mutex is needed because reads happen serially
|
|
123
|
-
@read_serial_port.read
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# @return [String] Returns a binary string of data from the serial port without blocking
|
|
127
|
-
def read_nonblock
|
|
128
|
-
raise "Attempt to read from write only stream" unless @read_serial_port
|
|
129
|
-
|
|
130
|
-
# No read mutex is needed because reads happen serially
|
|
131
|
-
@read_serial_port.read_nonblock
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
# @param data [String] A binary string of data to write to the serial port
|
|
135
|
-
def write(data)
|
|
136
|
-
raise "Attempt to write to read only stream" unless @write_serial_port
|
|
137
|
-
|
|
138
|
-
@write_mutex.synchronize do
|
|
139
|
-
@write_serial_port.write(data)
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
118
|
# Connect the stream
|
|
144
119
|
def connect
|
|
145
120
|
# N/A - Serial streams 'connect' on creation
|
|
@@ -168,5 +143,30 @@ module OpenC3
|
|
|
168
143
|
@connected = false
|
|
169
144
|
end
|
|
170
145
|
end
|
|
171
|
-
|
|
146
|
+
|
|
147
|
+
# @return [String] Returns a binary string of data from the serial port
|
|
148
|
+
def read
|
|
149
|
+
raise "Attempt to read from write only stream" unless @read_serial_port
|
|
150
|
+
|
|
151
|
+
# No read mutex is needed because reads happen serially
|
|
152
|
+
@read_serial_port.read
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# @return [String] Returns a binary string of data from the serial port without blocking
|
|
156
|
+
def read_nonblock
|
|
157
|
+
raise "Attempt to read from write only stream" unless @read_serial_port
|
|
158
|
+
|
|
159
|
+
# No read mutex is needed because reads happen serially
|
|
160
|
+
@read_serial_port.read_nonblock
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# @param data [String] A binary string of data to write to the serial port
|
|
164
|
+
def write(data)
|
|
165
|
+
raise "Attempt to write to read only stream" unless @write_serial_port
|
|
166
|
+
|
|
167
|
+
@write_mutex.synchronize do
|
|
168
|
+
@write_serial_port.write(data)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
172
|
end
|
|
@@ -27,6 +27,22 @@ module OpenC3
|
|
|
27
27
|
# allows Streams to simply focus on getting and sending raw data while the
|
|
28
28
|
# higher level processing occurs in {Protocol}.
|
|
29
29
|
class Stream
|
|
30
|
+
# Connects the stream
|
|
31
|
+
def connect
|
|
32
|
+
raise "connect not defined by Stream"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Boolean] true if connected or false otherwise
|
|
36
|
+
def connected?
|
|
37
|
+
raise "connected? not defined by Stream"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Disconnects the stream
|
|
41
|
+
# Note that streams are not designed to be reconnected and must be recreated
|
|
42
|
+
def disconnect
|
|
43
|
+
raise "disconnect not defined by Stream"
|
|
44
|
+
end
|
|
45
|
+
|
|
30
46
|
# Expected to return any amount of data on success, or a blank string on
|
|
31
47
|
# closed/EOF, and may raise Timeout::Error, or other errors
|
|
32
48
|
def read
|
|
@@ -46,21 +62,5 @@ module OpenC3
|
|
|
46
62
|
def write(data)
|
|
47
63
|
raise "write not defined by Stream"
|
|
48
64
|
end
|
|
49
|
-
|
|
50
|
-
# Connects the stream
|
|
51
|
-
def connect
|
|
52
|
-
raise "connect not defined by Stream"
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# @return [Boolean] true if connected or false otherwise
|
|
56
|
-
def connected?
|
|
57
|
-
raise "connected? not defined by Stream"
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Disconnects the stream
|
|
61
|
-
# Note that streams are not designed to be reconnected and must be recreated
|
|
62
|
-
def disconnect
|
|
63
|
-
raise "disconnect not defined by Stream"
|
|
64
|
-
end
|
|
65
|
-
end # class Stream
|
|
65
|
+
end
|
|
66
66
|
end
|
|
@@ -58,6 +58,25 @@ module OpenC3
|
|
|
58
58
|
@connected = false
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
+
# Connect the stream
|
|
62
|
+
def connect
|
|
63
|
+
# If called directly this class is acting as a server and does not need to connect the sockets
|
|
64
|
+
@connected = true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @return [Boolean] Whether the sockets are connected
|
|
68
|
+
def connected?
|
|
69
|
+
@connected
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Disconnect by closing the sockets
|
|
73
|
+
def disconnect
|
|
74
|
+
OpenC3.close_socket(@write_socket)
|
|
75
|
+
OpenC3.close_socket(@read_socket)
|
|
76
|
+
@pipe_writer.write('.')
|
|
77
|
+
@connected = false
|
|
78
|
+
end
|
|
79
|
+
|
|
61
80
|
# @return [String] Returns a binary string of data from the socket
|
|
62
81
|
def read
|
|
63
82
|
raise "Attempt to read from write only stream" unless @read_socket
|
|
@@ -142,25 +161,6 @@ module OpenC3
|
|
|
142
161
|
end
|
|
143
162
|
end
|
|
144
163
|
|
|
145
|
-
# Connect the stream
|
|
146
|
-
def connect
|
|
147
|
-
# If called directly this class is acting as a server and does not need to connect the sockets
|
|
148
|
-
@connected = true
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# @return [Boolean] Whether the sockets are connected
|
|
152
|
-
def connected?
|
|
153
|
-
@connected
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# Disconnect by closing the sockets
|
|
157
|
-
def disconnect
|
|
158
|
-
OpenC3.close_socket(@write_socket)
|
|
159
|
-
OpenC3.close_socket(@read_socket)
|
|
160
|
-
@pipe_writer.write('.')
|
|
161
|
-
@connected = false
|
|
162
|
-
end
|
|
163
|
-
|
|
164
164
|
def set_option(option_name, option_values)
|
|
165
165
|
option_name_upcase = option_name.upcase
|
|
166
166
|
|
data/lib/openc3/system/system.rb
CHANGED
|
@@ -89,7 +89,7 @@ module OpenC3
|
|
|
89
89
|
FileUtils.mkdir_p("#{base_dir}/targets")
|
|
90
90
|
bucket = Bucket.getClient()
|
|
91
91
|
target_names.each do |target_name|
|
|
92
|
-
# Retrieve bucket/targets/target_name
|
|
92
|
+
# Retrieve bucket/targets/target_name/<TARGET>_current.zip
|
|
93
93
|
zip_path = "#{base_dir}/targets/#{target_name}_current.zip"
|
|
94
94
|
FileUtils.mkdir_p(File.dirname(zip_path))
|
|
95
95
|
bucket_key = "#{scope}/target_archives/#{target_name}/#{target_name}_current.zip"
|
data/lib/openc3/system.rb
CHANGED
|
@@ -14,14 +14,13 @@
|
|
|
14
14
|
# GNU Affero General Public License for more details.
|
|
15
15
|
|
|
16
16
|
# Modified by OpenC3, Inc.
|
|
17
|
-
# All changes Copyright
|
|
17
|
+
# All changes Copyright 2024, OpenC3, Inc.
|
|
18
18
|
# All Rights Reserved
|
|
19
19
|
#
|
|
20
|
-
# This file may also be used under the terms of a commercial license
|
|
20
|
+
# This file may also be used under the terms of a commercial license
|
|
21
21
|
# if purchased from OpenC3, Inc.
|
|
22
22
|
|
|
23
23
|
module OpenC3
|
|
24
24
|
autoload(:Target, "openc3/system/target.rb")
|
|
25
25
|
autoload(:System, "openc3/system/system.rb")
|
|
26
|
-
autoload(:SystemConfig, "openc3/system/system_config.rb")
|
|
27
26
|
end
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
# GNU Affero General Public License for more details.
|
|
15
15
|
|
|
16
16
|
# Modified by OpenC3, Inc.
|
|
17
|
-
# All changes Copyright
|
|
17
|
+
# All changes Copyright 2024, OpenC3, Inc.
|
|
18
18
|
# All Rights Reserved
|
|
19
19
|
#
|
|
20
|
-
# This file may also be used under the terms of a commercial license
|
|
20
|
+
# This file may also be used under the terms of a commercial license
|
|
21
21
|
# if purchased from OpenC3, Inc.
|
|
22
22
|
|
|
23
23
|
require 'openc3/packets/packet'
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
# GNU Affero General Public License for more details.
|
|
15
15
|
|
|
16
16
|
# Modified by OpenC3, Inc.
|
|
17
|
-
# All changes Copyright
|
|
17
|
+
# All changes Copyright 2024, OpenC3, Inc.
|
|
18
18
|
# All Rights Reserved
|
|
19
19
|
#
|
|
20
20
|
# This file may also be used under the terms of a commercial license
|
data/lib/openc3/top_level.rb
CHANGED
|
@@ -465,11 +465,6 @@ module OpenC3
|
|
|
465
465
|
raise $!, msg, $!.backtrace
|
|
466
466
|
end
|
|
467
467
|
|
|
468
|
-
# @param filename [String] Name of the file to open in the web browser
|
|
469
|
-
def self.open_in_web_browser(_filename)
|
|
470
|
-
puts "open_in_web_browser is DEPRECATED"
|
|
471
|
-
end
|
|
472
|
-
|
|
473
468
|
# Temporarily set the working directory during a block
|
|
474
469
|
# Working directory is global, so this can make other threads wait
|
|
475
470
|
# Ruby Dir.chdir with block always throws an error if multiple threads
|
|
@@ -47,13 +47,6 @@ module OpenC3
|
|
|
47
47
|
def self.get_cmd_item(target_name, packet_name, param_name, type: :WITH_UNITS, scope: $openc3_scope)
|
|
48
48
|
msg_id, msg_hash = Topic.get_newest_message("#{scope}__DECOMCMD__{#{target_name}}__#{packet_name}")
|
|
49
49
|
if msg_id
|
|
50
|
-
# TODO: We now have these reserved items directly on command packets
|
|
51
|
-
# Do we still calculate from msg_hash['time'] or use the times directly?
|
|
52
|
-
#
|
|
53
|
-
# if param_name == 'RECEIVED_TIMESECONDS' || param_name == 'PACKET_TIMESECONDS'
|
|
54
|
-
# Time.from_nsec_from_epoch(msg_hash['time'].to_i).to_f
|
|
55
|
-
# elsif param_name == 'RECEIVED_TIMEFORMATTED' || param_name == 'PACKET_TIMEFORMATTED'
|
|
56
|
-
# Time.from_nsec_from_epoch(msg_hash['time'].to_i).formatted
|
|
57
50
|
if param_name == 'RECEIVED_COUNT'
|
|
58
51
|
msg_hash['received_count'].to_i
|
|
59
52
|
else
|
|
@@ -123,7 +123,7 @@ module OpenC3
|
|
|
123
123
|
def self.get_cache_control(filename)
|
|
124
124
|
# Allow caching for files that have a filename versioning strategy
|
|
125
125
|
has_version_number = /(-|_|\.)\d+(-|_|\.)\d+(-|_|\.)\d+\./.match(filename)
|
|
126
|
-
has_content_hash =
|
|
126
|
+
has_content_hash = /[\.-][a-f0-9]{20}\./.match(filename)
|
|
127
127
|
return nil if has_version_number or has_content_hash
|
|
128
128
|
return 'no-store'
|
|
129
129
|
end
|
data/lib/openc3/version.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# encoding: ascii-8bit
|
|
2
2
|
|
|
3
|
-
OPENC3_VERSION = '
|
|
3
|
+
OPENC3_VERSION = '6.0.0'
|
|
4
4
|
module OpenC3
|
|
5
5
|
module Version
|
|
6
|
-
MAJOR = '
|
|
7
|
-
MINOR = '
|
|
6
|
+
MAJOR = '6'
|
|
7
|
+
MINOR = '0'
|
|
8
8
|
PATCH = '0'
|
|
9
9
|
OTHER = ''
|
|
10
|
-
BUILD = '
|
|
10
|
+
BUILD = '8aad1e8cd4d45e7e207dbe6f61f892e38857b4ed'
|
|
11
11
|
end
|
|
12
|
-
VERSION = '
|
|
13
|
-
GEM_VERSION = '
|
|
12
|
+
VERSION = '6.0.0'
|
|
13
|
+
GEM_VERSION = '6.0.0'
|
|
14
14
|
end
|
data/templates/plugin/README.md
CHANGED
|
@@ -42,7 +42,7 @@ docker run -it -v %cd%:/openc3/local -w /openc3/local docker.io/openc3inc/openc3
|
|
|
42
42
|
## Installing into OpenC3 COSMOS
|
|
43
43
|
|
|
44
44
|
1. Go to the OpenC3 Admin Tool, Plugins Tab
|
|
45
|
-
1. Click the
|
|
45
|
+
1. Click the install button and choose your plugin.gem file
|
|
46
46
|
1. Fill out plugin parameters
|
|
47
47
|
1. Click Install
|
|
48
48
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# This class can be used in your scripts like so:
|
|
2
|
-
#
|
|
2
|
+
# load_utility '<%= target_class.upcase %>/lib/<%= target_lib_filename %>'
|
|
3
3
|
# <%= target_object %> = <%= target_class %>.new
|
|
4
4
|
# <%= target_object %>.utility
|
|
5
5
|
# For more information see the OpenC3 scripting guide
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "<%= tool_name %>",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"ng": "ng",
|
|
6
6
|
"start": "ng serve",
|
|
@@ -18,20 +18,20 @@
|
|
|
18
18
|
"@angular/compiler": "^18.2.6",
|
|
19
19
|
"@angular/core": "^18.2.6",
|
|
20
20
|
"@angular/forms": "^18.2.6",
|
|
21
|
-
"@angular/material": "18.2.10",
|
|
21
|
+
"@angular/material": "^18.2.10",
|
|
22
22
|
"@angular/platform-browser": "^18.2.6",
|
|
23
23
|
"@angular/platform-browser-dynamic": "^18.2.6",
|
|
24
24
|
"@angular/router": "^18.2.6",
|
|
25
|
-
"@astrouxds/astro-web-components": "7.24.0",
|
|
26
|
-
"@openc3/
|
|
25
|
+
"@astrouxds/astro-web-components": "^7.24.0",
|
|
26
|
+
"@openc3/js-common": "6.0.0",
|
|
27
27
|
"rxjs": "~7.8.0",
|
|
28
|
-
"single-spa": "5.9.5",
|
|
28
|
+
"single-spa": "^5.9.5",
|
|
29
29
|
"single-spa-angular": "^9.2.0",
|
|
30
30
|
"tslib": "^2.7.0",
|
|
31
|
-
"zone.js": "
|
|
31
|
+
"zone.js": "^0.13.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@angular-builders/custom-webpack": "18.0.0",
|
|
34
|
+
"@angular-builders/custom-webpack": "^18.0.0",
|
|
35
35
|
"@angular-devkit/build-angular": "^18.2.6",
|
|
36
36
|
"@angular/cli": "~18.2.6",
|
|
37
37
|
"@angular/compiler-cli": "^18.2.6",
|
|
@@ -43,6 +43,6 @@
|
|
|
43
43
|
"karma-jasmine": "~5.1.0",
|
|
44
44
|
"karma-jasmine-html-reporter": "~2.1.0",
|
|
45
45
|
"style-loader": "^4.0.0",
|
|
46
|
-
"typescript": "~5.
|
|
46
|
+
"typescript": "~5.5.4"
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
<!-- This menu position hack should only be necessary in the portal -->
|
|
2
1
|
<style>
|
|
3
|
-
::ng-deep .mat-mdc-menu-panel.myMenu {
|
|
4
|
-
background-color:white;
|
|
5
|
-
color:black;
|
|
6
|
-
position:absolute !important;
|
|
7
|
-
top:0px;
|
|
8
|
-
left:60px;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
2
|
.mat-mdc-card {
|
|
12
3
|
background: white;
|
|
13
4
|
}
|
|
@@ -20,11 +11,11 @@
|
|
|
20
11
|
</mat-card>
|
|
21
12
|
|
|
22
13
|
<ng-template cdk-portal>
|
|
23
|
-
<
|
|
24
|
-
<mat-
|
|
25
|
-
|
|
14
|
+
<div style="display: inline-block; width: 80%; text-align: center; font-size: 32px"><%= tool_name_display %></div>
|
|
15
|
+
<button mat-raised-button [matMenuTriggerFor]="menu" style="background-color: rgb(33, 150, 243)">File</button>
|
|
16
|
+
<mat-menu #menu="matMenu" class="myMenu" style="background-color: white">
|
|
17
|
+
<button mat-menu-item (click)="clickHandler()" style="background-color: rgb(33, 150, 243)">Send Command</button>
|
|
26
18
|
</mat-menu>
|
|
27
|
-
<div style="display: inline-block; width: 80%; text-align: center"><%= tool_name_display %></div>
|
|
28
19
|
</ng-template>
|
|
29
20
|
</div>
|
|
30
21
|
|