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