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,77 @@
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/packet'
21
+ require 'openc3/tools/table_manager/table_item'
22
+
23
+ module OpenC3
24
+ # Table extends Packet by adding more attributes relative to
25
+ # displaying binary data in a gui.
26
+ class Table < Packet
27
+ # Define the target for tables as 'TABLE' since there is no target
28
+ TARGET = 'TABLE'
29
+
30
+ # @return [Symbol] Either :KEY_VALUE or :ROW_COLUMN
31
+ attr_reader :type
32
+
33
+ # @return [String] File which contains the table definition
34
+ attr_reader :filename
35
+
36
+ # @return [Integer] Number of columns in the table
37
+ attr_accessor :num_columns
38
+
39
+ alias table_name packet_name
40
+
41
+ # Constructor for a TableDefinition
42
+ def initialize(name, endianness, type, description, filename)
43
+ super(TARGET, name, endianness, description, '', TableItem)
44
+ # ONE_DIMENSIONAL and TWO_DIMENSIONAL are deprecated so translate
45
+ type = :KEY_VALUE if type == :ONE_DIMENSIONAL
46
+ type = :ROW_COLUMN if type == :TWO_DIMENSIONAL
47
+ if type != :KEY_VALUE && type != :ROW_COLUMN
48
+ raise ArgumentError,
49
+ "Invalid type '#{type}' for table '#{name}'. Must be KEY_VALUE or ROW_COLUMN"
50
+ end
51
+ @type = type
52
+ @filename = filename
53
+ @num_rows = 0
54
+ @num_columns = (@type == :KEY_VALUE) ? 1 : 0
55
+ end
56
+
57
+ # @param num_rows [Integer] Set the number of rows in a ROW_COLUMN table
58
+ def num_rows=(num_rows)
59
+ case @type
60
+ when :KEY_VALUE
61
+ raise 'Rows are fixed in a KEY_VALUE table'
62
+ when :ROW_COLUMN
63
+ @num_rows = num_rows
64
+ end
65
+ end
66
+
67
+ # @return [Integer] Number of rows in the table
68
+ def num_rows
69
+ case @type
70
+ when :KEY_VALUE
71
+ @sorted_items.count { |item| !item.hidden }
72
+ when :ROW_COLUMN
73
+ @num_rows
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,273 @@
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/config/config_parser'
21
+ require 'openc3/packets/packet_config'
22
+ require 'openc3/tools/table_manager/table'
23
+ require 'openc3/tools/table_manager/table_parser'
24
+ require 'openc3/tools/table_manager/table_item_parser'
25
+
26
+ module OpenC3
27
+ # Processes the Table Manager configuration files which define tables. Since
28
+ # this class inherits from {PacketConfig} it only needs to implement Table
29
+ # Manager specific keywords. All tables are accessed through the table
30
+ # and tables methods.
31
+ class TableConfig < PacketConfig
32
+ # @return [String] Table configuration filename
33
+ attr_reader :filename
34
+
35
+ def self.process_file(filename)
36
+ instance = self.new()
37
+ instance.process_file(filename)
38
+ instance
39
+ end
40
+
41
+ # Create the table configuration
42
+ def initialize
43
+ super
44
+ # Override commands with the Table::TARGET name to store tables
45
+ @commands[Table::TARGET] = {}
46
+ @definitions = {}
47
+ @last_config = [] # Stores array of [filename, contents]
48
+ end
49
+
50
+ # @return [Array<Table>] All tables defined in the configuration file
51
+ def tables
52
+ @commands[Table::TARGET]
53
+ end
54
+
55
+ # @return [String] Table definition for the specific table
56
+ def definition(table_name)
57
+ @definitions[table_name.upcase]
58
+ end
59
+
60
+ # @return [Array<String>] All the table names
61
+ def table_names
62
+ tables.keys
63
+ end
64
+
65
+ # @param table_name [String] Table name to return
66
+ # @return [Table]
67
+ def table(table_name)
68
+ tables[table_name.upcase]
69
+ end
70
+
71
+ # Processes a OpenC3 table configuration file and uses the keywords to build up
72
+ # knowledge of the tables.
73
+ #
74
+ # @param filename [String] The name of the configuration file
75
+ def process_file(filename)
76
+ # Partial files are included into another file and thus aren't directly processed
77
+ return if File.basename(filename)[0] == '_' # Partials start with underscore
78
+ @filename = filename
79
+ @last_config = [File.basename(filename), File.read(filename)]
80
+ @converted_type = nil
81
+ @converted_bit_size = nil
82
+ @proc_text = ''
83
+ @building_generic_conversion = false
84
+ @defaults = []
85
+
86
+ parser =
87
+ ConfigParser.new(
88
+ 'https://openc3.com/docs/tools/#table-manager-configuration-openc3--39',
89
+ )
90
+ parser.parse_file(filename) do |keyword, params|
91
+ if @building_generic_conversion
92
+ case keyword
93
+ # Complete a generic conversion
94
+ when 'GENERIC_READ_CONVERSION_END', 'GENERIC_WRITE_CONVERSION_END'
95
+ parser.verify_num_parameters(0, 0, keyword)
96
+ @current_item.read_conversion =
97
+ GenericConversion.new(
98
+ @proc_text,
99
+ @converted_type,
100
+ @converted_bit_size,
101
+ ) if keyword.include? 'READ'
102
+ @current_item.write_conversion =
103
+ GenericConversion.new(
104
+ @proc_text,
105
+ @converted_type,
106
+ @converted_bit_size,
107
+ ) if keyword.include? 'WRITE'
108
+ @building_generic_conversion = false
109
+ # Add the current config.line to the conversion being built
110
+ else
111
+ @proc_text << parser.line << "\n"
112
+ end # case keyword
113
+ else
114
+ # not building generic conversion
115
+ case keyword
116
+ when 'TABLEFILE'
117
+ usage = "#{keyword} <File name>"
118
+ parser.verify_num_parameters(1, 1, usage)
119
+ table_filename = File.join(File.dirname(filename), params[0])
120
+ unless File.exist?(table_filename)
121
+ raise parser.error(
122
+ "Table file #{table_filename} not found",
123
+ usage,
124
+ )
125
+ end
126
+ process_file(table_filename)
127
+
128
+ when 'TABLE'
129
+ finish_packet
130
+ @current_packet =
131
+ TableParser.parse_table(parser, @commands, @warnings)
132
+ @definitions[@current_packet.packet_name] = @last_config
133
+ @current_cmd_or_tlm = COMMAND
134
+ @default_index = 0
135
+
136
+ # Select an existing table for editing
137
+ when 'SELECT_TABLE'
138
+ usage = "#{keyword} <TABLE NAME>"
139
+ finish_packet
140
+ parser.verify_num_parameters(1, 1, usage)
141
+ table_name = params[0].upcase
142
+ @current_packet = table(table_name)
143
+ unless @current_packet
144
+ raise parser.error("Table #{table_name} not found", usage)
145
+ end
146
+
147
+ #######################################################################
148
+ # All the following keywords must have a current packet defined
149
+ #######################################################################
150
+ when 'SELECT_PARAMETER', 'PARAMETER', 'ID_PARAMETER',
151
+ 'ARRAY_PARAMETER', 'APPEND_PARAMETER', 'APPEND_ID_PARAMETER',
152
+ 'APPEND_ARRAY_PARAMETER', 'ALLOW_SHORT', 'HAZARDOUS',
153
+ 'PROCESSOR', 'META', 'DISABLE_MESSAGES', 'DISABLED'
154
+ unless @current_packet
155
+ raise parser.error("No current packet for #{keyword}")
156
+ end
157
+ process_current_packet(parser, keyword, params)
158
+
159
+ #######################################################################
160
+ # All the following keywords must have a current item defined
161
+ #######################################################################
162
+ when 'STATE', 'READ_CONVERSION', 'WRITE_CONVERSION',
163
+ 'POLY_READ_CONVERSION', 'POLY_WRITE_CONVERSION',
164
+ 'SEG_POLY_READ_CONVERSION', 'SEG_POLY_WRITE_CONVERSION',
165
+ 'GENERIC_READ_CONVERSION_START',
166
+ 'GENERIC_WRITE_CONVERSION_START', 'REQUIRED', 'LIMITS',
167
+ 'LIMITS_RESPONSE', 'UNITS', 'FORMAT_STRING', 'DESCRIPTION',
168
+ 'HIDDEN', 'MINIMUM_VALUE', 'MAXIMUM_VALUE', 'DEFAULT_VALUE',
169
+ 'OVERFLOW', 'UNEDITABLE'
170
+ unless @current_item
171
+ raise parser.error("No current item for #{keyword}")
172
+ end
173
+ process_current_item(parser, keyword, params)
174
+
175
+ when 'DEFAULT'
176
+ if params.length != @current_packet.sorted_items.length
177
+ raise parser.error("DEFAULT #{params.join(' ')} length of #{params.length} doesn't match item length of #{@current_packet.sorted_items.length}")
178
+ end
179
+ @defaults.concat(params)
180
+
181
+ else
182
+ # blank config.lines will have a nil keyword and should not raise an exception
183
+ raise parser.error("Unknown keyword '#{keyword}'") if keyword
184
+ end # case keyword
185
+ end
186
+ end
187
+
188
+ # Complete the last defined packet
189
+ finish_packet
190
+ end
191
+
192
+ # (see PacketConfig#process_current_packet)
193
+ def process_current_packet(parser, keyword, params)
194
+ super(parser, keyword, params)
195
+ rescue => err
196
+ if err.message.include?('not found')
197
+ raise parser.error(
198
+ "#{params[0]} not found in table #{@current_packet.table_name}",
199
+ 'SELECT_PARAMETER <PARAMETER NAME>',
200
+ )
201
+ else
202
+ raise err
203
+ end
204
+ end
205
+
206
+ # Overridden method to handle the unique table item parameters: UNEDITABLE
207
+ # and HIDDEN.
208
+ # (see PacketConfig#process_current_item)
209
+ def process_current_item(parser, keyword, params)
210
+ super(parser, keyword, params)
211
+ case keyword
212
+ when 'UNEDITABLE'
213
+ usage = "#{keyword}"
214
+ parser.verify_num_parameters(0, 0, usage)
215
+ @current_item.editable = false
216
+ when 'HIDDEN'
217
+ usage = "#{keyword}"
218
+ parser.verify_num_parameters(0, 0, usage)
219
+ @current_item.hidden = true
220
+ end
221
+ end
222
+
223
+ # (see PacketConfig#start_item)
224
+ def start_item(parser)
225
+ finish_item
226
+ @current_item = TableItemParser.parse(parser, @current_packet, @warnings)
227
+ end
228
+
229
+ # If the table is ROW_COLUMN all currently defined items are
230
+ # duplicated until the specified number of rows are created.
231
+ def finish_packet
232
+ if @current_packet
233
+ warnings = @current_packet.check_bit_offsets
234
+ if warnings.length > 0
235
+ raise "Overlapping items not allowed in tables.\n#{warnings}"
236
+ end
237
+ if @current_packet.type == :ROW_COLUMN
238
+ items = @current_packet.sorted_items.clone
239
+ (@current_packet.num_rows - 1).times do |row|
240
+ items.each do |item|
241
+ new_item = item.clone
242
+ new_item.name = "#{new_item.name[0...-1]}#{row + 1}"
243
+ @current_packet.append(new_item)
244
+ end
245
+ end
246
+ end
247
+ unless @defaults.empty?
248
+ @current_packet.sorted_items.each_with_index do |item, index|
249
+ case item.data_type
250
+ when :INT, :UINT
251
+ begin
252
+ # Integer handles hex strings, e.g. 0xDEADBEEF
253
+ item.default = Integer(@defaults[index])
254
+ rescue ArgumentError
255
+ value = item.states[@defaults[index]]
256
+ if value
257
+ item.default = value
258
+ else
259
+ raise "Unknown DEFAULT #{@defaults[index]} for item #{item.name}. Valid states are #{item.states.keys.join(', ')}."
260
+ end
261
+ end
262
+ when :FLOAT
263
+ item.default = @defaults[index].to_f
264
+ when :STRING, :BLOCK
265
+ item.default = @defaults[index]
266
+ end
267
+ end
268
+ end
269
+ end
270
+ super()
271
+ end
272
+ end
273
+ end
@@ -0,0 +1,90 @@
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/packet_item'
21
+
22
+ module OpenC3
23
+ # Implements the attributes that are unique to a TableItem such as editable
24
+ # and hidden. All other functionality is inherited from {PacketItem}.
25
+ class TableItem < PacketItem
26
+ # @return [Boolean] Whether this item is editable
27
+ attr_reader :editable
28
+
29
+ # @return [Boolean] Whether this item is hidden (not displayed)
30
+ attr_reader :hidden
31
+
32
+ # (see PacketItem#initialize)
33
+ def initialize(
34
+ name,
35
+ bit_offset,
36
+ bit_size,
37
+ data_type,
38
+ endianness,
39
+ array_size = nil,
40
+ overflow = :ERROR
41
+ )
42
+ super(
43
+ name,
44
+ bit_offset,
45
+ bit_size,
46
+ data_type,
47
+ endianness,
48
+ array_size,
49
+ overflow,
50
+ )
51
+ @display_type = nil
52
+ @editable = true
53
+ @hidden = false
54
+ end
55
+
56
+ # @param editable [Boolean] Whether this item can be edited
57
+ def editable=(editable)
58
+ unless !!editable == editable
59
+ raise ArgumentError,
60
+ "#{@name}: editable must be a boolean but is a #{editable.class}"
61
+ end
62
+ @editable = editable
63
+ end
64
+
65
+ # @param hidden [Boolean] Whether this item should be hidden
66
+ def hidden=(hidden)
67
+ unless !!hidden == hidden
68
+ raise ArgumentError,
69
+ "#{@name}: hidden must be a boolean but is a #{hidden.class}"
70
+ end
71
+ @hidden = hidden
72
+ end
73
+
74
+ # Make a light weight clone of this item
75
+ def clone
76
+ item = super()
77
+ item.editable = self.editable
78
+ item
79
+ end
80
+ alias dup clone
81
+
82
+ # Create a hash of this item's attributes
83
+ def as_json(*a)
84
+ hash = super()
85
+ hash['editable'] = self.editable
86
+ hash['hidden'] = self.hidden
87
+ hash
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,66 @@
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/packet_config'
21
+ require 'openc3/packets/parsers/packet_item_parser'
22
+ require 'openc3/tools/table_manager/table_item'
23
+
24
+ module OpenC3
25
+ # Extends the PacketItemParser to create TableItems for TableManager
26
+ class TableItemParser < PacketItemParser
27
+ # @param parser [ConfigParser] Configuration parser
28
+ # @param table [Table] Table all parsed items should be added to
29
+ # # @param warnings [Array<String>] Array of warning strings from PacketConfig
30
+ def self.parse(parser, table, warnings)
31
+ parser = TableItemParser.new(parser, warnings)
32
+ parser.verify_parameters(PacketConfig::COMMAND)
33
+ parser.create_table_item(table)
34
+ end
35
+
36
+ # @param table [Table] Table created items are added to
37
+ def create_table_item(table)
38
+ name = @parser.parameters[0]
39
+ if table.type == :ROW_COLUMN
40
+ name = "#{name}0"
41
+ table.num_columns += 1
42
+ end
43
+ item =
44
+ TableItem.new(
45
+ name,
46
+ get_bit_offset,
47
+ get_bit_size,
48
+ get_data_type,
49
+ get_endianness(table),
50
+ get_array_size,
51
+ :ERROR,
52
+ ) # overflow
53
+ item.range = get_range
54
+ item.default = get_default
55
+ item.description = get_description
56
+ if append?
57
+ item = table.append(item)
58
+ else
59
+ item = table.define(item)
60
+ end
61
+ item
62
+ rescue => err
63
+ raise @parser.error(err, @usage)
64
+ end
65
+ end
66
+ end