openc3 5.1.1 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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|
|