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
@@ -1,17 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2025 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.
@@ -200,8 +195,8 @@ module OpenC3
200
195
  abort("Target #{target_path} already exists!")
201
196
  end
202
197
  target_lib_filename = "#{target_name.downcase}.#{@@language}"
203
- target_class = target_lib_filename.filename_to_class_name # NOSONAR
204
- target_object = target_name.downcase # NOSONAR
198
+ target_class = target_lib_filename.filename_to_class_name
199
+ target_object = target_name.downcase
205
200
 
206
201
  process_template("#{TEMPLATES_DIR}/target", binding) do |filename|
207
202
  # Rename the template TARGET to our actual target named after the plugin
@@ -228,7 +223,7 @@ module OpenC3
228
223
  else
229
224
  'requirements.txt'
230
225
  end
231
- s.files = Dir.glob("{targets,lib,public,tools,microservices}/**/*") + %w(Rakefile README.md LICENSE.txt plugin.txt) + [python_dep_file]
226
+ s.files = Dir.glob("{targets,lib,public,tools,microservices}/**/*") + %w(Rakefile README.md LICENSE.md plugin.txt) + [python_dep_file]
232
227
  RUBY
233
228
  end
234
229
  File.write(gemspec_filename, gemspec)
@@ -296,7 +291,7 @@ RUBY
296
291
  abort("Microservice #{microservice_path} already exists!")
297
292
  end
298
293
  microservice_filename = "#{microservice_name.downcase}.#{@@language}"
299
- microservice_class = microservice_filename.filename_to_class_name # NOSONAR
294
+ microservice_class = microservice_filename.filename_to_class_name
300
295
 
301
296
  process_template("#{TEMPLATES_DIR}/microservice", binding) do |filename|
302
297
  # Rename the template MICROSERVICE to our actual microservice name
@@ -551,7 +546,7 @@ RUBY
551
546
  end
552
547
  conversion_name = "#{args[2].upcase.gsub(/_+|-+/, '_')}_CONVERSION"
553
548
  conversion_basename = "#{conversion_name.downcase}.#{@@language}"
554
- conversion_class = conversion_basename.filename_to_class_name # NOSONAR
549
+ conversion_class = conversion_basename.filename_to_class_name
555
550
  conversion_filename = "targets/#{target_name}/lib/#{conversion_basename}"
556
551
  if File.exist?(conversion_filename)
557
552
  abort("Conversion #{conversion_filename} already exists!")
@@ -605,7 +600,7 @@ RUBY
605
600
  end
606
601
  processor_name = "#{args[2].upcase.gsub(/_+|-+/, '_')}_PROCESSOR"
607
602
  processor_basename = "#{processor_name.downcase}.#{@@language}"
608
- processor_class = processor_basename.filename_to_class_name # NOSONAR
603
+ processor_class = processor_basename.filename_to_class_name
609
604
  processor_filename = "targets/#{target_name}/lib/#{processor_basename}"
610
605
  if File.exist?(processor_filename)
611
606
  abort("Processor #{processor_filename} already exists!")
@@ -660,7 +655,7 @@ RUBY
660
655
  response_name = "#{args[2].upcase.gsub(/_+|-+/, '_')}_LIMITS_RESPONSE"
661
656
  response_basename = "#{response_name.downcase}.#{@@language}"
662
657
  response_filename = "targets/#{target_name}/lib/#{response_basename}"
663
- response_class = response_basename.filename_to_class_name # NOSONAR
658
+ response_class = response_basename.filename_to_class_name
664
659
  if File.exist?(response_filename)
665
660
  abort("response #{response_filename} already exists!")
666
661
  end
@@ -713,7 +708,7 @@ RUBY
713
708
  end
714
709
  validator_name = "#{args[2].upcase.gsub(/_+|-+/, '_')}_COMMAND_VALIDATOR"
715
710
  validator_basename = "#{validator_name.downcase}.#{@@language}"
716
- validator_class = validator_basename.filename_to_class_name # NOSONAR
711
+ validator_class = validator_basename.filename_to_class_name
717
712
  validator_filename = "targets/#{target_name}/lib/#{validator_basename}"
718
713
  if File.exist?(validator_filename)
719
714
  abort("Command validator #{validator_filename} already exists!")
@@ -1,17 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2025 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 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,21 +3,16 @@
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
- # This file may also be used under the terms of a commercial license
15
+ # This file may also be used under the terms of a commercial license
21
16
  # if purchased from OpenC3, Inc.
