openc3 5.0.11 → 5.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of openc3 might be problematic. Click here for more details.

Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +3 -0
  3. data/LICENSE.txt +7 -5
  4. data/README.md +11 -9
  5. data/Rakefile +3 -0
  6. data/bin/cstol_converter +3 -0
  7. data/bin/openc3cli +29 -18
  8. data/bin/rubysloc +3 -0
  9. data/data/config/screen.yaml +10 -2
  10. data/data/config/target.yaml +1 -1
  11. data/data/config/widgets.yaml +6 -6
  12. data/ext/mkrf_conf.rb +3 -0
  13. data/ext/openc3/ext/array/array.c +3 -0
  14. data/ext/openc3/ext/buffered_file/buffered_file.c +3 -0
  15. data/ext/openc3/ext/config_parser/config_parser.c +3 -0
  16. data/ext/openc3/ext/crc/crc.c +3 -0
  17. data/ext/openc3/ext/openc3_io/openc3_io.c +3 -0
  18. data/ext/openc3/ext/packet/packet.c +3 -0
  19. data/ext/openc3/ext/platform/platform.c +3 -0
  20. data/ext/openc3/ext/polynomial_conversion/polynomial_conversion.c +3 -0
  21. data/ext/openc3/ext/string/string.c +3 -0
  22. data/ext/openc3/ext/structure/structure.c +3 -0
  23. data/ext/openc3/ext/tabbed_plots_config/tabbed_plots_config.c +3 -0
  24. data/ext/openc3/ext/telemetry/telemetry.c +3 -0
  25. data/lib/cosmos.rb +3 -0
  26. data/lib/cosmosc2.rb +3 -0
  27. data/lib/openc3/accessors/accessor.rb +3 -0
  28. data/lib/openc3/accessors/binary_accessor.rb +3 -0
  29. data/lib/openc3/accessors/cbor_accessor.rb +3 -0
  30. data/lib/openc3/accessors/html_accessor.rb +3 -0
  31. data/lib/openc3/accessors/json_accessor.rb +4 -1
  32. data/lib/openc3/accessors/xml_accessor.rb +3 -0
  33. data/lib/openc3/accessors.rb +3 -0
  34. data/lib/openc3/api/api.rb +3 -0
  35. data/lib/openc3/api/authorized_api.rb +3 -0
  36. data/lib/openc3/api/cmd_api.rb +6 -3
  37. data/lib/openc3/api/config_api.rb +3 -0
  38. data/lib/openc3/api/interface_api.rb +6 -2
  39. data/lib/openc3/api/limits_api.rb +54 -61
  40. data/lib/openc3/api/router_api.rb +6 -3
  41. data/lib/openc3/api/settings_api.rb +3 -0
  42. data/lib/openc3/api/target_api.rb +3 -0
  43. data/lib/openc3/api/tlm_api.rb +27 -32
  44. data/lib/openc3/bridge/bridge.rb +3 -0
  45. data/lib/openc3/bridge/bridge_config.rb +3 -0
  46. data/lib/openc3/bridge/bridge_interface_thread.rb +3 -0
  47. data/lib/openc3/bridge/bridge_router_thread.rb +3 -0
  48. data/lib/openc3/ccsds/ccsds_packet.rb +3 -0
  49. data/lib/openc3/ccsds/ccsds_parser.rb +3 -0
  50. data/lib/openc3/config/config_parser.rb +3 -0
  51. data/lib/openc3/config/meta_config_parser.rb +3 -0
  52. data/lib/openc3/conversions/conversion.rb +3 -0
  53. data/lib/openc3/conversions/generic_conversion.rb +3 -0
  54. data/lib/openc3/conversions/packet_time_formatted_conversion.rb +3 -0
  55. data/lib/openc3/conversions/packet_time_seconds_conversion.rb +3 -0
  56. data/lib/openc3/conversions/polynomial_conversion.rb +3 -0
  57. data/lib/openc3/conversions/processor_conversion.rb +3 -0
  58. data/lib/openc3/conversions/received_count_conversion.rb +3 -0
  59. data/lib/openc3/conversions/received_time_formatted_conversion.rb +3 -0
  60. data/lib/openc3/conversions/received_time_seconds_conversion.rb +3 -0
  61. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +3 -0
  62. data/lib/openc3/conversions/unix_time_conversion.rb +3 -0
  63. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +3 -0
  64. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +3 -0
  65. data/lib/openc3/conversions.rb +3 -0
  66. data/lib/openc3/core_ext/array.rb +3 -0
  67. data/lib/openc3/core_ext/binding.rb +3 -0
  68. data/lib/openc3/core_ext/class.rb +3 -0
  69. data/lib/openc3/core_ext/exception.rb +3 -0
  70. data/lib/openc3/core_ext/file.rb +3 -0
  71. data/lib/openc3/core_ext/hash.rb +3 -0
  72. data/lib/openc3/core_ext/io.rb +3 -0
  73. data/lib/openc3/core_ext/kernel.rb +3 -0
  74. data/lib/openc3/core_ext/math.rb +3 -0
  75. data/lib/openc3/core_ext/matrix.rb +3 -0
  76. data/lib/openc3/core_ext/objectspace.rb +3 -0
  77. data/lib/openc3/core_ext/openc3_io.rb +3 -0
  78. data/lib/openc3/core_ext/range.rb +3 -0
  79. data/lib/openc3/core_ext/socket.rb +3 -0
  80. data/lib/openc3/core_ext/string.rb +3 -0
  81. data/lib/openc3/core_ext/stringio.rb +3 -0
  82. data/lib/openc3/core_ext/tempfile.rb +3 -0
  83. data/lib/openc3/core_ext/time.rb +3 -0
  84. data/lib/openc3/core_ext.rb +3 -0
  85. data/lib/openc3/interfaces/interface.rb +3 -0
  86. data/lib/openc3/interfaces/linc_interface.rb +3 -0
  87. data/lib/openc3/interfaces/protocols/burst_protocol.rb +3 -0
  88. data/lib/openc3/interfaces/protocols/crc_protocol.rb +3 -0
  89. data/lib/openc3/interfaces/protocols/fixed_protocol.rb +3 -0
  90. data/lib/openc3/interfaces/protocols/ignore_packet_protocol.rb +3 -0
  91. data/lib/openc3/interfaces/protocols/length_protocol.rb +3 -0
  92. data/lib/openc3/interfaces/protocols/override_protocol.rb +3 -0
  93. data/lib/openc3/interfaces/protocols/preidentified_protocol.rb +3 -0
  94. data/lib/openc3/interfaces/protocols/protocol.rb +3 -0
  95. data/lib/openc3/interfaces/protocols/template_protocol.rb +3 -0
  96. data/lib/openc3/interfaces/protocols/terminated_protocol.rb +3 -0
  97. data/lib/openc3/interfaces/serial_interface.rb +3 -0
  98. data/lib/openc3/interfaces/simulated_target_interface.rb +3 -0
  99. data/lib/openc3/interfaces/stream_interface.rb +3 -0
  100. data/lib/openc3/interfaces/tcpip_client_interface.rb +3 -0
  101. data/lib/openc3/interfaces/tcpip_server_interface.rb +3 -0
  102. data/lib/openc3/interfaces/udp_interface.rb +3 -0
  103. data/lib/openc3/interfaces.rb +3 -0
  104. data/lib/openc3/io/buffered_file.rb +3 -0
  105. data/lib/openc3/io/io_multiplexer.rb +8 -0
  106. data/lib/openc3/io/json_api_object.rb +5 -2
  107. data/lib/openc3/io/json_drb.rb +3 -0
  108. data/lib/openc3/io/json_drb_object.rb +5 -2
  109. data/lib/openc3/io/json_drb_rack.rb +3 -0
  110. data/lib/openc3/io/json_rpc.rb +8 -3
  111. data/lib/openc3/io/openc3_snmp.rb +3 -0
  112. data/lib/openc3/io/posix_serial_driver.rb +3 -0
  113. data/lib/openc3/io/raw_logger.rb +3 -0
  114. data/lib/openc3/io/raw_logger_pair.rb +3 -0
  115. data/lib/openc3/io/serial_driver.rb +3 -0
  116. data/lib/openc3/io/stderr.rb +3 -0
  117. data/lib/openc3/io/stdout.rb +3 -0
  118. data/lib/openc3/io/udp_sockets.rb +3 -0
  119. data/lib/openc3/io/win32_serial_driver.rb +3 -0
  120. data/lib/openc3/logs/buffered_packet_log_reader.rb +65 -0
  121. data/lib/openc3/logs/buffered_packet_log_writer.rb +120 -0
  122. data/lib/openc3/logs/log_writer.rb +95 -40
  123. data/lib/openc3/logs/packet_log_constants.rb +9 -0
  124. data/lib/openc3/logs/packet_log_reader.rb +34 -3
  125. data/lib/openc3/logs/packet_log_writer.rb +85 -18
  126. data/lib/openc3/logs/text_log_writer.rb +9 -5
  127. data/lib/openc3/logs.rb +8 -2
  128. data/lib/openc3/microservices/cleanup_microservice.rb +18 -18
  129. data/lib/openc3/microservices/decom_microservice.rb +30 -24
  130. data/lib/openc3/microservices/interface_microservice.rb +136 -91
  131. data/lib/openc3/microservices/log_microservice.rb +35 -13
  132. data/lib/openc3/microservices/microservice.rb +16 -14
  133. data/lib/openc3/microservices/plugin_microservice.rb +3 -1
  134. data/lib/openc3/microservices/reaction_microservice.rb +4 -1
  135. data/lib/openc3/microservices/reducer_microservice.rb +332 -149
  136. data/lib/openc3/microservices/router_microservice.rb +3 -0
  137. data/lib/openc3/microservices/text_log_microservice.rb +22 -7
  138. data/lib/openc3/microservices/timeline_microservice.rb +4 -1
  139. data/lib/openc3/microservices/trigger_group_microservice.rb +3 -0
  140. data/lib/openc3/models/activity_model.rb +3 -0
  141. data/lib/openc3/models/auth_model.rb +3 -0
  142. data/lib/openc3/models/cvt_model.rb +14 -5
  143. data/lib/openc3/models/environment_model.rb +3 -0
  144. data/lib/openc3/models/gem_model.rb +30 -51
  145. data/lib/openc3/models/info_model.rb +3 -0
  146. data/lib/openc3/models/interface_model.rb +3 -0
  147. data/lib/openc3/models/interface_status_model.rb +4 -1
  148. data/lib/openc3/models/metadata_model.rb +3 -0
  149. data/lib/openc3/models/metric_model.rb +3 -0
  150. data/lib/openc3/models/microservice_model.rb +9 -6
  151. data/lib/openc3/models/microservice_status_model.rb +4 -1
  152. data/lib/openc3/models/model.rb +3 -0
  153. data/lib/openc3/models/note_model.rb +3 -0
  154. data/lib/openc3/models/notification_model.rb +3 -0
  155. data/lib/openc3/models/ping_model.rb +3 -0
  156. data/lib/openc3/models/plugin_model.rb +20 -14
  157. data/lib/openc3/models/process_status_model.rb +4 -1
  158. data/lib/openc3/models/reaction_model.rb +3 -0
  159. data/lib/openc3/models/reducer_model.rb +31 -24
  160. data/lib/openc3/models/router_model.rb +3 -0
  161. data/lib/openc3/models/router_status_model.rb +3 -0
  162. data/lib/openc3/models/scope_model.rb +3 -4
  163. data/lib/openc3/models/settings_model.rb +3 -0
  164. data/lib/openc3/models/sorted_model.rb +3 -0
  165. data/lib/openc3/models/target_model.rb +61 -94
  166. data/lib/openc3/models/timeline_model.rb +4 -1
  167. data/lib/openc3/models/tool_config_model.rb +3 -0
  168. data/lib/openc3/models/tool_model.rb +11 -9
  169. data/lib/openc3/models/trigger_group_model.rb +3 -0
  170. data/lib/openc3/models/trigger_model.rb +3 -0
  171. data/lib/openc3/models/widget_model.rb +18 -11
  172. data/lib/openc3/operators/microservice_operator.rb +3 -0
  173. data/lib/openc3/operators/operator.rb +105 -34
  174. data/lib/openc3/packets/commands.rb +3 -0
  175. data/lib/openc3/packets/json_packet.rb +87 -14
  176. data/lib/openc3/packets/limits.rb +4 -1
  177. data/lib/openc3/packets/limits_response.rb +3 -0
  178. data/lib/openc3/packets/packet.rb +5 -1
  179. data/lib/openc3/packets/packet_config.rb +3 -0
  180. data/lib/openc3/packets/packet_item.rb +9 -3
  181. data/lib/openc3/packets/packet_item_limits.rb +3 -0
  182. data/lib/openc3/packets/parsers/format_string_parser.rb +3 -0
  183. data/lib/openc3/packets/parsers/limits_parser.rb +3 -0
  184. data/lib/openc3/packets/parsers/limits_response_parser.rb +3 -0
  185. data/lib/openc3/packets/parsers/packet_item_parser.rb +3 -0
  186. data/lib/openc3/packets/parsers/packet_parser.rb +3 -0
  187. data/lib/openc3/packets/parsers/processor_parser.rb +3 -0
  188. data/lib/openc3/packets/parsers/state_parser.rb +3 -0
  189. data/lib/openc3/packets/parsers/xtce_converter.rb +3 -0
  190. data/lib/openc3/packets/parsers/xtce_parser.rb +3 -0
  191. data/lib/openc3/packets/structure.rb +3 -0
  192. data/lib/openc3/packets/structure_item.rb +3 -0
  193. data/lib/openc3/packets/telemetry.rb +3 -0
  194. data/lib/openc3/processors/processor.rb +3 -0
  195. data/lib/openc3/processors/statistics_processor.rb +3 -0
  196. data/lib/openc3/processors/watermark_processor.rb +3 -0
  197. data/lib/openc3/processors.rb +3 -0
  198. data/lib/openc3/script/api_shared.rb +35 -6
  199. data/lib/openc3/script/calendar.rb +3 -0
  200. data/lib/openc3/script/commands.rb +3 -0
  201. data/lib/openc3/script/exceptions.rb +3 -0
  202. data/lib/openc3/script/extract.rb +3 -0
  203. data/lib/openc3/script/limits.rb +3 -24
  204. data/lib/openc3/script/script.rb +11 -7
  205. data/lib/openc3/script/script_runner.rb +3 -0
  206. data/lib/openc3/script/storage.rb +33 -16
  207. data/lib/openc3/script/suite.rb +3 -0
  208. data/lib/openc3/script/suite_results.rb +3 -0
  209. data/lib/openc3/script/suite_runner.rb +3 -0
  210. data/lib/openc3/script/telemetry.rb +43 -0
  211. data/lib/openc3/script.rb +3 -0
  212. data/lib/openc3/streams/serial_stream.rb +3 -0
  213. data/lib/openc3/streams/stream.rb +3 -0
  214. data/lib/openc3/streams/tcpip_client_stream.rb +3 -0
  215. data/lib/openc3/streams/tcpip_socket_stream.rb +3 -0
  216. data/lib/openc3/system/system.rb +23 -10
  217. data/lib/openc3/system/system_config.rb +3 -0
  218. data/lib/openc3/system/target.rb +3 -0
  219. data/lib/openc3/system.rb +3 -0
  220. data/lib/openc3/tools/cmd_tlm_server/api.rb +3 -0
  221. data/lib/openc3/tools/cmd_tlm_server/cmd_tlm_server_config.rb +3 -0
  222. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +3 -0
  223. data/lib/openc3/tools/table_manager/table.rb +3 -0
  224. data/lib/openc3/tools/table_manager/table_config.rb +3 -0
  225. data/lib/openc3/tools/table_manager/table_item.rb +3 -0
  226. data/lib/openc3/tools/table_manager/table_item_parser.rb +3 -0
  227. data/lib/openc3/tools/table_manager/table_manager_core.rb +3 -0
  228. data/lib/openc3/tools/table_manager/table_parser.rb +3 -0
  229. data/lib/openc3/tools/test_runner/test.rb +3 -0
  230. data/lib/openc3/top_level.rb +3 -0
  231. data/lib/openc3/topics/autonomic_topic.rb +3 -0
  232. data/lib/openc3/topics/calendar_topic.rb +3 -0
  233. data/lib/openc3/topics/command_decom_topic.rb +4 -1
  234. data/lib/openc3/topics/command_topic.rb +6 -1
  235. data/lib/openc3/topics/config_topic.rb +3 -0
  236. data/lib/openc3/topics/interface_topic.rb +9 -2
  237. data/lib/openc3/topics/limits_event_topic.rb +144 -10
  238. data/lib/openc3/topics/notifications_topic.rb +3 -0
  239. data/lib/openc3/topics/router_topic.rb +10 -3
  240. data/lib/openc3/topics/telemetry_decom_topic.rb +26 -20
  241. data/lib/openc3/topics/telemetry_reduced_topics.rb +92 -0
  242. data/lib/openc3/topics/telemetry_topic.rb +5 -2
  243. data/lib/openc3/topics/timeline_topic.rb +3 -0
  244. data/lib/openc3/topics/topic.rb +3 -0
  245. data/lib/openc3/utilities/authentication.rb +3 -0
  246. data/lib/openc3/utilities/authorization.rb +3 -0
  247. data/lib/openc3/utilities/aws_bucket.rb +199 -0
  248. data/lib/openc3/utilities/bucket.rb +82 -0
  249. data/lib/openc3/utilities/bucket_file_cache.rb +264 -0
  250. data/lib/openc3/utilities/bucket_utilities.rb +109 -0
  251. data/lib/openc3/utilities/crc.rb +3 -0
  252. data/lib/openc3/utilities/csv.rb +3 -0
  253. data/lib/openc3/utilities/local_bucket.rb +28 -0
  254. data/lib/openc3/utilities/local_mode.rb +47 -61
  255. data/lib/openc3/utilities/logger.rb +7 -1
  256. data/lib/openc3/utilities/message_log.rb +7 -4
  257. data/lib/openc3/utilities/metric.rb +4 -1
  258. data/lib/openc3/utilities/open_telemetry.rb +96 -0
  259. data/lib/openc3/utilities/process_manager.rb +3 -0
  260. data/lib/openc3/utilities/quaternion.rb +3 -0
  261. data/lib/openc3/utilities/ruby_lex_utils.rb +3 -0
  262. data/lib/openc3/utilities/s3_autoload.rb +3 -3
  263. data/lib/openc3/utilities/simulated_target.rb +3 -0
  264. data/lib/openc3/utilities/sleeper.rb +3 -0
  265. data/lib/openc3/utilities/store.rb +3 -0
  266. data/lib/openc3/utilities/store_autoload.rb +30 -23
  267. data/lib/openc3/utilities/target_file.rb +70 -83
  268. data/lib/openc3/utilities/zip.rb +3 -0
  269. data/lib/openc3/utilities.rb +3 -0
  270. data/lib/openc3/version.rb +6 -6
  271. data/lib/openc3/win32/excel.rb +3 -0
  272. data/lib/openc3/win32/win32.rb +3 -0
  273. data/lib/openc3/win32/win32_main.rb +3 -0
  274. data/lib/openc3.rb +3 -0
  275. data/tasks/gemfile_stats.rake +3 -0
  276. data/tasks/spec.rake +3 -0
  277. data/templates/plugin-template/plugin.gemspec +1 -1
  278. metadata +112 -6
  279. data/lib/openc3/utilities/s3.rb +0 -220
  280. data/lib/openc3/utilities/s3_file_cache.rb +0 -274
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/models/interface_model'
21
24
  require 'openc3/models/interface_status_model'
