openc3 6.10.4 → 7.0.0.pre.rc2

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 (350) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/Guardfile +4 -9
  4. data/LICENSE.md +85 -0
  5. data/README.md +8 -8
  6. data/Rakefile +3 -9
  7. data/bin/cstol_converter +3 -8
  8. data/bin/openc3cli +64 -35
  9. data/data/config/command_modifiers.yaml +18 -1
  10. data/data/config/interface_modifiers.yaml +0 -2
  11. data/data/config/plugins.yaml +14 -18
  12. data/data/config/screen.yaml +1 -1
  13. data/data/config/target.yaml +26 -79
  14. data/data/config/telemetry_modifiers.yaml +15 -0
  15. data/data/config/widgets.yaml +32 -32
  16. data/ext/openc3/ext/array/array.c +4 -9
  17. data/ext/openc3/ext/buffered_file/buffered_file.c +4 -9
  18. data/ext/openc3/ext/burst_protocol/burst_protocol.c +3 -8
  19. data/ext/openc3/ext/config_parser/config_parser.c +2 -7
  20. data/ext/openc3/ext/crc/crc.c +3 -8
  21. data/ext/openc3/ext/openc3_io/openc3_io.c +4 -9
  22. data/ext/openc3/ext/packet/packet.c +7 -9
  23. data/ext/openc3/ext/platform/platform.c +3 -8
  24. data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +16 -12
  25. data/ext/openc3/ext/string/string.c +4 -9
  26. data/ext/openc3/ext/structure/structure.c +5 -9
  27. data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +4 -9
  28. data/ext/openc3/ext/telemetry/telemetry.c +8 -12
  29. data/lib/cosmos.rb +4 -9
  30. data/lib/cosmosc2.rb +4 -9
  31. data/lib/openc3/accessors/accessor.rb +10 -13
  32. data/lib/openc3/accessors/binary_accessor.rb +18 -17
  33. data/lib/openc3/accessors/cbor_accessor.rb +3 -8
  34. data/lib/openc3/accessors/form_accessor.rb +4 -9
  35. data/lib/openc3/accessors/html_accessor.rb +3 -8
  36. data/lib/openc3/accessors/http_accessor.rb +4 -9
  37. data/lib/openc3/accessors/json_accessor.rb +4 -9
  38. data/lib/openc3/accessors/template_accessor.rb +4 -9
  39. data/lib/openc3/accessors/xml_accessor.rb +4 -9
  40. data/lib/openc3/accessors.rb +3 -8
  41. data/lib/openc3/api/README.md +1 -1
  42. data/lib/openc3/api/api.rb +3 -8
  43. data/lib/openc3/api/authorized_api.rb +4 -9
  44. data/lib/openc3/api/cmd_api.rb +3 -8
  45. data/lib/openc3/api/config_api.rb +3 -8
  46. data/lib/openc3/api/interface_api.rb +4 -9
  47. data/lib/openc3/api/limits_api.rb +3 -8
  48. data/lib/openc3/api/metrics_api.rb +2 -19
  49. data/lib/openc3/api/offline_access_api.rb +2 -7
  50. data/lib/openc3/api/router_api.rb +5 -10
  51. data/lib/openc3/api/settings_api.rb +3 -8
  52. data/lib/openc3/api/stash_api.rb +2 -7
  53. data/lib/openc3/api/target_api.rb +3 -8
  54. data/lib/openc3/api/tlm_api.rb +15 -38
  55. data/lib/openc3/bridge/bridge.rb +3 -8
  56. data/lib/openc3/bridge/bridge_config.rb +5 -10
  57. data/lib/openc3/bridge/bridge_interface_thread.rb +4 -9
  58. data/lib/openc3/bridge/bridge_router_thread.rb +4 -9
  59. data/lib/openc3/ccsds/ccsds_packet.rb +4 -9
  60. data/lib/openc3/ccsds/ccsds_parser.rb +3 -8
  61. data/lib/openc3/config/config_parser.rb +3 -8
  62. data/lib/openc3/config/meta_config_parser.rb +3 -8
  63. data/lib/openc3/conversions/bit_reverse_conversion.rb +3 -8
  64. data/lib/openc3/conversions/conversion.rb +3 -8
  65. data/lib/openc3/conversions/generic_conversion.rb +3 -8
  66. data/lib/openc3/conversions/ip_read_conversion.rb +3 -8
  67. data/lib/openc3/conversions/ip_write_conversion.rb +3 -8
  68. data/lib/openc3/conversions/object_read_conversion.rb +3 -8
  69. data/lib/openc3/conversions/object_write_conversion.rb +3 -8
  70. data/lib/openc3/conversions/packet_time_formatted_conversion.rb +4 -9
  71. data/lib/openc3/conversions/packet_time_seconds_conversion.rb +4 -9
  72. data/lib/openc3/conversions/polynomial_conversion.rb +6 -8
  73. data/lib/openc3/conversions/processor_conversion.rb +3 -8
  74. data/lib/openc3/conversions/received_count_conversion.rb +4 -9
  75. data/lib/openc3/conversions/received_time_formatted_conversion.rb +4 -9
  76. data/lib/openc3/conversions/received_time_seconds_conversion.rb +4 -9
  77. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +6 -8
  78. data/lib/openc3/conversions/unix_time_conversion.rb +3 -8
  79. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +3 -8
  80. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +3 -8
  81. data/lib/openc3/conversions.rb +3 -8
  82. data/lib/openc3/core_ext/array.rb +3 -8
  83. data/lib/openc3/core_ext/binding.rb +4 -9
  84. data/lib/openc3/core_ext/class.rb +4 -9
  85. data/lib/openc3/core_ext/exception.rb +3 -8
  86. data/lib/openc3/core_ext/file.rb +4 -9
  87. data/lib/openc3/core_ext/io.rb +4 -9
  88. data/lib/openc3/core_ext/kernel.rb +3 -8
  89. data/lib/openc3/core_ext/math.rb +4 -9
  90. data/lib/openc3/core_ext/matrix.rb +4 -9
  91. data/lib/openc3/core_ext/objectspace.rb +4 -9
  92. data/lib/openc3/core_ext/openc3_io.rb +4 -9
  93. data/lib/openc3/core_ext/range.rb +4 -9
  94. data/lib/openc3/core_ext/socket.rb +4 -9
  95. data/lib/openc3/core_ext/string.rb +3 -8
  96. data/lib/openc3/core_ext/stringio.rb +4 -9
  97. data/lib/openc3/core_ext/tempfile.rb +4 -9
  98. data/lib/openc3/core_ext/time.rb +3 -8
  99. data/lib/openc3/core_ext.rb +3 -8
  100. data/lib/openc3/interfaces/file_interface.rb +3 -8
  101. data/lib/openc3/interfaces/http_client_interface.rb +3 -8
  102. data/lib/openc3/interfaces/http_server_interface.rb +3 -8
  103. data/lib/openc3/interfaces/interface.rb +3 -8
  104. data/lib/openc3/interfaces/mqtt_interface.rb +3 -8
  105. data/lib/openc3/interfaces/mqtt_stream_interface.rb +3 -8
  106. data/lib/openc3/interfaces/protocols/burst_protocol.rb +3 -8
  107. data/lib/openc3/interfaces/protocols/cmd_response_protocol.rb +3 -8
  108. data/lib/openc3/interfaces/protocols/cobs_protocol.rb +3 -8
  109. data/lib/openc3/interfaces/protocols/crc_protocol.rb +3 -8
  110. data/lib/openc3/interfaces/protocols/fixed_protocol.rb +3 -8
  111. data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +3 -8
  112. data/lib/openc3/interfaces/protocols/length_protocol.rb +3 -8
  113. data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +3 -8
  114. data/lib/openc3/interfaces/protocols/protocol.rb +3 -8
  115. data/lib/openc3/interfaces/protocols/slip_protocol.rb +3 -8
  116. data/lib/openc3/interfaces/protocols/template_protocol.rb +3 -8
  117. data/lib/openc3/interfaces/protocols/terminated_protocol.rb +3 -8
  118. data/lib/openc3/interfaces/serial_interface.rb +3 -8
  119. data/lib/openc3/interfaces/simulated_target_interface.rb +3 -8
  120. data/lib/openc3/interfaces/stream_interface.rb +3 -8
  121. data/lib/openc3/interfaces/tcpip_client_interface.rb +3 -8
  122. data/lib/openc3/interfaces/tcpip_server_interface.rb +3 -8
  123. data/lib/openc3/interfaces/udp_interface.rb +3 -8
  124. data/lib/openc3/interfaces.rb +3 -8
  125. data/lib/openc3/io/buffered_file.rb +4 -9
  126. data/lib/openc3/io/io_multiplexer.rb +4 -9
  127. data/lib/openc3/io/json_api.rb +3 -8
  128. data/lib/openc3/io/json_api_object.rb +4 -9
  129. data/lib/openc3/io/json_drb.rb +3 -8
  130. data/lib/openc3/io/json_drb_object.rb +4 -9
  131. data/lib/openc3/io/json_drb_rack.rb +4 -9
  132. data/lib/openc3/io/json_rpc.rb +3 -8
  133. data/lib/openc3/io/posix_serial_driver.rb +3 -8
  134. data/lib/openc3/io/serial_driver.rb +3 -8
  135. data/lib/openc3/io/stderr.rb +4 -9
  136. data/lib/openc3/io/stdout.rb +4 -9
  137. data/lib/openc3/io/udp_sockets.rb +3 -8
  138. data/lib/openc3/io/win32_serial_driver.rb +4 -9
  139. data/lib/openc3/logs/buffered_packet_log_reader.rb +3 -8
  140. data/lib/openc3/logs/buffered_packet_log_writer.rb +3 -8
  141. data/lib/openc3/logs/log_writer.rb +3 -8
  142. data/lib/openc3/logs/packet_log_constants.rb +3 -8
  143. data/lib/openc3/logs/packet_log_reader.rb +3 -8
  144. data/lib/openc3/logs/packet_log_writer.rb +3 -8
  145. data/lib/openc3/logs/stream_log.rb +3 -8
  146. data/lib/openc3/logs/stream_log_pair.rb +3 -8
  147. data/lib/openc3/logs/text_log_writer.rb +3 -8
  148. data/lib/openc3/logs.rb +3 -8
  149. data/lib/openc3/microservices/cleanup_microservice.rb +4 -14
  150. data/lib/openc3/microservices/decom_microservice.rb +3 -8
  151. data/lib/openc3/microservices/interface_decom_common.rb +3 -8
  152. data/lib/openc3/microservices/interface_microservice.rb +5 -9
  153. data/lib/openc3/microservices/log_microservice.rb +3 -8
  154. data/lib/openc3/microservices/microservice.rb +24 -12
  155. data/lib/openc3/microservices/multi_microservice.rb +2 -7
  156. data/lib/openc3/microservices/periodic_microservice.rb +3 -8
  157. data/lib/openc3/microservices/plugin_microservice.rb +3 -8
  158. data/lib/openc3/microservices/queue_microservice.rb +3 -8
  159. data/lib/openc3/microservices/router_microservice.rb +3 -8
  160. data/lib/openc3/microservices/scope_cleanup_microservice.rb +3 -8
  161. data/lib/openc3/microservices/text_log_microservice.rb +3 -8
  162. data/lib/openc3/migrations/20251213120000_reinstall_plugins.rb +45 -0
  163. data/lib/openc3/migrations/20260204000000_remove_decom_reducer.rb +60 -0
  164. data/lib/openc3/models/activity_model.rb +4 -8
  165. data/lib/openc3/models/auth_model.rb +57 -38
  166. data/lib/openc3/models/cvt_model.rb +203 -62
  167. data/lib/openc3/models/environment_model.rb +4 -9
  168. data/lib/openc3/models/gem_model.rb +3 -8
  169. data/lib/openc3/models/info_model.rb +4 -9
  170. data/lib/openc3/models/interface_model.rb +6 -10
  171. data/lib/openc3/models/interface_status_model.rb +4 -9
  172. data/lib/openc3/models/metadata_model.rb +3 -8
  173. data/lib/openc3/models/metric_model.rb +3 -8
  174. data/lib/openc3/models/microservice_model.rb +24 -10
  175. data/lib/openc3/models/microservice_status_model.rb +3 -8
  176. data/lib/openc3/models/migration_model.rb +3 -8
  177. data/lib/openc3/models/model.rb +3 -8
  178. data/lib/openc3/models/news_model.rb +3 -8
  179. data/lib/openc3/models/note_model.rb +3 -8
  180. data/lib/openc3/models/offline_access_model.rb +3 -8
  181. data/lib/openc3/models/ping_model.rb +4 -9
  182. data/lib/openc3/models/plugin_model.rb +14 -9
  183. data/lib/openc3/models/plugin_store_model.rb +21 -17
  184. data/lib/openc3/models/process_status_model.rb +4 -9
  185. data/lib/openc3/models/python_package_model.rb +3 -8
  186. data/lib/openc3/models/queue_model.rb +3 -8
  187. data/lib/openc3/models/reaction_model.rb +9 -10
  188. data/lib/openc3/models/router_model.rb +4 -9
  189. data/lib/openc3/models/router_status_model.rb +4 -9
  190. data/lib/openc3/models/scope_model.rb +4 -9
  191. data/lib/openc3/models/script_engine_model.rb +3 -8
  192. data/lib/openc3/models/script_status_model.rb +3 -8
  193. data/lib/openc3/models/secret_model.rb +3 -8
  194. data/lib/openc3/models/setting_model.rb +3 -8
  195. data/lib/openc3/models/sorted_model.rb +3 -8
  196. data/lib/openc3/models/stash_model.rb +3 -8
  197. data/lib/openc3/models/target_model.rb +99 -229
  198. data/lib/openc3/models/timeline_model.rb +3 -8
  199. data/lib/openc3/models/tool_config_model.rb +3 -8
  200. data/lib/openc3/models/tool_model.rb +10 -10
  201. data/lib/openc3/models/trigger_group_model.rb +3 -8
  202. data/lib/openc3/models/trigger_model.rb +3 -8
  203. data/lib/openc3/models/widget_model.rb +3 -8
  204. data/lib/openc3/operators/microservice_operator.rb +7 -8
  205. data/lib/openc3/operators/operator.rb +3 -8
  206. data/lib/openc3/packets/command_validator.rb +3 -8
  207. data/lib/openc3/packets/commands.rb +32 -14
  208. data/lib/openc3/packets/json_packet.rb +7 -19
  209. data/lib/openc3/packets/limits.rb +3 -8
  210. data/lib/openc3/packets/limits_response.rb +3 -8
  211. data/lib/openc3/packets/packet.rb +38 -32
  212. data/lib/openc3/packets/packet_config.rb +23 -13
  213. data/lib/openc3/packets/packet_item.rb +3 -8
  214. data/lib/openc3/packets/packet_item_limits.rb +3 -8
  215. data/lib/openc3/packets/parsers/format_string_parser.rb +3 -8
  216. data/lib/openc3/packets/parsers/limits_parser.rb +3 -8
  217. data/lib/openc3/packets/parsers/limits_response_parser.rb +3 -8
  218. data/lib/openc3/packets/parsers/packet_item_parser.rb +7 -8
  219. data/lib/openc3/packets/parsers/packet_parser.rb +3 -8
  220. data/lib/openc3/packets/parsers/processor_parser.rb +3 -8
  221. data/lib/openc3/packets/parsers/state_parser.rb +3 -8
  222. data/lib/openc3/packets/parsers/xtce_converter.rb +12 -9
  223. data/lib/openc3/packets/parsers/xtce_parser.rb +3 -8
  224. data/lib/openc3/packets/structure.rb +14 -11
  225. data/lib/openc3/packets/structure_item.rb +4 -9
  226. data/lib/openc3/packets/telemetry.rb +7 -11
  227. data/lib/openc3/processors/processor.rb +5 -10
  228. data/lib/openc3/processors/statistics_processor.rb +4 -9
  229. data/lib/openc3/processors/watermark_processor.rb +4 -9
  230. data/lib/openc3/processors.rb +4 -9
  231. data/lib/openc3/script/api_shared.rb +8 -37
  232. data/lib/openc3/script/autonomic.rb +3 -8
  233. data/lib/openc3/script/calendar.rb +3 -8
  234. data/lib/openc3/script/commands.rb +3 -8
  235. data/lib/openc3/script/critical_cmd.rb +3 -8
  236. data/lib/openc3/script/exceptions.rb +4 -9
  237. data/lib/openc3/script/extract.rb +3 -8
  238. data/lib/openc3/script/limits.rb +3 -8
  239. data/lib/openc3/script/metadata.rb +3 -8
  240. data/lib/openc3/script/packages.rb +3 -8
  241. data/lib/openc3/script/plugins.rb +3 -8
  242. data/lib/openc3/script/queue.rb +3 -8
  243. data/lib/openc3/script/screen.rb +7 -8
  244. data/lib/openc3/script/script.rb +3 -8
  245. data/lib/openc3/script/script_runner.rb +3 -8
  246. data/lib/openc3/script/storage.rb +6 -10
  247. data/lib/openc3/script/suite.rb +3 -8
  248. data/lib/openc3/script/suite_results.rb +3 -8
  249. data/lib/openc3/script/suite_runner.rb +3 -8
  250. data/lib/openc3/script/tables.rb +3 -8
  251. data/lib/openc3/script/telemetry.rb +3 -8
  252. data/lib/openc3/script/web_socket_api.rb +8 -13
  253. data/lib/openc3/script.rb +4 -9
  254. data/lib/openc3/script_engines/script_engine.rb +3 -8
  255. data/lib/openc3/streams/mqtt_stream.rb +3 -8
  256. data/lib/openc3/streams/serial_stream.rb +3 -8
  257. data/lib/openc3/streams/stream.rb +3 -8
  258. data/lib/openc3/streams/tcpip_client_stream.rb +3 -8
  259. data/lib/openc3/streams/tcpip_socket_stream.rb +3 -8
  260. data/lib/openc3/streams/web_socket_client_stream.rb +3 -8
  261. data/lib/openc3/system/system.rb +3 -8
  262. data/lib/openc3/system/target.rb +3 -8
  263. data/lib/openc3/system.rb +3 -8
  264. data/lib/openc3/tools/cmd_tlm_server/api.rb +4 -9
  265. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +3 -8
  266. data/lib/openc3/tools/table_manager/table.rb +3 -8
  267. data/lib/openc3/tools/table_manager/table_config.rb +3 -8
  268. data/lib/openc3/tools/table_manager/table_item.rb +4 -9
  269. data/lib/openc3/tools/table_manager/table_item_parser.rb +3 -8
  270. data/lib/openc3/tools/table_manager/table_manager_core.rb +3 -8
  271. data/lib/openc3/tools/table_manager/table_parser.rb +3 -8
  272. data/lib/openc3/tools/test_runner/test.rb +4 -9
  273. data/lib/openc3/top_level.rb +3 -8
  274. data/lib/openc3/topics/autonomic_topic.rb +4 -9
  275. data/lib/openc3/topics/calendar_topic.rb +4 -9
  276. data/lib/openc3/topics/command_decom_topic.rb +14 -17
  277. data/lib/openc3/topics/command_topic.rb +14 -10
  278. data/lib/openc3/topics/config_topic.rb +3 -8
  279. data/lib/openc3/topics/decom_interface_topic.rb +3 -8
  280. data/lib/openc3/topics/interface_topic.rb +3 -8
  281. data/lib/openc3/topics/limits_event_topic.rb +3 -8
  282. data/lib/openc3/topics/notebook_topic.rb +32 -0
  283. data/lib/openc3/topics/queue_topic.rb +3 -8
  284. data/lib/openc3/topics/router_topic.rb +3 -8
  285. data/lib/openc3/topics/system_events_topic.rb +3 -8
  286. data/lib/openc3/topics/telemetry_decom_topic.rb +12 -12
  287. data/lib/openc3/topics/telemetry_topic.rb +3 -8
  288. data/lib/openc3/topics/timeline_topic.rb +4 -9
  289. data/lib/openc3/topics/topic.rb +3 -8
  290. data/lib/openc3/utilities/authentication.rb +29 -10
  291. data/lib/openc3/utilities/authorization.rb +4 -9
  292. data/lib/openc3/utilities/aws_bucket.rb +126 -16
  293. data/lib/openc3/utilities/bucket.rb +9 -9
  294. data/lib/openc3/utilities/bucket_file_cache.rb +3 -13
  295. data/lib/openc3/utilities/bucket_require.rb +3 -8
  296. data/lib/openc3/utilities/bucket_utilities.rb +3 -10
  297. data/lib/openc3/utilities/cli_generator.rb +11 -16
  298. data/lib/openc3/utilities/cmd_log.rb +3 -8
  299. data/lib/openc3/utilities/crc.rb +3 -8
  300. data/lib/openc3/utilities/csv.rb +4 -9
  301. data/lib/openc3/utilities/local_bucket.rb +5 -10
  302. data/lib/openc3/utilities/local_mode.rb +14 -18
  303. data/lib/openc3/utilities/logger.rb +3 -8
  304. data/lib/openc3/utilities/message_log.rb +3 -8
  305. data/lib/openc3/utilities/metric.rb +3 -8
  306. data/lib/openc3/utilities/migration.rb +3 -8
  307. data/lib/openc3/utilities/open_telemetry.rb +3 -8
  308. data/lib/openc3/utilities/process_manager.rb +3 -8
  309. data/lib/openc3/utilities/python_proxy.rb +3 -8
  310. data/lib/openc3/utilities/quaternion.rb +3 -8
  311. data/lib/openc3/utilities/questdb_client.rb +210 -0
  312. data/lib/openc3/utilities/redis_secrets.rb +3 -8
  313. data/lib/openc3/utilities/ruby_lex_utils.rb +3 -8
  314. data/lib/openc3/utilities/running_script.rb +13 -11
  315. data/lib/openc3/utilities/s3_autoload.rb +9 -2
  316. data/lib/openc3/utilities/secrets.rb +8 -9
  317. data/lib/openc3/utilities/simulated_target.rb +4 -9
  318. data/lib/openc3/utilities/sleeper.rb +3 -8
  319. data/lib/openc3/utilities/store.rb +4 -9
  320. data/lib/openc3/utilities/store_autoload.rb +7 -14
  321. data/lib/openc3/utilities/store_queued.rb +6 -9
  322. data/lib/openc3/utilities/target_file.rb +3 -8
  323. data/lib/openc3/utilities/thread_manager.rb +3 -8
  324. data/lib/openc3/utilities/throttle.rb +3 -8
  325. data/lib/openc3/utilities/zip.rb +4 -9
  326. data/lib/openc3/utilities.rb +4 -9
  327. data/lib/openc3/version.rb +8 -8
  328. data/lib/openc3/win32/excel.rb +4 -9
  329. data/lib/openc3/win32/win32.rb +4 -9
  330. data/lib/openc3/win32/win32_main.rb +3 -8
  331. data/lib/openc3.rb +3 -12
  332. data/tasks/gemfile_stats.rake +4 -9
  333. data/tasks/spec.rake +4 -9
  334. data/templates/plugin/README.md +2 -2
  335. data/templates/plugin/plugin.gemspec +1 -1
  336. data/templates/tool_angular/package.json +1 -1
  337. data/templates/tool_vue/package.json +3 -3
  338. data/templates/tool_vue/vite.config.js +2 -1
  339. data/templates/widget/package.json +3 -3
  340. data/templates/widget/vite.config.js +1 -1
  341. metadata +49 -26
  342. data/LICENSE.txt +0 -729
  343. data/bin/rubysloc +0 -142
  344. data/ext/openc3/ext/reducer_microservice/extconf.rb +0 -13
  345. data/ext/openc3/ext/reducer_microservice/reducer_microservice.c +0 -165
  346. data/lib/openc3/microservices/reducer_microservice.rb +0 -640
  347. data/lib/openc3/models/reducer_model.rb +0 -72
  348. data/lib/openc3/topics/telemetry_reduced_topics.rb +0 -80
  349. /data/templates/plugin/{LICENSE.txt → LICENSE.md} +0 -0
  350. /data/templates/widget/{LICENSE.txt → LICENSE.md} +0 -0
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2024, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -53,9 +48,13 @@ module OpenC3
53
48
  if microservice_config["needs_dependencies"]
