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 'childprocess'
21
24
  require 'openc3'
@@ -23,6 +26,56 @@ require 'fileutils'
23
26
  require 'tempfile'
24
27
 
25
28
  module OpenC3
29
+ # Class to prevent an infinitely growing log file
30
+ class OperatorProcessIO < Tempfile
31
+ def initialize(label, max_start_lines: 100, max_end_lines: 100)
32
+ super(label)
33
+ @max_start_lines = max_start_lines
34
+ @max_end_lines = max_end_lines
35
+ @start_lines = []
36
+ @end_lines = []
37
+ end
38
+
39
+ def extract
40
+ rewind()
41
+ data = read()
42
+ truncate(0)
43
+ rewind()
44
+
45
+ # Save a set number of lines for unexpected death messages
46
+ lines = data.split("\n")
47
+ lines.each do |line|
48
+ if @start_lines.length < @max_start_lines
49
+ @start_lines << line
50
+ else
51
+ @end_lines << line
52
+ end
53
+ end
54
+ if @end_lines.length > @max_end_lines
55
+ @end_lines = @end_lines[(@end_lines.length - @max_end_lines)..-1]
56
+ end
57
+
58
+ return data
59
+ end
60
+
61
+ def finalize
62
+ extract()
63
+ close()
64
+ unlink()
65
+
66
+ output = ''
67
+ output << @start_lines.join("\n")
68
+ if @end_lines.length >= @max_end_lines
69
+ output << "\n...\n"
70
+ output << @end_lines.join("\n")
71
+ elsif @end_lines.length > 0
72
+ output << @end_lines.join("\n")
73
+ end
74
+ output << "\n"
75
+ output
76
+ end
77
+ end
78
+
26
79
  class OperatorProcess
27
80
  attr_accessor :process_definition
28
81
  attr_accessor :work_dir
@@ -48,21 +101,25 @@ module OpenC3
48
101
  @config = config
49
102
  end
50
103
 
51
- def start
52
- @temp_dir = @new_temp_dir
53
- @new_temp_dir = nil
54
-
104
+ def cmd_line
55
105
  # In ProcessManager processes, the process_definition is the actual thing run
56
106
  # e.g. OpenC3::ProcessManager.instance.spawn(["ruby", "/openc3/bin/openc3cli", "load", ...])
57
107
  # However, if the MicroserviceOperator is spawning the proceses it sets
58
108
  # process_definition = ["ruby", "plugin_microservice.rb"]
59
109
  # which then calls exec(*@config["cmd"]) to actually run
60
110
  # So check if the @config['cmd'] is defined to give the user more info in the log
61
- cmd = @process_definition.join(' ')
111
+ cmd_line_text = @process_definition.join(' ')
62
112
  if @config && @config['cmd']
63
- cmd = @config['cmd'].join(' ')
113
+ cmd_line_text = @config['cmd'].join(' ')
64
114
  end
65
- Logger.info("Starting: #{cmd}", scope: @scope)
115
+ return cmd_line_text
116
+ end
117
+
118
+ def start
119
+ @temp_dir = @new_temp_dir
120
+ @new_temp_dir = nil
121
+
122
+ Logger.info("Starting: #{cmd_line()}", scope: @scope)
66
123
 
67
124
  @process = ChildProcess.build(*@process_definition)
68
125
  # This lets the ChildProcess use the parent IO ... but it breaks unit tests
@@ -79,8 +136,8 @@ module OpenC3
79
136
  @process.environment[key] = value
80
137
  end
81
138
  @process.environment['OPENC3_SCOPE'] = @scope
82
- @process.io.stdout = Tempfile.new("child-output")
83
- @process.io.stderr = Tempfile.new("child-output")
139
+ @process.io.stdout = OperatorProcessIO.new('microservice-stdout')
140
+ @process.io.stderr = OperatorProcessIO.new('microservice-stderr')
84
141
  @process.start
85
142
  end
86
143
 
@@ -102,14 +159,18 @@ module OpenC3
102
159
 
103
160
  def soft_stop
104
161
  Thread.new do
105
- Logger.info("Soft shutting down process: #{@process_definition.join(' ')}", scope: @scope)
162
+ Logger.info("Soft shutting down process: #{cmd_line()}", scope: @scope)
106
163
  Process.kill("SIGINT", @process.pid) if @process # Signal the process to stop
107
164
  end
108
165
  end
109
166
 
110
167
  def hard_stop
111
168
  if @process and !@process.exited?