22
17
 
23
18
  require 'csv'
@@ -1,19 +1,14 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2022 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
- # This file may also be used under the terms of a commercial license
11
+ # This file may also be used under the terms of a commercial license
17
12
  # if purchased from OpenC3, Inc.
18
13
 
19
14
  require 'openc3/utilities/aws_bucket'
@@ -22,7 +17,7 @@ module OpenC3
22
17
  # This class exists simply to enable the following code in bucket.rb
23
18
  # bucket_class = ENV['OPENC3_CLOUD'].capitalize + 'Bucket'
24
19
  # So when the OPENC3_CLOUD var is set to 'local' this file is used
25
- # The local code uses Minio which is identical to the Aws APIs
20
+ # The local code uses versitygw which is identical to the Aws APIs
26
21
  class LocalBucket < AwsBucket
27
22
  end
28
23
  end
@@ -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.
@@ -26,13 +21,13 @@ require 'openc3/utilities/bucket'
26
21
  module OpenC3
27
22
  module LocalMode
28
23
  OPENC3_LOCAL_MODE_PATH = ENV['OPENC3_LOCAL_MODE_PATH'] || "/plugins"
29
- # When updating update local_mode.py, PluginsTab.vue, plugins.spec.ts
24
+ # When updating update local_mode.py, PluginsTab.vue, plugins.p.spec.ts
30
25
  DEFAULT_PLUGINS = [
31
26
  'openc3-cosmos-tool-admin',
32
27
  'openc3-cosmos-tool-bucketexplorer',
33
28
  'openc3-cosmos-tool-cmdsender',
34
- 'openc3-cosmos-tool-cmdqueue',
35
- 'openc3-cosmos-tool-cmdhistory',
29
+ 'openc3-cosmos-tool-cmdqueue', # Enterprise only
30
+ 'openc3-cosmos-tool-cmdhistory', # Enterprise only
36
31
  'openc3-cosmos-tool-cmdtlmserver',
37
32
  'openc3-cosmos-tool-dataextractor',
38
33
  'openc3-cosmos-tool-dataviewer',
@@ -45,13 +40,14 @@ module OpenC3
45
40
  'openc3-cosmos-tool-tablemanager',
46
41
  'openc3-cosmos-tool-tlmgrapher',
47
42
  'openc3-cosmos-tool-tlmviewer',
48
- 'openc3-cosmos-enterprise-tool-admin',
49
- 'openc3-enterprise-tool-base',
50
- 'openc3-cosmos-tool-autonomic',
51
- 'openc3-cosmos-tool-calendar',
52
- 'openc3-cosmos-tool-grafana',
53
- 'openc3-cosmos-tool-systemhealth',
54
- 'openc3-cosmos-tool-logexplorer',
43
+ 'openc3-cosmos-enterprise-tool-admin', # Enterprise only
44
+ 'openc3-cosmos-tool-autonomic', # Enterprise only
45
+ 'openc3-cosmos-tool-calendar', # Enterprise only
46
+ 'openc3-cosmos-tool-grafana', # Enterprise only
47
+ 'openc3-cosmos-tool-logexplorer', # Enterprise only
48
+ 'openc3-cosmos-tool-notebooks', # Enterprise only
49
+ 'openc3-cosmos-tool-systemhealth', # Enterprise only
50
+ 'openc3-enterprise-tool-base', # Enterprise only
55
51
  'openc3-tool-base',
56
52
  ]
57
53
 