54
49
  env['GEM_HOME'] = '/gems'
55
50
  env['PYTHONUSERBASE'] = '/gems/python_packages'
51
+ # Ensure PYTHONPATH includes both the UV venv (for base openc3 module) and user packages
52
+ # This is critical for UV-based Python installations where openc3 is installed as editable
53
+ env['PYTHONPATH'] = "#{ENV['PYTHONPATH']}"
56
54
  else
57
55
  env['GEM_HOME'] = nil
58
56
  env['PYTHONUSERBASE'] = nil
57
+ env['PYTHONPATH'] = nil
59
58
  end
60
59
  env['OPENC3_MICROSERVICE_NAME'] = microservice_name
61
60
  container = microservice_config["container"]
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -1,17 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2024 OpenC3, Inc.
3
+ # Copyright 2026 OpenC3, Inc.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # This file may also be used under the terms of a commercial license
17
12
  # if purchased from OpenC3, Inc.
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2025, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -190,9 +185,15 @@ module OpenC3
190
185
  target_upcase = target_name.to_s.upcase
191
186
  packet_upcase = packet_name.to_s.upcase
192
187
 
193
- # Lookup the command and create a light weight copy
194
- pkt = packet(target_upcase, packet_upcase)
195
- command = pkt.clone
188
+ # Lookup the command directly - avoid redundant upcase in packet()/packets()
189
+ target_packets = @config.commands[target_upcase]
190
+ raise "Command target '#{target_upcase}' does not exist" unless target_packets
191
+ pkt = target_packets[packet_upcase]
192
+ raise "Command packet '#{target_upcase} #{packet_upcase}' does not exist" unless pkt
193
+ # Use deep_copy to avoid shared item modifications affecting the template
194
+ # This is critical for variable_bit_size items where handle_write_variable_bit_size
195
+ # modifies item.bit_offset and item.array_size during writes
196
+ command = pkt.deep_copy
196
197
 
