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.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +18 -0
  3. data/Guardfile +35 -0
  4. data/LICENSE.txt +727 -0
  5. data/README.md +37 -0
  6. data/Rakefile +131 -0
  7. data/bin/cstol_converter +1178 -0
  8. data/bin/openc3cli +531 -0
  9. data/bin/rubysloc +139 -0
  10. data/data/config/_array_params.yaml +23 -0
  11. data/data/config/_id_items.yaml +24 -0
  12. data/data/config/_id_params.yaml +58 -0
  13. data/data/config/_interfaces.yaml +214 -0
  14. data/data/config/_interfaces.yaml.err +1017 -0
  15. data/data/config/_items.yaml +20 -0
  16. data/data/config/_params.yaml +60 -0
  17. data/data/config/cmd_tlm_server.yaml +136 -0
  18. data/data/config/command.yaml +44 -0
  19. data/data/config/command_modifiers.yaml +160 -0
  20. data/data/config/command_telemetry.yaml +3 -0
  21. data/data/config/interface_modifiers.yaml +104 -0
  22. data/data/config/item_modifiers.yaml +221 -0
  23. data/data/config/microservice.yaml +78 -0
  24. data/data/config/param_item_modifiers.yaml +52 -0
  25. data/data/config/parameter_modifiers.yaml +200 -0
  26. data/data/config/plugins.yaml +80 -0
  27. data/data/config/protocols.yaml +290 -0
  28. data/data/config/screen.yaml +147 -0
  29. data/data/config/table_manager.yaml +89 -0
  30. data/data/config/table_parameter_modifiers.yaml +9 -0
  31. data/data/config/target.yaml +142 -0
  32. data/data/config/target_config.yaml +94 -0
  33. data/data/config/telemetry.yaml +87 -0
  34. data/data/config/telemetry_modifiers.yaml +159 -0
  35. data/data/config/tool.yaml +63 -0
  36. data/data/config/unknown.yaml +3 -0
  37. data/data/config/widgets.yaml +1505 -0
  38. data/ext/mkrf_conf.rb +49 -0
  39. data/ext/openc3/ext/array/array.c +122 -0
  40. data/ext/openc3/ext/array/extconf.rb +13 -0
  41. data/ext/openc3/ext/buffered_file/buffered_file.c +198 -0
  42. data/ext/openc3/ext/buffered_file/extconf.rb +13 -0
  43. data/ext/openc3/ext/config_parser/config_parser.c +280 -0
  44. data/ext/openc3/ext/config_parser/extconf.rb +13 -0
  45. data/ext/openc3/ext/crc/crc.c +351 -0
  46. data/ext/openc3/ext/crc/extconf.rb +13 -0
  47. data/ext/openc3/ext/openc3_io/extconf.rb +13 -0
  48. data/ext/openc3/ext/openc3_io/openc3_io.c +158 -0
  49. data/ext/openc3/ext/packet/extconf.rb +13 -0
  50. data/ext/openc3/ext/packet/packet.c +318 -0
  51. data/ext/openc3/ext/platform/extconf.rb +13 -0
  52. data/ext/openc3/ext/platform/platform.c +134 -0
  53. data/ext/openc3/ext/polynomial_conversion/extconf.rb +13 -0
  54. data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +79 -0
  55. data/ext/openc3/ext/string/extconf.rb +13 -0
  56. data/ext/openc3/ext/string/string.c +63 -0
  57. data/ext/openc3/ext/structure/structure.c +1719 -0
  58. data/ext/openc3/ext/tabbed_plots_config/extconf.rb +13 -0
  59. data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +62 -0
  60. data/ext/openc3/ext/telemetry/extconf.rb +13 -0
  61. data/ext/openc3/ext/telemetry/telemetry.c +336 -0
  62. data/lib/cosmos.rb +20 -0
  63. data/lib/cosmosc2.rb +20 -0
  64. data/lib/openc3/api/api.rb +39 -0
  65. data/lib/openc3/api/authorized_api.rb +30 -0
  66. data/lib/openc3/api/cmd_api.rb +451 -0
  67. data/lib/openc3/api/config_api.rb +58 -0
  68. data/lib/openc3/api/interface_api.rb +117 -0
  69. data/lib/openc3/api/limits_api.rb +375 -0
  70. data/lib/openc3/api/router_api.rb +117 -0
  71. data/lib/openc3/api/settings_api.rb +70 -0
  72. data/lib/openc3/api/target_api.rb +78 -0
  73. data/lib/openc3/api/tlm_api.rb +455 -0
  74. data/lib/openc3/bridge/bridge.rb +54 -0
  75. data/lib/openc3/bridge/bridge_config.rb +167 -0
  76. data/lib/openc3/bridge/bridge_interface_thread.rb +42 -0
  77. data/lib/openc3/bridge/bridge_router_thread.rb +42 -0
  78. data/lib/openc3/ccsds/ccsds_packet.rb +68 -0
  79. data/lib/openc3/ccsds/ccsds_parser.rb +148 -0
  80. data/lib/openc3/config/config_parser.rb +549 -0
  81. data/lib/openc3/config/meta_config_parser.rb +74 -0
  82. data/lib/openc3/conversions/conversion.rb +70 -0
  83. data/lib/openc3/conversions/generic_conversion.rb +83 -0
  84. data/lib/openc3/conversions/packet_time_formatted_conversion.rb +43 -0
  85. data/lib/openc3/conversions/packet_time_seconds_conversion.rb +43 -0
  86. data/lib/openc3/conversions/polynomial_conversion.rb +87 -0
  87. data/lib/openc3/conversions/processor_conversion.rb +70 -0
  88. data/lib/openc3/conversions/received_count_conversion.rb +38 -0
  89. data/lib/openc3/conversions/received_time_formatted_conversion.rb +42 -0
  90. data/lib/openc3/conversions/received_time_seconds_conversion.rb +42 -0
  91. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +171 -0
  92. data/lib/openc3/conversions/unix_time_conversion.rb +68 -0
  93. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +49 -0
  94. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +49 -0
  95. data/lib/openc3/conversions.rb +34 -0
  96. data/lib/openc3/core_ext/array.rb +416 -0
  97. data/lib/openc3/core_ext/binding.rb +29 -0
  98. data/lib/openc3/core_ext/class.rb +72 -0
  99. data/lib/openc3/core_ext/exception.rb +61 -0
  100. data/lib/openc3/core_ext/file.rb +83 -0
  101. data/lib/openc3/core_ext/hash.rb +37 -0
  102. data/lib/openc3/core_ext/io.rb +134 -0
  103. data/lib/openc3/core_ext/kernel.rb +42 -0
  104. data/lib/openc3/core_ext/math.rb +128 -0
  105. data/lib/openc3/core_ext/matrix.rb +156 -0
  106. data/lib/openc3/core_ext/objectspace.rb +36 -0
  107. data/lib/openc3/core_ext/openc3_io.rb +57 -0
  108. data/lib/openc3/core_ext/range.rb +27 -0
  109. data/lib/openc3/core_ext/socket.rb +38 -0
  110. data/lib/openc3/core_ext/string.rb +389 -0
  111. data/lib/openc3/core_ext/stringio.rb +33 -0
  112. data/lib/openc3/core_ext/time.rb +508 -0
  113. data/lib/openc3/core_ext.rb +36 -0
  114. data/lib/openc3/interfaces/interface.rb +498 -0
  115. data/lib/openc3/interfaces/linc_interface.rb +475 -0
  116. data/lib/openc3/interfaces/protocols/burst_protocol.rb +192 -0
  117. data/lib/openc3/interfaces/protocols/crc_protocol.rb +193 -0
  118. data/lib/openc3/interfaces/protocols/fixed_protocol.rb +155 -0
  119. data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +56 -0
  120. data/lib/openc3/interfaces/protocols/length_protocol.rb +165 -0
  121. data/lib/openc3/interfaces/protocols/override_protocol.rb +60 -0
  122. data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +206 -0
  123. data/lib/openc3/interfaces/protocols/protocol.rb +82 -0
  124. data/lib/openc3/interfaces/protocols/template_protocol.rb +261 -0
  125. data/lib/openc3/interfaces/protocols/terminated_protocol.rb +93 -0
  126. data/lib/openc3/interfaces/serial_interface.rb +94 -0
  127. data/lib/openc3/interfaces/simulated_target_interface.rb +168 -0
  128. data/lib/openc3/interfaces/stream_interface.rb +81 -0
  129. data/lib/openc3/interfaces/tcpip_client_interface.rb +69 -0
  130. data/lib/openc3/interfaces/tcpip_server_interface.rb +629 -0
  131. data/lib/openc3/interfaces/udp_interface.rb +169 -0
  132. data/lib/openc3/interfaces.rb +44 -0
  133. data/lib/openc3/io/buffered_file.rb +109 -0
  134. data/lib/openc3/io/io_multiplexer.rb +80 -0
  135. data/lib/openc3/io/json_api_object.rb +208 -0
  136. data/lib/openc3/io/json_drb.rb +335 -0
  137. data/lib/openc3/io/json_drb_object.rb +114 -0
  138. data/lib/openc3/io/json_drb_rack.rb +84 -0
  139. data/lib/openc3/io/json_rpc.rb +420 -0
  140. data/lib/openc3/io/openc3_snmp.rb +58 -0
  141. data/lib/openc3/io/posix_serial_driver.rb +156 -0
  142. data/lib/openc3/io/raw_logger.rb +167 -0
  143. data/lib/openc3/io/raw_logger_pair.rb +77 -0
  144. data/lib/openc3/io/serial_driver.rb +105 -0
  145. data/lib/openc3/io/stderr.rb +43 -0
  146. data/lib/openc3/io/stdout.rb +43 -0
  147. data/lib/openc3/io/udp_sockets.rb +194 -0
  148. data/lib/openc3/io/win32_serial_driver.rb +196 -0
  149. data/lib/openc3/logs/log_writer.rb +302 -0
  150. data/lib/openc3/logs/packet_log_constants.rb +62 -0
  151. data/lib/openc3/logs/packet_log_reader.rb +345 -0
  152. data/lib/openc3/logs/packet_log_writer.rb +299 -0
  153. data/lib/openc3/logs/text_log_writer.rb +68 -0
  154. data/lib/openc3/logs.rb +25 -0
  155. data/lib/openc3/microservices/cleanup_microservice.rb +68 -0
  156. data/lib/openc3/microservices/decom_microservice.rb +136 -0
  157. data/lib/openc3/microservices/interface_microservice.rb +532 -0
  158. data/lib/openc3/microservices/log_microservice.rb +108 -0
  159. data/lib/openc3/microservices/microservice.rb +204 -0
  160. data/lib/openc3/microservices/plugin_microservice.rb +43 -0
  161. data/lib/openc3/microservices/reaction_microservice.rb +541 -0
  162. data/lib/openc3/microservices/reducer_microservice.rb +313 -0
  163. data/lib/openc3/microservices/router_microservice.rb +44 -0
  164. data/lib/openc3/microservices/text_log_microservice.rb +84 -0
  165. data/lib/openc3/microservices/timeline_microservice.rb +363 -0
  166. data/lib/openc3/microservices/trigger_group_microservice.rb +638 -0
  167. data/lib/openc3/models/activity_model.rb +319 -0
  168. data/lib/openc3/models/auth_model.rb +65 -0
  169. data/lib/openc3/models/cvt_model.rb +185 -0
  170. data/lib/openc3/models/environment_model.rb +58 -0
  171. data/lib/openc3/models/gem_model.rb +137 -0
  172. data/lib/openc3/models/info_model.rb +31 -0
  173. data/lib/openc3/models/interface_model.rb +281 -0
  174. data/lib/openc3/models/interface_status_model.rb +117 -0
  175. data/lib/openc3/models/metadata_model.rb +139 -0
  176. data/lib/openc3/models/metric_model.rb +59 -0
  177. data/lib/openc3/models/microservice_model.rb +206 -0
  178. data/lib/openc3/models/microservice_status_model.rb +74 -0
  179. data/lib/openc3/models/model.rb +204 -0
  180. data/lib/openc3/models/note_model.rb +122 -0
  181. data/lib/openc3/models/notification_model.rb +40 -0
  182. data/lib/openc3/models/ping_model.rb +35 -0
  183. data/lib/openc3/models/plugin_model.rb +292 -0
  184. data/lib/openc3/models/process_status_model.rb +76 -0
  185. data/lib/openc3/models/reaction_model.rb +322 -0
  186. data/lib/openc3/models/reducer_model.rb +65 -0
  187. data/lib/openc3/models/router_model.rb +35 -0
  188. data/lib/openc3/models/router_status_model.rb +27 -0
  189. data/lib/openc3/models/scope_model.rb +153 -0
  190. data/lib/openc3/models/settings_model.rb +55 -0
  191. data/lib/openc3/models/sorted_model.rb +167 -0
  192. data/lib/openc3/models/target_model.rb +759 -0
  193. data/lib/openc3/models/timeline_model.rb +154 -0
  194. data/lib/openc3/models/tool_config_model.rb +38 -0
  195. data/lib/openc3/models/tool_model.rb +262 -0
  196. data/lib/openc3/models/trigger_group_model.rb +186 -0
  197. data/lib/openc3/models/trigger_model.rb +330 -0
  198. data/lib/openc3/models/widget_model.rb +138 -0
  199. data/lib/openc3/operators/microservice_operator.rb +128 -0
  200. data/lib/openc3/operators/operator.rb +277 -0
  201. data/lib/openc3/packets/binary_accessor.rb +1207 -0
  202. data/lib/openc3/packets/commands.rb +373 -0
  203. data/lib/openc3/packets/json_packet.rb +134 -0
  204. data/lib/openc3/packets/limits.rb +271 -0
  205. data/lib/openc3/packets/limits_response.rb +53 -0
  206. data/lib/openc3/packets/packet.rb +1168 -0
  207. data/lib/openc3/packets/packet_config.rb +625 -0
  208. data/lib/openc3/packets/packet_item.rb +586 -0
  209. data/lib/openc3/packets/packet_item_limits.rb +162 -0
  210. data/lib/openc3/packets/parsers/format_string_parser.rb +65 -0
  211. data/lib/openc3/packets/parsers/limits_parser.rb +159 -0
  212. data/lib/openc3/packets/parsers/limits_response_parser.rb +61 -0
  213. data/lib/openc3/packets/parsers/packet_item_parser.rb +272 -0
  214. data/lib/openc3/packets/parsers/packet_parser.rb +134 -0
  215. data/lib/openc3/packets/parsers/processor_parser.rb +73 -0
  216. data/lib/openc3/packets/parsers/state_parser.rb +127 -0
  217. data/lib/openc3/packets/parsers/xtce_converter.rb +442 -0
  218. data/lib/openc3/packets/parsers/xtce_parser.rb +722 -0
  219. data/lib/openc3/packets/structure.rb +553 -0
  220. data/lib/openc3/packets/structure_item.rb +365 -0
  221. data/lib/openc3/packets/telemetry.rb +487 -0
  222. data/lib/openc3/processors/processor.rb +86 -0
  223. data/lib/openc3/processors/statistics_processor.rb +82 -0
  224. data/lib/openc3/processors/watermark_processor.rb +58 -0
  225. data/lib/openc3/processors.rb +24 -0
  226. data/lib/openc3/script/api_shared.rb +828 -0
  227. data/lib/openc3/script/calendar.rb +89 -0
  228. data/lib/openc3/script/commands.rb +227 -0
  229. data/lib/openc3/script/exceptions.rb +29 -0
  230. data/lib/openc3/script/extract.rb +161 -0
  231. data/lib/openc3/script/limits.rb +60 -0
  232. data/lib/openc3/script/script.rb +299 -0
  233. data/lib/openc3/script/script_runner.rb +238 -0
  234. data/lib/openc3/script/storage.rb +146 -0
  235. data/lib/openc3/script/suite.rb +542 -0
  236. data/lib/openc3/script/suite_results.rb +196 -0
  237. data/lib/openc3/script/suite_runner.rb +217 -0
  238. data/lib/openc3/script.rb +21 -0
  239. data/lib/openc3/streams/serial_stream.rb +167 -0
  240. data/lib/openc3/streams/stream.rb +63 -0
  241. data/lib/openc3/streams/tcpip_client_stream.rb +116 -0
  242. data/lib/openc3/streams/tcpip_socket_stream.rb +195 -0
  243. data/lib/openc3/system/system.rb +127 -0
  244. data/lib/openc3/system/system_config.rb +411 -0
  245. data/lib/openc3/system/target.rb +269 -0
  246. data/lib/openc3/system.rb +24 -0
  247. data/lib/openc3/tools/cmd_tlm_server/api.rb +20 -0
  248. data/lib/openc3/tools/cmd_tlm_server/cmd_tlm_server_config.rb +320 -0
  249. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +294 -0
  250. data/lib/openc3/tools/table_manager/table.rb +77 -0
  251. data/lib/openc3/tools/table_manager/table_config.rb +273 -0
  252. data/lib/openc3/tools/table_manager/table_item.rb +90 -0
  253. data/lib/openc3/tools/table_manager/table_item_parser.rb +66 -0
  254. data/lib/openc3/tools/table_manager/table_manager_core.rb +333 -0
  255. data/lib/openc3/tools/table_manager/table_parser.rb +93 -0
  256. data/lib/openc3/tools/test_runner/test.rb +67 -0
  257. data/lib/openc3/top_level.rb +595 -0
  258. data/lib/openc3/topics/autonomic_topic.rb +52 -0
  259. data/lib/openc3/topics/calendar_topic.rb +44 -0
  260. data/lib/openc3/topics/command_decom_topic.rb +76 -0
  261. data/lib/openc3/topics/command_topic.rb +83 -0
  262. data/lib/openc3/topics/config_topic.rb +68 -0
  263. data/lib/openc3/topics/interface_topic.rb +73 -0
  264. data/lib/openc3/topics/limits_event_topic.rb +109 -0
  265. data/lib/openc3/topics/notifications_topic.rb +28 -0
  266. data/lib/openc3/topics/router_topic.rb +85 -0
  267. data/lib/openc3/topics/telemetry_decom_topic.rb +54 -0
  268. data/lib/openc3/topics/telemetry_topic.rb +36 -0
  269. data/lib/openc3/topics/timeline_topic.rb +45 -0
  270. data/lib/openc3/topics/topic.rb +53 -0
  271. data/lib/openc3/utilities/authentication.rb +141 -0
  272. data/lib/openc3/utilities/authorization.rb +51 -0
  273. data/lib/openc3/utilities/crc.rb +278 -0
  274. data/lib/openc3/utilities/csv.rb +153 -0
  275. data/lib/openc3/utilities/logger.rb +187 -0
  276. data/lib/openc3/utilities/message_log.rb +91 -0
  277. data/lib/openc3/utilities/metric.rb +141 -0
  278. data/lib/openc3/utilities/process_manager.rb +139 -0
  279. data/lib/openc3/utilities/quaternion.rb +257 -0
  280. data/lib/openc3/utilities/ruby_lex_utils.rb +568 -0
  281. data/lib/openc3/utilities/s3.rb +202 -0
  282. data/lib/openc3/utilities/s3_autoload.rb +9 -0
  283. data/lib/openc3/utilities/s3_file_cache.rb +274 -0
  284. data/lib/openc3/utilities/simulated_target.rb +117 -0
  285. data/lib/openc3/utilities/sleeper.rb +51 -0
  286. data/lib/openc3/utilities/store.rb +23 -0
  287. data/lib/openc3/utilities/store_autoload.rb +237 -0
  288. data/lib/openc3/utilities/zip.rb +21 -0
  289. data/lib/openc3/utilities.rb +35 -0
  290. data/lib/openc3/version.rb +14 -0
  291. data/lib/openc3/win32/excel.rb +132 -0
  292. data/lib/openc3/win32/win32.rb +402 -0
  293. data/lib/openc3/win32/win32_main.rb +333 -0
  294. data/lib/openc3.rb +49 -0
  295. data/tasks/gemfile_stats.rake +113 -0
  296. data/tasks/spec.rake +30 -0
  297. data/templates/plugin-template/README.md +15 -0
  298. data/templates/plugin-template/Rakefile +12 -0
  299. data/templates/plugin-template/plugin.gemspec +23 -0
  300. data/templates/plugin-template/plugin.txt +9 -0
  301. data/templates/plugin-template/targets/TARGET/cmd_tlm/cmd.txt +8 -0
  302. data/templates/plugin-template/targets/TARGET/cmd_tlm/tlm.txt +8 -0
  303. data/templates/plugin-template/targets/TARGET/lib/target.rb +10 -0
  304. data/templates/plugin-template/targets/TARGET/procedures/procedure.rb +3 -0
  305. data/templates/plugin-template/targets/TARGET/screens/status.txt +9 -0
  306. data/templates/plugin-template/targets/TARGET/target.txt +5 -0
  307. 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