openc3 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.
- checksums.yaml +7 -0
- data/Gemfile +18 -0
- data/Guardfile +35 -0
- data/LICENSE.txt +727 -0
- data/README.md +37 -0
- data/Rakefile +131 -0
- data/bin/cstol_converter +1178 -0
- data/bin/openc3cli +531 -0
- data/bin/rubysloc +139 -0
- data/data/config/_array_params.yaml +23 -0
- data/data/config/_id_items.yaml +24 -0
- data/data/config/_id_params.yaml +58 -0
- data/data/config/_interfaces.yaml +214 -0
- data/data/config/_interfaces.yaml.err +1017 -0
- data/data/config/_items.yaml +20 -0
- data/data/config/_params.yaml +60 -0
- data/data/config/cmd_tlm_server.yaml +136 -0
- data/data/config/command.yaml +44 -0
- data/data/config/command_modifiers.yaml +160 -0
- data/data/config/command_telemetry.yaml +3 -0
- data/data/config/interface_modifiers.yaml +104 -0
- data/data/config/item_modifiers.yaml +221 -0
- data/data/config/microservice.yaml +78 -0
- data/data/config/param_item_modifiers.yaml +52 -0
- data/data/config/parameter_modifiers.yaml +200 -0
- data/data/config/plugins.yaml +80 -0
- data/data/config/protocols.yaml +290 -0
- data/data/config/screen.yaml +147 -0
- data/data/config/table_manager.yaml +89 -0
- data/data/config/table_parameter_modifiers.yaml +9 -0
- data/data/config/target.yaml +142 -0
- data/data/config/target_config.yaml +94 -0
- data/data/config/telemetry.yaml +87 -0
- data/data/config/telemetry_modifiers.yaml +159 -0
- data/data/config/tool.yaml +63 -0
- data/data/config/unknown.yaml +3 -0
- data/data/config/widgets.yaml +1505 -0
- data/ext/mkrf_conf.rb +49 -0
- data/ext/openc3/ext/array/array.c +122 -0
- data/ext/openc3/ext/array/extconf.rb +13 -0
- data/ext/openc3/ext/buffered_file/buffered_file.c +198 -0
- data/ext/openc3/ext/buffered_file/extconf.rb +13 -0
- data/ext/openc3/ext/config_parser/config_parser.c +280 -0
- data/ext/openc3/ext/config_parser/extconf.rb +13 -0
- data/ext/openc3/ext/crc/crc.c +351 -0
- data/ext/openc3/ext/crc/extconf.rb +13 -0
- data/ext/openc3/ext/openc3_io/extconf.rb +13 -0
- data/ext/openc3/ext/openc3_io/openc3_io.c +158 -0
- data/ext/openc3/ext/packet/extconf.rb +13 -0
- data/ext/openc3/ext/packet/packet.c +318 -0
- data/ext/openc3/ext/platform/extconf.rb +13 -0
- data/ext/openc3/ext/platform/platform.c +134 -0
- data/ext/openc3/ext/polynomial_conversion/extconf.rb +13 -0
- data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +79 -0
- data/ext/openc3/ext/string/extconf.rb +13 -0
- data/ext/openc3/ext/string/string.c +63 -0
- data/ext/openc3/ext/structure/structure.c +1719 -0
- data/ext/openc3/ext/tabbed_plots_config/extconf.rb +13 -0
- data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +62 -0
- data/ext/openc3/ext/telemetry/extconf.rb +13 -0
- data/ext/openc3/ext/telemetry/telemetry.c +336 -0
- data/lib/cosmos.rb +20 -0
- data/lib/cosmosc2.rb +20 -0
- data/lib/openc3/api/api.rb +39 -0
- data/lib/openc3/api/authorized_api.rb +30 -0
- data/lib/openc3/api/cmd_api.rb +451 -0
- data/lib/openc3/api/config_api.rb +58 -0
- data/lib/openc3/api/interface_api.rb +117 -0
- data/lib/openc3/api/limits_api.rb +375 -0
- data/lib/openc3/api/router_api.rb +117 -0
- data/lib/openc3/api/settings_api.rb +70 -0
- data/lib/openc3/api/target_api.rb +78 -0
- data/lib/openc3/api/tlm_api.rb +455 -0
- data/lib/openc3/bridge/bridge.rb +54 -0
- data/lib/openc3/bridge/bridge_config.rb +167 -0
- data/lib/openc3/bridge/bridge_interface_thread.rb +42 -0
- data/lib/openc3/bridge/bridge_router_thread.rb +42 -0
- data/lib/openc3/ccsds/ccsds_packet.rb +68 -0
- data/lib/openc3/ccsds/ccsds_parser.rb +148 -0
- data/lib/openc3/config/config_parser.rb +549 -0
- data/lib/openc3/config/meta_config_parser.rb +74 -0
- data/lib/openc3/conversions/conversion.rb +70 -0
- data/lib/openc3/conversions/generic_conversion.rb +83 -0
- data/lib/openc3/conversions/packet_time_formatted_conversion.rb +43 -0
- data/lib/openc3/conversions/packet_time_seconds_conversion.rb +43 -0
- data/lib/openc3/conversions/polynomial_conversion.rb +87 -0
- data/lib/openc3/conversions/processor_conversion.rb +70 -0
- data/lib/openc3/conversions/received_count_conversion.rb +38 -0
- data/lib/openc3/conversions/received_time_formatted_conversion.rb +42 -0
- data/lib/openc3/conversions/received_time_seconds_conversion.rb +42 -0
- data/lib/openc3/conversions/segmented_polynomial_conversion.rb +171 -0
- data/lib/openc3/conversions/unix_time_conversion.rb +68 -0
- data/lib/openc3/conversions/unix_time_formatted_conversion.rb +49 -0
- data/lib/openc3/conversions/unix_time_seconds_conversion.rb +49 -0
- data/lib/openc3/conversions.rb +34 -0
- data/lib/openc3/core_ext/array.rb +416 -0
- data/lib/openc3/core_ext/binding.rb +29 -0
- data/lib/openc3/core_ext/class.rb +72 -0
- data/lib/openc3/core_ext/exception.rb +61 -0
- data/lib/openc3/core_ext/file.rb +83 -0
- data/lib/openc3/core_ext/hash.rb +37 -0
- data/lib/openc3/core_ext/io.rb +134 -0
- data/lib/openc3/core_ext/kernel.rb +42 -0
- data/lib/openc3/core_ext/math.rb +128 -0
- data/lib/openc3/core_ext/matrix.rb +156 -0
- data/lib/openc3/core_ext/objectspace.rb +36 -0
- data/lib/openc3/core_ext/openc3_io.rb +57 -0
- data/lib/openc3/core_ext/range.rb +27 -0
- data/lib/openc3/core_ext/socket.rb +38 -0
- data/lib/openc3/core_ext/string.rb +389 -0
- data/lib/openc3/core_ext/stringio.rb +33 -0
- data/lib/openc3/core_ext/time.rb +508 -0
- data/lib/openc3/core_ext.rb +36 -0
- data/lib/openc3/interfaces/interface.rb +498 -0
- data/lib/openc3/interfaces/linc_interface.rb +475 -0
- data/lib/openc3/interfaces/protocols/burst_protocol.rb +192 -0
- data/lib/openc3/interfaces/protocols/crc_protocol.rb +193 -0
- data/lib/openc3/interfaces/protocols/fixed_protocol.rb +155 -0
- data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +56 -0
- data/lib/openc3/interfaces/protocols/length_protocol.rb +165 -0
- data/lib/openc3/interfaces/protocols/override_protocol.rb +60 -0
- data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +206 -0
- data/lib/openc3/interfaces/protocols/protocol.rb +82 -0
- data/lib/openc3/interfaces/protocols/template_protocol.rb +261 -0
- data/lib/openc3/interfaces/protocols/terminated_protocol.rb +93 -0
- data/lib/openc3/interfaces/serial_interface.rb +94 -0
- data/lib/openc3/interfaces/simulated_target_interface.rb +168 -0
- data/lib/openc3/interfaces/stream_interface.rb +81 -0
- data/lib/openc3/interfaces/tcpip_client_interface.rb +69 -0
- data/lib/openc3/interfaces/tcpip_server_interface.rb +629 -0
- data/lib/openc3/interfaces/udp_interface.rb +169 -0
- data/lib/openc3/interfaces.rb +44 -0
- data/lib/openc3/io/buffered_file.rb +109 -0
- data/lib/openc3/io/io_multiplexer.rb +80 -0
- data/lib/openc3/io/json_api_object.rb +208 -0
- data/lib/openc3/io/json_drb.rb +335 -0
- data/lib/openc3/io/json_drb_object.rb +114 -0
- data/lib/openc3/io/json_drb_rack.rb +84 -0
- data/lib/openc3/io/json_rpc.rb +420 -0
- data/lib/openc3/io/openc3_snmp.rb +58 -0
- data/lib/openc3/io/posix_serial_driver.rb +156 -0
- data/lib/openc3/io/raw_logger.rb +167 -0
- data/lib/openc3/io/raw_logger_pair.rb +77 -0
- data/lib/openc3/io/serial_driver.rb +105 -0
- data/lib/openc3/io/stderr.rb +43 -0
- data/lib/openc3/io/stdout.rb +43 -0
- data/lib/openc3/io/udp_sockets.rb +194 -0
- data/lib/openc3/io/win32_serial_driver.rb +196 -0
- data/lib/openc3/logs/log_writer.rb +302 -0
- data/lib/openc3/logs/packet_log_constants.rb +62 -0
- data/lib/openc3/logs/packet_log_reader.rb +345 -0
- data/lib/openc3/logs/packet_log_writer.rb +299 -0
- data/lib/openc3/logs/text_log_writer.rb +68 -0
- data/lib/openc3/logs.rb +25 -0
- data/lib/openc3/microservices/cleanup_microservice.rb +68 -0
- data/lib/openc3/microservices/decom_microservice.rb +136 -0
- data/lib/openc3/microservices/interface_microservice.rb +532 -0
- data/lib/openc3/microservices/log_microservice.rb +108 -0
- data/lib/openc3/microservices/microservice.rb +204 -0
- data/lib/openc3/microservices/plugin_microservice.rb +43 -0
- data/lib/openc3/microservices/reaction_microservice.rb +541 -0
- data/lib/openc3/microservices/reducer_microservice.rb +313 -0
- data/lib/openc3/microservices/router_microservice.rb +44 -0
- data/lib/openc3/microservices/text_log_microservice.rb +84 -0
- data/lib/openc3/microservices/timeline_microservice.rb +363 -0
- data/lib/openc3/microservices/trigger_group_microservice.rb +638 -0
- data/lib/openc3/models/activity_model.rb +319 -0
- data/lib/openc3/models/auth_model.rb +65 -0
- data/lib/openc3/models/cvt_model.rb +185 -0
- data/lib/openc3/models/environment_model.rb +58 -0
- data/lib/openc3/models/gem_model.rb +137 -0
- data/lib/openc3/models/info_model.rb +31 -0
- data/lib/openc3/models/interface_model.rb +281 -0
- data/lib/openc3/models/interface_status_model.rb +117 -0
- data/lib/openc3/models/metadata_model.rb +139 -0
- data/lib/openc3/models/metric_model.rb +59 -0
- data/lib/openc3/models/microservice_model.rb +206 -0
- data/lib/openc3/models/microservice_status_model.rb +74 -0
- data/lib/openc3/models/model.rb +204 -0
- data/lib/openc3/models/note_model.rb +122 -0
- data/lib/openc3/models/notification_model.rb +40 -0
- data/lib/openc3/models/ping_model.rb +35 -0
- data/lib/openc3/models/plugin_model.rb +292 -0
- data/lib/openc3/models/process_status_model.rb +76 -0
- data/lib/openc3/models/reaction_model.rb +322 -0
- data/lib/openc3/models/reducer_model.rb +65 -0
- data/lib/openc3/models/router_model.rb +35 -0
- data/lib/openc3/models/router_status_model.rb +27 -0
- data/lib/openc3/models/scope_model.rb +153 -0
- data/lib/openc3/models/settings_model.rb +55 -0
- data/lib/openc3/models/sorted_model.rb +167 -0
- data/lib/openc3/models/target_model.rb +759 -0
- data/lib/openc3/models/timeline_model.rb +154 -0
- data/lib/openc3/models/tool_config_model.rb +38 -0
- data/lib/openc3/models/tool_model.rb +262 -0
- data/lib/openc3/models/trigger_group_model.rb +186 -0
- data/lib/openc3/models/trigger_model.rb +330 -0
- data/lib/openc3/models/widget_model.rb +138 -0
- data/lib/openc3/operators/microservice_operator.rb +128 -0
- data/lib/openc3/operators/operator.rb +277 -0
- data/lib/openc3/packets/binary_accessor.rb +1207 -0
- data/lib/openc3/packets/commands.rb +373 -0
- data/lib/openc3/packets/json_packet.rb +134 -0
- data/lib/openc3/packets/limits.rb +271 -0
- data/lib/openc3/packets/limits_response.rb +53 -0
- data/lib/openc3/packets/packet.rb +1168 -0
- data/lib/openc3/packets/packet_config.rb +625 -0
- data/lib/openc3/packets/packet_item.rb +586 -0
- data/lib/openc3/packets/packet_item_limits.rb +162 -0
- data/lib/openc3/packets/parsers/format_string_parser.rb +65 -0
- data/lib/openc3/packets/parsers/limits_parser.rb +159 -0
- data/lib/openc3/packets/parsers/limits_response_parser.rb +61 -0
- data/lib/openc3/packets/parsers/packet_item_parser.rb +272 -0
- data/lib/openc3/packets/parsers/packet_parser.rb +134 -0
- data/lib/openc3/packets/parsers/processor_parser.rb +73 -0
- data/lib/openc3/packets/parsers/state_parser.rb +127 -0
- data/lib/openc3/packets/parsers/xtce_converter.rb +442 -0
- data/lib/openc3/packets/parsers/xtce_parser.rb +722 -0
- data/lib/openc3/packets/structure.rb +553 -0
- data/lib/openc3/packets/structure_item.rb +365 -0
- data/lib/openc3/packets/telemetry.rb +487 -0
- data/lib/openc3/processors/processor.rb +86 -0
- data/lib/openc3/processors/statistics_processor.rb +82 -0
- data/lib/openc3/processors/watermark_processor.rb +58 -0
- data/lib/openc3/processors.rb +24 -0
- data/lib/openc3/script/api_shared.rb +828 -0
- data/lib/openc3/script/calendar.rb +89 -0
- data/lib/openc3/script/commands.rb +227 -0
- data/lib/openc3/script/exceptions.rb +29 -0
- data/lib/openc3/script/extract.rb +161 -0
- data/lib/openc3/script/limits.rb +60 -0
- data/lib/openc3/script/script.rb +299 -0
- data/lib/openc3/script/script_runner.rb +238 -0
- data/lib/openc3/script/storage.rb +146 -0
- data/lib/openc3/script/suite.rb +542 -0
- data/lib/openc3/script/suite_results.rb +196 -0
- data/lib/openc3/script/suite_runner.rb +217 -0
- data/lib/openc3/script.rb +21 -0
- data/lib/openc3/streams/serial_stream.rb +167 -0
- data/lib/openc3/streams/stream.rb +63 -0
- data/lib/openc3/streams/tcpip_client_stream.rb +116 -0
- data/lib/openc3/streams/tcpip_socket_stream.rb +195 -0
- data/lib/openc3/system/system.rb +127 -0
- data/lib/openc3/system/system_config.rb +411 -0
- data/lib/openc3/system/target.rb +269 -0
- data/lib/openc3/system.rb +24 -0
- data/lib/openc3/tools/cmd_tlm_server/api.rb +20 -0
- data/lib/openc3/tools/cmd_tlm_server/cmd_tlm_server_config.rb +320 -0
- data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +294 -0
- data/lib/openc3/tools/table_manager/table.rb +77 -0
- data/lib/openc3/tools/table_manager/table_config.rb +273 -0
- data/lib/openc3/tools/table_manager/table_item.rb +90 -0
- data/lib/openc3/tools/table_manager/table_item_parser.rb +66 -0
- data/lib/openc3/tools/table_manager/table_manager_core.rb +333 -0
- data/lib/openc3/tools/table_manager/table_parser.rb +93 -0
- data/lib/openc3/tools/test_runner/test.rb +67 -0
- data/lib/openc3/top_level.rb +595 -0
- data/lib/openc3/topics/autonomic_topic.rb +52 -0
- data/lib/openc3/topics/calendar_topic.rb +44 -0
- data/lib/openc3/topics/command_decom_topic.rb +76 -0
- data/lib/openc3/topics/command_topic.rb +83 -0
- data/lib/openc3/topics/config_topic.rb +68 -0
- data/lib/openc3/topics/interface_topic.rb +73 -0
- data/lib/openc3/topics/limits_event_topic.rb +109 -0
- data/lib/openc3/topics/notifications_topic.rb +28 -0
- data/lib/openc3/topics/router_topic.rb +85 -0
- data/lib/openc3/topics/telemetry_decom_topic.rb +54 -0
- data/lib/openc3/topics/telemetry_topic.rb +36 -0
- data/lib/openc3/topics/timeline_topic.rb +45 -0
- data/lib/openc3/topics/topic.rb +53 -0
- data/lib/openc3/utilities/authentication.rb +141 -0
- data/lib/openc3/utilities/authorization.rb +51 -0
- data/lib/openc3/utilities/crc.rb +278 -0
- data/lib/openc3/utilities/csv.rb +153 -0
- data/lib/openc3/utilities/logger.rb +187 -0
- data/lib/openc3/utilities/message_log.rb +91 -0
- data/lib/openc3/utilities/metric.rb +141 -0
- data/lib/openc3/utilities/process_manager.rb +139 -0
- data/lib/openc3/utilities/quaternion.rb +257 -0
- data/lib/openc3/utilities/ruby_lex_utils.rb +568 -0
- data/lib/openc3/utilities/s3.rb +202 -0
- data/lib/openc3/utilities/s3_autoload.rb +9 -0
- data/lib/openc3/utilities/s3_file_cache.rb +274 -0
- data/lib/openc3/utilities/simulated_target.rb +117 -0
- data/lib/openc3/utilities/sleeper.rb +51 -0
- data/lib/openc3/utilities/store.rb +23 -0
- data/lib/openc3/utilities/store_autoload.rb +237 -0
- data/lib/openc3/utilities/zip.rb +21 -0
- data/lib/openc3/utilities.rb +35 -0
- data/lib/openc3/version.rb +14 -0
- data/lib/openc3/win32/excel.rb +132 -0
- data/lib/openc3/win32/win32.rb +402 -0
- data/lib/openc3/win32/win32_main.rb +333 -0
- data/lib/openc3.rb +49 -0
- data/tasks/gemfile_stats.rake +113 -0
- data/tasks/spec.rake +30 -0
- data/templates/plugin-template/README.md +15 -0
- data/templates/plugin-template/Rakefile +12 -0
- data/templates/plugin-template/plugin.gemspec +23 -0
- data/templates/plugin-template/plugin.txt +9 -0
- data/templates/plugin-template/targets/TARGET/cmd_tlm/cmd.txt +8 -0
- data/templates/plugin-template/targets/TARGET/cmd_tlm/tlm.txt +8 -0
- data/templates/plugin-template/targets/TARGET/lib/target.rb +10 -0
- data/templates/plugin-template/targets/TARGET/procedures/procedure.rb +3 -0
- data/templates/plugin-template/targets/TARGET/screens/status.txt +9 -0
- data/templates/plugin-template/targets/TARGET/target.txt +5 -0
- metadata +849 -0
|
@@ -0,0 +1,375 @@
|
|
|
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/api/target_api'
|
|
21
|
+
|
|
22
|
+
module OpenC3
|
|
23
|
+
module Api
|
|
24
|
+
WHITELIST ||= []
|
|
25
|
+
WHITELIST.concat([
|
|
26
|
+
'get_stale',
|
|
27
|
+
'get_out_of_limits',
|
|
28
|
+
'get_overall_limits_state',
|
|
29
|
+
'limits_enabled?',
|
|
30
|
+
'enable_limits',
|
|
31
|
+
'disable_limits',
|
|
32
|
+
'get_limits',
|
|
33
|
+
'set_limits',
|
|
34
|
+
'get_limits_groups',
|
|
35
|
+
'enable_limits_group',
|
|
36
|
+
'disable_limits_group',
|
|
37
|
+
'get_limits_sets',
|
|
38
|
+
'set_limits_set',
|
|
39
|
+
'get_limits_set',
|
|
40
|
+
'get_limits_events',
|
|
41
|
+
])
|
|
42
|
+
|
|
43
|
+
# Get the list of stale packets for a specific target or pass nil to list
|
|
44
|
+
# all stale packets
|
|
45
|
+
#
|
|
46
|
+
# @param with_limits_only [Boolean] Return only the stale packets
|
|
47
|
+
# that have limits items and thus affect the overall limits
|
|
48
|
+
# state of the system
|
|
49
|
+
# @param target_name [String] The target to find stale packets for or nil to list
|
|
50
|
+
# all stale packets in the system
|
|
51
|
+
# @param staleness_sec [Integer] The amount of time to pass before a packet is marked stale
|
|
52
|
+
# @return [Array<Array<String, String>>] Array of arrays listing the target
|
|
53
|
+
# name and packet name
|
|
54
|
+
def get_stale(with_limits_only: false, target_name: nil, staleness_sec: 30, scope: $openc3_scope, token: $openc3_token)
|
|
55
|
+
authorize(permission: 'tlm', target_name: target_name, scope: scope, token: token)
|
|
56
|
+
stale_time = Time.now.sys.to_nsec_from_epoch - (staleness_sec * Time::NSEC_PER_SECOND)
|
|
57
|
+
stale = []
|
|
58
|
+
targets = []
|
|
59
|
+
if target_name
|
|
60
|
+
targets = [target_name]
|
|
61
|
+
else
|
|
62
|
+
targets = get_target_list()
|
|
63
|
+
end
|
|
64
|
+
targets.each do |target_name|
|
|
65
|
+
get_all_telemetry(target_name, scope: scope).each do |packet|
|
|
66
|
+
topic = "#{scope}__TELEMETRY__{#{target_name}}__#{packet['packet_name']}"
|
|
67
|
+
_, msg_hash = Topic.get_newest_message(topic)
|
|
68
|
+
unless msg_hash && msg_hash['time'].to_i > stale_time
|
|
69
|
+
next if with_limits_only && packet['items'].find { |item| item['limits'] }.nil?
|
|
70
|
+
|
|
71
|
+
stale << [packet['target_name'], packet['packet_name']]
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
stale
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Return an array of arrays indicating all items in the packet that are out of limits
|
|
79
|
+
# [[target name, packet name, item name, item limits state], ...]
|
|
80
|
+
#
|
|
81
|
+
# @return [Array<Array<String, String, String, String>>]
|
|
82
|
+
def get_out_of_limits(scope: $openc3_scope, token: $openc3_token)
|
|
83
|
+
authorize(permission: 'tlm', scope: scope, token: token)
|
|
84
|
+
LimitsEventTopic.out_of_limits(scope: scope)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Get the overall limits state which is the worse case of all limits items.
|
|
88
|
+
# For example if any limits are YELLOW_LOW or YELLOW_HIGH then the overall limits state is YELLOW.
|
|
89
|
+
# If a single limit item then turns RED_HIGH the overall limits state is RED.
|
|
90
|
+
#
|
|
91
|
+
# @param ignored_items [Array<Array<String, String, String|nil>>] Array of [TGT, PKT, ITEM] strings
|
|
92
|
+
# to ignore when determining overall state. Note, ITEM can be nil to indicate to ignore entire packet.
|
|
93
|
+
# @return [String] The overall limits state for the system, one of 'GREEN', 'YELLOW', 'RED'
|
|
94
|
+
def get_overall_limits_state(ignored_items = nil, scope: $openc3_scope, token: $openc3_token)
|
|
95
|
+
# We only need to check out of limits items so call get_out_of_limits() which authorizes
|
|
96
|
+
out_of_limits = get_out_of_limits(scope: scope, token: token)
|
|
97
|
+
overall = 'GREEN'
|
|
98
|
+
limits_packet_stale = false # TODO: Calculate stale
|
|
99
|
+
|
|
100
|
+
# Build easily matchable ignore list
|
|
101
|
+
if ignored_items
|
|
102
|
+
ignored_items.map! do |item|
|
|
103
|
+
raise "Invalid ignored item: #{item}. Must be [TGT, PKT, ITEM] where ITEM can be nil." if item.length != 3
|
|
104
|
+
|
|
105
|
+
item.join('__')
|
|
106
|
+
end
|
|
107
|
+
else
|
|
108
|
+
ignored_items = []
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
out_of_limits.each do |target_name, packet_name, item_name, limits_state|
|
|
112
|
+
# Ignore this item if we match one of the ignored items. Checking against /^#{item}/
|
|
113
|
+
# allows us to detect matches against a TGT__PKT__ with no item defined.
|
|
114
|
+
next if ignored_items.detect { |item| "#{target_name}__#{packet_name}__#{item_name}" =~ /^#{item}/ }
|
|
115
|
+
|
|
116
|
+
case overall
|
|
117
|
+
# If our overall state is currently blue or green we can go to any state
|
|
118
|
+
when 'BLUE', 'GREEN', 'GREEN_HIGH', 'GREEN_LOW'
|
|
119
|
+
overall = limits_state
|
|
120
|
+
# If our overal state is yellow we can only go higher to red
|
|
121
|
+
when 'YELLOW', 'YELLOW_HIGH', 'YELLOW_LOW'
|
|
122
|
+
if limits_state == 'RED' || limits_state == 'RED_HIGH' || limits_state == 'RED_LOW'
|
|
123
|
+
overall = limits_state
|
|
124
|
+
break # Red is as high as we go so no need to look for more
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
overall = 'GREEN' if overall == 'GREEN_HIGH' || overall == 'GREEN_LOW' || overall == 'BLUE'
|
|
129
|
+
overall = 'YELLOW' if overall == 'YELLOW_HIGH' || overall == 'YELLOW_LOW'
|
|
130
|
+
overall = 'RED' if overall == 'RED_HIGH' || overall == 'RED_LOW'
|
|
131
|
+
overall = 'STALE' if (overall == 'GREEN' || overall == 'BLUE') && limits_packet_stale
|
|
132
|
+
return overall
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Whether the limits are enabled for the given item
|
|
136
|
+
#
|
|
137
|
+
# Accepts two different calling styles:
|
|
138
|
+
# limits_enabled?("TGT PKT ITEM")
|
|
139
|
+
# limits_enabled?('TGT','PKT','ITEM')
|
|
140
|
+
#
|
|
141
|
+
# Favor the first syntax where possible as it is more succinct.
|
|
142
|
+
#
|
|
143
|
+
# @param args [String|Array<String>] See the description for calling style
|
|
144
|
+
# @return [Boolean] Whether limits are enable for the itme
|
|
145
|
+
def limits_enabled?(*args, scope: $openc3_scope, token: $openc3_token)
|
|
146
|
+
target_name, packet_name, item_name = tlm_process_args(args, 'limits_enabled?', scope: scope)
|
|
147
|
+
authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
|
|
148
|
+
return TargetModel.packet_item(target_name, packet_name, item_name, scope: scope)['limits']['enabled'] ? true : false
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Enable limits checking for a telemetry item
|
|
152
|
+
#
|
|
153
|
+
# Accepts two different calling styles:
|
|
154
|
+
# enable_limits("TGT PKT ITEM")
|
|
155
|
+
# enable_limits('TGT','PKT','ITEM')
|
|
156
|
+
#
|
|
157
|
+
# Favor the first syntax where possible as it is more succinct.
|
|
158
|
+
#
|
|
159
|
+
# @param args [String|Array<String>] See the description for calling style
|
|
160
|
+
def enable_limits(*args, scope: $openc3_scope, token: $openc3_token)
|
|
161
|
+
target_name, packet_name, item_name = tlm_process_args(args, 'enable_limits', scope: scope)
|
|
162
|
+
authorize(permission: 'tlm_set', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
|
|
163
|
+
packet = TargetModel.packet(target_name, packet_name, scope: scope)
|
|
164
|
+
found_item = nil
|
|
165
|
+
packet['items'].each do |item|
|
|
166
|
+
if item['name'] == item_name
|
|
167
|
+
item['limits']['enabled'] = true
|
|
168
|
+
found_item = item
|
|
169
|
+
break
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
raise "Item '#{target_name} #{packet_name} #{item_name}' does not exist" unless found_item
|
|
173
|
+
|
|
174
|
+
TargetModel.set_packet(target_name, packet_name, packet, scope: scope)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Disable limit checking for a telemetry item
|
|
178
|
+
#
|
|
179
|
+
# Accepts two different calling styles:
|
|
180
|
+
# disable_limits("TGT PKT ITEM")
|
|
181
|
+
# disable_limits('TGT','PKT','ITEM')
|
|
182
|
+
#
|
|
183
|
+
# Favor the first syntax where possible as it is more succinct.
|
|
184
|
+
#
|
|
185
|
+
# @param args [String|Array<String>] See the description for calling style
|
|
186
|
+
def disable_limits(*args, scope: $openc3_scope, token: $openc3_token)
|
|
187
|
+
target_name, packet_name, item_name = tlm_process_args(args, 'disable_limits', scope: scope)
|
|
188
|
+
authorize(permission: 'tlm_set', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
|
|
189
|
+
packet = TargetModel.packet(target_name, packet_name, scope: scope)
|
|
190
|
+
found_item = nil
|
|
191
|
+
packet['items'].each do |item|
|
|
192
|
+
if item['name'] == item_name
|
|
193
|
+
item['limits'].delete('enabled')
|
|
194
|
+
found_item = item
|
|
195
|
+
break
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
raise "Item '#{target_name} #{packet_name} #{item_name}' does not exist" unless found_item
|
|
199
|
+
|
|
200
|
+
TargetModel.set_packet(target_name, packet_name, packet, scope: scope)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Get a Hash of all the limits sets defined for an item. Hash keys are the limit
|
|
204
|
+
# set name in uppercase (note there is always a DEFAULT) and the value is an array
|
|
205
|
+
# of limit values: red low, yellow low, yellow high, red high, <green low, green high>.
|
|
206
|
+
# Green low and green high are optional.
|
|
207
|
+
#
|
|
208
|
+
# For example: {'DEFAULT' => [-80, -70, 60, 80, -20, 20],
|
|
209
|
+
# 'TVAC' => [-25, -10, 50, 55] }
|
|
210
|
+
#
|
|
211
|
+
# @return [Hash{String => Array<Number, Number, Number, Number, Number, Number>}]
|
|
212
|
+
def get_limits(target_name, packet_name, item_name, scope: $openc3_scope, token: $openc3_token)
|
|
213
|
+
authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
|
|
214
|
+
limits = {}
|
|
215
|
+
item = TargetModel.packet_item(target_name, packet_name, item_name, scope: scope)
|
|
216
|
+
item['limits'].each do |key, vals|
|
|
217
|
+
next unless vals.is_a?(Hash)
|
|
218
|
+
|
|
219
|
+
limits[key] = [vals['red_low'], vals['yellow_low'], vals['yellow_high'], vals['red_high']]
|
|
220
|
+
limits[key].concat([vals['green_low'], vals['green_high']]) if vals['green_low']
|
|
221
|
+
end
|
|
222
|
+
return limits
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Change the limits settings for a given item. By default, a new limits set called 'CUSTOM'
|
|
226
|
+
# is created to avoid overriding existing limits.
|
|
227
|
+
def set_limits(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high,
|
|
228
|
+
green_low = nil, green_high = nil, limits_set = :CUSTOM, persistence = nil, enabled = true,
|
|
229
|
+
scope: $openc3_scope, token: $openc3_token)
|
|
230
|
+
authorize(permission: 'tlm_set', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
|
|
231
|
+
if (red_low > yellow_low) || (yellow_low >= yellow_high) || (yellow_high > red_high)
|
|
232
|
+
raise "Invalid limits specified. Ensure yellow limits are within red limits."
|
|
233
|
+
end
|
|
234
|
+
if (green_low && green_high) && ((yellow_low > green_low) || (green_low >= green_high) || (green_high > yellow_high))
|
|
235
|
+
raise "Invalid limits specified. Ensure green limits are within yellow limits."
|
|
236
|
+
end
|
|
237
|
+
packet = TargetModel.packet(target_name, packet_name, scope: scope)
|
|
238
|
+
found_item = nil
|
|
239
|
+
packet['items'].each do |item|
|
|
240
|
+
if item['name'] == item_name
|
|
241
|
+
item['limits']['persistence_setting'] = persistence
|
|
242
|
+
if enabled
|
|
243
|
+
item['limits']['enabled'] = true
|
|
244
|
+
else
|
|
245
|
+
item['limits'].delete('enabled')
|
|
246
|
+
end
|
|
247
|
+
limits = {}
|
|
248
|
+
limits['red_low'] = red_low
|
|
249
|
+
limits['yellow_low'] = yellow_low
|
|
250
|
+
limits['yellow_high'] = yellow_high
|
|
251
|
+
limits['red_high'] = red_high
|
|
252
|
+
limits['green_low'] = green_low if green_low && green_high
|
|
253
|
+
limits['green_high'] = green_high if green_low && green_high
|
|
254
|
+
item['limits'][limits_set] = limits
|
|
255
|
+
found_item = item
|
|
256
|
+
break
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
raise "Item '#{target_name} #{packet_name} #{item_name}' does not exist" unless found_item
|
|
260
|
+
message = "Setting '#{target_name} #{packet_name} #{item_name}' limits to #{red_low} #{yellow_low} #{yellow_high} #{red_high}"
|
|
261
|
+
message << " #{green_low} #{green_high}" if green_low && green_high
|
|
262
|
+
message << " in set #{limits_set} with persistence #{persistence} as enabled #{enabled}"
|
|
263
|
+
Logger.info(message)
|
|
264
|
+
|
|
265
|
+
TargetModel.set_packet(target_name, packet_name, packet, scope: scope)
|
|
266
|
+
|
|
267
|
+
event = { type: :LIMITS_SETTINGS, target_name: target_name, packet_name: packet_name,
|
|
268
|
+
item_name: item_name, red_low: red_low, yellow_low: yellow_low, yellow_high: yellow_high, red_high: red_high,
|
|
269
|
+
green_low: green_low, green_high: green_high, limits_set: limits_set, persistence: persistence, enabled: enabled,
|
|
270
|
+
time_nsec: Time.now.to_nsec_from_epoch, message: message }
|
|
271
|
+
LimitsEventTopic.write(event, scope: scope)
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
# Returns all limits_groups and their members
|
|
275
|
+
# @since 5.0.0 Returns hash with values
|
|
276
|
+
# @return [Hash{String => Array<Array<String, String, String>>]
|
|
277
|
+
def get_limits_groups(scope: $openc3_scope, token: $openc3_token)
|
|
278
|
+
authorize(permission: 'tlm', scope: scope, token: token)
|
|
279
|
+
TargetModel.limits_groups(scope: scope)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# Enables limits for all the items in the group
|
|
283
|
+
#
|
|
284
|
+
# @param group_name [String] Name of the group to enable
|
|
285
|
+
def enable_limits_group(group_name, scope: $openc3_scope, token: $openc3_token)
|
|
286
|
+
_limits_group(group_name, action: :enable, scope: scope, token: token)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Disables limits for all the items in the group
|
|
290
|
+
#
|
|
291
|
+
# @param group_name [String] Name of the group to disable
|
|
292
|
+
def disable_limits_group(group_name, scope: $openc3_scope, token: $openc3_token)
|
|
293
|
+
_limits_group(group_name, action: :disable, scope: scope, token: token)
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Returns all defined limits sets
|
|
297
|
+
#
|
|
298
|
+
# @return [Array<String>] All defined limits sets
|
|
299
|
+
def get_limits_sets(scope: $openc3_scope, token: $openc3_token)
|
|
300
|
+
authorize(permission: 'tlm', scope: scope, token: token)
|
|
301
|
+
LimitsEventTopic.sets(scope: scope).keys
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Changes the active limits set that applies to all telemetry
|
|
305
|
+
#
|
|
306
|
+
# @param limits_set [String] The name of the limits set
|
|
307
|
+
def set_limits_set(limits_set, scope: $openc3_scope, token: $openc3_token)
|
|
308
|
+
authorize(permission: 'tlm_set', scope: scope, token: token)
|
|
309
|
+
message = "Setting Limits Set: #{limits_set}"
|
|
310
|
+
Logger.info(message)
|
|
311
|
+
LimitsEventTopic.write({ type: :LIMITS_SET, set: limits_set.to_s,
|
|
312
|
+
time_nsec: Time.now.to_nsec_from_epoch, message: message }, scope: scope)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# Returns the active limits set that applies to all telemetry
|
|
316
|
+
#
|
|
317
|
+
# @return [String] The current limits set
|
|
318
|
+
def get_limits_set(scope: $openc3_scope, token: $openc3_token)
|
|
319
|
+
authorize(permission: 'tlm', scope: scope, token: token)
|
|
320
|
+
LimitsEventTopic.current_set(scope: scope)
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
# Returns limits events starting at the provided offset. Passing nil for an
|
|
324
|
+
# offset will return the last received limits event and associated offset.
|
|
325
|
+
#
|
|
326
|
+
# @param offset [Integer] Offset to start reading limits events. Nil to return
|
|
327
|
+
# the last received limits event (if any).
|
|
328
|
+
# @param count [Integer] The total number of events returned. Default is 100.
|
|
329
|
+
# @return [Hash, Integer] Event hash followed by the offset. The offset can
|
|
330
|
+
# be used in subsequent calls to return events from where the last call left off.
|
|
331
|
+
def get_limits_events(offset = nil, count: 100, scope: $openc3_scope, token: $openc3_token)
|
|
332
|
+
authorize(permission: 'tlm', scope: scope, token: token)
|
|
333
|
+
LimitsEventTopic.read(offset, count: count, scope: scope)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
###########################################################################
|
|
337
|
+
# PRIVATE implementation details
|
|
338
|
+
###########################################################################
|
|
339
|
+
|
|
340
|
+
def _limits_group(group_name, action:, scope:, token:)
|
|
341
|
+
authorize(permission: 'tlm_set', scope: scope, token: token)
|
|
342
|
+
group_name.upcase!
|
|
343
|
+
group = get_limits_groups()[group_name]
|
|
344
|
+
raise "LIMITS_GROUP #{group_name} undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP #{group_name}" unless group
|
|
345
|
+
|
|
346
|
+
Logger.info("Disabling Limits Group: #{group_name}")
|
|
347
|
+
last_target_name = nil
|
|
348
|
+
last_packet_name = nil
|
|
349
|
+
packet = nil
|
|
350
|
+
group.sort.each do |target_name, packet_name, item_name|
|
|
351
|
+
if last_target_name != target_name || last_packet_name != packet_name
|
|
352
|
+
if last_target_name && last_packet_name
|
|
353
|
+
TargetModel.set_packet(last_target_name, last_packet_name, packet, scope: scope)
|
|
354
|
+
end
|
|
355
|
+
packet = TargetModel.packet(target_name, packet_name, scope: scope)
|
|
356
|
+
end
|
|
357
|
+
packet['items'].each do |item|
|
|
358
|
+
if item['name'] == item_name
|
|
359
|
+
if action == :enable
|
|
360
|
+
item['limits']['enabled'] = true
|
|
361
|
+
elsif action == :disable
|
|
362
|
+
item['limits'].delete('enabled')
|
|
363
|
+
end
|
|
364
|
+
break
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
last_target_name = target_name
|
|
368
|
+
last_packet_name = packet_name
|
|
369
|
+
end
|
|
370
|
+
if last_target_name && last_packet_name
|
|
371
|
+
TargetModel.set_packet(last_target_name, last_packet_name, packet, scope: scope)
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
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/models/router_model'
|
|
21
|
+
require 'openc3/models/router_status_model'
|
|
22
|
+
require 'openc3/topics/router_topic'
|
|
23
|
+
|
|
24
|
+
module OpenC3
|
|
25
|
+
module Api
|
|
26
|
+
WHITELIST ||= []
|
|
27
|
+
WHITELIST.concat([
|
|
28
|
+
'get_router',
|
|
29
|
+
'get_router_names',
|
|
30
|
+
'connect_router',
|
|
31
|
+
'disconnect_router',
|
|
32
|
+
'start_raw_logging_router',
|
|
33
|
+
'stop_raw_logging_router',
|
|
34
|
+
'get_all_router_info',
|
|
35
|
+
])
|
|
36
|
+
|
|
37
|
+
# Get information about a router
|
|
38
|
+
#
|
|
39
|
+
# @param router_name [String] Router name
|
|
40
|
+
# @return [Hash] Hash of all the router information
|
|
41
|
+
def get_router(router_name, scope: $openc3_scope, token: $openc3_token)
|
|
42
|
+
authorize(permission: 'system', router_name: router_name, scope: scope, token: token)
|
|
43
|
+
router = RouterModel.get(name: router_name, scope: scope)
|
|
44
|
+
raise "Router '#{router_name}' does not exist" unless router
|
|
45
|
+
|
|
46
|
+
router.merge(RouterStatusModel.get(name: router_name, scope: scope))
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @return [Array<String>] All the router names
|
|
50
|
+
def get_router_names(scope: $openc3_scope, token: $openc3_token)
|
|
51
|
+
authorize(permission: 'system', scope: scope, token: token)
|
|
52
|
+
RouterModel.names(scope: scope)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Connects a router and starts its command gathering thread
|
|
56
|
+
#
|
|
57
|
+
# @param router_name [String] Name of router
|
|
58
|
+
# @param params [Array] Parameters to pass to the router.
|
|
59
|
+
def connect_router(router_name, *params, scope: $openc3_scope, token: $openc3_token)
|
|
60
|
+
authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
|
|
61
|
+
RouterTopic.connect_router(router_name, scope: scope)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Disconnects a router and kills its command gathering thread
|
|
65
|
+
#
|
|
66
|
+
# @param router_name [String] Name of router
|
|
67
|
+
def disconnect_router(router_name, scope: $openc3_scope, token: $openc3_token)
|
|
68
|
+
authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
|
|
69
|
+
RouterTopic.disconnect_router(router_name, scope: scope)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Starts raw logging for a router
|
|
73
|
+
#
|
|
74
|
+
# @param router_name [String] The name of the interface
|
|
75
|
+
def start_raw_logging_router(router_name = 'ALL', scope: $openc3_scope, token: $openc3_token)
|
|
76
|
+
authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
|
|
77
|
+
if router_name == 'ALL'
|
|
78
|
+
get_router_names().each do |router_name|
|
|
79
|
+
RouterTopic.start_raw_logging(router_name, scope: scope)
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
RouterTopic.start_raw_logging(router_name, scope: scope)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Stop raw logging for a router
|
|
87
|
+
#
|
|
88
|
+
# @param router_name [String] The name of the interface
|
|
89
|
+
def stop_raw_logging_router(router_name = 'ALL', scope: $openc3_scope, token: $openc3_token)
|
|
90
|
+
authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
|
|
91
|
+
if router_name == 'ALL'
|
|
92
|
+
get_router_names().each do |router_name|
|
|
93
|
+
RouterTopic.stop_raw_logging(router_name, scope: scope)
|
|
94
|
+
end
|
|
95
|
+
else
|
|
96
|
+
RouterTopic.stop_raw_logging(router_name, scope: scope)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Consolidate all router info into a single API call
|
|
101
|
+
#
|
|
102
|
+
# @return [Array<Array<String, Numeric, Numeric, Numeric, Numeric, Numeric,
|
|
103
|
+
# Numeric, Numeric>>] Array of Arrays containing \[name, state, num clients,
|
|
104
|
+
# TX queue size, RX queue size, TX bytes, RX bytes, Command count,
|
|
105
|
+
# Telemetry count] for all routers
|
|
106
|
+
def get_all_router_info(scope: $openc3_scope, token: $openc3_token)
|
|
107
|
+
authorize(permission: 'system', scope: scope, token: token)
|
|
108
|
+
info = []
|
|
109
|
+
RouterStatusModel.all(scope: scope).each do |router_name, router|
|
|
110
|
+
info << [router['name'], router['state'], router['clients'], router['txsize'], router['rxsize'],\
|
|
111
|
+
router['txbytes'], router['rxbytes'], router['rxcnt'], router['txcnt']]
|
|
112
|
+
end
|
|
113
|
+
info.sort! { |a, b| a[0] <=> b[0] }
|
|
114
|
+
info
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
module OpenC3
|
|
21
|
+
module Api
|
|
22
|
+
WHITELIST ||= []
|
|
23
|
+
WHITELIST.concat([
|
|
24
|
+
'list_settings',
|
|
25
|
+
'get_all_settings',
|
|
26
|
+
'get_setting',
|
|
27
|
+
'get_settings',
|
|
28
|
+
'save_setting'
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
def list_settings(scope: $openc3_scope, token: $openc3_token)
|
|
32
|
+
authorize(permission: 'system', scope: scope, token: token)
|
|
33
|
+
SettingsModel.names(scope: scope)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def get_all_settings(scope: $openc3_scope, token: $openc3_token)
|
|
37
|
+
authorize(permission: 'system', scope: scope, token: token)
|
|
38
|
+
SettingsModel.all(scope: scope)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def get_setting(name, scope: $openc3_scope, token: $openc3_token)
|
|
42
|
+
authorize(permission: 'system', scope: scope, token: token)
|
|
43
|
+
setting = SettingsModel.get(name: name, scope: scope)
|
|
44
|
+
if setting
|
|
45
|
+
return setting["data"]
|
|
46
|
+
else
|
|
47
|
+
return nil
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def get_settings(*args, scope: $openc3_scope, token: $openc3_token)
|
|
52
|
+
authorize(permission: 'system', scope: scope, token: token)
|
|
53
|
+
ret = []
|
|
54
|
+
args.each do |name|
|
|
55
|
+
setting = SettingsModel.get(name: name, scope: scope)
|
|
56
|
+
if setting
|
|
57
|
+
ret << setting["data"]
|
|
58
|
+
else
|
|
59
|
+
ret << nil
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
return ret
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def save_setting(name, data, scope: $openc3_scope, token: $openc3_token)
|
|
66
|
+
authorize(permission: 'admin', scope: scope, token: token)
|
|
67
|
+
SettingsModel.set({ name: name, data: data }, scope: scope)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
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/models/target_model'
|
|
21
|
+
|
|
22
|
+
module OpenC3
|
|
23
|
+
module Api
|
|
24
|
+
WHITELIST ||= []
|
|
25
|
+
WHITELIST.concat([
|
|
26
|
+
'get_target_list',
|
|
27
|
+
'get_target',
|
|
28
|
+
'get_all_target_info',
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
# Returns the list of all target names
|
|
32
|
+
#
|
|
33
|
+
# @return [Array<String>] All target names
|
|
34
|
+
def get_target_list(scope: $openc3_scope, token: $openc3_token)
|
|
35
|
+
authorize(permission: 'tlm', scope: scope, token: token)
|
|
36
|
+
TargetModel.names(scope: scope)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Gets the full target hash
|
|
40
|
+
#
|
|
41
|
+
# @since 5.0.0
|
|
42
|
+
# @param target_name [String] Target name
|
|
43
|
+
# @return [Hash] Hash of all the target properties
|
|
44
|
+
def get_target(target_name, scope: $openc3_scope, token: $openc3_token)
|
|
45
|
+
authorize(permission: 'system', target_name: target_name, scope: scope, token: token)
|
|
46
|
+
TargetModel.get(name: target_name, scope: scope)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Get information about all targets
|
|
50
|
+
#
|
|
51
|
+
# @return [Array<Array<String, Numeric, Numeric>] Array of Arrays \[name, interface, cmd_cnt, tlm_cnt]
|
|
52
|
+
def get_all_target_info(scope: $openc3_scope, token: $openc3_token)
|
|
53
|
+
authorize(permission: 'system', scope: scope, token: token)
|
|
54
|
+
info = []
|
|
55
|
+
get_target_list(scope: scope, token: token).each do |target_name|
|
|
56
|
+
cmd_cnt = 0
|
|
57
|
+
packets = TargetModel.packets(target_name, type: :CMD, scope: scope)
|
|
58
|
+
packets.each do |packet|
|
|
59
|
+
cmd_cnt += Topic.get_cnt("#{scope}__COMMAND__{#{target_name}}__#{packet['packet_name']}")
|
|
60
|
+
end
|
|
61
|
+
tlm_cnt = 0
|
|
62
|
+
packets = TargetModel.packets(target_name, type: :TLM, scope: scope)
|
|
63
|
+
packets.each do |packet|
|
|
64
|
+
tlm_cnt += Topic.get_cnt("#{scope}__TELEMETRY__{#{target_name}}__#{packet['packet_name']}")
|
|
65
|
+
end
|
|
66
|
+
interface_name = ''
|
|
67
|
+
InterfaceModel.all(scope: scope).each do |name, interface|
|
|
68
|
+
if interface['target_names'].include? target_name
|
|
69
|
+
interface_name = interface['name']
|
|
70
|
+
break
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
info << [target_name, interface_name, cmd_cnt, tlm_cnt]
|
|
74
|
+
end
|
|
75
|
+
info
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|