197
198
  # Restore the command's buffer to a zeroed string of defined length
198
199
  # This will undo any side effects from earlier commands that may have altered the size
@@ -294,8 +295,25 @@ module OpenC3
294
295
 
295
296
  def set_parameters(command, params, range_checking)
296
297
  given_item_names = []
298
+
299
+ # Identify length fields that are auto-managed by variable_bit_size arrays
300
+ # These should not be written directly - the array write will auto-update them
301
+ auto_length_fields = Set.new
302
+ command.sorted_items.each do |item|
303
+ if item.variable_bit_size
304
+ auto_length_fields << item.variable_bit_size['length_item_name'].upcase
305
+ end
306
+ end
307
+
297
308
  params.each do |item_name, value|
298
309
  item_upcase = item_name.to_s.upcase
310
+
311
+ # Skip auto-managed length fields - they will be set when the array is written
312
+ if auto_length_fields.include?(item_upcase)
313
+ given_item_names << item_upcase
314
+ next
315
+ end
316
+
299
317
  item = command.get_item(item_upcase)
300
318
  range_check_value = value
301
319
 
@@ -327,11 +345,11 @@ module OpenC3
327
345
  end
328
346
  end
329
347
 
330
- # Update parameter in command
348
+ # Update parameter in command - use write_item directly to avoid redundant get_item call
331
349
  if command.raw