@@ -57,9 +60,10 @@ module OpenC3
57
60
  # Connects an interface and starts its telemetry gathering thread
58
61
  #
59
62
  # @param interface_name [String] The name of the interface
60
- def connect_interface(interface_name, scope: $openc3_scope, token: $openc3_token)
63
+ # @param interface_params [Array] Optional parameters to pass to the interface
64
+ def connect_interface(interface_name, *interface_params, scope: $openc3_scope, token: $openc3_token)
61
65
  authorize(permission: 'system_set', interface_name: interface_name, scope: scope, token: token)
62
- InterfaceTopic.connect_interface(interface_name, scope: scope)
66
+ InterfaceTopic.connect_interface(interface_name, *interface_params, scope: scope)
63
67
  end
64
68
 
65
69
  # Disconnects from an interface and kills its telemetry gathering thread
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/api/target_api'
21
24
 
@@ -23,7 +26,6 @@ module OpenC3
23
26
  module Api
24
27
  WHITELIST ||= []
25
28
  WHITELIST.concat([
26
- 'get_stale',
27
29
  'get_out_of_limits',
28
30
  'get_overall_limits_state',
29
31
  'limits_enabled?',
@@ -40,41 +42,6 @@ module OpenC3
40
42
  'get_limits_events',
41
43
  ])
