openc3 5.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +18 -0
  3. data/Guardfile +35 -0
  4. data/LICENSE.txt +727 -0
  5. data/README.md +37 -0
  6. data/Rakefile +131 -0
  7. data/bin/cstol_converter +1178 -0
  8. data/bin/openc3cli +531 -0
  9. data/bin/rubysloc +139 -0
  10. data/data/config/_array_params.yaml +23 -0
  11. data/data/config/_id_items.yaml +24 -0
  12. data/data/config/_id_params.yaml +58 -0
  13. data/data/config/_interfaces.yaml +214 -0
  14. data/data/config/_interfaces.yaml.err +1017 -0
  15. data/data/config/_items.yaml +20 -0
  16. data/data/config/_params.yaml +60 -0
  17. data/data/config/cmd_tlm_server.yaml +136 -0
  18. data/data/config/command.yaml +44 -0
  19. data/data/config/command_modifiers.yaml +160 -0
  20. data/data/config/command_telemetry.yaml +3 -0
  21. data/data/config/interface_modifiers.yaml +104 -0
  22. data/data/config/item_modifiers.yaml +221 -0
  23. data/data/config/microservice.yaml +78 -0
  24. data/data/config/param_item_modifiers.yaml +52 -0
  25. data/data/config/parameter_modifiers.yaml +200 -0
  26. data/data/config/plugins.yaml +80 -0
  27. data/data/config/protocols.yaml +290 -0
  28. data/data/config/screen.yaml +147 -0
  29. data/data/config/table_manager.yaml +89 -0
  30. data/data/config/table_parameter_modifiers.yaml +9 -0
  31. data/data/config/target.yaml +142 -0
  32. data/data/config/target_config.yaml +94 -0
  33. data/data/config/telemetry.yaml +87 -0
  34. data/data/config/telemetry_modifiers.yaml +159 -0
  35. data/data/config/tool.yaml +63 -0
  36. data/data/config/unknown.yaml +3 -0
  37. data/data/config/widgets.yaml +1505 -0
  38. data/ext/mkrf_conf.rb +49 -0
  39. data/ext/openc3/ext/array/array.c +122 -0
  40. data/ext/openc3/ext/array/extconf.rb +13 -0
  41. data/ext/openc3/ext/buffered_file/buffered_file.c +198 -0
  42. data/ext/openc3/ext/buffered_file/extconf.rb +13 -0
  43. data/ext/openc3/ext/config_parser/config_parser.c +280 -0
  44. data/ext/openc3/ext/config_parser/extconf.rb +13 -0
  45. data/ext/openc3/ext/crc/crc.c +351 -0
  46. data/ext/openc3/ext/crc/extconf.rb +13 -0
  47. data/ext/openc3/ext/openc3_io/extconf.rb +13 -0
  48. data/ext/openc3/ext/openc3_io/openc3_io.c +158 -0
  49. data/ext/openc3/ext/packet/extconf.rb +13 -0
  50. data/ext/openc3/ext/packet/packet.c +318 -0
  51. data/ext/openc3/ext/platform/extconf.rb +13 -0
  52. data/ext/openc3/ext/platform/platform.c +134 -0
  53. data/ext/openc3/ext/polynomial_conversion/extconf.rb +13 -0
  54. data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +79 -0
  55. data/ext/openc3/ext/string/extconf.rb +13 -0
  56. data/ext/openc3/ext/string/string.c +63 -0
  57. data/ext/openc3/ext/structure/structure.c +1719 -0
  58. data/ext/openc3/ext/tabbed_plots_config/extconf.rb +13 -0
  59. data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +62 -0
  60. data/ext/openc3/ext/telemetry/extconf.rb +13 -0
  61. data/ext/openc3/ext/telemetry/telemetry.c +336 -0
  62. data/lib/cosmos.rb +20 -0
  63. data/lib/cosmosc2.rb +20 -0
  64. data/lib/openc3/api/api.rb +39 -0
  65. data/lib/openc3/api/authorized_api.rb +30 -0
  66. data/lib/openc3/api/cmd_api.rb +451 -0
  67. data/lib/openc3/api/config_api.rb +58 -0
  68. data/lib/openc3/api/interface_api.rb +117 -0
  69. data/lib/openc3/api/limits_api.rb +375 -0
  70. data/lib/openc3/api/router_api.rb +117 -0
  71. data/lib/openc3/api/settings_api.rb +70 -0
  72. data/lib/openc3/api/target_api.rb +78 -0
  73. data/lib/openc3/api/tlm_api.rb +455 -0
  74. data/lib/openc3/bridge/bridge.rb +54 -0
  75. data/lib/openc3/bridge/bridge_config.rb +167 -0
  76. data/lib/openc3/bridge/bridge_interface_thread.rb +42 -0
  77. data/lib/openc3/bridge/bridge_router_thread.rb +42 -0
  78. data/lib/openc3/ccsds/ccsds_packet.rb +68 -0
  79. data/lib/openc3/ccsds/ccsds_parser.rb +148 -0
  80. data/lib/openc3/config/config_parser.rb +549 -0
  81. data/lib/openc3/config/meta_config_parser.rb +74 -0
  82. data/lib/openc3/conversions/conversion.rb +70 -0
  83. data/lib/openc3/conversions/generic_conversion.rb +83 -0
  84. data/lib/openc3/conversions/packet_time_formatted_conversion.rb +43 -0
  85. data/lib/openc3/conversions/packet_time_seconds_conversion.rb +43 -0
  86. data/lib/openc3/conversions/polynomial_conversion.rb +87 -0
  87. data/lib/openc3/conversions/processor_conversion.rb +70 -0
  88. data/lib/openc3/conversions/received_count_conversion.rb +38 -0
  89. data/lib/openc3/conversions/received_time_formatted_conversion.rb +42 -0
  90. data/lib/openc3/conversions/received_time_seconds_conversion.rb +42 -0
  91. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +171 -0
  92. data/lib/openc3/conversions/unix_time_conversion.rb +68 -0
  93. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +49 -0
  94. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +49 -0
  95. data/lib/openc3/conversions.rb +34 -0
  96. data/lib/openc3/core_ext/array.rb +416 -0
  97. data/lib/openc3/core_ext/binding.rb +29 -0
  98. data/lib/openc3/core_ext/class.rb +72 -0
  99. data/lib/openc3/core_ext/exception.rb +61 -0
  100. data/lib/openc3/core_ext/file.rb +83 -0
  101. data/lib/openc3/core_ext/hash.rb +37 -0
  102. data/lib/openc3/core_ext/io.rb +134 -0
  103. data/lib/openc3/core_ext/kernel.rb +42 -0
  104. data/lib/openc3/core_ext/math.rb +128 -0
  105. data/lib/openc3/core_ext/matrix.rb +156 -0
  106. data/lib/openc3/core_ext/objectspace.rb +36 -0
  107. data/lib/openc3/core_ext/openc3_io.rb +57 -0
  108. data/lib/openc3/core_ext/range.rb +27 -0
  109. data/lib/openc3/core_ext/socket.rb +38 -0
  110. data/lib/openc3/core_ext/string.rb +389 -0
  111. data/lib/openc3/core_ext/stringio.rb +33 -0
  112. data/lib/openc3/core_ext/time.rb +508 -0
  113. data/lib/openc3/core_ext.rb +36 -0
  114. data/lib/openc3/interfaces/interface.rb +498 -0
  115. data/lib/openc3/interfaces/linc_interface.rb +475 -0
  116. data/lib/openc3/interfaces/protocols/burst_protocol.rb +192 -0
  117. data/lib/openc3/interfaces/protocols/crc_protocol.rb +193 -0
  118. data/lib/openc3/interfaces/protocols/fixed_protocol.rb +155 -0
  119. data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +56 -0
  120. data/lib/openc3/interfaces/protocols/length_protocol.rb +165 -0
  121. data/lib/openc3/interfaces/protocols/override_protocol.rb +60 -0
  122. data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +206 -0
  123. data/lib/openc3/interfaces/protocols/protocol.rb +82 -0
  124. data/lib/openc3/interfaces/protocols/template_protocol.rb +261 -0
  125. data/lib/openc3/interfaces/protocols/terminated_protocol.rb +93 -0
  126. data/lib/openc3/interfaces/serial_interface.rb +94 -0
  127. data/lib/openc3/interfaces/simulated_target_interface.rb +168 -0
  128. data/lib/openc3/interfaces/stream_interface.rb +81 -0
  129. data/lib/openc3/interfaces/tcpip_client_interface.rb +69 -0
  130. data/lib/openc3/interfaces/tcpip_server_interface.rb +629 -0
  131. data/lib/openc3/interfaces/udp_interface.rb +169 -0
  132. data/lib/openc3/interfaces.rb +44 -0
  133. data/lib/openc3/io/buffered_file.rb +109 -0
  134. data/lib/openc3/io/io_multiplexer.rb +80 -0
  135. data/lib/openc3/io/json_api_object.rb +208 -0
  136. data/lib/openc3/io/json_drb.rb +335 -0
  137. data/lib/openc3/io/json_drb_object.rb +114 -0
  138. data/lib/openc3/io/json_drb_rack.rb +84 -0
  139. data/lib/openc3/io/json_rpc.rb +420 -0
  140. data/lib/openc3/io/openc3_snmp.rb +58 -0
  141. data/lib/openc3/io/posix_serial_driver.rb +156 -0
  142. data/lib/openc3/io/raw_logger.rb +167 -0
  143. data/lib/openc3/io/raw_logger_pair.rb +77 -0
  144. data/lib/openc3/io/serial_driver.rb +105 -0
  145. data/lib/openc3/io/stderr.rb +43 -0
  146. data/lib/openc3/io/stdout.rb +43 -0
  147. data/lib/openc3/io/udp_sockets.rb +194 -0
  148. data/lib/openc3/io/win32_serial_driver.rb +196 -0
  149. data/lib/openc3/logs/log_writer.rb +302 -0
  150. data/lib/openc3/logs/packet_log_constants.rb +62 -0
  151. data/lib/openc3/logs/packet_log_reader.rb +345 -0
  152. data/lib/openc3/logs/packet_log_writer.rb +299 -0
  153. data/lib/openc3/logs/text_log_writer.rb +68 -0
  154. data/lib/openc3/logs.rb +25 -0
  155. data/lib/openc3/microservices/cleanup_microservice.rb +68 -0
  156. data/lib/openc3/microservices/decom_microservice.rb +136 -0
  157. data/lib/openc3/microservices/interface_microservice.rb +532 -0
  158. data/lib/openc3/microservices/log_microservice.rb +108 -0
  159. data/lib/openc3/microservices/microservice.rb +204 -0
  160. data/lib/openc3/microservices/plugin_microservice.rb +43 -0
  161. data/lib/openc3/microservices/reaction_microservice.rb +541 -0
  162. data/lib/openc3/microservices/reducer_microservice.rb +313 -0
  163. data/lib/openc3/microservices/router_microservice.rb +44 -0
  164. data/lib/openc3/microservices/text_log_microservice.rb +84 -0
  165. data/lib/openc3/microservices/timeline_microservice.rb +363 -0
  166. data/lib/openc3/microservices/trigger_group_microservice.rb +638 -0
  167. data/lib/openc3/models/activity_model.rb +319 -0
  168. data/lib/openc3/models/auth_model.rb +65 -0
  169. data/lib/openc3/models/cvt_model.rb +185 -0
  170. data/lib/openc3/models/environment_model.rb +58 -0
  171. data/lib/openc3/models/gem_model.rb +137 -0
  172. data/lib/openc3/models/info_model.rb +31 -0
  173. data/lib/openc3/models/interface_model.rb +281 -0
  174. data/lib/openc3/models/interface_status_model.rb +117 -0
  175. data/lib/openc3/models/metadata_model.rb +139 -0
  176. data/lib/openc3/models/metric_model.rb +59 -0
  177. data/lib/openc3/models/microservice_model.rb +206 -0
  178. data/lib/openc3/models/microservice_status_model.rb +74 -0
  179. data/lib/openc3/models/model.rb +204 -0
  180. data/lib/openc3/models/note_model.rb +122 -0
  181. data/lib/openc3/models/notification_model.rb +40 -0
  182. data/lib/openc3/models/ping_model.rb +35 -0
  183. data/lib/openc3/models/plugin_model.rb +292 -0
  184. data/lib/openc3/models/process_status_model.rb +76 -0
  185. data/lib/openc3/models/reaction_model.rb +322 -0
  186. data/lib/openc3/models/reducer_model.rb +65 -0
  187. data/lib/openc3/models/router_model.rb +35 -0
  188. data/lib/openc3/models/router_status_model.rb +27 -0
  189. data/lib/openc3/models/scope_model.rb +153 -0
  190. data/lib/openc3/models/settings_model.rb +55 -0
  191. data/lib/openc3/models/sorted_model.rb +167 -0
  192. data/lib/openc3/models/target_model.rb +759 -0
  193. data/lib/openc3/models/timeline_model.rb +154 -0
  194. data/lib/openc3/models/tool_config_model.rb +38 -0
  195. data/lib/openc3/models/tool_model.rb +262 -0
  196. data/lib/openc3/models/trigger_group_model.rb +186 -0
  197. data/lib/openc3/models/trigger_model.rb +330 -0
  198. data/lib/openc3/models/widget_model.rb +138 -0
  199. data/lib/openc3/operators/microservice_operator.rb +128 -0
  200. data/lib/openc3/operators/operator.rb +277 -0
  201. data/lib/openc3/packets/binary_accessor.rb +1207 -0
  202. data/lib/openc3/packets/commands.rb +373 -0
  203. data/lib/openc3/packets/json_packet.rb +134 -0
  204. data/lib/openc3/packets/limits.rb +271 -0
  205. data/lib/openc3/packets/limits_response.rb +53 -0
  206. data/lib/openc3/packets/packet.rb +1168 -0
  207. data/lib/openc3/packets/packet_config.rb +625 -0
  208. data/lib/openc3/packets/packet_item.rb +586 -0
  209. data/lib/openc3/packets/packet_item_limits.rb +162 -0
  210. data/lib/openc3/packets/parsers/format_string_parser.rb +65 -0
  211. data/lib/openc3/packets/parsers/limits_parser.rb +159 -0
  212. data/lib/openc3/packets/parsers/limits_response_parser.rb +61 -0
  213. data/lib/openc3/packets/parsers/packet_item_parser.rb +272 -0
  214. data/lib/openc3/packets/parsers/packet_parser.rb +134 -0
  215. data/lib/openc3/packets/parsers/processor_parser.rb +73 -0
  216. data/lib/openc3/packets/parsers/state_parser.rb +127 -0
  217. data/lib/openc3/packets/parsers/xtce_converter.rb +442 -0
  218. data/lib/openc3/packets/parsers/xtce_parser.rb +722 -0
  219. data/lib/openc3/packets/structure.rb +553 -0
  220. data/lib/openc3/packets/structure_item.rb +365 -0
  221. data/lib/openc3/packets/telemetry.rb +487 -0
  222. data/lib/openc3/processors/processor.rb +86 -0
  223. data/lib/openc3/processors/statistics_processor.rb +82 -0
  224. data/lib/openc3/processors/watermark_processor.rb +58 -0
  225. data/lib/openc3/processors.rb +24 -0
  226. data/lib/openc3/script/api_shared.rb +828 -0
  227. data/lib/openc3/script/calendar.rb +89 -0
  228. data/lib/openc3/script/commands.rb +227 -0
  229. data/lib/openc3/script/exceptions.rb +29 -0
  230. data/lib/openc3/script/extract.rb +161 -0
  231. data/lib/openc3/script/limits.rb +60 -0
  232. data/lib/openc3/script/script.rb +299 -0
  233. data/lib/openc3/script/script_runner.rb +238 -0
  234. data/lib/openc3/script/storage.rb +146 -0
  235. data/lib/openc3/script/suite.rb +542 -0
  236. data/lib/openc3/script/suite_results.rb +196 -0
  237. data/lib/openc3/script/suite_runner.rb +217 -0
  238. data/lib/openc3/script.rb +21 -0
  239. data/lib/openc3/streams/serial_stream.rb +167 -0
  240. data/lib/openc3/streams/stream.rb +63 -0
  241. data/lib/openc3/streams/tcpip_client_stream.rb +116 -0
  242. data/lib/openc3/streams/tcpip_socket_stream.rb +195 -0
  243. data/lib/openc3/system/system.rb +127 -0
  244. data/lib/openc3/system/system_config.rb +411 -0
  245. data/lib/openc3/system/target.rb +269 -0
  246. data/lib/openc3/system.rb +24 -0
  247. data/lib/openc3/tools/cmd_tlm_server/api.rb +20 -0
  248. data/lib/openc3/tools/cmd_tlm_server/cmd_tlm_server_config.rb +320 -0
  249. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +294 -0
  250. data/lib/openc3/tools/table_manager/table.rb +77 -0
  251. data/lib/openc3/tools/table_manager/table_config.rb +273 -0
  252. data/lib/openc3/tools/table_manager/table_item.rb +90 -0
  253. data/lib/openc3/tools/table_manager/table_item_parser.rb +66 -0
  254. data/lib/openc3/tools/table_manager/table_manager_core.rb +333 -0
  255. data/lib/openc3/tools/table_manager/table_parser.rb +93 -0
  256. data/lib/openc3/tools/test_runner/test.rb +67 -0
  257. data/lib/openc3/top_level.rb +595 -0
  258. data/lib/openc3/topics/autonomic_topic.rb +52 -0
  259. data/lib/openc3/topics/calendar_topic.rb +44 -0
  260. data/lib/openc3/topics/command_decom_topic.rb +76 -0
  261. data/lib/openc3/topics/command_topic.rb +83 -0
  262. data/lib/openc3/topics/config_topic.rb +68 -0
  263. data/lib/openc3/topics/interface_topic.rb +73 -0
  264. data/lib/openc3/topics/limits_event_topic.rb +109 -0
  265. data/lib/openc3/topics/notifications_topic.rb +28 -0
  266. data/lib/openc3/topics/router_topic.rb +85 -0
  267. data/lib/openc3/topics/telemetry_decom_topic.rb +54 -0
  268. data/lib/openc3/topics/telemetry_topic.rb +36 -0
  269. data/lib/openc3/topics/timeline_topic.rb +45 -0
  270. data/lib/openc3/topics/topic.rb +53 -0
  271. data/lib/openc3/utilities/authentication.rb +141 -0
  272. data/lib/openc3/utilities/authorization.rb +51 -0
  273. data/lib/openc3/utilities/crc.rb +278 -0
  274. data/lib/openc3/utilities/csv.rb +153 -0
  275. data/lib/openc3/utilities/logger.rb +187 -0
  276. data/lib/openc3/utilities/message_log.rb +91 -0
  277. data/lib/openc3/utilities/metric.rb +141 -0
  278. data/lib/openc3/utilities/process_manager.rb +139 -0
  279. data/lib/openc3/utilities/quaternion.rb +257 -0
  280. data/lib/openc3/utilities/ruby_lex_utils.rb +568 -0
  281. data/lib/openc3/utilities/s3.rb +202 -0
  282. data/lib/openc3/utilities/s3_autoload.rb +9 -0
  283. data/lib/openc3/utilities/s3_file_cache.rb +274 -0
  284. data/lib/openc3/utilities/simulated_target.rb +117 -0
  285. data/lib/openc3/utilities/sleeper.rb +51 -0
  286. data/lib/openc3/utilities/store.rb +23 -0
  287. data/lib/openc3/utilities/store_autoload.rb +237 -0
  288. data/lib/openc3/utilities/zip.rb +21 -0
  289. data/lib/openc3/utilities.rb +35 -0
  290. data/lib/openc3/version.rb +14 -0
  291. data/lib/openc3/win32/excel.rb +132 -0
  292. data/lib/openc3/win32/win32.rb +402 -0
  293. data/lib/openc3/win32/win32_main.rb +333 -0
  294. data/lib/openc3.rb +49 -0
  295. data/tasks/gemfile_stats.rake +113 -0
  296. data/tasks/spec.rake +30 -0
  297. data/templates/plugin-template/README.md +15 -0
  298. data/templates/plugin-template/Rakefile +12 -0
  299. data/templates/plugin-template/plugin.gemspec +23 -0
  300. data/templates/plugin-template/plugin.txt +9 -0
  301. data/templates/plugin-template/targets/TARGET/cmd_tlm/cmd.txt +8 -0
  302. data/templates/plugin-template/targets/TARGET/cmd_tlm/tlm.txt +8 -0
  303. data/templates/plugin-template/targets/TARGET/lib/target.rb +10 -0
  304. data/templates/plugin-template/targets/TARGET/procedures/procedure.rb +3 -0
  305. data/templates/plugin-template/targets/TARGET/screens/status.txt +9 -0
  306. data/templates/plugin-template/targets/TARGET/target.txt +5 -0
  307. metadata +849 -0