332
- command.write(item_upcase, value, :RAW)
350
+ command.write_item(item, value, :RAW)
333
351
  else
334
- command.write(item_upcase, value, :CONVERTED)
352
+ command.write_item(item, value, :CONVERTED)
335
353
  end
336
354
 
337
355
  given_item_names << item_upcase
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -77,7 +72,9 @@ module OpenC3
77
72
  end
78
73
  end
79
74
  if reduced_type
80
- raise "Reduced types only support RAW or CONVERTED value types: #{value_type} unsupported" if value_type == :WITH_UNITS or value_type == :FORMATTED
75
+ if value_type == :FORMATTED or value_type == :WITH_UNITS
76
+ raise "Reduced types only support RAW or CONVERTED value types: #{value_type} unsupported"
77
+ end
81
78
  if value_type == :CONVERTED
82
79
  case reduced_type
83
80
  when :AVG
@@ -109,13 +106,6 @@ module OpenC3
109
106
  return value
110
107
  end
111
108
  end
112
- if value_type == :WITH_UNITS
113
- value = @json_hash["#{name}__U"]
114
- if value
115
- value = value[array_index] if array_index
116
- return value
117
- end
118
- end
119
109
  if value_type == :WITH_UNITS or value_type == :FORMATTED
120
110
  value = @json_hash["#{name}__F"]
