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,237 @@
|
|
|
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 'redis'
|
|
21
|
+
require 'json'
|
|
22
|
+
require 'connection_pool'
|
|
23
|
+
|
|
24
|
+
if ENV['OPENC3_REDIS_CLUSTER']
|
|
25
|
+
require 'openc3-enterprise/utilities/store'
|
|
26
|
+
$openc3_enterprise = true
|
|
27
|
+
else
|
|
28
|
+
$openc3_enterprise = false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module OpenC3
|
|
32
|
+
class Store
|
|
33
|
+
# Variable that holds the singleton instance
|
|
34
|
+
@instance = nil
|
|
35
|
+
|
|
36
|
+
# Mutex used to ensure that only one instance is created
|
|
37
|
+
@@instance_mutex = Mutex.new
|
|
38
|
+
|
|
39
|
+
attr_reader :redis_url
|
|
40
|
+
attr_reader :redis_pool
|
|
41
|
+
|
|
42
|
+
# Get the singleton instance
|
|
43
|
+
def self.instance(pool_size = 100)
|
|
44
|
+
# Logger.level = Logger::DEBUG
|
|
45
|
+
return @instance if @instance
|
|
46
|
+
|
|
47
|
+
@@instance_mutex.synchronize do
|
|
48
|
+
@instance ||= self.new(pool_size)
|
|
49
|
+
return @instance
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
if RUBY_VERSION < "3"
|
|
54
|
+
# Delegate all unknown class methods to delegate to the instance
|
|
55
|
+
def self.method_missing(message, *args, &block)
|
|
56
|
+
self.instance.public_send(message, *args, &block)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Delegate all unknown methods to redis through the @redis_pool
|
|
60
|
+
def method_missing(message, *args, &block)
|
|
61
|
+
@redis_pool.with { |redis| redis.public_send(message, *args, &block) }
|
|
62
|
+
end
|
|
63
|
+
else
|
|
64
|
+
# Delegate all unknown class methods to delegate to the instance
|
|
65
|
+
def self.method_missing(message, *args, **kwargs, &block)
|
|
66
|
+
self.instance.public_send(message, *args, **kwargs, &block)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Delegate all unknown methods to redis through the @redis_pool
|
|
70
|
+
def method_missing(message, *args, **kwargs, &block)
|
|
71
|
+
@redis_pool.with { |redis| redis.public_send(message, *args, **kwargs, &block) }
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def initialize(pool_size = 10)
|
|
76
|
+
Redis.exists_returns_integer = true
|
|
77
|
+
@redis_username = ENV['OPENC3_REDIS_USERNAME']
|
|
78
|
+
@redis_key = ENV['OPENC3_REDIS_PASSWORD']
|
|
79
|
+
@redis_url = "redis://#{ENV['OPENC3_REDIS_HOSTNAME']}:#{ENV['OPENC3_REDIS_PORT']}"
|
|
80
|
+
@redis_pool = ConnectionPool.new(size: pool_size) { build_redis() }
|
|
81
|
+
@topic_offsets = {}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
unless $openc3_enterprise
|
|
85
|
+
def build_redis
|
|
86
|
+
return Redis.new(url: @redis_url, username: @redis_username, password: @redis_key)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
###########################################################################
|
|
91
|
+
# Stream APIs
|
|
92
|
+
###########################################################################
|
|
93
|
+
|
|
94
|
+
def initialize_streams(topics)
|
|
95
|
+
@redis_pool.with do |redis|
|
|
96
|
+
topics.each do |topic|
|
|
97
|
+
# Create empty stream with maxlen 0
|
|
98
|
+
redis.xadd(topic, { a: 'b' }, maxlen: 0)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def get_oldest_message(topic)
|
|
104
|
+
@redis_pool.with do |redis|
|
|
105
|
+
result = redis.xrange(topic, count: 1)
|
|
106
|
+
if result and result.length > 0
|
|
107
|
+
return result[0]
|
|
108
|
+
else
|
|
109
|
+
return nil
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def get_newest_message(topic)
|
|
115
|
+
@redis_pool.with do |redis|
|
|
116
|
+
# Default in xrevrange is range end '+', start '-' which means get all
|
|
117
|
+
# elements from higher ID to lower ID and since we're limiting to 1
|
|
118
|
+
# we get the last element. See https://redis.io/commands/xrevrange.
|
|
119
|
+
result = redis.xrevrange(topic, count: 1)
|
|
120
|
+
if result and result.length > 0
|
|
121
|
+
return result[0]
|
|
122
|
+
else
|
|
123
|
+
return nil
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def get_last_offset(topic)
|
|
129
|
+
@redis_pool.with do |redis|
|
|
130
|
+
result = redis.xrevrange(topic, count: 1)
|
|
131
|
+
if result and result[0] and result[0][0]
|
|
132
|
+
result[0][0]
|
|
133
|
+
else
|
|
134
|
+
"0-0"
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def update_topic_offsets(topics)
|
|
140
|
+
offsets = []
|
|
141
|
+
topics.each do |topic|
|
|
142
|
+
# Normally we will just be grabbing the topic offset
|
|
143
|
+
# this allows xread to get everything past this point
|
|
144
|
+
last_id = @topic_offsets[topic]
|
|
145
|
+
if last_id
|
|
146
|
+
offsets << last_id
|
|
147
|
+
else
|
|
148
|
+
# If there is no topic offset this is the first call.
|
|
149
|
+
# Get the last offset ID so we'll start getting everything from now on
|
|
150
|
+
offsets << get_last_offset(topic)
|
|
151
|
+
@topic_offsets[topic] = offsets[-1]
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
return offsets
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
unless $openc3_enterprise
|
|
158
|
+
def read_topics(topics, offsets = nil, timeout_ms = 1000, count = nil)
|
|
159
|
+
# Logger.debug "read_topics: #{topics}, #{offsets} pool:#{@redis_pool}"
|
|
160
|
+
@redis_pool.with do |redis|
|
|
161
|
+
offsets = update_topic_offsets(topics) unless offsets
|
|
162
|
+
result = redis.xread(topics, offsets, block: timeout_ms, count: count)
|
|
163
|
+
if result and result.length > 0
|
|
164
|
+
result.each do |topic, messages|
|
|
165
|
+
messages.each do |msg_id, msg_hash|
|
|
166
|
+
@topic_offsets[topic] = msg_id
|
|
167
|
+
yield topic, msg_id, msg_hash, redis if block_given?
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
# Logger.debug "result:#{result}" if result and result.length > 0
|
|
172
|
+
return result
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Add new entry to the redis stream.
|
|
178
|
+
# > https://www.rubydoc.info/github/redis/redis-rb/Redis:xadd
|
|
179
|
+
#
|
|
180
|
+
# @example Without options
|
|
181
|
+
# store.write_topic('MANGO__TOPIC', {'message' => 'something'})
|
|
182
|
+
# @example With options
|
|
183
|
+
# store.write_topic('MANGO__TOPIC', {'message' => 'something'}, id: '0-0', maxlen: 1000, approximate: true)
|
|
184
|
+
#
|
|
185
|
+
# @param topic [String] the stream / topic
|
|
186
|
+
# @param msg_hash [Hash] one or multiple field-value pairs
|
|
187
|
+
#
|
|
188
|
+
# @option opts [String] :id the entry id, default value is `*`, it means auto generation,
|
|
189
|
+
# if `nil` id is passed it will be changed to `*`
|
|
190
|
+
# @option opts [Integer] :maxlen max length of entries, default value is `nil`, it means will grow forever
|
|
191
|
+
# @option opts [Boolean] :approximate whether to add `~` modifier of maxlen or not, default value is `true`
|
|
192
|
+
#
|
|
193
|
+
# @return [String] the entry id
|
|
194
|
+
def write_topic(topic, msg_hash, id = '*', maxlen = nil, approximate = true)
|
|
195
|
+
id = '*' if id.nil?
|
|
196
|
+
# Logger.debug "write_topic topic:#{topic} id:#{id} hash:#{msg_hash}"
|
|
197
|
+
@redis_pool.with do |redis|
|
|
198
|
+
return redis.xadd(topic, msg_hash, id: id, maxlen: maxlen, approximate: approximate)
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# Trims older entries of the redis stream if needed.
|
|
203
|
+
# > https://www.rubydoc.info/github/redis/redis-rb/Redis:xtrim
|
|
204
|
+
#
|
|
205
|
+
# @example Without options
|
|
206
|
+
# store.trim_topic('MANGO__TOPIC', 1000)
|
|
207
|
+
# @example With options
|
|
208
|
+
# store.trim_topic('MANGO__TOPIC', 1000, approximate: true, limit: 0)
|
|
209
|
+
#
|
|
210
|
+
# @param topic [String] the stream key
|
|
211
|
+
# @param minid [Integer] mid id length of entries to trim
|
|
212
|
+
# @param limit [Boolean] whether to add `~` modifier of maxlen or not
|
|
213
|
+
#
|
|
214
|
+
# @return [Integer] the number of entries actually deleted
|
|
215
|
+
def trim_topic(topic, minid, approximate = true, limit: 0)
|
|
216
|
+
@redis_pool.with do |redis|
|
|
217
|
+
return redis.xtrim_minid(topic, minid, approximate: approximate, limit: limit)
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
class EphemeralStore < Store
|
|
223
|
+
def initialize(pool_size = 10)
|
|
224
|
+
super(pool_size)
|
|
225
|
+
@redis_url = "redis://#{ENV['OPENC3_REDIS_EPHEMERAL_HOSTNAME']}:#{ENV['OPENC3_REDIS_EPHEMERAL_PORT']}"
|
|
226
|
+
@redis_pool = ConnectionPool.new(size: pool_size) { build_redis() }
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
class Redis
|
|
232
|
+
def xtrim_minid(key, minid, approximate: true, limit: nil)
|
|
233
|
+
args = [:xtrim, key, :MINID, (approximate ? '~' : nil), minid].compact
|
|
234
|
+
args.concat([:LIMIT, limit]) if limit
|
|
235
|
+
synchronize { |client| client.call(args) }
|
|
236
|
+
end
|
|
237
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
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 'zip'
|
|
21
|
+
require 'zip/filesystem'
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
autoload(:Logger, 'openc3/utilities/logger.rb')
|
|
22
|
+
autoload(:Authorization, 'openc3/utilities/authorization.rb')
|
|
23
|
+
autoload(:Store, 'openc3/utilities/store_autoload.rb')
|
|
24
|
+
autoload(:Sleeper, 'openc3/utilities/sleeper.rb')
|
|
25
|
+
autoload(:Crc, 'openc3/utilities/crc.rb')
|
|
26
|
+
autoload(:Crc16, 'openc3/utilities/crc.rb')
|
|
27
|
+
autoload(:Crc32, 'openc3/utilities/crc.rb')
|
|
28
|
+
autoload(:Crc64, 'openc3/utilities/crc.rb')
|
|
29
|
+
autoload(:Csv, 'openc3/utilities/csv.rb')
|
|
30
|
+
autoload(:Metric, 'openc3/utilities/metric.rb')
|
|
31
|
+
autoload(:MessageLog, 'openc3/utilities/message_log.rb')
|
|
32
|
+
autoload(:Quaternion, 'openc3/utilities/quaternion.rb')
|
|
33
|
+
autoload(:SimulatedTarget, 'openc3/utilities/simulated_target.rb')
|
|
34
|
+
end
|
|
35
|
+
autoload(:RubyLexUtils, 'openc3/utilities/ruby_lex_utils.rb')
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
OPENC3_VERSION = '5.0.6'
|
|
4
|
+
module OpenC3
|
|
5
|
+
module Version
|
|
6
|
+
MAJOR = '5'
|
|
7
|
+
MINOR = '0'
|
|
8
|
+
PATCH = '6'
|
|
9
|
+
OTHER = ''
|
|
10
|
+
BUILD = 'a855874ec4d38adb28e024dd53f9094b9d0c4574'
|
|
11
|
+
end
|
|
12
|
+
VERSION = '5.0.6'
|
|
13
|
+
GEM_VERSION = '5.0.6'
|
|
14
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
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 'win32ole'
|
|
21
|
+
require 'fileutils'
|
|
22
|
+
|
|
23
|
+
module OpenC3
|
|
24
|
+
# Open an Excel spreadsheet and build an easily manipulated spreadsheet in ruby
|
|
25
|
+
class ExcelSpreadsheet
|
|
26
|
+
attr_reader :worksheets
|
|
27
|
+
|
|
28
|
+
# Class to allow easy manipulation to the data in an Excel worksheet
|
|
29
|
+
class ExcelWorksheet
|
|
30
|
+
attr_reader :name, :num_rows, :num_columns, :data
|
|
31
|
+
|
|
32
|
+
# @param worksheet [WIN32OLE] The underlying Excel worksheet object
|
|
33
|
+
def initialize(worksheet)
|
|
34
|
+
@name = worksheet.name
|
|
35
|
+
@num_rows = worksheet.UsedRange.rows.count
|
|
36
|
+
@num_columns = worksheet.UsedRange.columns.count
|
|
37
|
+
|
|
38
|
+
# Get Excel Data from Worksheet
|
|
39
|
+
@data = worksheet.UsedRange.value
|
|
40
|
+
|
|
41
|
+
# Build a lookup table based on the first column
|
|
42
|
+
@lkup = {}
|
|
43
|
+
if @data
|
|
44
|
+
@data.each do |row|
|
|
45
|
+
@lkup[row[0]] = row[1..-1]
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def keys
|
|
51
|
+
@lkup.keys
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Access the lookup values by string or the raw data by index
|
|
55
|
+
#
|
|
56
|
+
# @param index [String|Integer] Name of the first column or index
|
|
57
|
+
# @return [ExcelWorksheet] The data in that row
|
|
58
|
+
def [](index)
|
|
59
|
+
if index.is_a? String
|
|
60
|
+
@lkup[index]
|
|
61
|
+
else
|
|
62
|
+
@data[index]
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @param filename [String] Name of the Excel file to open
|
|
68
|
+
# @param archive [true|String] If true, create an archive file in the
|
|
69
|
+
# default system LOGS directory. If an absolute path, create the
|
|
70
|
+
# archive file in the specified path.
|
|
71
|
+
def initialize(filename, archive: nil)
|
|
72
|
+
if archive
|
|
73
|
+
time = Time.now.sys
|
|
74
|
+
timestamp = sprintf("%04u_%02u_%02u_%02u_%02u_%02u", time.year, time.month, time.mday, time.hour, time.min, time.sec)
|
|
75
|
+
# If archive is true we use the system LOGS path
|
|
76
|
+
if archive == true
|
|
77
|
+
archive = OpenC3::System.paths['LOGS']
|
|
78
|
+
end
|
|
79
|
+
archive = File.join(archive, "#{timestamp}_#{File.basename(filename)}")
|
|
80
|
+
FileUtils.cp filename, archive
|
|
81
|
+
File.chmod(0444, archive) # Mark read-only
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
begin
|
|
85
|
+
excel = WIN32OLE.new('excel.application')
|
|
86
|
+
excel.visible = false
|
|
87
|
+
wb = excel.workbooks.open(filename)
|
|
88
|
+
|
|
89
|
+
@worksheets = []
|
|
90
|
+
@lkup = {}
|
|
91
|
+
count = wb.worksheets.count
|
|
92
|
+
count.times do |index|
|
|
93
|
+
ws = wb.worksheets(index + 1)
|
|
94
|
+
@worksheets << ExcelWorksheet.new(ws)
|
|
95
|
+
@lkup[ws.name] = @worksheets[-1]
|
|
96
|
+
end
|
|
97
|
+
ensure
|
|
98
|
+
if excel
|
|
99
|
+
excel.DisplayAlerts = false
|
|
100
|
+
excel.quit
|
|
101
|
+
end
|
|
102
|
+
excel = nil
|
|
103
|
+
GC.start
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# @return [Array<String>] Array of all the worksheet names
|
|
108
|
+
def keys
|
|
109
|
+
@lkup.keys
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Access a worksheet by passing in the name or index
|
|
113
|
+
#
|
|
114
|
+
# @param index [String|Integer] Name of the worksheet or index
|
|
115
|
+
# @return [ExcelWorksheet] The worksheet object
|
|
116
|
+
def [](index)
|
|
117
|
+
if index.is_a? String
|
|
118
|
+
@lkup[index]
|
|
119
|
+
else
|
|
120
|
+
@worksheets[index]
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
module ExcelColumnConstants
|
|
126
|
+
index = 0
|
|
127
|
+
('A'..'IV').each do |value|
|
|
128
|
+
self.const_set(value, index)
|
|
129
|
+
index += 1
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|