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,169 @@
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 'openc3/interfaces/interface'
21
+ require 'openc3/io/udp_sockets'
22
+ require 'openc3/config/config_parser'
23
+
24
+ module OpenC3
25
+ # Base class for interfaces that send and receive messages over UDP
26
+ class UdpInterface < Interface
27
+ # @param hostname [String] Machine to connect to
28
+ # @param write_dest_port [Integer] Port to write commands to
29
+ # @param read_port [Integer] Port to read telemetry from
30
+ # @param write_src_port [Integer] Port to allow replies if needed
31
+ # @param interface_address [String] If the destination machine represented
32
+ # by hostname supports multicast, then interface_address is used to
33
+ # configure the outgoing multicast address.
34
+ # @param ttl [Integer] Time To Live value. The number of intermediate
35
+ # routers allowed before dropping the packet.
36
+ # @param write_timeout [Integer] Seconds to wait before aborting writes
37
+ # @param read_timeout [Integer] Seconds to wait before aborting reads
38
+ # @param bind_address [String] Address to bind UDP ports to
39
+ def initialize(
40
+ hostname,
41
+ write_dest_port,
42
+ read_port,
43
+ write_src_port = nil,
44
+ interface_address = nil,
45
+ ttl = 128, # default for Windows
46
+ write_timeout = 10.0,
47
+ read_timeout = nil,
48
+ bind_address = '0.0.0.0'
49
+ )
50
+
51
+ super()
52
+ @hostname = ConfigParser.handle_nil(hostname)
53
+ if @hostname
54
+ @hostname = @hostname.to_s
55
+ @hostname = '127.0.0.1' if @hostname.casecmp('LOCALHOST').zero?
56
+ end
57
+ @write_dest_port = ConfigParser.handle_nil(write_dest_port)
58
+ @write_dest_port = write_dest_port.to_i if @write_dest_port
59
+ @read_port = ConfigParser.handle_nil(read_port)
60
+ @read_port = read_port.to_i if @read_port
61
+ @write_src_port = ConfigParser.handle_nil(write_src_port)
62
+ @write_src_port = @write_src_port.to_i if @write_src_port
63
+ @interface_address = ConfigParser.handle_nil(interface_address)
64
+ if @interface_address && @interface_address.casecmp('LOCALHOST').zero?
65
+ @interface_address = '127.0.0.1'
66
+ end
67
+ @ttl = ttl.to_i
68
+ @ttl = 1 if @ttl < 1
69
+ @write_timeout = ConfigParser.handle_nil(write_timeout)
70
+ @write_timeout = @write_timeout.to_f if @write_timeout
71
+ @read_timeout = ConfigParser.handle_nil(read_timeout)
72
+ @read_timeout = @read_timeout.to_f if @read_timeout
73
+ @bind_address = ConfigParser.handle_nil(bind_address)
74
+ if @bind_address && @bind_address.casecmp('LOCALHOST').zero?
75
+ @bind_address = '127.0.0.1'
76
+ end
77
+ @write_socket = nil
78
+ @read_socket = nil
79
+ @read_allowed = false unless @read_port
80
+ @write_allowed = false unless @write_dest_port
81
+ @write_raw_allowed = false unless @write_dest_port
82
+ end
83
+
84
+ # Creates a new {UdpWriteSocket} if the the write_dest_port was given in
85
+ # the constructor and a new {UdpReadSocket} if the read_port was given in
86
+ # the constructor.
87
+ def connect
88
+ if @read_port and @write_dest_port and @write_src_port and (@read_port == @write_src_port)
89
+ @read_socket = UdpReadWriteSocket.new(
90
+ @read_port,
91
+ @bind_address,
92
+ @write_dest_port,
93
+ @hostname,
94
+ @interface_address,
95
+ @ttl
96
+ )
97
+ @write_socket = @read_socket
98
+ else
99
+ @read_socket = UdpReadSocket.new(
100
+ @read_port,
101
+ @hostname,
102
+ @interface_address,
103
+ @bind_address
104
+ ) if @read_port
105
+ @write_socket = UdpWriteSocket.new(
106
+ @hostname,
107
+ @write_dest_port,
108
+ @write_src_port,
109
+ @interface_address,
110
+ @ttl,
111
+ @bind_address
112
+ ) if @write_dest_port
113
+ end
114
+ @thread_sleeper = nil
115
+ end
116
+
117
+ # @return [Boolean] Whether the active ports (read and/or write) have
118
+ # created sockets. Since UDP is connectionless, creation of the sockets
119
+ # is used to determine connection.
120
+ def connected?
121
+ if @write_dest_port && @read_port
122
+ (@write_socket && @read_socket) ? true : false
123
+ elsif @write_dest_port
124
+ @write_socket ? true : false
125
+ else
126
+ @read_socket ? true : false
127
+ end
128
+ end
129
+
130
+ # Close the active ports (read and/or write) and set the sockets to nil.
131
+ def disconnect
132
+ if @write_socket != @read_socket
133
+ OpenC3.close_socket(@write_socket)
134
+ end
135
+ OpenC3.close_socket(@read_socket)
136
+ @write_socket = nil
137
+ @read_socket = nil
138
+ @thread_sleeper.cancel if @thread_sleeper
139
+ @thread_sleeper = nil
140
+ end
141
+
142
+ def read
143
+ return super() if @read_port
144
+
145
+ # Write only interface so stop the thread which calls read
146
+ @thread_sleeper = Sleeper.new
147
+ @thread_sleeper.sleep(1_000_000_000) while connected?
148
+ return nil
149
+ end
150
+
151
+ # Reads from the socket if the read_port is defined
152
+ def read_interface
153
+ data = @read_socket.read(@read_timeout)
154
+ Logger.info "#{@name}: Udp read returned 0 bytes (stream closed)" if data.length <= 0
155
+ read_interface_base(data)
156
+ return data
157
+ rescue IOError # Disconnected
158
+ return nil
159
+ end
160
+
161
+ # Writes to the socket
162
+ # @param data [String] Raw packet data
163
+ def write_interface(data)
164
+ write_interface_base(data)
165
+ @write_socket.write(data, @write_timeout)
166
+ data
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,44 @@
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(:Interface, 'openc3/interfaces/interface.rb')
22
+ autoload(:StreamInterface, 'openc3/interfaces/stream_interface.rb')
23
+ autoload(:SerialInterface, 'openc3/interfaces/serial_interface.rb')
24
+ autoload(:SimulatedTargetInterface, 'openc3/interfaces/simulated_target_interface.rb')
25
+ autoload(:TcpipClientInterface, 'openc3/interfaces/tcpip_client_interface.rb')
26
+ autoload(:TcpipServerInterface, 'openc3/interfaces/tcpip_server_interface.rb')
27
+ autoload(:UdpInterface, 'openc3/interfaces/udp_interface.rb')
28
+ autoload(:LincInterface, 'openc3/interfaces/linc_interface.rb')
29
+ autoload(:LincHandshakeCommand, 'openc3/interfaces/linc_interface.rb')
30
+ autoload(:LincHandshake, 'openc3/interfaces/linc_interface.rb')
31
+ autoload(:DartStatusInterface, 'openc3/interfaces/dart_status_interface.rb')
32
+
33
+ autoload(:Protocol, 'openc3/interfaces/protocols/protocol.rb')
34
+ autoload(:BurstProtocol, 'openc3/interfaces/protocols/burst_protocol.rb')
35
+ autoload(:FixedProtocol, 'openc3/interfaces/protocols/fixed_protocol.rb')
36
+ autoload(:LengthProtocol, 'openc3/interfaces/protocols/length_protocol.rb')
37
+ autoload(:PreidentifiedProtocol, 'openc3/interfaces/protocols/preidentified_protocol.rb')
38
+ autoload(:TemplateProtocol, 'openc3/interfaces/protocols/template_protocol.rb')
39
+ autoload(:TerminatedProtocol, 'openc3/interfaces/protocols/terminated_protocol.rb')
40
+
41
+ autoload(:OverrideProtocol, 'openc3/interfaces/protocols/override_protocol.rb')
42
+ autoload(:CrcProtocol, 'openc3/interfaces/protocols/crc_protocol.rb')
43
+ autoload(:IgnorePacketProtocol, 'openc3/interfaces/protocols/ignore_packet_protocol.rb')
44
+ end
@@ -0,0 +1,109 @@
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
+ if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT']
21
+ require 'openc3/ext/buffered_file'
22
+ else
23
+ module OpenC3
24
+ class BufferedFile < File
25
+ BUFFER_SIZE = 16 * 1024
26
+
27
+ # Initialize the BufferedFile. Takes the same args as File
28
+ def initialize(*args)
29
+ super(*args)
30
+ @buffer = ''
31
+ @buffer_index = 0
32
+ end
33
+
34
+ # Read using an internal buffer to avoid system calls
35
+ def read(read_length)
36
+ if read_length <= (@buffer.length - @buffer_index)
37
+ # Return part of the buffer without having to go to the OS
38
+ result = @buffer[@buffer_index, read_length]
39
+ @buffer_index += read_length
40
+ return result
41
+ elsif read_length > BUFFER_SIZE
42
+ # Reading more than our buffer
43
+ if @buffer.length > 0
44
+ if @buffer_index > 0
45
+ @buffer.slice!(0..(@buffer_index - 1))
46
+ @buffer_index = 0
47
+ end
48
+ @buffer << super(read_length - @buffer.length).to_s
49
+ return @buffer.slice!(0..-1)
50
+ else
51
+ return super(read_length)
52
+ end
53
+ else
54
+ # Read into the buffer
55
+ if @buffer_index > 0
56
+ @buffer.slice!(0..(@buffer_index - 1))
57
+ @buffer_index = 0
58
+ end
59
+ @buffer << super(BUFFER_SIZE - @buffer.length).to_s
60
+ if @buffer.length <= 0
61
+ return nil
62
+ end
63
+
64
+ if read_length <= @buffer.length
65
+ result = @buffer[@buffer_index, read_length]
66
+ @buffer_index += read_length
67
+ return result
68
+ else
69
+ return @buffer.slice!(0..-1)
70
+ end
71
+ end
72
+ end
73
+
74
+ # Get the current file position
75
+ def pos
76
+ parent_pos = super()
77
+ return parent_pos - (@buffer.length - @buffer_index)
78
+ end
79
+
80
+ # Seek to a given file position
81
+ def seek(*args)
82
+ case args.length
83
+ when 1
84
+ amount = args[0]
85
+ whence = IO::SEEK_SET
86
+ when 2
87
+ amount = args[0]
88
+ whence = args[1]
89
+ else
90
+ # Invalid number of arguments given - let super handle
91
+ return super(*args)
92
+ end
93
+
94
+ if whence == IO::SEEK_CUR
95
+ buffer_index = @buffer_index + amount
96
+ if (buffer_index >= 0) && (buffer_index < @buffer.length)
97
+ @buffer_index = buffer_index
98
+ return 0
99
+ end
100
+ super(self.pos, IO::SEEK_SET)
101
+ end
102
+
103
+ @buffer.clear
104
+ @buffer_index = 0
105
+ return super(*args)
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,80 @@
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
+ # Adds IO streams and then defers to the streams when using any of the Ruby
22
+ # output methods such as print, puts, etc.
23
+ class IoMultiplexer
24
+ # Create the empty stream array
25
+ def initialize
26
+ @streams = []
27
+ end
28
+
29
+ def write(*args)
30
+ first = true
31
+ result = nil
32
+ @streams.each do |stream|
33
+ if first
34
+ result = stream.write(*args)
35
+ result = self if result == stream
36
+ first = false
37
+ else
38
+ stream.write(*args)
39
+ end
40
+ end
41
+ result
42
+ end
43
+
44
+ # Forwards IO methods to all streams
45
+ def method_missing(method_name, *args)
46
+ first = true
47
+ result = nil
48
+ @streams.each do |stream|
49
+ if first
50
+ # Fortify Access Specifier Manipulation
51
+ # We're forwarding only public methods to the stream
52
+ result = stream.public_send(method_name, *args)
53
+ result = self if result == stream
54
+ first = false
55
+ else
56
+ # Fortify Access Specifier Manipulation
57
+ # We're forwarding only public methods to the stream
58
+ stream.public_send(method_name, *args)
59
+ end
60
+ end
61
+ result
62
+ end
63
+
64
+ # Removes STDOUT and STDERR from the array of streams
65
+ def remove_default_io
66
+ @streams.delete(STDOUT)
67
+ @streams.delete(STDERR)
68
+ end
69
+
70
+ # @param stream [IO] The stream to add
71
+ def add_stream(stream)
72
+ @streams << stream unless @streams.include?(stream)
73
+ end
74
+
75
+ # @param stream [IO] The stream to remove
76
+ def remove_stream(stream)
77
+ @streams.delete(stream)
78
+ end
79
+ end # class IoMultiplexer
80
+ end
@@ -0,0 +1,208 @@
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 'openc3'
21
+ require 'openc3/utilities/authentication'
22
+ require 'openc3/io/json_drb'
23
+
24
+ require 'thread'
25
+ require 'socket'
26
+ require 'json'
27
+ # require 'drb/acl'
28
+ require 'drb/drb'
29
+ require 'uri'
30
+ require 'httpclient'
31
+
32
+
33
+ module OpenC3
34
+
35
+ class JsonApiError < StandardError; end
36
+
37
+ # Used to forward all method calls to the remote server object. Before using
38
+ # this class ensure the remote service has been started in the server class:
39
+ #
40
+ # json = JsonDrb.new
41
+ # json.start_service('127.0.0.1', 7777, self)
42
+ #
43
+ # Now the JsonApiObject can be used to call server methods directly:
44
+ #
45
+ # server = JsonApiObject('http://openc3-cmd-tlm-api:2901', 1.0)
46
+ # server.cmd(*args)
47
+ #
48
+ class JsonApiObject
49
+ attr_reader :request_data
50
+ attr_reader :response_data
51
+
52
+ USER_AGENT = 'OpenC3 / v5 (ruby/openc3/lib/io/json_api_object)'.freeze
53
+
54
+ # @param url [String] The url of openc3-cmd-tlm-api http://openc3-cmd-tlm-api:2901
55
+ # @param timeout [Float] The time to wait before disconnecting 1.0
56
+ # @param authentication [OpenC3Authentication] The authentication object if nill initialize will generate
57
+ def initialize(url: ENV['OPENC3_API_URL'], timeout: 1.0, authentication: nil)
58
+ @http = nil
59
+ @mutex = Mutex.new
60
+ @request_data = ""
61
+ @response_data = ""
62
+ @url = url
63
+ @log = [nil, nil, nil]
64
+ @authentication = authentication.nil? ? OpenC3Authentication.new() : authentication
65
+ @timeout = timeout
66
+ @shutdown = false
67
+ end
68
+
69
+ # Forwards all method calls to the remote service.
70
+ #
71
+ # @param method_params [Array] Array of parameters to pass to the method
72
+ # @param keyword_params [Hash<Symbol, Variable>] Hash of keyword parameters
73
+ # @return The result of the method call.
74
+ def request(*method_params, **keyword_params)
75
+ raise JsonApiError, "Shutdown" if @shutdown
76
+ method = method_params[0]
77
+ endpoint = method_params[1]
78
+ @mutex.synchronize do
79
+ kwargs = _generate_kwargs(keyword_params)
80
+ @log = [nil, nil, nil]
81
+ connect() if !@http
82
+ return _send_request(method: method, endpoint: endpoint, kwargs: kwargs)
83
+ end
84
+ end
85
+
86
+ # Disconnects from http server
87
+ def disconnect
88
+ @http.reset_all() if @http
89
+ @http = nil
90
+ end
91
+
92
+ # Permanently disconnects from the http server
93
+ def shutdown
94
+ @shutdown = true
95
+ disconnect()
96
+ end
97
+
98
+ private
99
+
100
+ def connect
101
+ begin
102
+ @http = HTTPClient.new
103
+ @http.connect_timeout = @timeout
104
+ @http.receive_timeout = nil # Allow long polling
105
+ rescue => e
106
+ raise JsonApiError, e.message
107
+ end
108
+ end
109
+
110
+ # NOTE: This is a helper method and should not be called directly
111
+ def _generate_kwargs(keyword_params)
112
+ kwargs = {}
113
+ keyword_params.each do |key, value|
114
+ kwargs[key.intern] = value
115
+ end
116
+ kwargs[:scope] = _generate_scope(kwargs)
117
+ kwargs[:headers] = _generate_headers(kwargs)
118
+ kwargs[:data] = _generate_data(kwargs)
119
+ kwargs[:query] = _generate_query(kwargs)
120
+ return kwargs
121
+ end
122
+
123
+ # NOTE: This is a helper method and should not be called directly
124
+ def _generate_scope(kwargs)
125
+ scope = kwargs[:scope]
126
+ if scope.nil?
127
+ raise JsonApiError, "no scope keyword found: #{kwargs}"
128
+ elsif scope.is_a?(String) == false
129
+ raise JsonApiError, "incorrect type for keyword 'scope' MUST be String: #{scope}"
130
+ end
131
+ return scope
132
+ end
133
+
134
+ # NOTE: This is a helper method and should not be called directly
135
+ def _generate_headers(kwargs)
136
+ headers = kwargs[:headers]
137
+ if headers.nil?
138
+ headers = kwargs[:headers] = {}
139
+ elsif headers.is_a?(Hash) == false
140
+ raise JsonApiError, "incorrect type for keyword 'headers' MUST be Hash: #{headers}"
141
+ end
142
+
143
+ headers['Content-Type'] = 'application/json' if kwargs[:json]
144
+ return headers.update({
145
+ 'User-Agent' => USER_AGENT,
146
+ 'Authorization' => @authentication.token(),
147
+ })
148
+ end
149
+
150
+ # NOTE: This is a helper method and should not be called directly
151
+ def _generate_data(kwargs)
152
+ data = kwargs[:data]
153
+ if data.nil?
154
+ data = kwargs[:data] = {}
155
+ elsif data.is_a?(Hash) == false and data.is_a?(String) == false
156
+ raise JsonApiError, "incorrect type for keyword 'data' MUST be Hash or String: #{data}"
157
+ end
158
+ return kwargs[:json] ? JSON.generate(kwargs[:data]) : kwargs[:data]
159
+ end
160
+
161
+ # NOTE: This is a helper method and should not be called directly
162
+ def _generate_query(kwargs)
163
+ query = kwargs[:query]
164
+ if query.nil?
165
+ query = kwargs[:query] = {}
166
+ elsif query.is_a?(Hash) == false
167
+ raise JsonApiError, "incorrect type for keyword 'query' MUST be Hash: #{query}"
168
+ end
169
+ kwargs[:query].update(:scope => kwargs[:scope]) if kwargs[:scope]
170
+ end
171
+
172
+ # NOTE: This is a helper method and should not be called directly
173
+ def _send_request(method:, endpoint:, kwargs:)
174
+ begin
175
+ uri = URI("#{@url}#{endpoint}")
176
+ @log[0] = "#{method} Request: #{uri.to_s} #{kwargs}"
177
+ STDOUT.puts @log[0] if JsonDRb.debug?
178
+ resp = _http_request(method: method, uri: uri, kwargs: kwargs)
179
+ @log[1] = "#{method} Response: #{resp.status} #{resp.headers} #{resp.body}"
180
+ STDOUT.puts @log[1] if JsonDRb.debug?
181
+ @response_data = resp.body
182
+ return resp
183
+ rescue StandardError => e
184
+ @log[2] = "#{method} Exception: #{e.class}, #{e.message}, #{e.backtrace}"
185
+ disconnect()
186
+ error = "Api Exception: #{@log[0]} ::: #{@log[1]} ::: #{@log[2]}"
187
+ raise error
188
+ end
189
+ end
190
+
191
+ # NOTE: This is a helper method and should not be called directly
192
+ def _http_request(method:, uri:, kwargs:)
193
+ case method
194
+ when 'get', :get
195
+ return @http.get(uri, :header => kwargs[:headers], :query => kwargs[:query])
196
+ when 'post', :post
197
+ return @http.post(uri, :header => kwargs[:headers], :query => kwargs[:query], :body => kwargs[:data])
198
+ when 'put', :put
199
+ return @http.put(uri, :header => kwargs[:headers], :query => kwargs[:query], :body => kwargs[:data])
200
+ when 'delete', :delete
201
+ return @http.delete(uri, :header => kwargs[:headers], :query => kwargs[:query])
202
+ else
203
+ raise JsonApiError, "no method found: '#{method}'"
204
+ end
205
+ end
206
+
207
+ end # class JsonApiObject
208
+ end