121
111
  if value
@@ -197,10 +187,8 @@ module OpenC3
197
187
  postfix = ''
198
188
  when :CONVERTED
199
189
  postfix = 'C'
200
- when :FORMATTED
190
+ when :FORMATTED, :WITH_UNITS
201
191
  postfix = 'F'
202
- when :WITH_UNITS
203
- postfix = 'U'
204
192
  end
205
193
  case reduced_type
206
194
  when :MIN
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -3,15 +3,10 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
12
  # All changes Copyright 2026, OpenC3, Inc.
@@ -32,7 +27,8 @@ module OpenC3
32
27
  # Packet adds is the ability to apply formatting to PacketItem values as well
33
28
  # as managing PacketItem's limit states.
34
29
  class Packet < Structure
35
- RESERVED_ITEM_NAMES = ['PACKET_TIMESECONDS'.freeze, 'PACKET_TIMEFORMATTED'.freeze, 'RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
30
+ RESERVED_ITEM_NAMES = Set['PACKET_TIMESECONDS'.freeze, 'PACKET_TIMEFORMATTED'.freeze, 'RECEIVED_TIMESECONDS'.freeze,
31
+ 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze, 'COSMOS_DATA_TAG'.freeze, 'COSMOS_EXTRA'.freeze].freeze
36
32
  ANY_STATE = 'ANY'
37
33
 
38
34
  # @return [String] Name of the target this packet is associated with
@@ -119,8 +115,11 @@ module OpenC3
119
115
  # @return [Subpacketizer] Subpacketizer class (optional)
120
116
  attr_accessor :subpacketizer
121
117
 
118
+ # @return [Boolean] Catchall flag - Used to prevent warnings for catchall packets
119
+ attr_accessor :catchall
120
+
122
121
  # Valid format types
123
- VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
122
+ VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED]
124
123
 