@@ -0,0 +1,237 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Affero General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # Modified by OpenC3, Inc.
17
+ # All changes Copyright 2022, OpenC3, Inc.
18
+ # All Rights Reserved
19
+
20
+ require 'redis'
21
+ require 'json'
22
+ require 'connection_pool'
23
+
24
+ if ENV['OPENC3_REDIS_CLUSTER']
25
+ require 'openc3-enterprise/utilities/store'
26
+ $openc3_enterprise = true
27
+ else
28
+ $openc3_enterprise = false
29
+ end
30
+
31
+ module OpenC3
32
+ class Store
33
+ # Variable that holds the singleton instance
34
+ @instance = nil
35
+
36
+ # Mutex used to ensure that only one instance is created
37
+ @@instance_mutex = Mutex.new
38
+
39
+ attr_reader :redis_url
40
+ attr_reader :redis_pool
41
+
42
+ # Get the singleton instance
43
+ def self.instance(pool_size = 100)
44
+ # Logger.level = Logger::DEBUG
45
+ return @instance if @instance
46
+
47
+ @@instance_mutex.synchronize do
48
+ @instance ||= self.new(pool_size)
49
+ return @instance
50
+ end
51
+ end
52
+
53
+ if RUBY_VERSION < "3"
54
+ # Delegate all unknown class methods to delegate to the instance
55
+ def self.method_missing(message, *args, &block)
56
+ self.instance.public_send(message, *args, &block)
57
+ end
58
+
59
+ # Delegate all unknown methods to redis through the @redis_pool
60
+ def method_missing(message, *args, &block)
61
+ @redis_pool.with { |redis| redis.public_send(message, *args, &block) }
62
+ end
63
+ else
64
+ # Delegate all unknown class methods to delegate to the instance
65
+ def self.method_missing(message, *args, **kwargs, &block)
66
+ self.instance.public_send(message, *args, **kwargs, &block)
67
+ end
68
+
69
+ # Delegate all unknown methods to redis through the @redis_pool
70
+ def method_missing(message, *args, **kwargs, &block)
71
+ @redis_pool.with { |redis| redis.public_send(message, *args, **kwargs, &block) }
72
+ end
73
+ end
74
+
75
+ def initialize(pool_size = 10)
76
+ Redis.exists_returns_integer = true
77
+ @redis_username = ENV['OPENC3_REDIS_USERNAME']
78
+ @redis_key = ENV['OPENC3_REDIS_PASSWORD']
79
+ @redis_url = "redis://#{ENV['OPENC3_REDIS_HOSTNAME']}:#{ENV['OPENC3_REDIS_PORT']}"
80
+ @redis_pool = ConnectionPool.new(size: pool_size) { build_redis() }
81
+ @topic_offsets = {}
82
+ end
83
+
84
+ unless $openc3_enterprise
85
+ def build_redis
86
+ return Redis.new(url: @redis_url, username: @redis_username, password: @redis_key)
87
+ end
88
+ end
89
+
90
+ ###########################################################################
91
+ # Stream APIs
92
+ ###########################################################################
93
+
94
+ def initialize_streams(topics)
95
+ @redis_pool.with do |redis|
96
+ topics.each do |topic|
97
+ # Create empty stream with maxlen 0
98
+ redis.xadd(topic, { a: 'b' }, maxlen: 0)
99
+ end
100
+ end
101
+ end
102
+
103
+ def get_oldest_message(topic)
104
+ @redis_pool.with do |redis|
105
+ result = redis.xrange(topic, count: 1)
106
+ if result and result.length > 0
107
+ return result[0]
108
+ else
109
+ return nil
110
+ end
111
+ end
112
+ end
113
+
114
+ def get_newest_message(topic)
115
+ @redis_pool.with do |redis|
116
+ # Default in xrevrange is range end '+', start '-' which means get all
117
+ # elements from higher ID to lower ID and since we're limiting to 1
118
+ # we get the last element. See https://redis.io/commands/xrevrange.
119
+ result = redis.xrevrange(topic, count: 1)
120
+ if result and result.length > 0
121
+ return result[0]
122
+ else
123
+ return nil
124
+ end
125
+ end
126
+ end
127
+
128
+ def get_last_offset(topic)
129
+ @redis_pool.with do |redis|
130
+ result = redis.xrevrange(topic, count: 1)
131
+ if result and result[0] and result[0][0]
132
+ result[0][0]
133
+ else
134
+ "0-0"
135
+ end
136
+ end
137
+ end
138
+
139
+ def update_topic_offsets(topics)
140
+ offsets = []
141
+ topics.each do |topic|
142
+ # Normally we will just be grabbing the topic offset
143
+ # this allows xread to get everything past this point
144
+ last_id = @topic_offsets[topic]
145
+ if last_id
146
+ offsets << last_id
147
+ else
148
+ # If there is no topic offset this is the first call.
149
+ # Get the last offset ID so we'll start getting everything from now on
150
+ offsets << get_last_offset(topic)
151
+ @topic_offsets[topic] = offsets[-1]
152
+ end
153
+ end
154
+ return offsets
155
+ end
156
+
157
+ unless $openc3_enterprise
158
+ def read_topics(topics, offsets = nil, timeout_ms = 1000, count = nil)
159
+ # Logger.debug "read_topics: #{topics}, #{offsets} pool:#{@redis_pool}"
160
+ @redis_pool.with do |redis|
161
+ offsets = update_topic_offsets(topics) unless offsets
162
+ result = redis.xread(topics, offsets, block: timeout_ms, count: count)
163
+ if result and result.length > 0
164
+ result.each do |topic, messages|
165
+ messages.each do |msg_id, msg_hash|
166
+ @topic_offsets[topic] = msg_id
167
+ yield topic, msg_id, msg_hash, redis if block_given?
168
+ end
169
+ end
170
+ end
171
+ # Logger.debug "result:#{result}" if result and result.length > 0
172
+ return result
173
+ end
174
+ end
175
+ end
176
+
177
+ # Add new entry to the redis stream.
178
+ # > https://www.rubydoc.info/github/redis/redis-rb/Redis:xadd
179
+ #
180
+ # @example Without options
181
+ # store.write_topic('MANGO__TOPIC', {'message' => 'something'})
182
+ # @example With options
183
+ # store.write_topic('MANGO__TOPIC', {'message' => 'something'}, id: '0-0', maxlen: 1000, approximate: true)
184
+ #
185
+ # @param topic [String] the stream / topic
186
+ # @param msg_hash [Hash] one or multiple field-value pairs
187
+ #
188
+ # @option opts [String] :id the entry id, default value is `*`, it means auto generation,
189
+ # if `nil` id is passed it will be changed to `*`
190
+ # @option opts [Integer] :maxlen max length of entries, default value is `nil`, it means will grow forever
191
+ # @option opts [Boolean] :approximate whether to add `~` modifier of maxlen or not, default value is `true`
192
+ #
193
+ # @return [String] the entry id
194
+ def write_topic(topic, msg_hash, id = '*', maxlen = nil, approximate = true)
195
+ id = '*' if id.nil?
196
+ # Logger.debug "write_topic topic:#{topic} id:#{id} hash:#{msg_hash}"
197
+ @redis_pool.with do |redis|
198
+ return redis.xadd(topic, msg_hash, id: id, maxlen: maxlen, approximate: approximate)
199
+ end
200
+ end
201
+
202
+ # Trims older entries of the redis stream if needed.
203
+ # > https://www.rubydoc.info/github/redis/redis-rb/Redis:xtrim
204
+ #
205
+ # @example Without options
206
+ # store.trim_topic('MANGO__TOPIC', 1000)
207
+ # @example With options
208
+ # store.trim_topic('MANGO__TOPIC', 1000, approximate: true, limit: 0)
209
+ #
210
+ # @param topic [String] the stream key
211
+ # @param minid [Integer] mid id length of entries to trim
212
+ # @param limit [Boolean] whether to add `~` modifier of maxlen or not
213
+ #
214
+ # @return [Integer] the number of entries actually deleted
215
+ def trim_topic(topic, minid, approximate = true, limit: 0)
216
+ @redis_pool.with do |redis|
217
+ return redis.xtrim_minid(topic, minid, approximate: approximate, limit: limit)
218
+ end
219
+ end
220
+ end
221
+
222
+ class EphemeralStore < Store
223
+ def initialize(pool_size = 10)
224
+ super(pool_size)
225
+ @redis_url = "redis://#{ENV['OPENC3_REDIS_EPHEMERAL_HOSTNAME']}:#{ENV['OPENC3_REDIS_EPHEMERAL_PORT']}"
226
+ @redis_pool = ConnectionPool.new(size: pool_size) { build_redis() }
227
+ end
228
+ end
229
+ end
230
+
231
+ class Redis
232
+ def xtrim_minid(key, minid, approximate: true, limit: nil)
233
+ args = [:xtrim, key, :MINID, (approximate ? '~' : nil), minid].compact
234
+ args.concat([:LIMIT, limit]) if limit
235
+ synchronize { |client| client.call(args) }
236
+ end
237
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Affero General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # Modified by OpenC3, Inc.
17
+ # All changes Copyright 2022, OpenC3, Inc.
18
+ # All Rights Reserved
19
+
20
+ require 'zip'
21
+ require 'zip/filesystem'
@@ -0,0 +1,35 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Affero General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # Modified by OpenC3, Inc.
17
+ # All changes Copyright 2022, OpenC3, Inc.
18
+ # All Rights Reserved
19
+
20
+ module OpenC3
21
+ autoload(:Logger, 'openc3/utilities/logger.rb')
22
+ autoload(:Authorization, 'openc3/utilities/authorization.rb')
23
+ autoload(:Store, 'openc3/utilities/store_autoload.rb')
24
+ autoload(:Sleeper, 'openc3/utilities/sleeper.rb')
25
+ autoload(:Crc, 'openc3/utilities/crc.rb')
26
+ autoload(:Crc16, 'openc3/utilities/crc.rb')
27
+ autoload(:Crc32, 'openc3/utilities/crc.rb')
28
+ autoload(:Crc64, 'openc3/utilities/crc.rb')
29
+ autoload(:Csv, 'openc3/utilities/csv.rb')
30
+ autoload(:Metric, 'openc3/utilities/metric.rb')
31
+ autoload(:MessageLog, 'openc3/utilities/message_log.rb')
32
+ autoload(:Quaternion, 'openc3/utilities/quaternion.rb')
33
+ autoload(:SimulatedTarget, 'openc3/utilities/simulated_target.rb')
34
+ end
35
+ autoload(:RubyLexUtils, 'openc3/utilities/ruby_lex_utils.rb')
@@ -0,0 +1,14 @@
1
+ # encoding: ascii-8bit
2
+
3
+ OPENC3_VERSION = '5.0.6'
4
+ module OpenC3
5
+ module Version
6
+ MAJOR = '5'
7
+ MINOR = '0'
8
+ PATCH = '6'
9
+ OTHER = ''
10
+ BUILD = 'a855874ec4d38adb28e024dd53f9094b9d0c4574'
11
+ end
12
+ VERSION = '5.0.6'
13
+ GEM_VERSION = '5.0.6'
14
+ end
@@ -0,0 +1,132 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Affero General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # Modified by OpenC3, Inc.
17
+ # All changes Copyright 2022, OpenC3, Inc.
18
+ # All Rights Reserved
19
+
20
+ require 'win32ole'
21
+ require 'fileutils'
22
+
23
+ module OpenC3
24
+ # Open an Excel spreadsheet and build an easily manipulated spreadsheet in ruby
25
+ class ExcelSpreadsheet
26
+ attr_reader :worksheets
27
+
28
+ # Class to allow easy manipulation to the data in an Excel worksheet
29
+ class ExcelWorksheet
30
+ attr_reader :name, :num_rows, :num_columns, :data
31
+
32
+ # @param worksheet [WIN32OLE] The underlying Excel worksheet object
33
+ def initialize(worksheet)
34
+ @name = worksheet.name
35
+ @num_rows = worksheet.UsedRange.rows.count
36
+ @num_columns = worksheet.UsedRange.columns.count
37
+
38
+ # Get Excel Data from Worksheet
39
+ @data = worksheet.UsedRange.value
40
+
41
+ # Build a lookup table based on the first column
42
+ @lkup = {}
43
+ if @data
44
+ @data.each do |row|
45
+ @lkup[row[0]] = row[1..-1]
46
+ end
47
+ end
48
+ end
49
+
50
+ def keys
51
+ @lkup.keys
52
+ end
53
+
54
+ # Access the lookup values by string or the raw data by index
55
+ #
56
+ # @param index [String|Integer] Name of the first column or index
57
+ # @return [ExcelWorksheet] The data in that row
58
+ def [](index)
59
+ if index.is_a? String
60
+ @lkup[index]
61
+ else
62
+ @data[index]
63
+ end
64
+ end
65
+ end
66
+
67
+ # @param filename [String] Name of the Excel file to open
68
+ # @param archive [true|String] If true, create an archive file in the
69
+ # default system LOGS directory. If an absolute path, create the
70
+ # archive file in the specified path.
71
+ def initialize(filename, archive: nil)
72
+ if archive
73
+ time = Time.now.sys
74
+ timestamp = sprintf("%04u_%02u_%02u_%02u_%02u_%02u", time.year, time.month, time.mday, time.hour, time.min, time.sec)
75
+ # If archive is true we use the system LOGS path
76
+ if archive == true
77
+ archive = OpenC3::System.paths['LOGS']
78
+ end
79
+ archive = File.join(archive, "#{timestamp}_#{File.basename(filename)}")
80
+ FileUtils.cp filename, archive
81
+ File.chmod(0444, archive) # Mark read-only
82
+ end
83
+
84
+ begin
85
+ excel = WIN32OLE.new('excel.application')
86
+ excel.visible = false
87
+ wb = excel.workbooks.open(filename)
88
+
89
+ @worksheets = []
90
+ @lkup = {}
91
+ count = wb.worksheets.count
92
+ count.times do |index|
93
+ ws = wb.worksheets(index + 1)
94
+ @worksheets << ExcelWorksheet.new(ws)
95
+ @lkup[ws.name] = @worksheets[-1]
96
+ end
97
+ ensure
98
+ if excel
99
+ excel.DisplayAlerts = false
100
+ excel.quit
101
+ end
102
+ excel = nil
103
+ GC.start
104
+ end
105
+ end
106
+
107
+ # @return [Array<String>] Array of all the worksheet names
108
+ def keys
109
+ @lkup.keys
110
+ end
111
+
112
+ # Access a worksheet by passing in the name or index
113
+ #
114
+ # @param index [String|Integer] Name of the worksheet or index
115
+ # @return [ExcelWorksheet] The worksheet object
116
+ def [](index)
117
+ if index.is_a? String
118
+ @lkup[index]
119
+ else
120
+ @worksheets[index]
121
+ end
122
+ end
123
+ end
124
+
125
+ module ExcelColumnConstants
126
+ index = 0
127
+ ('A'..'IV').each do |value|
128
+ self.const_set(value, index)
129
+ index += 1
130
+ end
131
+ end
132
+ end