112
- Logger.info("Hard shutting down process: #{@process_definition.join(' ')}", scope: @scope)
169
+ # Redis may be down at this point so just catch any Logger errors
170
+ begin
171
+ Logger.info("Hard shutting down process: #{cmd_line()}", scope: @scope)
172
+ rescue Exception
173
+ end
113
174
  @process.stop
114
175
  end
115
176
  FileUtils.remove_entry(@temp_dir) if @temp_dir and File.exist?(@temp_dir)
@@ -124,20 +185,37 @@ module OpenC3
124
185
  @process.io.stderr
125
186
  end
126
187
 
127
- def extract_output(max_length_stdout = 65536, max_length_stderr = 65536)
188
+ def output_increment
128
189
  if @process
129
- @process.io.stdout.rewind
130
- output = @process.io.stdout.read
131
- @process.io.stdout.close
132
- @process.io.stdout.unlink
133
- @process.io.stderr.rewind
134
- err_output = @process.io.stderr.read
135
- @process.io.stderr.close
136
- @process.io.stderr.unlink
137
- return "Stdout:\n#{output[-max_length_stdout..-1] || output}\n\nStderr:\n#{err_output[-max_length_stderr..-1] || err_output}\n"
138
- else
139
- return ""
190
+ stdout = @process.io.stdout.extract
191
+ if stdout.length > 0
192
+ STDOUT.puts "STDOUT #{stdout.length} bytes from #{cmd_line()}:"
193
+ STDOUT.puts stdout
194
+ end
195
+ stderr = @process.io.stderr.extract
196
+ if stderr.length > 0
197
+ STDERR.puts "STDERR #{stderr.length} bytes from #{cmd_line()}:"
198
+ STDERR.puts stderr
199
+ end
200
+ end
201
+ end
202
+
203
+ # This is method is used in here and in ProcessManager
204
+ def extract_output
205
+ output = ''
206
+ if @process
207
+ stdout = @process.io.stdout.finalize
208
+ stderr = @process.io.stderr.finalize
209
+
210
+ # Always include the Stdout header for consistency and to show the option
211
+ output << "Stdout:\n"
212
+ output << stdout
213
+
214
+ # Always include the nStderr header for consistency and to show the option
215
+ output << "\nStderr:\n"
216
+ output << stderr
140
217
  end
218
+ output
141
219
  end
142
220
  end
143
221
 
@@ -215,18 +293,11 @@ module OpenC3
215
293
  @mutex.synchronize do
216
294
  @processes.each do |name, p|
217
295
  break if @shutdown
218
-
296
+ p.output_increment
219
297
  unless p.alive?
220
298
  # Respawn process
221
- p.stdout.rewind
222
- output = p.stdout.read
223
- p.stdout.close
224
- p.stdout.unlink
225
- p.stderr.rewind
226
- err_output = p.stderr.read
227
- p.stderr.close
228
- p.stderr.unlink
229
- Logger.error("Unexpected process died... respawning! #{p.process_definition.join(' ')}\nStdout:\n#{output}\nStderr:\n#{err_output}\n", scope: p.scope)
299
+ output = p.extract_output
300
+ Logger.error("Unexpected process died... respawning! #{p.cmd_line}\n#{output}\n", scope: p.scope)
230
301
  p.start
231
302
  end
232
303
  end
@@ -235,7 +306,7 @@ module OpenC3
235
306
 
236
307
  def shutdown_processes(processes)
237
308
  processes.each { |name, p| p.soft_stop }
238
- sleep(2) # TODO: This is an arbitrary sleep of 2s ...
309
+ sleep(4) # TODO: This is an arbitrary sleep of 4s ...
239
310
  processes.each { |name, p| p.hard_stop }
240
311
  end
241
312
 
@@ -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_config'
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 'json'
@@ -30,20 +33,63 @@ module OpenC3
30
33
  attr_accessor :stored
31
34
  attr_accessor :json_hash
32
35
 
33
- def initialize(cmd_or_tlm, target_name, packet_name, time_nsec_from_epoch, stored, json_data)
36
+ def initialize(cmd_or_tlm, target_name, packet_name, time_nsec_from_epoch, stored, json_data, key_map = nil)
34
37
  @cmd_or_tlm = cmd_or_tlm.intern
35
38
  @target_name = target_name
36
39
  @packet_name = packet_name
37
40
  @packet_time = ::Time.from_nsec_from_epoch(time_nsec_from_epoch)
38
41
  @stored = ConfigParser.handle_true_false(stored)
39
- @json_hash = JSON.parse(json_data, :allow_nan => true, :create_additions => true)
42
+ @json_hash = json_data
43
+ @json_hash = JSON.parse(json_data, :allow_nan => true, :create_additions => true) if String === json_data
44
+ if key_map
45
+ uncompressed = {}
46
+ @json_hash.each do |key, value|
47
+ uncompressed_key = key_map[key]
48
+ uncompressed_key = key unless uncompressed_key
49
+ uncompressed[uncompressed_key] = value
50
+ end
51
+ @json_hash = uncompressed
52
+ end
40
53
  end