125
124
  if RUBY_ENGINE != 'ruby' or ENV['OPENC3_NO_EXT']
126
125
  # Creates a new packet by initializing the attributes.
@@ -165,6 +164,7 @@ module OpenC3
165
164
  @subpacket = false
166
165
  @subpacketizer = nil
167
166
  @obfuscated_items = nil
167
+ @catchall = false
168
168
  end
169
169
 
170
170
  # Sets the target name this packet is associated with. Unidentified packets
@@ -219,7 +219,7 @@ module OpenC3
219
219
  if !(Time === received_time)
220
220
  raise(ArgumentError, "received_time must be a Time but is a #{received_time.class}")
221
221
  end
222
- @received_time = received_time.clone.freeze
222
+ @received_time = received_time
223
223
  else
224
224
  @received_time = nil
225
225
  end
@@ -602,7 +602,7 @@ module OpenC3
602
602
  cloned_item = sorted_item.clone
603
603
  cloned_item.key = cloned_item.name
604
604
  cloned_item.name = "#{item.name}.#{cloned_item.name}"
605
- cloned_item.parent_item = item
605
+ cloned_item.parent_item = item.name
606
606
  cloned_item.bit_offset = item.bit_offset
607
607
  if sorted_item.bit_size <= 0
608
608
  cloned_item.bit_size = item.bit_size
@@ -625,9 +625,10 @@ module OpenC3
625
625
  # Must be one of {VALUE_TYPES}
626
626
  # @param buffer (see Structure#read_item)
627
627
  # @param given_raw Given raw value to optimize
628
- # @return The value. :FORMATTED and :WITH_UNITS values are always returned
629
- # as Strings. :RAW values will match their data_type. :CONVERTED values
630
- # can be any type.
628
+ # @return The value
629
+ # :FORMATTED values are always returned as Strings
630
+ # :RAW values will match their data_type
631
+ # :CONVERTED values can be any type
631
632
  def read_item(item, value_type = :CONVERTED, buffer = @buffer, given_raw = nil)
632
633
  if given_raw
633
634
  # Must clone this since value is returned
@@ -733,7 +734,7 @@ module OpenC3
733
734
  value_type = value_type.simple_formatted unless value_type.is_printable?
734
735
  value_type += '...'
735
736
  end
736
- raise ArgumentError, "Unknown value type '#{value_type}', must be :RAW, :CONVERTED, :FORMATTED, or :WITH_UNITS"
737
+ raise ArgumentError, "Unknown value type '#{value_type}', must be :RAW, :CONVERTED or :FORMATTED"
737
738
  end
738
739
  return value
739
740
  end
@@ -803,7 +804,7 @@ module OpenC3
803
804
  value_type = value_type.simple_formatted unless value_type.is_printable?
804
805
  value_type += '...'
805
806
  end