42
44
 
43
- # Get the list of stale packets for a specific target or pass nil to list
44
- # all stale packets
45
- #
46
- # @param with_limits_only [Boolean] Return only the stale packets
47
- # that have limits items and thus affect the overall limits
48
- # state of the system
49
- # @param target_name [String] The target to find stale packets for or nil to list
50
- # all stale packets in the system
51
- # @param staleness_sec [Integer] The amount of time to pass before a packet is marked stale
52
- # @return [Array<Array<String, String>>] Array of arrays listing the target
53
- # name and packet name
54
- def get_stale(with_limits_only: false, target_name: nil, staleness_sec: 30, scope: $openc3_scope, token: $openc3_token)
55
- authorize(permission: 'tlm', target_name: target_name, scope: scope, token: token)
56
- stale_time = Time.now.sys.to_nsec_from_epoch - (staleness_sec * Time::NSEC_PER_SECOND)
57
- stale = []
58
- targets = []
59
- if target_name
60
- targets = [target_name]
61
- else
62
- targets = get_target_list()
63
- end
64
- targets.each do |target_name|
65
- get_all_telemetry(target_name, scope: scope).each do |packet|
66
- topic = "#{scope}__TELEMETRY__{#{target_name}}__#{packet['packet_name']}"
67
- _, msg_hash = Topic.get_newest_message(topic)
68
- unless msg_hash && msg_hash['time'].to_i > stale_time
69
- next if with_limits_only && packet['items'].find { |item| item['limits'] }.nil?
70
-
71
- stale << [packet['target_name'], packet['packet_name']]
72
- end
73
- end
74
- end
75
- stale
76
- end
77
-
78
45
  # Return an array of arrays indicating all items in the packet that are out of limits
