openc3 5.1.1 → 5.2.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 +48 -9
- data/data/config/interface_modifiers.yaml +14 -0
- data/data/config/parameter_modifiers.yaml +5 -3
- data/data/config/screen.yaml +12 -8
- data/data/config/target.yaml +33 -0
- data/ext/openc3/ext/config_parser/config_parser.c +66 -63
- data/ext/openc3/ext/packet/packet.c +1 -4
- data/lib/openc3/api/README.md +5 -0
- data/lib/openc3/api/api.rb +3 -1
- data/lib/openc3/api/cmd_api.rb +43 -112
- data/lib/openc3/api/interface_api.rb +3 -3
- data/lib/openc3/api/offline_access_api.rb +78 -0
- data/lib/openc3/api/settings_api.rb +3 -1
- data/lib/openc3/api/stash_api.rb +63 -0
- data/lib/openc3/api/target_api.rb +4 -5
- data/lib/openc3/config/config_parser.rb +47 -47
- data/lib/openc3/interfaces/interface.rb +11 -1
- data/lib/openc3/interfaces/protocols/burst_protocol.rb +30 -16
- data/lib/openc3/interfaces/protocols/fixed_protocol.rb +8 -2
- data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +2 -2
- data/lib/openc3/interfaces/protocols/override_protocol.rb +2 -2
- data/lib/openc3/interfaces/tcpip_server_interface.rb +3 -1
- data/lib/openc3/io/json_api_object.rb +30 -9
- data/lib/openc3/io/json_drb.rb +6 -1
- data/lib/openc3/io/json_drb_object.rb +18 -9
- data/lib/openc3/io/json_rpc.rb +5 -3
- data/lib/openc3/logs/buffered_packet_log_writer.rb +1 -1
- data/lib/openc3/logs/log_writer.rb +8 -2
- data/lib/openc3/microservices/cleanup_microservice.rb +3 -3
- data/lib/openc3/microservices/decom_microservice.rb +8 -8
- data/lib/openc3/microservices/interface_microservice.rb +86 -71
- data/lib/openc3/microservices/log_microservice.rb +5 -3
- data/lib/openc3/microservices/microservice.rb +18 -14
- data/lib/openc3/microservices/multi_microservice.rb +62 -0
- data/lib/openc3/microservices/periodic_microservice.rb +58 -0
- data/lib/openc3/microservices/reaction_microservice.rb +61 -47
- data/lib/openc3/microservices/reducer_microservice.rb +64 -40
- data/lib/openc3/microservices/router_microservice.rb +4 -4
- data/lib/openc3/microservices/text_log_microservice.rb +2 -2
- data/lib/openc3/microservices/timeline_microservice.rb +44 -30
- data/lib/openc3/microservices/trigger_group_microservice.rb +39 -36
- data/lib/openc3/migrations/20221202214600_add_target_names.rb +30 -0
- data/lib/openc3/migrations/20221210174900_convert_to_multi.rb +65 -0
- data/lib/openc3/models/cvt_model.rb +1 -1
- data/lib/openc3/models/gem_model.rb +24 -20
- data/lib/openc3/models/interface_model.rb +69 -35
- data/lib/openc3/models/metadata_model.rb +1 -1
- data/lib/openc3/models/microservice_model.rb +7 -24
- data/lib/openc3/models/migration_model.rb +52 -0
- data/lib/openc3/models/model.rb +2 -7
- data/lib/openc3/models/note_model.rb +1 -1
- data/lib/openc3/models/offline_access_model.rb +55 -0
- data/lib/openc3/models/plugin_model.rb +12 -3
- data/lib/openc3/models/reaction_model.rb +6 -2
- data/lib/openc3/models/scope_model.rb +89 -13
- data/lib/openc3/models/settings_model.rb +1 -1
- data/lib/openc3/models/stash_model.rb +53 -0
- data/lib/openc3/models/target_model.rb +301 -130
- data/lib/openc3/models/tool_model.rb +1 -12
- data/lib/openc3/models/widget_model.rb +1 -6
- data/lib/openc3/operators/microservice_operator.rb +45 -6
- data/lib/openc3/operators/operator.rb +27 -5
- data/lib/openc3/packets/commands.rb +1 -25
- data/lib/openc3/packets/limits.rb +0 -75
- data/lib/openc3/packets/packet.rb +0 -28
- data/lib/openc3/packets/packet_item.rb +23 -0
- data/lib/openc3/packets/packet_item_limits.rb +2 -2
- data/lib/openc3/packets/parsers/state_parser.rb +10 -6
- data/lib/openc3/packets/telemetry.rb +1 -45
- data/lib/openc3/script/commands.rb +41 -71
- data/lib/openc3/script/extract.rb +15 -1
- data/lib/openc3/script/{calendar.rb → metadata.rb} +42 -17
- data/lib/openc3/script/script.rb +13 -5
- data/lib/openc3/script/storage.rb +3 -1
- data/lib/openc3/system/system.rb +19 -17
- data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +4 -4
- data/lib/openc3/top_level.rb +3 -3
- data/lib/openc3/topics/command_decom_topic.rb +2 -2
- data/lib/openc3/topics/command_topic.rb +7 -6
- data/lib/openc3/topics/interface_topic.rb +2 -2
- data/lib/openc3/topics/router_topic.rb +1 -1
- data/lib/openc3/topics/telemetry_topic.rb +2 -1
- data/lib/openc3/utilities/authentication.rb +35 -14
- data/lib/openc3/utilities/aws_bucket.rb +4 -3
- data/lib/openc3/utilities/bucket.rb +4 -2
- data/lib/openc3/utilities/bucket_file_cache.rb +3 -8
- data/lib/openc3/utilities/bucket_utilities.rb +77 -15
- data/lib/openc3/utilities/local_mode.rb +12 -9
- data/lib/openc3/utilities/logger.rb +17 -9
- data/lib/openc3/utilities/message_log.rb +6 -5
- data/lib/openc3/utilities/migration.rb +22 -0
- data/lib/openc3/utilities/store_autoload.rb +7 -5
- data/lib/openc3/utilities/target_file.rb +9 -7
- data/lib/openc3/version.rb +6 -6
- data/lib/openc3.rb +2 -1
- metadata +14 -3
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# All changes Copyright 2022, 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'
|
|
@@ -64,27 +64,65 @@ module OpenC3
|
|
|
64
64
|
# Detect new and changed microservices
|
|
65
65
|
@new_microservices = {}
|
|
66
66
|
@changed_microservices = {}
|
|
67
|
+
@removed_microservices = {}
|
|
67
68
|
@microservices.each do |microservice_name, microservice_config|
|
|
69
|
+
parent = microservice_config['parent']
|
|
68
70
|
if @previous_microservices[microservice_name]
|
|
71
|
+
previous_parent = @previous_microservices[microservice_name]['parent']
|
|
69
72
|
if @previous_microservices[microservice_name] != microservice_config
|
|
73
|
+
# CHANGED
|
|
70
74
|
scope = microservice_name.split("__")[0]
|
|
71
75
|
Logger.info("Changed microservice detected: #{microservice_name}\nWas: #{@previous_microservices[microservice_name]}\nIs: #{microservice_config}", scope: scope)
|
|
72
|
-
|
|
76
|
+
if parent or previous_parent
|
|
77
|
+
if parent == previous_parent
|
|
78
|
+
# Same Parent - Respawn parent
|
|
79
|
+
@changed_microservices[parent] = @microservices[parent] if @microservices[parent] and @previous_microservices[parent]
|
|
80
|
+
elsif parent and previous_parent
|
|
81
|
+
# Parent changed - Respawn both parents
|
|
82
|
+
@changed_microservices[parent] = @microservices[parent] if @microservices[parent] and @previous_microservices[parent]
|
|
83
|
+
@changed_microservices[previous_parent] = @microservices[previous_parent] if @microservices[previous_parent] and @previous_microservices[previous_parent]
|
|
84
|
+
elsif parent
|
|
85
|
+
# Moved under a parent - Respawn parent and kill standalone
|
|
86
|
+
@changed_microservices[parent] = @microservices[parent] if @microservices[parent] and @previous_microservices[parent]
|
|
87
|
+
@removed_microservices[microservice_name] = microservice_config
|
|
88
|
+
else # previous_parent
|
|
89
|
+
# Moved to standalone - Respawn previous parent and make new
|
|
90
|
+
@changed_microservices[previous_parent] = @microservices[previous_parent] if @microservices[previous_parent] and @previous_microservices[previous_parent]
|
|
91
|
+
@new_microservices[microservice_name] = microservice_config
|
|
92
|
+
end
|
|
93
|
+
else
|
|
94
|
+
# Respawn regular microservice
|
|
95
|
+
@changed_microservices[microservice_name] = microservice_config
|
|
96
|
+
end
|
|
73
97
|
end
|
|
74
98
|
else
|
|
99
|
+
# NEW
|
|
75
100
|
scope = microservice_name.split("__")[0]
|
|
76
101
|
Logger.info("New microservice detected: #{microservice_name}", scope: scope)
|
|
77
|
-
|
|
102
|
+
if parent
|
|
103
|
+
# Respawn parent
|
|
104
|
+
@changed_microservices[parent] = @microservices[parent] if @microservices[parent] and @previous_microservices[parent]
|
|
105
|
+
else
|
|
106
|
+
# New process be spawned
|
|
107
|
+
@new_microservices[microservice_name] = microservice_config
|
|
108
|
+
end
|
|
78
109
|
end
|
|
79
110
|
end
|
|
80
111
|
|
|
81
112
|
# Detect removed microservices
|
|
82
|
-
@removed_microservices = {}
|
|
83
113
|
@previous_microservices.each do |microservice_name, microservice_config|
|
|
114
|
+
previous_parent = microservice_config['parent']
|
|
84
115
|
unless @microservices[microservice_name]
|
|
116
|
+
# REMOVED
|
|
85
117
|
scope = microservice_name.split("__")[0]
|
|
86
118
|
Logger.info("Removed microservice detected: #{microservice_name}", scope: scope)
|
|
87
|
-
|
|
119
|
+
if previous_parent
|
|
120
|
+
# Respawn previous parent
|
|
121
|
+
@changed_microservices[previous_parent] = @microservices[previous_parent] if @microservices[previous_parent] and @previous_microservices[previous_parent]
|
|
122
|
+
else
|
|
123
|
+
# Regular process to be removed
|
|
124
|
+
@removed_microservices[microservice_name] = microservice_config
|
|
125
|
+
end
|
|
88
126
|
end
|
|
89
127
|
end
|
|
90
128
|
|
|
@@ -109,7 +147,8 @@ module OpenC3
|
|
|
109
147
|
process.new_temp_dir = nil
|
|
110
148
|
process.env = env
|
|
111
149
|
@changed_processes[microservice_name] = process
|
|
112
|
-
else
|
|
150
|
+
else
|
|
151
|
+
# This shouldn't be possible, but still needs to be handled
|
|
113
152
|
Logger.error("Changed microservice #{microservice_name} does not exist. Creating new...", scope: scope)
|
|
114
153
|
process = OperatorProcess.new(cmd_array, work_dir: work_dir, env: env, scope: scope, container: container, config: microservice_config)
|
|
115
154
|
@new_processes[microservice_name] = process
|
|
@@ -225,12 +225,11 @@ module OpenC3
|
|
|
225
225
|
@@instance = nil
|
|
226
226
|
|
|
227
227
|
CYCLE_TIME = 5.0 # cycle time to check for new microservices
|
|
228
|
+
PROCESS_SHUTDOWN_SECONDS = 5.0
|
|
228
229
|
|
|
229
230
|
def initialize
|
|
230
231
|
Logger.level = Logger::INFO
|
|
231
|
-
# TODO: This is pretty generic. Can we pass in more information to help identify the operator?
|
|
232
232
|
Logger.microservice_name = 'MicroserviceOperator'
|
|
233
|
-
Logger.tag = "operator.log"
|
|
234
233
|
|
|
235
234
|
OperatorProcess.setup()
|
|
236
235
|
@cycle_time = (ENV['OPERATOR_CYCLE_TIME'] and ENV['OPERATOR_CYCLE_TIME'].to_f) || CYCLE_TIME # time in seconds
|
|
@@ -305,9 +304,31 @@ module OpenC3
|
|
|
305
304
|
end
|
|
306
305
|
|
|
307
306
|
def shutdown_processes(processes)
|
|
307
|
+
Logger.info("Commanding soft stops...")
|
|
308
308
|
processes.each { |name, p| p.soft_stop }
|
|
309
|
-
|
|
310
|
-
|
|
309
|
+
start_time = Time.now
|
|
310
|
+
# Allow sufficient time for processes to shutdown cleanly
|
|
311
|
+
while (Time.now - start_time) < PROCESS_SHUTDOWN_SECONDS
|
|
312
|
+
processes_to_remove = []
|
|
313
|
+
processes.each do |name, p|
|
|
314
|
+
unless p.alive?
|
|
315
|
+
processes_to_remove << name
|
|
316
|
+
Logger.info("Soft stop process successful: #{p.cmd_line}", scope: p.scope)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
processes_to_remove.each do |name|
|
|
320
|
+
processes.delete(name)
|
|
321
|
+
end
|
|
322
|
+
if processes.length <= 0
|
|
323
|
+
Logger.info("Soft stop all successful")
|
|
324
|
+
break
|
|
325
|
+
end
|
|
326
|
+
sleep(0.1)
|
|
327
|
+
end
|
|
328
|
+
if processes.length > 0
|
|
329
|
+
Logger.info("Commanding hard stops...")
|
|
330
|
+
processes.each { |name, p| p.hard_stop }
|
|
331
|
+
end
|
|
311
332
|
end
|
|
312
333
|
|
|
313
334
|
def run
|
|
@@ -317,6 +338,7 @@ module OpenC3
|
|
|
317
338
|
@mutex.synchronize do
|
|
318
339
|
Logger.info("Shutting down processes...")
|
|
319
340
|
shutdown_processes(@processes)
|
|
341
|
+
Logger.info("Shutting down processes complete")
|
|
320
342
|
@shutdown_complete = true
|
|
321
343
|
end
|
|
322
344
|
end
|
|
@@ -337,7 +359,7 @@ module OpenC3
|
|
|
337
359
|
|
|
338
360
|
loop do
|
|
339
361
|
break if @shutdown_complete
|
|
340
|
-
sleep(1)
|
|
362
|
+
sleep(0.1)
|
|
341
363
|
end
|
|
342
364
|
ensure
|
|
343
365
|
Logger.info("#{self.class} shutdown complete")
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# All changes Copyright 2022, 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_config'
|
|
@@ -297,30 +297,6 @@ module OpenC3
|
|
|
297
297
|
end
|
|
298
298
|
end
|
|
299
299
|
|
|
300
|
-
# Returns an array with a "TARGET_NAME PACKET_NAME" string for every command in the system (PACKET_NAME == command name)
|
|
301
|
-
def all_packet_strings(include_hidden = false, splash = nil)
|
|
302
|
-
strings = []
|
|
303
|
-
tnames = target_names()
|
|
304
|
-
total = tnames.length.to_f
|
|
305
|
-
tnames.each_with_index do |target_name, index|
|
|
306
|
-
if splash
|
|
307
|
-
splash.message = "Processing #{target_name} command"
|
|
308
|
-
splash.progress = index / total
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
# TODO: This wasn't being used ... should it be
|
|
312
|
-
# ignored_items = System.targets[target_name].ignored_items
|
|
313
|
-
|
|
314
|
-
packets(target_name).each do |command_name, packet|
|
|
315
|
-
# We don't audit against hidden or disabled packets/commands
|
|
316
|
-
next if !include_hidden and (packet.hidden || packet.disabled)
|
|
317
|
-
|
|
318
|
-
strings << "#{target_name} #{command_name}"
|
|
319
|
-
end
|
|
320
|
-
end
|
|
321
|
-
strings
|
|
322
|
-
end
|
|
323
|
-
|
|
324
300
|
def all
|
|
325
301
|
@config.commands
|
|
326
302
|
end
|
|
@@ -62,86 +62,11 @@ module OpenC3
|
|
|
62
62
|
return items
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
# @param ignored_items [Array<Array<String, String, String>>] Items to ignore from the consideration
|
|
66
|
-
# @return [Symbol] The overall limits state for the system
|
|
67
|
-
def overall_limits_state(ignored_items = nil)
|
|
68
|
-
overall = :GREEN
|
|
69
|
-
limits_packet_stale = false
|
|
70
|
-
items_out_of_limits = []
|
|
71
|
-
# Note: If anything with limits is stale then overall limits state cannot be green or blue
|
|
72
|
-
@config.telemetry.each do |target_name, target_packets|
|
|
73
|
-
target_packets.each do |packet_name, packet|
|
|
74
|
-
if packet.stale && !packet.limits_items.empty?
|
|
75
|
-
if ignored_items
|
|
76
|
-
all_ignored = true
|
|
77
|
-
packet.limits_items.each do |item|
|
|
78
|
-
all_ignored = false unless includes_item?(ignored_items, target_name, packet_name, item.name)
|
|
79
|
-
end
|
|
80
|
-
else
|
|
81
|
-
all_ignored = false
|
|
82
|
-
end
|
|
83
|
-
limits_packet_stale = true unless all_ignored
|
|
84
|
-
end
|
|
85
|
-
items_out_of_limits.concat(packet.out_of_limits)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
items_out_of_limits.each do |target_name, packet_name, item_name, limits_state|
|
|
89
|
-
next if ignored_items && includes_item?(ignored_items, target_name, packet_name, item_name)
|
|
90
|
-
|
|
91
|
-
case overall
|
|
92
|
-
# If our overall state is currently blue or green we can go to any state
|
|
93
|
-
when :BLUE, :GREEN, :GREEN_HIGH, :GREEN_LOW
|
|
94
|
-
overall = limits_state
|
|
95
|
-
# If our overal state is yellow we can only go higher to red
|
|
96
|
-
when :YELLOW, :YELLOW_HIGH, :YELLOW_LOW
|
|
97
|
-
if limits_state == :RED || limits_state == :RED_HIGH || limits_state == :RED_LOW
|
|
98
|
-
overall = limits_state
|
|
99
|
-
break # Red is as high as we go so no need to look for more
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
overall = :GREEN if overall == :GREEN_HIGH || overall == :GREEN_LOW || overall == :BLUE
|
|
104
|
-
overall = :YELLOW if overall == :YELLOW_HIGH || overall == :YELLOW_LOW
|
|
105
|
-
overall = :RED if overall == :RED_HIGH || overall == :RED_LOW
|
|
106
|
-
overall = :STALE if (overall == :GREEN || overall == :BLUE) && limits_packet_stale
|
|
107
|
-
return overall
|
|
108
|
-
end
|
|
109
|
-
|
|
110
65
|
# @return [Hash(String, Array)] The defined limits groups
|
|
111
66
|
def groups
|
|
112
67
|
return @config.limits_groups
|
|
113
68
|
end
|
|
114
69
|
|
|
115
|
-
# Enables limit checking for all the items in the given group.
|
|
116
|
-
#
|
|
117
|
-
# @param group_name [String] Name of the group to enable
|
|
118
|
-
def enable_group(group_name)
|
|
119
|
-
group_upcase = group_name.to_s.upcase
|
|
120
|
-
limits_group = @config.limits_groups[group_upcase]
|
|
121
|
-
if limits_group
|
|
122
|
-
limits_group.each do |target_name, packet_name, item_name|
|
|
123
|
-
enable(target_name, packet_name, item_name)
|
|
124
|
-
end
|
|
125
|
-
else
|
|
126
|
-
raise "LIMITS_GROUP #{group_upcase} undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP #{group_upcase}"
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
# Disables limit checking for all the items in the given group.
|
|
131
|
-
#
|
|
132
|
-
# @param group_name [String] Name of the group to disable
|
|
133
|
-
def disable_group(group_name)
|
|
134
|
-
group_upcase = group_name.to_s.upcase
|
|
135
|
-
limits_group = @config.limits_groups[group_upcase]
|
|
136
|
-
if limits_group
|
|
137
|
-
limits_group.each do |target_name, packet_name, item_name|
|
|
138
|
-
disable(target_name, packet_name, item_name)
|
|
139
|
-
end
|
|
140
|
-
else
|
|
141
|
-
raise "LIMITS_GROUP #{group_upcase} undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP #{group_upcase}"
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
70
|
# Checks whether the limits are enabled for the specified item
|
|
146
71
|
#
|
|
147
72
|
# @param target_name [String] The target name
|
|
@@ -62,9 +62,6 @@ module OpenC3
|
|
|
62
62
|
# @return [Hash<Item Name, Value>] Given values when constructing the packet
|
|
63
63
|
attr_reader :given_values
|
|
64
64
|
|
|
65
|
-
# @return [Boolean] Flag indicating if the packet is stale (hasn't been received recently)
|
|
66
|
-
attr_reader :stale
|
|
67
|
-
|
|
68
65
|
# @return [Boolean] Whether or not this is a 'raw' packet
|
|
69
66
|
attr_accessor :raw
|
|
70
67
|
|
|
@@ -119,7 +116,6 @@ module OpenC3
|
|
|
119
116
|
@given_values = nil
|
|
120
117
|
@limits_items = nil
|
|
121
118
|
@processors = nil
|
|
122
|
-
@stale = true
|
|
123
119
|
@limits_change_callback = nil
|
|
124
120
|
@read_conversion_cache = nil
|
|
125
121
|
@raw = nil
|
|
@@ -896,13 +892,6 @@ module OpenC3
|
|
|
896
892
|
return items
|
|
897
893
|
end
|
|
898
894
|
|
|
899
|
-
# Set the limits state for all items to the given state
|
|
900
|
-
#
|
|
901
|
-
# @param state [Symbol] Must be one of PacketItemLimits::LIMITS_STATES
|
|
902
|
-
def set_all_limits_states(state)
|
|
903
|
-
@sorted_items.each { |item| item.limits.state = state }
|
|
904
|
-
end
|
|
905
|
-
|
|
906
895
|
# Check all the items in the packet against their defined limits. Update
|
|
907
896
|
# their internal limits state and persistence and call the
|
|
908
897
|
# limits_change_callback as necessary.
|
|
@@ -912,14 +901,6 @@ module OpenC3
|
|
|
912
901
|
# @param ignore_persistence [Boolean] Whether to ignore persistence when
|
|
913
902
|
# checking for out of limits
|
|
914
903
|
def check_limits(limits_set = :DEFAULT, ignore_persistence = false)
|
|
915
|
-
# If check_limits is being called, then a new packet has arrived and
|
|
916
|
-
# this packet is no longer stale
|
|
917
|
-
# Stored telemetry doesn't affect the current value table and such doesn't affect stale
|
|
918
|
-
if @stale and !@stored
|
|
919
|
-
@stale = false
|
|
920
|
-
set_all_limits_states(nil)
|
|
921
|
-
end
|
|
922
|
-
|
|
923
904
|
return unless @limits_items
|
|
924
905
|
|
|
925
906
|
@limits_items.each do |item|
|
|
@@ -937,13 +918,6 @@ module OpenC3
|
|
|
937
918
|
end
|
|
938
919
|
end
|
|
939
920
|
|
|
940
|
-
# Sets the overall packet stale state to true and sets each packet item
|
|
941
|
-
# limits state to :STALE.
|
|
942
|
-
def set_stale
|
|
943
|
-
@stale = true
|
|
944
|
-
set_all_limits_states(:STALE)
|
|
945
|
-
end
|
|
946
|
-
|
|
947
921
|
# Reset temporary packet data
|
|
948
922
|
# This includes packet received time, received count, and processor state
|
|
949
923
|
def reset
|
|
@@ -1063,7 +1037,6 @@ module OpenC3
|
|
|
1063
1037
|
config['messages_disabled'] = true if @messages_disabled
|
|
1064
1038
|
config['disabled'] = true if @disabled
|
|
1065
1039
|
config['hidden'] = true if @hidden
|
|
1066
|
-
config['stale'] = true if @stale
|
|
1067
1040
|
config['accessor'] = @accessor.to_s
|
|
1068
1041
|
config['template'] = Base64.encode64(@template) if @template
|
|
1069
1042
|
|
|
@@ -1103,7 +1076,6 @@ module OpenC3
|
|
|
1103
1076
|
packet.messages_disabled = hash['messages_disabled']
|
|
1104
1077
|
packet.disabled = hash['disabled']
|
|
1105
1078
|
packet.hidden = hash['hidden']
|
|
1106
|
-
# packet.stale is read only
|
|
1107
1079
|
if hash['accessor']
|
|
1108
1080
|
begin
|
|
1109
1081
|
packet.accessor = OpenC3::const_get(hash['accessor'])
|
|
@@ -78,6 +78,10 @@ module OpenC3
|
|
|
78
78
|
# description was given the value will be nil.
|
|
79
79
|
attr_reader :hazardous
|
|
80
80
|
|
|
81
|
+
# @return [Hash] Whether or not messages should be printed for this state.
|
|
82
|
+
# Given as STATE_NAME => true / false.
|
|
83
|
+
attr_accessor :messages_disabled
|
|
84
|
+
|
|
81
85
|
# Colors associated with states
|
|
82
86
|
# @return [Hash] State colors given as STATE_NAME => COLOR
|
|
83
87
|
attr_reader :state_colors
|
|
@@ -104,6 +108,7 @@ module OpenC3
|
|
|
104
108
|
@range = nil
|
|
105
109
|
@required = false
|
|
106
110
|
@hazardous = nil
|
|
111
|
+
@messages_disabled = nil
|
|
107
112
|
@state_colors = nil
|
|
108
113
|
@limits = PacketItemLimits.new
|
|
109
114
|
@persistence_setting = 1
|
|
@@ -250,6 +255,16 @@ module OpenC3
|
|
|
250
255
|
end
|
|
251
256
|
end
|
|
252
257
|
|
|
258
|
+
def messages_disabled=(messages_disabled)
|
|
259
|
+
if messages_disabled
|
|
260
|
+
raise ArgumentError, "#{@name}: messages_disabled must be a Hash but is a #{messages_disabled.class}" unless Hash === messages_disabled
|
|
261
|
+
|
|
262
|
+
@messages_disabled = messages_disabled.clone
|
|
263
|
+
else
|
|
264
|
+
@messages_disabled = nil
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
253
268
|
def state_colors=(state_colors)
|
|
254
269
|
if state_colors
|
|
255
270
|
raise ArgumentError, "#{@name}: state_colors must be a Hash but is a #{state_colors.class}" unless Hash === state_colors
|
|
@@ -296,6 +311,7 @@ module OpenC3
|
|
|
296
311
|
item.units = self.units.clone if self.units
|
|
297
312
|
item.default = self.default.clone if self.default and String === self.default
|
|
298
313
|
item.hazardous = self.hazardous.clone if self.hazardous
|
|
314
|
+
item.messages_disabled = self.messages_disabled.clone if self.messages_disabled
|
|
299
315
|
item.state_colors = self.state_colors.clone if self.state_colors
|
|
300
316
|
item.limits = self.limits.clone if self.limits
|
|
301
317
|
item.meta = self.meta.clone if @meta
|
|
@@ -325,6 +341,7 @@ module OpenC3
|
|
|
325
341
|
hash['range'] = self.range
|
|
326
342
|
hash['required'] = self.required
|
|
327
343
|
hash['hazardous'] = self.hazardous
|
|
344
|
+
hash['messages_disabled'] = self.messages_disabled
|
|
328
345
|
hash['state_colors'] = self.state_colors
|
|
329
346
|
hash['limits'] = self.limits.to_hash
|
|
330
347
|
hash['meta'] = nil
|
|
@@ -394,6 +411,9 @@ module OpenC3
|
|
|
394
411
|
if @hazardous and @hazardous[state_name]
|
|
395
412
|
config << " HAZARDOUS #{@hazardous[state_name].to_s.quote_if_necessary}"
|
|
396
413
|
end
|
|
414
|
+
if @messages_disabled and @messages_disabled[state_name]
|
|
415
|
+
config << " DISABLE_MESSAGES"
|
|
416
|
+
end
|
|
397
417
|
if @state_colors and @state_colors[state_name]
|
|
398
418
|
config << " #{@state_colors[state_name]}"
|
|
399
419
|
end
|
|
@@ -459,6 +479,7 @@ module OpenC3
|
|
|
459
479
|
states[state_name] = state
|
|
460
480
|
state['value'] = state_value.as_json(*a)
|
|
461
481
|
state['hazardous'] = @hazardous[state_name] if @hazardous and @hazardous[state_name]
|
|
482
|
+
state['messages_disabled'] = @messages_disabled[state_name] if @messages_disabled and @messages_disabled[state_name]
|
|
462
483
|
state['color'] = @state_colors[state_name].to_s if @state_colors and @state_colors[state_name]
|
|
463
484
|
end
|
|
464
485
|
end
|
|
@@ -509,10 +530,12 @@ module OpenC3
|
|
|
509
530
|
if hash['states']
|
|
510
531
|
item.states = {}
|
|
511
532
|
item.hazardous = {}
|
|
533
|
+
item.messages_disabled = {}
|
|
512
534
|
item.state_colors = {}
|
|
513
535
|
hash['states'].each do |state_name, state|
|
|
514
536
|
item.states[state_name] = state['value']
|
|
515
537
|
item.hazardous[state_name] = state['hazardous']
|
|
538
|
+
item.messages_disabled[state_name] = state['messages_disabled']
|
|
516
539
|
item.state_colors[state_name] = state['color'].to_sym if state['color']
|
|
517
540
|
end
|
|
518
541
|
end
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# All changes Copyright 2022, 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/limits_response'
|
|
@@ -71,7 +71,7 @@ module OpenC3
|
|
|
71
71
|
def initialize
|
|
72
72
|
@values = nil
|
|
73
73
|
@enabled = false
|
|
74
|
-
@state =
|
|
74
|
+
@state = nil
|
|
75
75
|
@response = nil
|
|
76
76
|
@persistence_setting = 1
|
|
77
77
|
@persistence_count = 0
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# All changes Copyright 2022, 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_item'
|
|
@@ -48,7 +48,7 @@ module OpenC3
|
|
|
48
48
|
def verify_parameters(cmd_or_tlm)
|
|
49
49
|
@usage = "STATE <STATE NAME> <STATE VALUE> "
|
|
50
50
|
if cmd_or_tlm == PacketConfig::COMMAND
|
|
51
|
-
@usage << "<HAZARDOUS (Optional)> <Hazardous Description (Optional)>"
|
|
51
|
+
@usage << "<HAZARDOUS / DISABLE_MESSAGES (Optional)> <Hazardous Description (Optional)>"
|
|
52
52
|
@parser.verify_num_parameters(2, 4, @usage)
|
|
53
53
|
else
|
|
54
54
|
@usage << "<COLOR: GREEN/YELLOW/RED (Optional)>"
|
|
@@ -96,23 +96,27 @@ module OpenC3
|
|
|
96
96
|
return unless @parser.parameters.length > 2
|
|
97
97
|
|
|
98
98
|
if cmd_or_tlm == PacketConfig::COMMAND
|
|
99
|
-
|
|
99
|
+
get_hazardous_or_disable_messages(item)
|
|
100
100
|
else
|
|
101
101
|
get_state_colors(item)
|
|
102
102
|
packet.update_limits_items_cache(item)
|
|
103
103
|
end
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
def
|
|
107
|
-
|
|
106
|
+
def get_hazardous_or_disable_messages(item)
|
|
107
|
+
case @parser.parameters[2].upcase
|
|
108
|
+
when 'HAZARDOUS'
|
|
108
109
|
item.hazardous ||= {}
|
|
109
110
|
if @parser.parameters[3]
|
|
110
111
|
item.hazardous[get_state_name()] = @parser.parameters[3]
|
|
111
112
|
else
|
|
112
113
|
item.hazardous[get_state_name()] = ""
|
|
113
114
|
end
|
|
115
|
+
when 'DISABLE_MESSAGES'
|
|
116
|
+
item.messages_disabled ||= {}
|
|
117
|
+
item.messages_disabled[get_state_name()] = true
|
|
114
118
|
else
|
|
115
|
-
raise @parser.error("HAZARDOUS expected as third parameter for this line.", @usage)
|
|
119
|
+
raise @parser.error("HAZARDOUS or DISABLE_MESSAGES expected as third parameter for this line.", @usage)
|
|
116
120
|
end
|
|
117
121
|
end
|
|
118
122
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# All changes Copyright 2022, 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_config'
|
|
@@ -372,50 +372,6 @@ module OpenC3
|
|
|
372
372
|
end
|
|
373
373
|
end
|
|
374
374
|
|
|
375
|
-
# Iterates through all the telemetry packets and marks them stale if they
|
|
376
|
-
# haven't been received for over the System.staleness_seconds value.
|
|
377
|
-
#
|
|
378
|
-
# @return [Array(Packet)] Array of the stale packets
|
|
379
|
-
def check_stale
|
|
380
|
-
stale = []
|
|
381
|
-
time = Time.now.sys
|
|
382
|
-
@config.telemetry.each do |target_name, target_packets|
|
|
383
|
-
target_packets.each do |packet_name, packet|
|
|
384
|
-
if packet.received_time and (!packet.stale) and (time - packet.received_time > System.staleness_seconds)
|
|
385
|
-
packet.set_stale
|
|
386
|
-
stale << packet
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
end
|
|
390
|
-
stale
|
|
391
|
-
end
|
|
392
|
-
|
|
393
|
-
# @param with_limits_only [Boolean] Return only the stale packets
|
|
394
|
-
# that have limits items and thus affect the overall limits
|
|
395
|
-
# state of the system
|
|
396
|
-
# @param target [String] Target name or nil for all targets
|
|
397
|
-
# @return [Array(Packet)] Array of the stale packets
|
|
398
|
-
def stale(with_limits_only = false, target = nil)
|
|
399
|
-
if target && !target_names.include?(target)
|
|
400
|
-
raise "Telemetry target '#{target.upcase}' does not exist"
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
stale = []
|
|
404
|
-
@config.telemetry.each do |target_name, target_packets|
|
|
405
|
-
next if target && target != target_name
|
|
406
|
-
next if target_name == 'UNKNOWN'
|
|
407
|
-
|
|
408
|
-
target_packets.each do |packet_name, packet|
|
|
409
|
-
if packet.stale
|
|
410
|
-
next if with_limits_only && packet.limits_items.empty?
|
|
411
|
-
|
|
412
|
-
stale << packet
|
|
413
|
-
end
|
|
414
|
-
end
|
|
415
|
-
end
|
|
416
|
-
stale
|
|
417
|
-
end
|
|
418
|
-
|
|
419
375
|
# Clears the received_count value on every packet in every target
|
|
420
376
|
def clear_counters
|
|
421
377
|
@config.telemetry.each do |target_name, target_packets|
|