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,333 @@
|
|
|
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'
|
|
21
|
+
require 'openc3/tools/table_manager/table_config'
|
|
22
|
+
|
|
23
|
+
module OpenC3
|
|
24
|
+
# Provides the low level Table Manager methods which do not require a GUI.
|
|
25
|
+
class TableManagerCore
|
|
26
|
+
# Generic error raised when a more specific error doesn't work
|
|
27
|
+
class CoreError < StandardError
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Raised when opening a file that is either larger or smaller than its definition
|
|
31
|
+
class MismatchError < CoreError
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.binary(binary, definition_filename, table_name)
|
|
35
|
+
config = TableConfig.process_file(definition_filename)
|
|
36
|
+
load_binary(config, binary)
|
|
37
|
+
return config.table(table_name).buffer
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.definition(definition_filename, table_name)
|
|
41
|
+
config = TableConfig.process_file(definition_filename)
|
|
42
|
+
return config.definition(table_name) # This returns an array: [filename, contents]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.report(binary, definition_filename, requested_table_name = nil)
|
|
46
|
+
report = StringIO.new
|
|
47
|
+
config = TableConfig.process_file(definition_filename)
|
|
48
|
+
begin
|
|
49
|
+
load_binary(config, binary)
|
|
50
|
+
rescue CoreError => err
|
|
51
|
+
report.puts "Error: #{err.message}\n"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
config.tables.each do |table_name, table|
|
|
55
|
+
next if requested_table_name && table_name != requested_table_name
|
|
56
|
+
items = table.sorted_items
|
|
57
|
+
report.puts(table.table_name)
|
|
58
|
+
|
|
59
|
+
# Write the column headers
|
|
60
|
+
if table.type == :ROW_COLUMN
|
|
61
|
+
columns = ['Item']
|
|
62
|
+
|
|
63
|
+
# Remove the '0' from the 'itemname0'
|
|
64
|
+
table.num_columns.times.each do |x|
|
|
65
|
+
columns << items[x].name[0...-1]
|
|
66
|
+
end
|
|
67
|
+
report.puts columns.join(', ')
|
|
68
|
+
else
|
|
69
|
+
report.puts 'Label, Value'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Write the table item values
|
|
73
|
+
(0...table.num_rows).each do |r|
|
|
74
|
+
if table.type == :ROW_COLUMN
|
|
75
|
+
rowtext = "#{r + 1}"
|
|
76
|
+
else
|
|
77
|
+
rowtext = items[r].name
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
report.write "#{rowtext}, "
|
|
81
|
+
(0...table.num_columns).each do |c|
|
|
82
|
+
if table.type == :ROW_COLUMN
|
|
83
|
+
table_item = items[c + r * table.num_columns]
|
|
84
|
+
else
|
|
85
|
+
table_item = items[r]
|
|
86
|
+
end
|
|
87
|
+
value = table.read(table_item.name, :FORMATTED)
|
|
88
|
+
if value.is_printable?
|
|
89
|
+
report.write "#{value}, "
|
|
90
|
+
else
|
|
91
|
+
report.write "#{value.simple_formatted}, "
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
report.write("\n") # newline after each row
|
|
95
|
+
end
|
|
96
|
+
report.write("\n") # newline after each table
|
|
97
|
+
end
|
|
98
|
+
report.string
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.generate(definition_filename)
|
|
102
|
+
config = TableConfig.process_file(definition_filename)
|
|
103
|
+
binary = ''
|
|
104
|
+
config.tables.each do |table_name, table|
|
|
105
|
+
table.restore_defaults
|
|
106
|
+
binary += table.buffer
|
|
107
|
+
end
|
|
108
|
+
binary
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def self.save(definition_filename, tables)
|
|
112
|
+
config = TableConfig.process_file(definition_filename)
|
|
113
|
+
tables.each do |table|
|
|
114
|
+
table_def = config.tables[table['name']]
|
|
115
|
+
table['rows'].each do |row|
|
|
116
|
+
row.each do |item|
|
|
117
|
+
# TODO: I don't know how the frontend could edit an item like this:
|
|
118
|
+
# item:{"name"=>"BINARY", "value"=>{"json_class"=>"String", "raw"=>[222, 173, 190, 239]} }
|
|
119
|
+
next if item['value'].is_a? Hash
|
|
120
|
+
table_def.write(item['name'], item['value'])
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
binary = ''
|
|
125
|
+
config.tables.each { |table_name, table| binary += table.buffer }
|
|
126
|
+
binary
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def self.build_json(binary, definition_filename)
|
|
130
|
+
config = TableConfig.process_file(definition_filename)
|
|
131
|
+
tables = []
|
|
132
|
+
json = { tables: tables }
|
|
133
|
+
begin
|
|
134
|
+
load_binary(config, binary)
|
|
135
|
+
rescue CoreError => err
|
|
136
|
+
json['errors'] = err.message
|
|
137
|
+
end
|
|
138
|
+
config.tables.each do |table_name, table|
|
|
139
|
+
tables << {
|
|
140
|
+
name: table_name,
|
|
141
|
+
numRows: table.num_rows,
|
|
142
|
+
numColumns: table.num_columns,
|
|
143
|
+
headers: [],
|
|
144
|
+
rows: [],
|
|
145
|
+
}
|
|
146
|
+
col = 0
|
|
147
|
+
row = 0
|
|
148
|
+
num_cols = table.num_columns
|
|
149
|
+
table.sorted_items.each_with_index do |item, index|
|
|
150
|
+
next if item.hidden
|
|
151
|
+
if table.num_columns == 1
|
|
152
|
+
if row == 0
|
|
153
|
+
tables[-1][:headers] = [ "INDEX", "NAME", "VALUE" ]
|
|
154
|
+
end
|
|
155
|
+
tables[-1][:rows] << [
|
|
156
|
+
{
|
|
157
|
+
index: row + 1,
|
|
158
|
+
name: item.name,
|
|
159
|
+
value: table.read(item.name, :FORMATTED),
|
|
160
|
+
states: item.states,
|
|
161
|
+
editable: item.editable,
|
|
162
|
+
},
|
|
163
|
+
]
|
|
164
|
+
else
|
|
165
|
+
if row == 0 && col == 0
|
|
166
|
+
tables[-1][:headers] << "INDEX"
|
|
167
|
+
end
|
|
168
|
+
if row == 0
|
|
169
|
+
tables[-1][:headers] << item.name[0..-2]
|
|
170
|
+
end
|
|
171
|
+
if col == 0
|
|
172
|
+
# Each row is an array of items
|
|
173
|
+
tables[-1][:rows][row] = []
|
|
174
|
+
end
|
|
175
|
+
tables[-1][:rows][row] << {
|
|
176
|
+
index: row + 1,
|
|
177
|
+
name: item.name,
|
|
178
|
+
value: table.read(item.name, :FORMATTED),
|
|
179
|
+
states: item.states,
|
|
180
|
+
editable: item.editable,
|
|
181
|
+
}
|
|
182
|
+
end
|
|
183
|
+
col += 1
|
|
184
|
+
if col == table.num_columns
|
|
185
|
+
col = 0
|
|
186
|
+
row += 1
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
json.as_json(:allow_nan => true).to_json(:allow_nan => true)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def self.load_binary(config, data)
|
|
194
|
+
binary_data_index = 0
|
|
195
|
+
total_table_length = 0
|
|
196
|
+
config.tables.each do |table_name, table|
|
|
197
|
+
total_table_length += table.length
|
|
198
|
+
end
|
|
199
|
+
config.tables.each do |table_name, table|
|
|
200
|
+
if binary_data_index + table.length > data.length
|
|
201
|
+
table.buffer = data[binary_data_index..-1]
|
|
202
|
+
raise MismatchError,
|
|
203
|
+
"Binary size of #{data.length} not large enough to fully represent table definition of length #{total_table_length}. "+
|
|
204
|
+
"The remaining table definition (starting with byte #{data.length - binary_data_index} in #{table.table_name}) will be filled with 0."
|
|
205
|
+
end
|
|
206
|
+
table.buffer = data[binary_data_index...binary_data_index + table.length]
|
|
207
|
+
binary_data_index += table.length
|
|
208
|
+
end
|
|
209
|
+
if binary_data_index < data.length
|
|
210
|
+
raise MismatchError,
|
|
211
|
+
"Binary size of #{data.length} larger than table definition of length #{total_table_length}. "+
|
|
212
|
+
"Discarding the remaing #{data.length - binary_data_index} bytes."
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# TODO: Potentially useful methods?
|
|
217
|
+
# # @return [String] Success string if parameters all check. Raises
|
|
218
|
+
# # a CoreError if errors are found.
|
|
219
|
+
# def file_check
|
|
220
|
+
# raise NoConfigError unless @config
|
|
221
|
+
# result = ''
|
|
222
|
+
# @config.table_names.each do |name|
|
|
223
|
+
# table_result = table_check(name)
|
|
224
|
+
# unless table_result.empty?
|
|
225
|
+
# result << "Errors in #{name}:\n" + table_result
|
|
226
|
+
# end
|
|
227
|
+
# end
|
|
228
|
+
# raise CoreError, result unless result.empty?
|
|
229
|
+
# 'All parameters are within their constraints.'
|
|
230
|
+
# end
|
|
231
|
+
|
|
232
|
+
# # Create a hex formatted string of all the file data
|
|
233
|
+
# def file_hex
|
|
234
|
+
# raise NoConfigError unless @config
|
|
235
|
+
# data = ''
|
|
236
|
+
# @config.tables.values.each { |table| data << table.buffer }
|
|
237
|
+
# "#{data.formatted}\n\nTotal Bytes Read: #{data.length}"
|
|
238
|
+
# end
|
|
239
|
+
|
|
240
|
+
# # @param table_name [String] Name of the table to check for out of range values
|
|
241
|
+
# def table_check(table_name)
|
|
242
|
+
# raise NoConfigError unless @config
|
|
243
|
+
# table = @config.table(table_name)
|
|
244
|
+
# raise NoTableError unless table
|
|
245
|
+
|
|
246
|
+
# result = ''
|
|
247
|
+
# table_items = table.sorted_items
|
|
248
|
+
|
|
249
|
+
# # Check the ranges and constraints for each item in the table
|
|
250
|
+
# # We go through it this way (by row and columns) so we can grab the actual
|
|
251
|
+
# # user input when we display any errors found
|
|
252
|
+
# (0...table.num_rows).each do |r|
|
|
253
|
+
# (0...table.num_columns).each do |c|
|
|
254
|
+
# # get the table item definition so we know how to save it
|
|
255
|
+
# table_item = table_items[r * table.num_columns + c]
|
|
256
|
+
|
|
257
|
+
# value = table.read(table_item.name)
|
|
258
|
+
# unless table_item.range.nil?
|
|
259
|
+
# # If the item has states which include the value, then convert
|
|
260
|
+
# # the state back to the numeric value for range checking
|
|
261
|
+
# if table_item.states && table_item.states.include?(value)
|
|
262
|
+
# value = table_item.states[value]
|
|
263
|
+
# end
|
|
264
|
+
|
|
265
|
+
# # check to see if the value lies within its valid range
|
|
266
|
+
# unless table_item.range.include?(value)
|
|
267
|
+
# if table_item.format_string
|
|
268
|
+
# value = table.read(table_item.name, :FORMATTED)
|
|
269
|
+
# range_first =
|
|
270
|
+
# sprintf(table_item.format_string, table_item.range.first)
|
|
271
|
+
# range_last =
|
|
272
|
+
# sprintf(table_item.format_string, table_item.range.last)
|
|
273
|
+
# else
|
|
274
|
+
# range_first = table_item.range.first
|
|
275
|
+
# range_last = table_item.range.last
|
|
276
|
+
# end
|
|
277
|
+
# result <<
|
|
278
|
+
# " #{table_item.name}: #{value} outside valid range of #{range_first}..#{range_last}\n"
|
|
279
|
+
# end
|
|
280
|
+
# end
|
|
281
|
+
# end # end each column
|
|
282
|
+
# end # end each row
|
|
283
|
+
# result
|
|
284
|
+
# end
|
|
285
|
+
|
|
286
|
+
# # @param table_name [String] Create a hex formatted string of the given table data
|
|
287
|
+
# def table_hex(table_name)
|
|
288
|
+
# raise NoConfigError unless @config
|
|
289
|
+
# table = @config.table(table_name)
|
|
290
|
+
# raise NoTableError unless table
|
|
291
|
+
# "#{table.buffer.formatted}\n\nTotal Bytes Read: #{table.buffer.length}"
|
|
292
|
+
# end
|
|
293
|
+
|
|
294
|
+
# # Commit a table from the current configuration into a new binary
|
|
295
|
+
# #
|
|
296
|
+
# # @param table_name [String] Table name to commit to an existing binary
|
|
297
|
+
# # @param bin_file [String] Binary file to open
|
|
298
|
+
# # @param def_file [String] Definition file to use when opening
|
|
299
|
+
# def table_commit(table_name, bin_file, def_file)
|
|
300
|
+
# raise NoConfigError unless @config
|
|
301
|
+
# save_table = @config.table(table_name)
|
|
302
|
+
# raise NoTableError unless save_table
|
|
303
|
+
|
|
304
|
+
# result = table_check(table_name)
|
|
305
|
+
# unless result.empty?
|
|
306
|
+
# raise CoreError, "Errors in #{table_name}:\n#{result}"
|
|
307
|
+
# end
|
|
308
|
+
|
|
309
|
+
# config = TableConfig.new
|
|
310
|
+
# begin
|
|
311
|
+
# config.process_file(def_file)
|
|
312
|
+
# rescue => err
|
|
313
|
+
# raise CoreError,
|
|
314
|
+
# "The table definition file:#{def_file} has the following errors:\n#{err}"
|
|
315
|
+
# end
|
|
316
|
+
|
|
317
|
+
# if !config.table_names.include?(table_name.upcase)
|
|
318
|
+
# raise NoTableError,
|
|
319
|
+
# "#{table_name} not found in #{def_file} table definition file."
|
|
320
|
+
# end
|
|
321
|
+
|
|
322
|
+
# saved_config = @config
|
|
323
|
+
# @config = config
|
|
324
|
+
# open_and_load_binary_file(bin_file)
|
|
325
|
+
|
|
326
|
+
# # Store the saved table data in the new table definition
|
|
327
|
+
# table = config.table(save_table.table_name)
|
|
328
|
+
# table.buffer = save_table.buffer[0...table.length]
|
|
329
|
+
# file_save(bin_file)
|
|
330
|
+
# @config = saved_config
|
|
331
|
+
# end
|
|
332
|
+
end
|
|
333
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
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/packets/parsers/packet_parser'
|
|
21
|
+
require 'openc3/tools/table_manager/table'
|
|
22
|
+
|
|
23
|
+
module OpenC3
|
|
24
|
+
# Parses the TABLE keyword definition in table configuration files.
|
|
25
|
+
class TableParser < PacketParser
|
|
26
|
+
# @param parser [ConfigParser] Configuration parser
|
|
27
|
+
# @param tables [Hash] Hash of the currently defined tables
|
|
28
|
+
# @param warnings [Array<String>] Any warning strings generated while
|
|
29
|
+
# parsing this command will be appened to this array
|
|
30
|
+
def self.parse_table(parser, tables, warnings)
|
|
31
|
+
parser = TableParser.new(parser)
|
|
32
|
+
parser.verify_parameters
|
|
33
|
+
parser.create_table(tables, warnings)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Verify the correct number of arguments to the TABLE keyword
|
|
37
|
+
def verify_parameters
|
|
38
|
+
@usage =
|
|
39
|
+
'TABLE <TABLE NAME> <ENDIANNESS: BIG_ENDIAN/LITTLE_ENDIAN> <DISPLAY: KEY_VALUE/ROW_COLUMN> <ROW_COLUMN ROW COUNT> <DESCRIPTION (Optional)>'
|
|
40
|
+
@parser.verify_num_parameters(3, 5, @usage)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @param tables [Array<Table>] All tables defined in the configuration
|
|
44
|
+
# @param warnings [String] List of warnings to append to
|
|
45
|
+
def create_table(tables, warnings)
|
|
46
|
+
params = @parser.parameters
|
|
47
|
+
table_name = params[0].to_s.upcase
|
|
48
|
+
endianness = params[1].to_s.upcase.to_sym
|
|
49
|
+
if endianness != :BIG_ENDIAN && endianness != :LITTLE_ENDIAN
|
|
50
|
+
raise @parser.error(
|
|
51
|
+
"Invalid endianness #{params[1]}. Must be BIG_ENDIAN or LITTLE_ENDIAN.",
|
|
52
|
+
@usage,
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
type = params[2].to_s.upcase.to_sym
|
|
56
|
+
case type
|
|
57
|
+
when :KEY_VALUE, :ONE_DIMENSIONAL # :ONE_DIMENSIONAL is deprecated
|
|
58
|
+
@parser.verify_num_parameters(3, 4, @usage)
|
|
59
|
+
description = params[3].to_s
|
|
60
|
+
when :ROW_COLUMN, :TWO_DIMENSIONAL # :TWO_DIMENSIONAL is deprecated
|
|
61
|
+
@parser.verify_num_parameters(4, 5, @usage)
|
|
62
|
+
num_rows = params[3].to_i
|
|
63
|
+
description = params[4].to_s
|
|
64
|
+
else
|
|
65
|
+
raise @parser.error(
|
|
66
|
+
"Invalid display type #{params[2]}. Must be KEY_VALUE or ROW_COLUMN.",
|
|
67
|
+
@usage,
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
table =
|
|
71
|
+
Table.new(table_name, endianness, type, description, @parser.filename)
|
|
72
|
+
table.num_rows = num_rows if type == :ROW_COLUMN
|
|
73
|
+
TableParser.finish_create_table(table, tables, warnings)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
protected
|
|
77
|
+
|
|
78
|
+
def self.check_for_duplicate(tables, table)
|
|
79
|
+
msg = nil
|
|
80
|
+
if tables[Table::TARGET][table.table_name]
|
|
81
|
+
msg = "Table #{table.table_name} redefined."
|
|
82
|
+
Logger.instance.warn msg
|
|
83
|
+
end
|
|
84
|
+
msg
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def self.finish_create_table(table, tables, warnings)
|
|
88
|
+
warning = TableParser.check_for_duplicate(tables, table)
|
|
89
|
+
warnings << warning if warning
|
|
90
|
+
table
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
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/script/suite'
|
|
21
|
+
require 'openc3/script/exceptions'
|
|
22
|
+
|
|
23
|
+
module OpenC3
|
|
24
|
+
# @deprecated Use SkipScript
|
|
25
|
+
class SkipTestCase < SkipScript; end
|
|
26
|
+
|
|
27
|
+
# @deprecated Use Suite
|
|
28
|
+
class TestSuite < Suite
|
|
29
|
+
alias :tests :scripts
|
|
30
|
+
alias :add_test :add_group
|
|
31
|
+
alias :add_test_case :add_script
|
|
32
|
+
alias :add_test_setup :add_group_setup
|
|
33
|
+
alias :add_test_teardown :add_group_teardown
|
|
34
|
+
alias :run_test :run_group
|
|
35
|
+
alias :run_test_case :run_script
|
|
36
|
+
alias :get_num_test :get_num_scripts
|
|
37
|
+
alias :run_test_setup :run_group_setup
|
|
38
|
+
alias :run_test_teardown :run_group_teardown
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @deprecated Use Group
|
|
42
|
+
class Test < Group
|
|
43
|
+
alias :run_test_case :run_script
|
|
44
|
+
|
|
45
|
+
class << self
|
|
46
|
+
alias :test_cases :scripts
|
|
47
|
+
alias :get_num_tests :get_num_scripts
|
|
48
|
+
alias :current_test_suite :current_suite
|
|
49
|
+
alias :current_test_group :current_group
|
|
50
|
+
alias :current_test :current_group
|
|
51
|
+
alias :current_test_case :current_script
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @deprecated Use ScriptStatus
|
|
56
|
+
class TestStatus < ScriptStatus; end
|
|
57
|
+
|
|
58
|
+
# @deprecated Use ScriptResult
|
|
59
|
+
class TestResult < ScriptResult
|
|
60
|
+
alias :test_suite :suite
|
|
61
|
+
alias :test_suite= :suite=
|
|
62
|
+
alias :test :group
|
|
63
|
+
alias :test= :group=
|
|
64
|
+
alias :test_case :script
|
|
65
|
+
alias :test_case= :script=
|
|
66
|
+
end
|
|
67
|
+
end
|