79
46
  # [[target name, packet name, item name, item limits state], ...]
80
47
  #
@@ -95,7 +62,6 @@ module OpenC3
95
62
  # We only need to check out of limits items so call get_out_of_limits() which authorizes
96
63
  out_of_limits = get_out_of_limits(scope: scope, token: token)
97
64
  overall = 'GREEN'
98
- limits_packet_stale = false # TODO: Calculate stale
99
65
 
100
66
  # Build easily matchable ignore list
101
67
  if ignored_items
@@ -113,22 +79,21 @@ module OpenC3
113
79
  # allows us to detect matches against a TGT__PKT__ with no item defined.
114
80
  next if ignored_items.detect { |item| "#{target_name}__#{packet_name}__#{item_name}" =~ /^#{item}/ }
115
81
 
82
+ if limits_state == 'RED' || limits_state == 'RED_HIGH' || limits_state == 'RED_LOW'
83
+ overall = limits_state
84
+ break # Red is as high as we go so no need to look for more
85
+ end
86
+
116
87
  case overall
117
88
  # If our overall state is currently blue or green we can go to any state
118
89
  when 'BLUE', 'GREEN', 'GREEN_HIGH', 'GREEN_LOW'
119
90
  overall = limits_state
120
- # If our overal state is yellow we can only go higher to red
121
- when 'YELLOW', 'YELLOW_HIGH', 'YELLOW_LOW'
122
- if limits_state == 'RED' || limits_state == 'RED_HIGH' || limits_state == 'RED_LOW'
123
- overall = limits_state
124
- break # Red is as high as we go so no need to look for more
125
- end
91
+ # else YELLOW - Stay at YELLOW until we find a red
126
92
  end
127
93
  end
128
94
  overall = 'GREEN' if overall == 'GREEN_HIGH' || overall == 'GREEN_LOW' || overall == 'BLUE'
129
95
  overall = 'YELLOW' if overall == 'YELLOW_HIGH' || overall == 'YELLOW_LOW'
130
96
  overall = 'RED' if overall == 'RED_HIGH' || overall == 'RED_LOW'
131
- overall = 'STALE' if (overall == 'GREEN' || overall == 'BLUE') && limits_packet_stale
132
97
  return overall
133
98
  end
134
99
 
@@ -172,6 +137,13 @@ module OpenC3
172
137
  raise "Item '#{target_name} #{packet_name} #{item_name}' does not exist" unless found_item
173
138
 
174
139
  TargetModel.set_packet(target_name, packet_name, packet, scope: scope)
140
+
141
+ message = "Enabling Limits For '#{target_name} #{packet_name} #{item_name}'"
142
+ Logger.info(message, scope: scope)
143
+
144
+ event = { type: :LIMITS_ENABLE_STATE, target_name: target_name, packet_name: packet_name,
145
+ item_name: item_name, enabled: true, time_nsec: Time.now.to_nsec_from_epoch, message: message }
146
+ LimitsEventTopic.write(event, scope: scope)
175
147
  end
176
148
 
177
149
  # Disable limit checking for a telemetry item
@@ -198,6 +170,13 @@ module OpenC3
198
170
  raise "Item '#{target_name} #{packet_name} #{item_name}' does not exist" unless found_item
199
171
 
200
172
  TargetModel.set_packet(target_name, packet_name, packet, scope: scope)
173
+
174
+ message = "Disabling Limits For '#{target_name} #{packet_name} #{item_name}'"
175
+ Logger.info(message, scope: scope)
176
+
177
+ event = { type: :LIMITS_ENABLE_STATE, target_name: target_name, packet_name: packet_name,
178
+ item_name: item_name, enabled: false, time_nsec: Time.now.to_nsec_from_epoch, message: message }
179
+ LimitsEventTopic.write(event, scope: scope)
201
180
  end
202
181
 
203
182
  # Get a Hash of all the limits sets defined for an item. Hash keys are the limit
@@ -225,7 +204,7 @@ module OpenC3
225
204
  # Change the limits settings for a given item. By default, a new limits set called 'CUSTOM'
226
205
  # is created to avoid overriding existing limits.
227
206
  def set_limits(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high,
228
- green_low = nil, green_high = nil, limits_set = :CUSTOM, persistence = nil, enabled = true,
207
+ green_low = nil, green_high = nil, limits_set = 'CUSTOM', persistence = nil, enabled = true,
229
208
  scope: $openc3_scope, token: $openc3_token)
230
209
  authorize(permission: 'tlm_set', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
231
210
  if (red_low > yellow_low) || (yellow_low >= yellow_high) || (yellow_high > red_high)
@@ -238,22 +217,26 @@ module OpenC3
238
217
  found_item = nil
239
218
  packet['items'].each do |item|
240
219
  if item['name'] == item_name
241
- item['limits']['persistence_setting'] = persistence
242
- if enabled
243
- item['limits']['enabled'] = true
220
+ if item['limits']
221
+ item['limits']['persistence_setting'] = persistence if persistence
222
+ if enabled
223
+ item['limits']['enabled'] = true
224
+ else
225
+ item['limits'].delete('enabled')
226
+ end
227
+ limits = {}
228
+ limits['red_low'] = red_low
229
+ limits['yellow_low'] = yellow_low
230
+ limits['yellow_high'] = yellow_high
231
+ limits['red_high'] = red_high
232
+ limits['green_low'] = green_low if green_low && green_high
233
+ limits['green_high'] = green_high if green_low && green_high
234
+ item['limits'][limits_set] = limits
235
+ found_item = item
236
+ break
244
237
  else
245
- item['limits'].delete('enabled')
238
+ raise "Cannot set_limits on item without any limits"
246
239
  end
247
- limits = {}
248
- limits['red_low'] = red_low
249
- limits['yellow_low'] = yellow_low
250
- limits['yellow_high'] = yellow_high
251
- limits['red_high'] = red_high
252
- limits['green_low'] = green_low if green_low && green_high
253
- limits['green_high'] = green_high if green_low && green_high
254
- item['limits'][limits_set] = limits
255
- found_item = item
256
- break
257
240
  end
258
241
  end
259
242
  raise "Item '#{target_name} #{packet_name} #{item_name}' does not exist" unless found_item
@@ -337,13 +320,14 @@ module OpenC3
337
320
  # PRIVATE implementation details
338
321
  ###########################################################################
339
322
 
323
+ # Enables or disables a limits group
340
324
  def _limits_group(group_name, action:, scope:, token:)
341
325
  authorize(permission: 'tlm_set', scope: scope, token: token)
342
326
  group_name.upcase!
343
- group = get_limits_groups()[group_name]
327
+ group = get_limits_groups(scope: scope, token: token)[group_name]
344
328
  raise "LIMITS_GROUP #{group_name} undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP #{group_name}" unless group
345
329
 
346
- Logger.info("Disabling Limits Group: #{group_name}", scope: scope)
330
+ Logger.info("#{action.to_s.capitalize} Limits Group: #{group_name}", scope: scope)
347
331
  last_target_name = nil
348
332
  last_packet_name = nil
349
333
  packet = nil
@@ -357,10 +341,19 @@ module OpenC3
357
341
  packet['items'].each do |item|
358
342
  if item['name'] == item_name
359
343
  if action == :enable
344
+ enabled = true
360
345
  item['limits']['enabled'] = true
346
+ message = "Enabling Limits For '#{target_name} #{packet_name} #{item_name}'"
361
347
  elsif action == :disable
348
+ enabled = false
362
349
  item['limits'].delete('enabled')
350
+ message = "Disabling Limits For '#{target_name} #{packet_name} #{item_name}'"
363
351
  end
352
+ Logger.info(message, scope: scope)
353
+
354
+ event = { type: :LIMITS_ENABLE_STATE, target_name: target_name, packet_name: packet_name,
355
+ item_name: item_name, enabled: enabled, time_nsec: Time.now.to_nsec_from_epoch, message: message }
356
+ LimitsEventTopic.write(event, scope: scope)
364
357
  break
365
358
  end
366
359
  end
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/models/router_model'
21
24
  require 'openc3/models/router_status_model'
@@ -55,10 +58,10 @@ module OpenC3
55
58
  # Connects a router and starts its command gathering thread
56
59
  #
57
60
  # @param router_name [String] Name of router
58
- # @param params [Array] Parameters to pass to the router.
59
- def connect_router(router_name, *params, scope: $openc3_scope, token: $openc3_token)
61
+ # @param router_params [Array] Optional parameters to pass to the router
62
+ def connect_router(router_name, *router_params, scope: $openc3_scope, token: $openc3_token)
60
63
  authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
61
- RouterTopic.connect_router(router_name, scope: scope)
64
+ RouterTopic.connect_router(router_name, *router_params, scope: scope)
62
65
  end
63
66
 
64
67
  # Disconnects a router and kills its command gathering thread
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  module OpenC3
21
24
  module Api
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/models/target_model'
21
24
 
@@ -16,12 +16,14 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/models/target_model'
21
24
  require 'openc3/models/cvt_model'
22
25
  require 'openc3/packets/packet'
23
26
  require 'openc3/topics/telemetry_topic'
24
- require 'openc3/utilities/s3'
25
27
 
26
28
  module OpenC3
27
29
  module Api
@@ -48,7 +50,6 @@ module OpenC3
48
50
  'get_tlm_cnt',
49
51
  'get_tlm_cnts',
50
52
  'get_packet_derived_items',
51
- 'get_oldest_logfile',
52
53
  ])