806
- raise ArgumentError, "Unknown value type '#{value_type}', must be :RAW, :CONVERTED, :FORMATTED, or :WITH_UNITS"
807
+ raise ArgumentError, "Unknown value type '#{value_type}', must be :RAW, :CONVERTED or :FORMATTED"
807
808
  end
808
809
  if @read_conversion_cache
809
810
  synchronize() do
@@ -1048,6 +1049,9 @@ module OpenC3
1048
1049
  if item.limits.enabled
1049
1050
  value = read_item(item)
1050
1051
 
1052
+ # Skip limits checking if value is nil (item outside buffer bounds)
1053
+ next if value.nil?
1054
+
1051
1055
  # Handle state monitoring and value monitoring differently
1052
1056
  if item.states
1053
1057
  handle_limits_states(item, value)
@@ -1094,7 +1098,7 @@ module OpenC3
1094
1098
  end
1095
1099
  end
1096
1100
  packet.instance_variable_set("@read_conversion_cache".freeze, nil)
1097
- packet.extra = JSON.parse(packet.extra.as_json().to_json(allow_nan: true), allow_nan: true, create_additions: true) if packet.extra # Deep copy using JSON
1101
+ packet.extra = packet.extra.deep_dup if packet.extra
1098
1102
  packet
1099
1103
  end
1100
1104
  alias dup clone
@@ -1136,13 +1140,13 @@ module OpenC3
1136
1140
  if @validator
1137
1141
  config << " VALIDATOR #{@validator.class} #{@validator.args.map { |a| a.to_s.quote_if_necessary }.join(" ")}\n"
1138
1142
  end
1139
- # TODO: Add TEMPLATE_ENCODED so this can always be done inline regardless of content
1140
1143
  if @template
1141
- config << " TEMPLATE '#{@template}'\n"
1144
+ config << " TEMPLATE_BASE64 #{Base64.strict_encode64(@template)}\n"
1142
1145
  end
1143
1146
  config << " ALLOW_SHORT\n" if @short_buffer_allowed
1144
1147
  config << " HAZARDOUS #{@hazardous_description.to_s.quote_if_necessary}\n" if @hazardous
1145
1148
  config << " DISABLE_MESSAGES\n" if @messages_disabled
1149
+ config << " CATCHALL" if @catchall
1146
1150
  if @virtual
1147
1151
  config << " VIRTUAL\n"
1148
1152
  elsif @disabled
@@ -1213,6 +1217,7 @@ module OpenC3
1213
1217
  config['hazardous'] = true if @hazardous
1214
1218
  config['hazardous_description'] = @hazardous_description.to_s if @hazardous_description
1215
1219
  config['messages_disabled'] = true if @messages_disabled
1220
+ config['catchall'] = true if @catchall
1216
1221
  config['disabled'] = true if @disabled
1217
1222
  config['hidden'] = true if @hidden
1218
1223
  config['virtual'] = true if @virtual
@@ -1222,7 +1227,7 @@ module OpenC3
1222
1227
  config['accessor'] = @accessor.class.to_s
1223
1228
  config['accessor_args'] = @accessor.args
1224
1229
  config['validator'] = @validator.class.to_s if @validator
1225
- config['template'] = Base64.encode64(@template) if @template
1230
+ config['template'] = Base64.strict_encode64(@template) if @template
1226
1231
  config['config_name'] = self.config_name
1227
1232
  config['obfuscated_items'] = @obfuscated_items&.map(&:name) || []
1228
1233
 
@@ -1283,24 +1288,22 @@ module OpenC3
1283
1288
  # Read all the RAW at once because this could be optimized by the accessor
1284
1289
  json_hash = read_items(@sorted_items)
1285
1290
 
1286
- # Decom extra into the values (all raw)
1287
- if @extra
1288
- @extra.each do |key, value|
1289
- json_hash[key.upcase] = value
1290
- end
1291
- end
1292
-
1293
1291
  # Now read all other value types - no accessor required
1294
1292
  @sorted_items.each do |item|
1295
1293
  if item.hidden
1296
1294
  json_hash.delete(item.name)
1297
1295
  else
1298
1296
  given_raw = json_hash[item.name]
1299
- json_hash["#{item.name}__C"] = read_item(item, :CONVERTED, @buffer, given_raw) if item.states or (item.read_conversion and item.data_type != :DERIVED)
1300
- json_hash["#{item.name}__F"] = read_item(item, :FORMATTED, @buffer, given_raw) if item.format_string
1301
- json_hash["#{item.name}__U"] = read_item(item, :WITH_UNITS, @buffer, given_raw) if item.units
1297
+ if item.states or (item.read_conversion and item.data_type != :DERIVED)
1298
+ json_hash["#{item.name}__C"] = read_item(item, :CONVERTED, @buffer, given_raw)
1299
+ end
1300
+ if item.format_string or item.units
1301
+ json_hash["#{item.name}__F"] = read_item(item, :FORMATTED, @buffer, given_raw)
1302
+ end
1302
1303
  limits_state = item.limits.state
1303
- json_hash["#{item.name}__L"] = limits_state if limits_state
1304
+ if limits_state
1305
+ json_hash["#{item.name}__L"] = limits_state
1306
+ end
1304
1307
  end
1305
1308
  end
1306
1309
 
@@ -1520,14 +1523,17 @@ module OpenC3
1520
1523
  end
1521
1524
 
1522
1525
  def apply_format_string_and_units(item, value, value_type)
1526
+ # Return nil as-is - can't format a value that doesn't exist
1527
+ return nil if value.nil?
1528
+
1523
1529
  if value_type == :FORMATTED or value_type == :WITH_UNITS
1524
1530
  if item.format_string && value
1525
1531
  value = sprintf(item.format_string, value)
1526
1532
  else
1527
1533
  value = value.to_s
1528
1534
  end
