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,365 @@
|
|
|
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/ext/packet' if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT']
|
|
21
|
+
|
|
22
|
+
module OpenC3
|
|
23
|
+
# Maintains knowledge of an item in a Structure. Multiple StructureItems
|
|
24
|
+
# compose a Structure.
|
|
25
|
+
class StructureItem
|
|
26
|
+
include Comparable
|
|
27
|
+
|
|
28
|
+
@@create_index = 0
|
|
29
|
+
|
|
30
|
+
# Valid data types adds :DERIVED to those defined by BinaryAccessor
|
|
31
|
+
DATA_TYPES = BinaryAccessor::DATA_TYPES << :DERIVED
|
|
32
|
+
|
|
33
|
+
# Name is used by higher level classes to access the StructureItem.
|
|
34
|
+
# @return [String] Name of the item
|
|
35
|
+
attr_reader :name
|
|
36
|
+
|
|
37
|
+
# Indicates where in the binary buffer the StructureItem exists.
|
|
38
|
+
# @return [Integer] 0 based bit offset
|
|
39
|
+
attr_reader :bit_offset
|
|
40
|
+
|
|
41
|
+
# The number of bits which represent this StructureItem in the binary buffer.
|
|
42
|
+
# @return [Integer] Size in bits
|
|
43
|
+
attr_reader :bit_size
|
|
44
|
+
|
|
45
|
+
# The data type is what kind of data this StructureItem
|
|
46
|
+
# represents when extracted from the binary buffer. :INT and :UINT are
|
|
47
|
+
# turned into Integers (Ruby Fixnum). :FLOAT are turned into floating point
|
|
48
|
+
# numbers (Ruby Float). :STRING is turned into an ASCII string (Ruby
|
|
49
|
+
# String). :BLOCK is turned into a binary buffer (Ruby String). :DERIVED is
|
|
50
|
+
# interpreted by the subclass and can result in any type.
|
|
51
|
+
# @return [Symbol] {DATA_TYPES}
|
|
52
|
+
attr_reader :data_type
|
|
53
|
+
|
|
54
|
+
# Used to interpret how to read the item from the binary data buffer.
|
|
55
|
+
# @return [Symbol] {BinaryAccessor::ENDIANNESS}
|
|
56
|
+
attr_reader :endianness
|
|
57
|
+
|
|
58
|
+
# The total number of bits in the binary buffer that create the array.
|
|
59
|
+
# The array size can be set to nil to indicate the StructureItem is
|
|
60
|
+
# not represented as an array. For example, if the bit_size is 8 bits,
|
|
61
|
+
# an array_size of 16 would result in two 8 bit items.
|
|
62
|
+
# @return [Integer, nil] Array size of the item in bits
|
|
63
|
+
attr_reader :array_size
|
|
64
|
+
|
|
65
|
+
# How to handle overflow for :INT, :UINT, :STRING, and :BLOCK data types
|
|
66
|
+
# Note: Has no meaning for :FLOAT data types
|
|
67
|
+
# @return [Symbol] {BinaryAccessor::OVERFLOW_TYPES}
|
|
68
|
+
attr_reader :overflow
|
|
69
|
+
|
|
70
|
+
# @return [Boolean] Whether this structure item can overlap another item in the same packet
|
|
71
|
+
attr_accessor :overlap
|
|
72
|
+
|
|
73
|
+
# A large buffer size in bits (1 Megabyte)
|
|
74
|
+
LARGE_BUFFER_SIZE_BITS = 1024 * 1024 * 8
|
|
75
|
+
|
|
76
|
+
# Create a StructureItem by setting all the attributes. It
|
|
77
|
+
# calls all the setter routines to do the attribute verification and then
|
|
78
|
+
# verifies the overall integrity.
|
|
79
|
+
#
|
|
80
|
+
# @param name [String] The item name
|
|
81
|
+
# @param bit_offset [Integer] Offset to the item starting at 0
|
|
82
|
+
# @param bit_size [Integer] Size of the items in bits
|
|
83
|
+
# @param data_type [Symbol] {DATA_TYPES}
|
|
84
|
+
# @param endianness [Symbol] {BinaryAccessor::ENDIANNESS}
|
|
85
|
+
# @param array_size [Integer, nil] Size of the array item in bits. For
|
|
86
|
+
# example, if the bit_size is 8, an array_size of 16 holds two values.
|
|
87
|
+
# @param overflow [Symbol] {BinaryAccessor::OVERFLOW_TYPES}
|
|
88
|
+
def initialize(name, bit_offset, bit_size, data_type, endianness, array_size = nil, overflow = :ERROR)
|
|
89
|
+
@structure_item_constructed = false
|
|
90
|
+
# Assignment order matters due to verifications!
|
|
91
|
+
self.name = name
|
|
92
|
+
self.endianness = endianness
|
|
93
|
+
self.data_type = data_type
|
|
94
|
+
self.bit_offset = bit_offset
|
|
95
|
+
self.bit_size = bit_size
|
|
96
|
+
self.array_size = array_size
|
|
97
|
+
self.overflow = overflow
|
|
98
|
+
self.overlap = false
|
|
99
|
+
@create_index = @@create_index
|
|
100
|
+
@@create_index += 1
|
|
101
|
+
@structure_item_constructed = true
|
|
102
|
+
verify_overall()
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def name=(name)
|
|
106
|
+
raise ArgumentError, "name must be a String but is a #{name.class}" unless String === name
|
|
107
|
+
raise ArgumentError, "name must contain at least one character" if name.empty?
|
|
108
|
+
|
|
109
|
+
@name = name.upcase.clone.freeze
|
|
110
|
+
verify_overall() if @structure_item_constructed
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def endianness=(endianness)
|
|
114
|
+
raise ArgumentError, "#{@name}: endianness must be a Symbol" unless Symbol === endianness
|
|
115
|
+
unless BinaryAccessor::ENDIANNESS.include? endianness
|
|
116
|
+
raise ArgumentError, "#{@name}: unknown endianness: #{endianness} - Must be :BIG_ENDIAN or :LITTLE_ENDIAN"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
@endianness = endianness
|
|
120
|
+
verify_overall() if @structure_item_constructed
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def bit_offset=(bit_offset)
|
|
124
|
+
if 0.class == Integer
|
|
125
|
+
# Ruby version >= 2.4.0
|
|
126
|
+
raise ArgumentError, "#{@name}: bit_offset must be an Integer" unless Integer === bit_offset
|
|
127
|
+
else
|
|
128
|
+
# Ruby version < 2.4.0
|
|
129
|
+
raise ArgumentError, "#{@name}: bit_offset must be a Fixnum" unless Fixnum === bit_offset
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
byte_aligned = ((bit_offset % 8) == 0)
|
|
133
|
+
if (@data_type == :FLOAT or @data_type == :STRING or @data_type == :BLOCK) and !byte_aligned
|
|
134
|
+
raise ArgumentError, "#{@name}: bit_offset for :FLOAT, :STRING, and :BLOCK items must be byte aligned"
|
|
135
|
+
end
|
|
136
|
+
if @data_type == :DERIVED and bit_offset != 0
|
|
137
|
+
raise ArgumentError, "#{@name}: DERIVED items must have bit_offset of zero"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
@bit_offset = bit_offset
|
|
141
|
+
verify_overall() if @structure_item_constructed
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def bit_size=(bit_size)
|
|
145
|
+
if 0.class == Integer
|
|
146
|
+
# Ruby version >= 2.4.0
|
|
147
|
+
raise ArgumentError, "#{name}: bit_size must be an Integer" unless Integer === bit_size
|
|
148
|
+
else
|
|
149
|
+
# Ruby version < 2.4.0
|
|
150
|
+
raise ArgumentError, "#{name}: bit_size must be a Fixnum" unless Fixnum === bit_size
|
|
151
|
+
end
|
|
152
|
+
byte_multiple = ((bit_size % 8) == 0)
|
|
153
|
+
if bit_size <= 0 and (@data_type == :INT or @data_type == :UINT or @data_type == :FLOAT)
|
|
154
|
+
raise ArgumentError, "#{@name}: bit_size cannot be negative or zero for :INT, :UINT, and :FLOAT items: #{bit_size}"
|
|
155
|
+
end
|
|
156
|
+
raise ArgumentError, "#{@name}: bit_size for STRING and BLOCK items must be byte multiples" if (@data_type == :STRING or @data_type == :BLOCK) and !byte_multiple
|
|
157
|
+
if @data_type == :FLOAT and bit_size != 32 and bit_size != 64
|
|
158
|
+
raise ArgumentError, "#{@name}: bit_size for FLOAT items must be 32 or 64. Given: #{bit_size}"
|
|
159
|
+
end
|
|
160
|
+
if @data_type == :DERIVED and bit_size != 0
|
|
161
|
+
raise ArgumentError, "#{@name}: DERIVED items must have bit_size of zero"
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
@bit_size = bit_size
|
|
165
|
+
verify_overall() if @structure_item_constructed
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def data_type=(data_type)
|
|
169
|
+
raise ArgumentError, "#{@name}: data_type must be a Symbol" unless Symbol === data_type
|
|
170
|
+
|
|
171
|
+
case data_type
|
|
172
|
+
when *DATA_TYPES
|
|
173
|
+
# Valid data_type
|
|
174
|
+
else
|
|
175
|
+
raise ArgumentError, "#{@name}: unknown data_type: #{data_type} - Must be :INT, :UINT, :FLOAT, :STRING, :BLOCK, or :DERIVED"
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
@data_type = data_type
|
|
179
|
+
verify_overall() if @structure_item_constructed
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def array_size=(array_size)
|
|
183
|
+
if array_size
|
|
184
|
+
if 0.class == Integer
|
|
185
|
+
# Ruby version >= 2.4.0
|
|
186
|
+
raise ArgumentError, "#{@name}: array_size must be an Integer" unless Integer === array_size
|
|
187
|
+
else
|
|
188
|
+
# Ruby version < 2.4.0
|
|
189
|
+
raise ArgumentError, "#{@name}: array_size must be a Fixnum" unless Fixnum === array_size
|
|
190
|
+
end
|
|
191
|
+
raise ArgumentError, "#{@name}: array_size must be a multiple of bit_size" unless @bit_size == 0 or (array_size % @bit_size == 0) or array_size < 0
|
|
192
|
+
raise ArgumentError, "#{@name}: bit_size cannot be negative or zero for array items" if @bit_size <= 0
|
|
193
|
+
end
|
|
194
|
+
@array_size = array_size
|
|
195
|
+
verify_overall() if @structure_item_constructed
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def overflow=(overflow)
|
|
199
|
+
raise ArgumentError, "#{@name}: overflow type must be a Symbol" unless Symbol === overflow
|
|
200
|
+
|
|
201
|
+
case overflow
|
|
202
|
+
when *BinaryAccessor::OVERFLOW_TYPES
|
|
203
|
+
# Valid overflow
|
|
204
|
+
else
|
|
205
|
+
raise ArgumentError, "#{@name}: unknown overflow type: #{overflow} - Must be :ERROR, :ERROR_ALLOW_HEX, :TRUNCATE, or :SATURATE"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
@overflow = overflow
|
|
209
|
+
verify_overall() if @structure_item_constructed
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def create_index
|
|
213
|
+
@create_index.to_i
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
if RUBY_ENGINE != 'ruby' or ENV['OPENC3_NO_EXT']
|
|
217
|
+
# Comparison Operator based on bit_offset. This means that StructureItems
|
|
218
|
+
# with different names or bit sizes are equal if they have the same bit
|
|
219
|
+
# offset.
|
|
220
|
+
def <=>(other_item)
|
|
221
|
+
return nil unless other_item.kind_of?(StructureItem)
|
|
222
|
+
|
|
223
|
+
other_bit_offset = other_item.bit_offset
|
|
224
|
+
other_bit_size = other_item.bit_size
|
|
225
|
+
|
|
226
|
+
# Handle same bit offset case
|
|
227
|
+
if (@bit_offset == 0) && (other_bit_offset == 0)
|
|
228
|
+
# Both bit_offsets are 0 so sort by bit_size
|
|
229
|
+
# This allows derived items with bit_size of 0 to be listed first
|
|
230
|
+
# Compare based on bit size then create index
|
|
231
|
+
if @bit_size == other_bit_size
|
|
232
|
+
if @create_index
|
|
233
|
+
if @create_index <= other_item.create_index
|
|
234
|
+
return -1
|
|
235
|
+
else
|
|
236
|
+
return 1
|
|
237
|
+
end
|
|
238
|
+
else
|
|
239
|
+
return 0
|
|
240
|
+
end
|
|
241
|
+
elsif @bit_size < other_bit_size
|
|
242
|
+
return -1
|
|
243
|
+
else
|
|
244
|
+
return 1
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
# Handle different bit offsets
|
|
249
|
+
if ((@bit_offset >= 0) && (other_bit_offset >= 0)) || ((@bit_offset < 0) && (other_bit_offset < 0))
|
|
250
|
+
# Both Have Same Sign
|
|
251
|
+
if @bit_offset == other_bit_offset
|
|
252
|
+
if @create_index
|
|
253
|
+
if @create_index <= other_item.create_index
|
|
254
|
+
return -1
|
|
255
|
+
else
|
|
256
|
+
return 1
|
|
257
|
+
end
|
|
258
|
+
else
|
|
259
|
+
return 0
|
|
260
|
+
end
|
|
261
|
+
elsif @bit_offset <= other_bit_offset
|
|
262
|
+
return -1
|
|
263
|
+
else
|
|
264
|
+
return 1
|
|
265
|
+
end
|
|
266
|
+
else
|
|
267
|
+
# Different Signs
|
|
268
|
+
if @bit_offset == other_bit_offset
|
|
269
|
+
if @create_index
|
|
270
|
+
if @create_index < other_item.create_index
|
|
271
|
+
return -1
|
|
272
|
+
else
|
|
273
|
+
return 1
|
|
274
|
+
end
|
|
275
|
+
else
|
|
276
|
+
return 0
|
|
277
|
+
end
|
|
278
|
+
elsif @bit_offset < other_bit_offset
|
|
279
|
+
return 1
|
|
280
|
+
else
|
|
281
|
+
return -1
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
# Make a light weight clone of this item
|
|
288
|
+
def clone
|
|
289
|
+
item = super()
|
|
290
|
+
item.name = self.name.clone if self.name
|
|
291
|
+
item
|
|
292
|
+
end
|
|
293
|
+
alias dup clone
|
|
294
|
+
|
|
295
|
+
def self.from_json(hash)
|
|
296
|
+
# Convert strings to symbols
|
|
297
|
+
endianness = hash['endianness'] ? hash['endianness'].intern : nil
|
|
298
|
+
data_type = hash['data_type'] ? hash['data_type'].intern : nil
|
|
299
|
+
overflow = hash['overflow'] ? hash['overflow'].intern : nil
|
|
300
|
+
StructureItem.new(hash['name'], hash['bit_offset'], hash['bit_size'], data_type,
|
|
301
|
+
endianness, hash['array_size'], overflow)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def as_json(*a)
|
|
305
|
+
hash = {}
|
|
306
|
+
hash['name'] = self.name
|
|
307
|
+
hash['bit_offset'] = self.bit_offset
|
|
308
|
+
hash['bit_size'] = self.bit_size
|
|
309
|
+
hash['data_type'] = self.data_type
|
|
310
|
+
hash['endianness'] = self.endianness
|
|
311
|
+
hash['array_size'] = self.array_size
|
|
312
|
+
hash['overflow'] = self.overflow
|
|
313
|
+
hash
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def little_endian_bit_field?
|
|
317
|
+
return false unless @endianness == :LITTLE_ENDIAN
|
|
318
|
+
return false unless @data_type == :INT || @data_type == :UINT
|
|
319
|
+
# If we're not byte aligned we're a bit field
|
|
320
|
+
return true unless (@bit_offset % 8) == 0
|
|
321
|
+
# If we don't have an even number of bytes we're a bit field
|
|
322
|
+
return true unless even_byte_multiple()
|
|
323
|
+
|
|
324
|
+
false
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
protected
|
|
328
|
+
|
|
329
|
+
# Verifies overall integrity of the StructureItem by checking for correct
|
|
330
|
+
# LITTLE_ENDIAN bit fields
|
|
331
|
+
def verify_overall
|
|
332
|
+
# Verify negative bit_offset conditions
|
|
333
|
+
if @bit_offset < 0
|
|
334
|
+
raise ArgumentError, "#{@name}: Can't define an item with negative bit_size #{@bit_size} and negative bit_offset #{@bit_offset}" if @bit_size < 0
|
|
335
|
+
raise ArgumentError, "#{@name}: Can't define an item with negative array_size #{@array_size} and negative bit_offset #{@bit_offset}" if @array_size and @array_size < 0
|
|
336
|
+
if @array_size and @array_size > @bit_offset.abs
|
|
337
|
+
raise ArgumentError, "#{@name}: Can't define an item with array_size #{@array_size} greater than negative bit_offset #{@bit_offset}"
|
|
338
|
+
elsif @bit_size > @bit_offset.abs
|
|
339
|
+
raise ArgumentError, "#{@name}: Can't define an item with bit_size #{@bit_size} greater than negative bit_offset #{@bit_offset}"
|
|
340
|
+
end
|
|
341
|
+
else
|
|
342
|
+
# Verify bounds on little-endian bit fields
|
|
343
|
+
if little_endian_bit_field?()
|
|
344
|
+
# Bitoffset always refers to the most significant bit of a bitfield
|
|
345
|
+
num_bytes = (((@bit_offset % 8) + @bit_size - 1) / 8) + 1
|
|
346
|
+
upper_bound = @bit_offset / 8
|
|
347
|
+
lower_bound = upper_bound - num_bytes + 1
|
|
348
|
+
|
|
349
|
+
if lower_bound < 0
|
|
350
|
+
raise ArgumentError, "#{@name}: LITTLE_ENDIAN bitfield with bit_offset #{@bit_offset} and bit_size #{@bit_size} is invalid"
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def even_byte_multiple
|
|
357
|
+
case @bit_size
|
|
358
|
+
when 8, 16, 32, 64
|
|
359
|
+
true
|
|
360
|
+
else
|
|
361
|
+
false
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
end
|