53
54
 
54
55
  # Request a telemetry item from a packet.
@@ -136,9 +137,14 @@ module OpenC3
136
137
  packet.write(name.to_s, value, type)
137
138
  end
138
139
  end
140
+ topic = "#{scope}__TELEMETRY__{#{target_name}}__#{packet_name}"
141
+ msg_id, msg_hash = Topic.get_newest_message(topic)
142
+ if msg_id
143
+ packet.received_count = msg_hash['received_count'].to_i + 1
144
+ else
145
+ packet.received_count = 1
146
+ end
139
147
  packet.received_time = Time.now.sys
140
- # TODO: New packet so received_count is not correct
141
- packet.received_count += 1
142
148
  TelemetryTopic.write_packet(packet, scope: scope)
143
149
  end
144
150
 
@@ -202,16 +208,19 @@ module OpenC3
202
208
  #
203
209
  # @param target_name [String] Name of the target
204
210
  # @param packet_name [String] Name of the packet
211
+ # @param stale_time [Integer] Time in seconds from Time.now that packet will be marked stale
205
212
  # @param type [Symbol] Types returned, :RAW, :CONVERTED (default), :FORMATTED, or :WITH_UNITS
206
- # @return (see OpenC3::Packet#read_all_with_limits_states)
207
- def get_tlm_packet(target_name, packet_name, type: :CONVERTED, scope: $openc3_scope, token: $openc3_token)
213
+ # @return [Array<String, Object, Symbol|nil>] Returns an Array consisting
214
+ # of [item name, item value, item limits state] where the item limits
215
+ # state can be one of {OpenC3::Limits::LIMITS_STATES}
216
+ def get_tlm_packet(target_name, packet_name, stale_time: 30, type: :CONVERTED, scope: $openc3_scope, token: $openc3_token)
208
217
  authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