1535
+ value << ' ' << item.units if item.units
1529
1536
  end
1530
- value = "#{value} #{item.units}" if value_type == :WITH_UNITS and item.units
1531
1537
  value
1532
1538
  end
1533
1539
 
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2025, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license
@@ -35,6 +30,7 @@ require 'openc3/utilities/python_proxy'
35
30
  require 'openc3/conversions'
36
31
  require 'openc3/processors'
37
32
  require 'openc3/accessors'
33
+ require 'base64'
38
34
  require 'nokogiri'
39
35
  require 'ostruct'
40
36
  require 'fileutils'
@@ -244,7 +240,7 @@ module OpenC3
244
240
  'PARAMETER', 'ID_ITEM', 'ID_PARAMETER', 'ARRAY_ITEM', 'ARRAY_PARAMETER', 'APPEND_ITEM',\
245
241
  'APPEND_PARAMETER', 'APPEND_ID_ITEM', 'APPEND_ID_PARAMETER', 'APPEND_ARRAY_ITEM',\
246
242
  'APPEND_ARRAY_PARAMETER', 'ALLOW_SHORT', 'HAZARDOUS', 'PROCESSOR', 'META',\
247
- 'DISABLE_MESSAGES', 'HIDDEN', 'DISABLED', 'VIRTUAL', 'RESTRICTED', 'ACCESSOR', 'TEMPLATE', 'TEMPLATE_FILE',\
243
+ 'DISABLE_MESSAGES', 'HIDDEN', 'DISABLED', 'VIRTUAL', 'CATCHALL', 'RESTRICTED', 'ACCESSOR', 'TEMPLATE', 'TEMPLATE_BASE64', 'TEMPLATE_FILE',\
248
244
  'RESPONSE', 'ERROR_RESPONSE', 'SCREEN', 'RELATED_ITEM', 'IGNORE_OVERLAP', 'VALIDATOR', 'SUBPACKET', 'SUBPACKETIZER',\
249
245
  'STRUCTURE', 'APPEND_STRUCTURE'
250
246
  raise parser.error("No current packet for #{keyword}") unless @current_packet
@@ -341,6 +337,10 @@ module OpenC3
341
337
  finish_item()
342
338
  if @current_packet
343
339
  @warnings += @current_packet.check_bit_offsets
340
+ if !@current_packet.virtual && !@current_packet.disabled && !@current_packet.catchall && @current_packet.target_name != 'UNKNOWN' && @current_packet.id_items.empty?
341
+ type = @current_cmd_or_tlm == COMMAND ? "Command" : "Telemetry"
342
+ @warnings << "#{type} packet #{@current_packet.target_name} #{@current_packet.packet_name} has no ID_ITEMS and will match all buffers"
343
+ end
344
344
  if @current_cmd_or_tlm == COMMAND
345
345
  PacketParser.check_item_data_types(@current_packet)
346
346
  @commands[@current_packet.target_name][@current_packet.packet_name] = @current_packet
@@ -493,8 +493,8 @@ module OpenC3
493
493
  'APPEND_ARRAY_ITEM', 'APPEND_ARRAY_PARAMETER', 'STRUCTURE', 'APPEND_STRUCTURE'
494
494
  start_item(parser)
495
495
 
496
- # Allow this packet to be received with less data than the defined length
497
- # without generating a warning.
496
+ # Allow this packet to be received with less data than the defined length.
497
+ # Items that are beyond the buffer will return nil when read.
498
498
  when 'ALLOW_SHORT'
499
499
  @current_packet.short_buffer_allowed = true
500
500
 
@@ -568,6 +568,11 @@ module OpenC3
568
568
  parser.verify_num_parameters(0, 0, usage)
569
569
  @current_packet.restricted = true
570
570
 
571
+ when 'CATCHALL'
572
+ usage = "#{keyword}"
573
+ parser.verify_num_parameters(0, 0, usage)
574
+ @current_packet.catchall = true
575
+
571
576
  when 'ACCESSOR', 'VALIDATOR', 'SUBPACKETIZER'
572
577
  usage = "#{keyword} <Class name> <Optional parameters> ..."
573
578
  parser.verify_num_parameters(1, nil, usage)
@@ -594,14 +599,19 @@ module OpenC3
594
599
  when 'TEMPLATE'
595
600
  usage = "#{keyword} <Template string>"
596
601
  parser.verify_num_parameters(1, 1, usage)
597
- @current_packet.template = params[0]
602
+ @current_packet.template = params[0].force_encoding('ascii-8bit')
603
+
604
+ when 'TEMPLATE_BASE64'
605
+ usage = "#{keyword} <Template string>"
606
+ parser.verify_num_parameters(1, 1, usage)
607
+ @current_packet.template = Base64.decode64(params[0])
598
608
 
599
609
  when 'TEMPLATE_FILE'
600
610
  usage = "#{keyword} <Template file path>"
601
611
  parser.verify_num_parameters(1, 1, usage)
602
612
 
603
613
  begin
604
- @current_packet.template = parser.read_file(params[0])
614
+ @current_packet.template = parser.read_file(params[0]).force_encoding('ascii-8bit')
605
615
  rescue Exception => e
606
616
  raise parser.error(e.formatted)
607
617
  end
@@ -3,18 +3,13 @@
3
3
  # Copyright 2022 Ball Aerospace & Technologies Corp.
4
4
  # All Rights Reserved.
5
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
6
  # This program is distributed in the hope that it will be useful,
12
7
  # 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.
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
15
10
 
16
11
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2025, OpenC3, Inc.
12
+ # All changes Copyright 2026, OpenC3, Inc.
18
13
  # All Rights Reserved
19
14
  #
20
15
  # This file may also be used under the terms of a commercial license