@@ -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 2023, 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
@@ -1,17 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2023 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.
@@ -1,17 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2022 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.
@@ -1,17 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2023 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 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 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
@@ -0,0 +1,210 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2026 OpenC3, Inc.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is distributed in the hope that it will be useful,
7
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
8
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
+ # See LICENSE.md for more details.
10
+ #
11
+ # This file may also be used under the terms of a commercial license
12
+ # if purchased from OpenC3, Inc.
13
+
14
+ require 'json'
15
+ require 'base64'
16
+ require 'bigdecimal'
17
+
18
+ module OpenC3
19
+ # Utility class for QuestDB data encoding and decoding.
20
+ # This provides a common interface for serializing/deserializing COSMOS data types
21
+ # when writing to and reading from QuestDB.
22
+ class QuestDBClient
23
+ # Special timestamp items that are calculated from PACKET_TIMESECONDS/RECEIVED_TIMESECONDS columns
24
+ # rather than stored as separate columns. PACKET_TIMESECONDS and RECEIVED_TIMESECONDS are stored
25
+ # as timestamp_ns columns and need conversion to float seconds on read. The TIMEFORMATTED items
26
+ # are derived from these timestamp columns.
27
+ TIMESTAMP_ITEMS = {
28
+ 'PACKET_TIMEFORMATTED' => { source: 'PACKET_TIMESECONDS', format: :formatted },
29
+ 'RECEIVED_TIMEFORMATTED' => { source: 'RECEIVED_TIMESECONDS', format: :formatted }
30
+ }.freeze
31
+
32
+ # Sentinel values for storing float special values (inf, -inf, nan) in QuestDB.
33
+ # QuestDB stores these as NULL, so we use sentinel values near float max instead.
34
+
35
+ # 64-bit double sentinels (for FLOAT 64-bit columns)
36
+ FLOAT64_POS_INF_SENTINEL = 1.7976931348623155e308
37
+ FLOAT64_NEG_INF_SENTINEL = -1.7976931348623155e308
38
+ FLOAT64_NAN_SENTINEL = -1.7976931348623153e308
39
+
40
+ # 32-bit float sentinels (what we read back after 32-bit storage)
41
+ FLOAT32_POS_INF_STORED = 3.4028232635611926e38
42
+ FLOAT32_NEG_INF_STORED = -3.4028232635611926e38
43
+ FLOAT32_NAN_STORED = -3.4028230607370965e38
44
+
45
+ # Decode sentinel values back to float special values (inf, -inf, nan).
46
+ # Checks against both 32-bit and 64-bit sentinel values since we may not
47
+ # know the original column type at read time.
48
+ #
49
+ # @param value [Float] The float value to potentially decode
50
+ # @return [Float] The value with sentinels replaced by special values
51
+ def self.decode_float_special_values(value)
52
+ return value unless value.is_a?(Float)
53
+
54
+ # Check 64-bit sentinels
55
+ return Float::INFINITY if value == FLOAT64_POS_INF_SENTINEL
56
+ return -Float::INFINITY if value == FLOAT64_NEG_INF_SENTINEL
57
+ return Float::NAN if value == FLOAT64_NAN_SENTINEL
58
+
59
+ # Check 32-bit sentinels (stored values after precision loss)
60
+ return Float::INFINITY if value == FLOAT32_POS_INF_STORED
61
+ return -Float::INFINITY if value == FLOAT32_NEG_INF_STORED
62
+ return Float::NAN if value == FLOAT32_NAN_STORED
63
+
64
+ value
65
+ end
66
+
67
+ # Decode a value retrieved from QuestDB back to its original Ruby type.
68
+ #
69
+ # QuestDB stores certain COSMOS types as encoded strings:
70
+ # - Arrays are JSON-encoded: "[1, 2, 3]" or '["a", "b"]'
71
+ # - Objects/Hashes are JSON-encoded: '{"key": "value"}'
72
+ # - Binary data (BLOCK) is base64-encoded
73
+ # - Large integers (64-bit) are stored as DECIMAL
74
+ #
75
+ # @param value [Object] The value to decode
76
+ # @param data_type [String] COSMOS data type (INT, UINT, FLOAT, STRING, BLOCK, DERIVED, etc.)
77
+ # @param array_size [Integer, nil] If not nil, indicates this is an array item
78
+ # @return [Object] The decoded value
79
+ def self.decode_value(value, data_type: nil, array_size: nil)
80
+ # Handle BigDecimal values from QuestDB DECIMAL columns (used for 64-bit integers)
81
+ if value.is_a?(BigDecimal)
82
+ return value.to_i if data_type == 'INT' || data_type == 'UINT'
83
+ return value
84
+ end
85
+
86
+ # Decode float sentinel values back to inf/nan
87
+ return decode_float_special_values(value) if value.is_a?(Float)
88
+
89
+ # Non-strings don't need decoding (already handled by PG type mapping)
90
+ return value unless value.is_a?(String)
91
+
92
+ # Empty strings stay as empty strings
93
+ return value if value.empty?
94
+
95
+ # Handle based on data type if provided
96
+ if data_type == 'BLOCK'
97
+ begin
98
+ return Base64.strict_decode64(value)
99
+ rescue ArgumentError
100
+ return value
101
+ end
102
+ end
103
+
104
+ # Arrays are JSON-encoded
105
+ if array_size
106
+ begin
107
+ return JSON.parse(value, allow_nan: true, create_additions: true)
108
+ rescue JSON::ParserError
109
+ return value
110
+ end
111
+ end
112
+
113
+ # Integer values stored as strings (fallback path, normally DECIMAL)
114
+ if data_type == 'INT' || data_type == 'UINT'
115
+ begin
116
+ return Integer(value)
117
+ rescue ArgumentError
118
+ return value
119
+ end
120
+ end
121
+
122
+ # DERIVED items with declared converted_type are stored as typed columns
123
+ # (float, int, etc.) and will be returned as non-strings, handled above.
124
+ # DERIVED items without declared type or with complex types (ARRAY, OBJECT, ANY)
125
+ # are stored as VARCHAR and JSON-encoded.
126
+ if data_type == 'DERIVED'
127
+ begin
128
+ return JSON.parse(value, allow_nan: true, create_additions: true)
129
+ rescue JSON::ParserError
130
+ # Could be a plain string from DERIVED with converted_type=STRING
131
+ return value
132
+ end
133
+ end
134
+
135
+ # No data_type provided - fall back to heuristic decoding
136
+ if data_type.nil?
137
+ first_char = value[0]
138
+ # Try JSON for arrays/objects
139
+ if first_char == '[' || first_char == '{'
140
+ begin
141
+ return JSON.parse(value, allow_nan: true, create_additions: true)
142
+ rescue JSON::ParserError
143
+ # Not valid JSON
144
+ end
145
+ # Try integer conversion for numeric strings
146
+ elsif value =~ /\A-?\d+\z/
147
+ begin
148
+ return Integer(value)
149
+ rescue ArgumentError
150
+ # Not a valid integer
151
+ end
152
+ end
153
+ end
154
+
155
+ # Return as-is (STRING type or unknown)
156
+ value
157
+ end
158
+
159
+ # Sanitize a table name for QuestDB.
160
+ # See https://questdb.com/docs/reference/api/ilp/advanced-settings/#name-restrictions
161
+ #
162
+ # @param target_name [String] Target name
163
+ # @param packet_name [String] Packet name
164
+ # @param cmd_or_tlm [String, Symbol] "CMD" or "TLM" prefix (default "TLM")
165
+ # @param scope [String] Scope name (default "DEFAULT")
166
+ # @return [String] Sanitized table name
167
+ def self.sanitize_table_name(target_name, packet_name, cmd_or_tlm = "TLM", scope: "DEFAULT")
168
+ "#{scope}__#{cmd_or_tlm}__#{target_name}__#{packet_name}".gsub(/[?,'"\\\/:\)\(\+\*\%~]/, '_')
169
+ end
170
+
171
+ # Sanitize a column name for QuestDB.
172
+ # See https://questdb.com/docs/reference/api/ilp/advanced-settings/#name-restrictions
173
+ #
174
+ # @param item_name [String] Item name
175
+ # @return [String] Sanitized column name
176
+ # ILP protocol special characters that must be sanitized in column names
177
+ def self.sanitize_column_name(item_name)
178
+ item_name.to_s.gsub(/[?\.,'"\\\/:\)\(\+=\-\*\%~;!@#\$\^&]/, '_')
179
+ end
180
+
181
+ # Convert a PG timestamp to UTC.
182
+ # PG driver returns timestamps as naive Time objects that need UTC treatment.
183
+ # QuestDB stores timestamps in UTC, but the PG driver applies local timezone.
184
+ #
185
+ # @param pg_time [Time] Timestamp from PG query result
186
+ # @return [Time] UTC timestamp
187
+ def self.pg_timestamp_to_utc(pg_time)
188
+ return nil unless pg_time
189
+ Time.utc(pg_time.year, pg_time.month, pg_time.day,
190
+ pg_time.hour, pg_time.min, pg_time.sec, pg_time.usec)
191
+ end
192
+
193
+ # Format a UTC timestamp according to the specified format.
194
+ #
195
+ # @param utc_time [Time] UTC timestamp
196
+ # @param format [Symbol] :seconds for Unix seconds (float), :formatted for ISO 8601
197
+ # @return [Float, String, nil] Formatted timestamp or nil if utc_time is nil
198
+ def self.format_timestamp(utc_time, format)
199
+ return nil unless utc_time
200
+ case format
201
+ when :seconds
202
+ utc_time.to_f
203
+ when :formatted
204
+ utc_time.strftime('%Y-%m-%dT%H:%M:%S.%6NZ')
205
+ else
206
+ nil
207
+ end
208
+ end
209
+ end
210
+ end
@@ -1,17 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2022 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.