209
218
  packet = TargetModel.packet(target_name, packet_name, scope: scope)
210
219
  t = _validate_tlm_type(type)
211
220
  raise ArgumentError, "Unknown type '#{type}' for #{target_name} #{packet_name}" if t.nil?
212
221
  items = packet['items'].map { | item | item['name'] }
213
222
  cvt_items = items.map { | item | "#{target_name}__#{packet_name}__#{item}__#{type}" }
214
- current_values = CvtModel.get_tlm_values(cvt_items, scope: scope)
223
+ current_values = CvtModel.get_tlm_values(cvt_items, stale_time: stale_time, scope: scope)
215
224
  items.zip(current_values).map { | item , values | [item, values[0], values[1]]}
216
225
  end
217
226
 
@@ -221,10 +230,11 @@ module OpenC3
221
230
  #
222
231
  # @since 5.0.0
223
232
  # @param items [Array<String>] Array of items consisting of 'tgt__pkt__item__type'
233
+ # @param stale_time [Integer] Time in seconds from Time.now that data will be marked stale
224
234
  # @return [Array<Object, Symbol>]
225
235
  # Array consisting of the item value and limits state
226
236
  # given as symbols such as :RED, :YELLOW, :STALE
227
- def get_tlm_values(items, scope: $openc3_scope, token: $openc3_token)
237
+ def get_tlm_values(items, stale_time: 30, scope: $openc3_scope, token: $openc3_token)
228
238
  if !items.is_a?(Array) || !items[0].is_a?(String)