41
54
 
42
55
  # Read an item in the packet by name
43
56
  #
44
57
  # @param name [String] Name of the item to read - Should already by upcase
45
58
  # @param value_type (see #read_item)
46
- def read(name, value_type = :CONVERTED)
59
+ def read(name, value_type = :CONVERTED, reduced_type = nil)
60
+ if reduced_type
61
+ raise "Reduced types only support RAW or CONVERTED value types: #{value_type} unsupported" if value_type == :WITH_UNITS or value_type == :FORMATTED
62
+ if value_type == :CONVERTED
63
+ case reduced_type
64
+ when :AVG
65
+ value = @json_hash["#{name}__CA"]
66
+ return value if value
67
+ when :STDDEV
68
+ value = @json_hash["#{name}__CS"]
69
+ return value if value
70
+ when :MIN
71
+ value = @json_hash["#{name}__CN"]
72
+ return value if value
73
+ when :MAX
74
+ value = @json_hash["#{name}__CX"]
75
+ return value if value
76
+ end
77
+ end
78
+ case reduced_type
79
+ when :AVG
80
+ value = @json_hash["#{name}__A"]
81
+ return value if value
82
+ when :STDDEV
83
+ value = @json_hash["#{name}__S"]
84
+ return value if value
85
+ when :MIN
86
+ value = @json_hash["#{name}__N"]
87
+ return value if value
88
+ when :MAX
89
+ value = @json_hash["#{name}__X"]
90
+ return value if value
91
+ end
92
+ end
47
93
  if value_type == :WITH_UNITS
48
94
  value = @json_hash["#{name}__U"]
49
95
  return value if value
@@ -68,8 +114,8 @@ module OpenC3
68
114
  return value if value
69
115
  end
70
116
 
71
- def read_with_limits_state(name, value_type = :CONVERTED)
72
- value = read(name, value_type)
117
+ def read_with_limits_state(name, value_type = :CONVERTED, reduced_type = nil)
118
+ value = read(name, value_type, reduced_type)
73
119
  limits_state = @json_hash["#{name}__L"]
74
120
  limits_state.intern if limits_state
75
121
  return [value, limits_state]
@@ -79,11 +125,11 @@ module OpenC3
79
125
  # [[item name, item value], ...]
80
126
  #
81
127
  # @param value_type (see #read_item)
82
- def read_all(value_type = :CONVERTED, names = nil)
128
+ def read_all(value_type = :CONVERTED, reduced_type = nil, names = nil)
83
129
  result = {}
84
130
  names = read_all_names() unless names
85
131
  names.each do |name|
86
- result[name] = read(name, value_type)
132
+ result[name] = read(name, value_type, reduced_type)
87
133
  end
88
134
  return result
89
135
  end
@@ -92,21 +138,48 @@ module OpenC3
92
138
  # [[item name, item value], [item limits state], ...]
93
139
  #
94
140
  # @param value_type (see #read_all)
95
- def read_all_with_limits_states(value_type = :CONVERTED, names = nil)
141
+ def read_all_with_limits_states(value_type = :CONVERTED, reduced_type = nil, names = nil)
96
142
  result = {}
97
143
  names = read_all_names() unless names
98
144
  names.each do |name|
99
- result[name] = read_with_limits_state(name, value_type)
145
+ result[name] = read_with_limits_state(name, value_type, reduced_type)
100
146
  end
101
147
  return result
102
148
  end
103
149
 
104
150
  # Read all the names of items in the packet
105
151
  # Note: This is not very efficient, ideally only call once for discovery purposes
106
- def read_all_names
152
+ def read_all_names(value_type = nil, reduced_type = nil)
107
153
  result = {}
108
- @json_hash.each do |key, value|
109
- result[key.split("__")[0]] = true
154
+ if value_type
155
+ case value_type
156
+ when :RAW
157
+ postfix = ''
158
+ when :CONVERTED
159
+ postfix = 'C'
160
+ when :FORMATTED
161
+ postfix = 'F'
162
+ when :WITH_UNITS
163
+ postfix = 'U'
164
+ end
165
+ case reduced_type
166
+ when :MIN
167
+ postfix << 'N'
168
+ when :MAX
169
+ postfix << 'X'
170
+ when :AVG
171
+ postfix << 'A'
172
+ when :STDDEV
173
+ postfix << 'S'
174
+ else
175
+ postfix = nil if value_type == :RAW
176
+ end
177
+ @json_hash.each do |key, value|
178
+ key_split = key.split("__")
179
+ result[key_split[0]] = true if key_split[1] == postfix
180
+ end
181
+ else
182
+ @json_hash.each { |key, value| result[key.split("__")[0]] = true }
110
183
  end