229
239
  raise ArgumentError, "items must be array of strings: ['TGT__PKT__ITEM__TYPE', ...]"
230
240
  end
@@ -237,7 +247,7 @@ module OpenC3
237
247
  end
238
248
  authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
239
249
  end
240
- CvtModel.get_tlm_values(items, scope: scope)
250
+ CvtModel.get_tlm_values(items, stale_time: stale_time, scope: scope)
241
251
  end
242
252
 
243
253
  # Returns an array of all the telemetry packet hashes
@@ -310,17 +320,17 @@ module OpenC3
310
320
 
311
321
  # Get packets based on ID returned from subscribe_packet.
312
322
  # @param id [String] ID returned from subscribe_packets or last call to get_packets
313
- # @param block [Integer] Number of milliseconds to block when requesting packets
323
+ # @param block [Integer] Unused - Blocking must be implemented at the client
314
324
  # @param count [Integer] Maximum number of packets to return from EACH packet stream
315
325
  # @return [Array<String, Array<Hash>] Array of the ID and array of all packets found
316
326
  def get_packets(id, block: nil, count: 1000, scope: $openc3_scope, token: $openc3_token)
317
327
  authorize(permission: 'tlm', scope: scope, token: token)
318
328
  # Split the list of topic, ID values and turn it into a hash for easy updates
319
329
  lookup = Hash[*id.split(SUBSCRIPTION_DELIMITER)]
320
- xread = Topic.read_topics(lookup.keys, lookup.values, block, count)
321
- # Return the original ID and nil if we didn't get anything
322
- return [id, nil] if xread.empty?
330
+ xread = Topic.read_topics(lookup.keys, lookup.values, nil, count) # Always don't block
331
+ # Return the original ID and and empty array if we didn't get anything
323
332
  packets = []
333
+ return [id, packets] if xread.empty?
324
334
  xread.each do |topic, data|
325
335
  data.each do |id, msg_hash|
326
336
  lookup[topic] = id # save the new ID
@@ -329,7 +339,7 @@ module OpenC3
329
339
  packets << msg_hash.merge(json_hash)
330
340
  end
331
341
  end
332
- return [lookup.to_a.join(SUBSCRIPTION_DELIMITER), packets]
342
+ return lookup.to_a.join(SUBSCRIPTION_DELIMITER), packets
333
343
  end
334
344
 
335
345
  # Get the receive count for a telemetry packet
@@ -367,23 +377,6 @@ module OpenC3
367
377
  return packet['items'].select { |item| item['data_type'] == 'DERIVED' }.map { |item| item['name'] }
368
378
  end
369
379
 
370
- def get_oldest_logfile(scope: $openc3_scope, token: $openc3_token)
371
- authorize(permission: 'tlm', scope: scope, token: token)
372
- _, list = S3Utilities.get_total_size_and_oldest_list('logs', "#{scope}/decom_logs", 1_000_000_000)
373
- # The list is a S3 structure containing the file paths
374
- # Request the path by calling the key method. Returns something like this:
375
- # DEFAULT/decom_logs/tlm/INST2/MECH/20220104/20220104165449021942700__20220104170449148642700__DEFAULT__INST2__MECH__rt__decom.bin
376
- # Thus we split and take the start date/time part of the filename
377
- if list and list[0]
378
- start = list[0].key.split('/')[-1].split('__')[0]
379
- # Format as YYYY-MM-DD HH:MM:SS for use by the frontend
380
- # utc_time = Time.utc(start[0,4], start[4,2], start[6,2], start[8,2], start[10,2], start[12,2])
381
- return "#{start[0,4]}-#{start[4,2]}-#{start[6,2]} #{start[8,2]}:#{start[10,2]}:#{start[12,2]}"
382
- else
383
- return Time.now.utc.to_s[0..18]
384
- end
385
- end
386
-
387
380
  # PRIVATE
388
381
 
389
382
  def _validate_tlm_type(type)
@@ -417,7 +410,9 @@ module OpenC3
417
410
  TargetModel.packets(target_name, scope: scope).each do |packet|
418
411
  item = packet['items'].find { |item| item['name'] == item_name }
419
412
  if item
420
- _, msg_hash = Topic.get_oldest_message("#{scope}__DECOM__{#{target_name}}__#{packet['packet_name']}")
413
+ # TODO: Fixme: This should be using the CVT not topics - Will possibly choose wrong packet if mixed with stored
414
+ _, msg_hash = Topic.get_newest_message("#{scope}__DECOM__{#{target_name}}__#{packet['packet_name']}")
415
+ packet_name = packet['packet_name'] if packet_name == 'LATEST'
421
416
  if msg_hash && msg_hash['time'] && msg_hash['time'].to_i > latest
422
417
  packet_name = packet['packet_name']
423
418
  latest = msg_hash['time'].to_i
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3'
21
24
  require 'openc3/bridge/bridge_config'
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/utilities/logger'
21
24
  require 'openc3/config/config_parser'
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/tools/cmd_tlm_server/interface_thread'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/tools/cmd_tlm_server/interface_thread'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/packets/packet'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3'
21
24
  require 'openc3/ccsds/ccsds_packet'
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/top_level'
21
24
  require 'openc3/ext/config_parser' if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT']
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'erb'
21
24
  require 'psych'
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  module OpenC3
21
24
  # Performs a general conversion via the implementation of the call method
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
  require 'openc3/packets/binary_accessor'
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
  require 'openc3/ext/polynomial_conversion' if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT']
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/unix_time_conversion'
21
24
 
@@ -16,6 +16,9 @@
16
16
  # Modified by OpenC3, Inc.
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
+ #
20
+ # This file may also be used under the terms of a commercial license
21
+ # if purchased from OpenC3, Inc.
19
22
 
20
23
  require 'openc3/conversions/unix_time_conversion'
21
24