111
184
  return result.keys
112
185
  end
@@ -115,12 +188,12 @@ module OpenC3
115
188
  #
116
189
  # @param value_type (see #read_item)
117
190
  # @param indent (see Structure#formatted)
118
- def formatted(value_type = :CONVERTED, names = nil, indent = 0)
191
+ def formatted(value_type = :CONVERTED, reduced_type = nil, names = nil, indent = 0)
119
192
  names = read_all_names() unless names
120
193
  indent_string = ' ' * indent
121
194
  string = ''
122
195
  names.each do |name|
123
- value = read(name, value_type)
196
+ value = read(name, value_type, reduced_type)
124
197
  if String === value and value =~ File::NON_ASCII_PRINTABLE
125
198
  string << "#{indent_string}#{name}:\n"
126
199
  string << value.formatted(1, 16, ' ', indent + 2)
@@ -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_config'
21
24
 
@@ -234,7 +237,7 @@ module OpenC3
234
237
  limits_for_set[4] = green_low.to_f
235
238
  limits_for_set[5] = green_high.to_f
236
239
  end
237
- limits.enabled = enabled
240
+ limits.enabled = enabled if not enabled.nil?
238
241
  limits.persistence_setting = Integer(persistence) if persistence
239
242
  packet.update_limits_items_cache(item)
240
243
  @config.limits_sets << limits_set
@@ -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
  # This file implements a class to handle responses to limits state changes.
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 'digest'
21
24
  require 'openc3/packets/structure'
@@ -558,7 +561,8 @@ module OpenC3
558
561
  # can be any type.
559
562
  def read_item(item, value_type = :CONVERTED, buffer = @buffer, given_raw = nil)
560
563
  if given_raw
561
- value = given_raw
564
+ # Must clone this since value is returned
565
+ value = given_raw.clone
562
566
  else
563
567
  value = super(item, :RAW, buffer)
564
568
  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/config/config_parser'
21
24
  require 'openc3/packets/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/packets/structure_item'
21
24
  require 'openc3/packets/packet_item_limits'
@@ -464,6 +467,8 @@ module OpenC3
464
467
  config['write_conversion'] = self.write_conversion.as_json(*a) if self.write_conversion
465
468
 
466
469
  if self.limits
470
+ config['limits'] ||= {}
471
+ config['limits']['enabled'] = true if self.limits.enabled
467
472
  if self.limits.values
468
473
  config['limits'] ||= {}
469
474
  config['limits']['persistence_setting'] = self.limits.persistence_setting
@@ -527,17 +532,18 @@ module OpenC3
527
532
  end
528
533
  end
529
534
 
535
+ item.limits = PacketItemLimits.new
530
536
  if hash['limits']
531
- item.limits = PacketItemLimits.new
532
537
  # Delete these keys so the only ones left are limits sets
533
- item.limits.persistence_setting = hash['limits'].delete('persistence_setting')
538
+ persistence_setting = hash['limits'].delete('persistence_setting')
539
+ item.limits.persistence_setting = persistence_setting if persistence_setting
534
540
  item.limits.enabled = true if hash['limits'].delete('enabled')
535
541
  values = {}
536
542
  hash['limits'].each do |set, items|
537
543
  values[set.to_sym] = [items['red_low'], items['yellow_low'], items['yellow_high'], items['red_high']]
538
544
  values[set.to_sym].concat([items['green_low'], items['green_high']]) if items['green_low'] && items['green_high']
539
545
  end
540
- item.limits.values = values
546
+ item.limits.values = values if values.length > 0
541
547
  end
542
548
  item.meta = hash['meta']
543
549
  item
@@ -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/limits_response'
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
  module OpenC3
21
24
  class FormatStringParser
@@ -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
  class LimitsParser
@@ -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
  class LimitsResponseParser
@@ -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_item'
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/processors'
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_item'
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 'nokogiri'
21
24
  require 'openc3/packets/parsers/xtce_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 'nokogiri'
21
24
  require 'ostruct'
@@ -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/binary_accessor'
21
24
  require 'openc3/packets/structure_item'
@@ -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/ext/packet' if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT']
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_config'
21
24
  require 'openc3/ext/telemetry' 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
  module OpenC3
21
24
  class Processor
@@ -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/processors/processor'
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/processors/processor'
21
24