cosmos 3.9.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (438) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +23 -0
  3. data/.travis.yml +1 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +1 -1
  6. data/Manifest.txt +137 -52
  7. data/Rakefile +50 -44
  8. data/autohotkey/config/system/system.txt +0 -5
  9. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +6 -1
  10. data/autohotkey/config/targets/INST/screens/extra.txt +19 -0
  11. data/autohotkey/config/targets/INST/sequences/run_sequence.txt +1 -0
  12. data/autohotkey/config/targets/META/screens/data.txt +12 -0
  13. data/autohotkey/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  14. data/autohotkey/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  15. data/autohotkey/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  16. data/autohotkey/config/targets/SYSTEM/screens/limits_change.txt +14 -0
  17. data/autohotkey/config/targets/SYSTEM/screens/meta.txt +14 -0
  18. data/autohotkey/config/targets/SYSTEM/target.txt +12 -0
  19. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  20. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  21. data/autohotkey/tools/CmdSequence +14 -0
  22. data/autohotkey/tools/CmdSequenceAHK +23 -0
  23. data/autohotkey/tools/CmdSequenceAHK2 +16 -0
  24. data/autohotkey/tools/cmd_extractor.ahk +2 -2
  25. data/autohotkey/tools/cmd_sender.ahk +4 -6
  26. data/autohotkey/tools/cmd_sequence.ahk +215 -0
  27. data/autohotkey/tools/cmd_sequence2.ahk +23 -0
  28. data/autohotkey/tools/data_viewer.ahk +2 -3
  29. data/autohotkey/tools/limits_monitor.ahk +9 -11
  30. data/autohotkey/tools/open_gl_builder.ahk +1 -2
  31. data/autohotkey/tools/packet_viewer.ahk +51 -35
  32. data/autohotkey/tools/replay.ahk +1 -2
  33. data/autohotkey/tools/script_runner.ahk +1 -2
  34. data/autohotkey/tools/script_runner2.ahk +1 -2
  35. data/autohotkey/tools/test_runner2.ahk +1 -5
  36. data/autohotkey/tools/test_runner3.ahk +1 -3
  37. data/autohotkey/tools/tlm_grapher.ahk +1 -3
  38. data/autohotkey/tools/tlm_grapher3.ahk +1 -2
  39. data/autohotkey/tools/tlm_viewer.ahk +8 -3
  40. data/autohotkey/tools/tlm_viewer2.ahk +2 -3
  41. data/autohotkey/tools/tlm_viewer5.ahk +1 -2
  42. data/cosmos.gemspec +26 -20
  43. data/data/cmd_sequence.png +0 -0
  44. data/data/config/_array_params.yaml +23 -0
  45. data/data/config/_id_items.yaml +24 -0
  46. data/data/config/_id_params.yaml +58 -0
  47. data/data/config/_interfaces.yaml +206 -0
  48. data/data/config/_items.yaml +20 -0
  49. data/data/config/_params.yaml +58 -0
  50. data/data/config/cmd_tlm_server.yaml +110 -0
  51. data/data/config/command.yaml +38 -0
  52. data/data/config/command_modifiers.yaml +127 -0
  53. data/data/config/command_telemetry.yaml +3 -0
  54. data/data/config/data_viewer.yaml +43 -0
  55. data/data/config/handbook_creator.yaml +23 -0
  56. data/data/config/housekeeping_params.yaml +71 -0
  57. data/data/config/interface_modifiers.yaml +44 -0
  58. data/data/config/item_modifiers.yaml +172 -0
  59. data/data/config/launcher.yaml +117 -0
  60. data/data/config/limits_monitor.yaml +53 -0
  61. data/data/config/linegraph_params.yaml +30 -0
  62. data/data/config/linegraph_plot.yaml +106 -0
  63. data/data/config/page_modifiers.yaml +128 -0
  64. data/data/config/param_item_modifiers.yaml +41 -0
  65. data/data/config/parameter_modifiers.yaml +144 -0
  66. data/data/config/protocols.yaml +257 -0
  67. data/data/config/screen.yaml +151 -0
  68. data/data/config/script_runner.yaml +15 -0
  69. data/data/config/system.yaml +153 -0
  70. data/data/config/table_manager.yaml +76 -0
  71. data/data/config/table_parameter_modifiers.yaml +9 -0
  72. data/data/config/target.yaml +71 -0
  73. data/data/config/telemetry.yaml +73 -0
  74. data/data/config/telemetry_modifiers.yaml +129 -0
  75. data/data/config/test_runner.yaml +118 -0
  76. data/data/config/tlm_extractor.yaml +109 -0
  77. data/data/config/tlm_grapher.yaml +78 -0
  78. data/data/config/tlm_viewer.yaml +107 -0
  79. data/data/config/unknown.yaml +3 -0
  80. data/data/config/widgets.yaml +1339 -0
  81. data/data/config/xy_params.yaml +50 -0
  82. data/data/config/xy_plot.yaml +12 -0
  83. data/data/config_editor.png +0 -0
  84. data/data/crc.txt +172 -161
  85. data/data/delete.png +0 -0
  86. data/demo/config/data/crc.txt +56 -36
  87. data/demo/config/data/meta_init.txt +1 -4
  88. data/demo/config/system/system.txt +15 -3
  89. data/demo/config/system/system2.txt +13 -3
  90. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +2 -6
  91. data/demo/config/targets/EXAMPLE/target.txt +3 -1
  92. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -0
  93. data/demo/config/targets/INST/lib/inst_dump_component.rb +34 -0
  94. data/demo/config/targets/INST/screens/adcs.txt +39 -15
  95. data/demo/config/targets/INST/screens/commanding.txt +26 -19
  96. data/demo/config/targets/INST/screens/spacing_box.txt +44 -0
  97. data/demo/config/targets/INST/screens/spacing_grid.txt +78 -0
  98. data/demo/config/targets/INST/screens/tabs.txt +0 -2
  99. data/demo/config/targets/INST/sequences/sequence.tsv +3 -0
  100. data/demo/config/targets/INST/tables/EventAction.csv +9 -0
  101. data/demo/config/targets/INST/tables/EventAction.dat +0 -0
  102. data/demo/config/targets/INST/tables/McConfigTable.csv +20 -0
  103. data/demo/config/targets/INST/tables/McConfigTable.dat +0 -0
  104. data/demo/config/targets/INST/target.txt +4 -0
  105. data/demo/config/targets/INST/tools/data_viewer/data_viewer.txt +2 -0
  106. data/demo/config/targets/INST/tools/data_viewer/data_viewer2.txt +2 -0
  107. data/demo/config/targets/INST/tools/table_manager/EventAction_def.txt +6 -0
  108. data/demo/config/targets/INST/tools/table_manager/McConfigTable_def.txt +38 -0
  109. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -3
  110. data/demo/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  111. data/demo/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  112. data/demo/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  113. data/demo/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  114. data/demo/config/targets/SYSTEM/lib/limits_groups.rb +39 -0
  115. data/demo/config/targets/SYSTEM/screens/status.txt +1 -1
  116. data/demo/config/targets/SYSTEM/target.txt +12 -0
  117. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +1 -1
  118. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +8 -5
  119. data/demo/config/targets/TEMPLATED/target.txt +2 -0
  120. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +15 -6
  121. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +13 -5
  122. data/demo/config/tools/data_viewer/data_viewer.txt +9 -0
  123. data/demo/config/tools/launcher/launcher.txt +9 -6
  124. data/demo/config/tools/launcher/launcher2.txt +16 -13
  125. data/demo/config/tools/launcher/launcher_mini.txt +45 -0
  126. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +12 -11
  127. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +12 -11
  128. data/demo/config/tools/test_runner/test_runner.txt +1 -1
  129. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  130. data/demo/lib/example_background_task.rb +9 -5
  131. data/demo/lib/example_target.rb +5 -15
  132. data/demo/lib/scpi_target.rb +4 -10
  133. data/demo/procedures/cosmos_api_test.rb +17 -0
  134. data/demo/tools/CmdSequence +16 -0
  135. data/demo/tools/CmdSequence.bat +9 -0
  136. data/demo/tools/ConfigEditor +16 -0
  137. data/demo/tools/ConfigEditor.bat +9 -0
  138. data/demo/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  139. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  140. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  141. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  142. data/demo/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  143. data/ext/cosmos/ext/packet/packet.c +5 -5
  144. data/install/config/data/crc.txt +12 -8
  145. data/install/config/system/system.txt +13 -3
  146. data/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +14 -0
  147. data/install/config/targets/SYSTEM/target.txt +12 -0
  148. data/install/tools/CmdSequence +16 -0
  149. data/install/tools/CmdSequence.bat +9 -0
  150. data/install/tools/ConfigEditor +16 -0
  151. data/install/tools/ConfigEditor.bat +9 -0
  152. data/install/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  153. data/install/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  154. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  155. data/install/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  156. data/install/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  157. data/lib/cosmos.rb +1 -1
  158. data/lib/cosmos/config/config_parser.rb +147 -59
  159. data/lib/cosmos/config/meta_config_parser.rb +57 -0
  160. data/lib/cosmos/conversions/polynomial_conversion.rb +20 -4
  161. data/lib/cosmos/conversions/unix_time_conversion.rb +4 -4
  162. data/lib/cosmos/core_ext/array.rb +45 -5
  163. data/lib/cosmos/core_ext/cosmos_io.rb +31 -15
  164. data/lib/cosmos/core_ext/file.rb +2 -2
  165. data/lib/cosmos/core_ext/kernel.rb +1 -6
  166. data/lib/cosmos/core_ext/objectspace.rb +0 -2
  167. data/lib/cosmos/core_ext/string.rb +27 -4
  168. data/lib/cosmos/core_ext/time.rb +39 -10
  169. data/lib/cosmos/gui/choosers/combobox_chooser.rb +37 -26
  170. data/lib/cosmos/gui/choosers/file_chooser.rb +23 -6
  171. data/lib/cosmos/gui/choosers/float_chooser.rb +13 -11
  172. data/lib/cosmos/gui/choosers/integer_chooser.rb +13 -11
  173. data/lib/cosmos/gui/choosers/string_chooser.rb +18 -36
  174. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +64 -64
  175. data/lib/cosmos/gui/choosers/value_chooser.rb +15 -15
  176. data/lib/cosmos/gui/dialogs/about_dialog.rb +18 -13
  177. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +11 -3
  178. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +1 -1
  179. data/lib/cosmos/gui/dialogs/details_dialog.rb +1 -1
  180. data/lib/cosmos/gui/dialogs/exception_dialog.rb +7 -7
  181. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +20 -15
  182. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +143 -0
  183. data/lib/cosmos/gui/dialogs/legal_dialog.rb +6 -5
  184. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +5 -2
  185. data/lib/cosmos/gui/dialogs/progress_dialog.rb +1 -1
  186. data/lib/cosmos/gui/dialogs/pry_dialog.rb +4 -4
  187. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +3 -0
  188. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +7 -6
  189. data/lib/cosmos/gui/dialogs/splash.rb +1 -1
  190. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
  191. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +114 -0
  192. data/lib/cosmos/gui/line_graph/line_graph.rb +9 -10
  193. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +7 -5
  194. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -7
  195. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +3 -8
  196. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +2 -7
  197. data/lib/cosmos/gui/line_graph/overview_graph.rb +6 -1
  198. data/lib/cosmos/gui/opengl/earth_model.rb +6 -3
  199. data/lib/cosmos/gui/opengl/gl_bounds.rb +11 -23
  200. data/lib/cosmos/gui/opengl/gl_light.rb +3 -4
  201. data/lib/cosmos/gui/opengl/gl_material.rb +3 -4
  202. data/lib/cosmos/gui/opengl/gl_scene.rb +10 -4
  203. data/lib/cosmos/gui/opengl/gl_shape.rb +6 -2
  204. data/lib/cosmos/gui/opengl/gl_viewer.rb +5 -5
  205. data/lib/cosmos/gui/opengl/gl_viewport.rb +11 -12
  206. data/lib/cosmos/gui/opengl/moon_model.rb +6 -3
  207. data/lib/cosmos/gui/opengl/stl_reader.rb +8 -9
  208. data/lib/cosmos/gui/opengl/stl_shape.rb +4 -5
  209. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +7 -7
  210. data/lib/cosmos/gui/qt.rb +1 -1
  211. data/lib/cosmos/gui/qt_tool.rb +21 -10
  212. data/lib/cosmos/gui/text/completion.rb +23 -2
  213. data/lib/cosmos/gui/text/completion_text_edit.rb +38 -23
  214. data/lib/cosmos/gui/utilities/analyze_log.rb +1 -1
  215. data/lib/cosmos/gui/utilities/screenshot.rb +2 -2
  216. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +11 -1
  217. data/lib/cosmos/gui/widgets/packet_log_frame.rb +19 -6
  218. data/lib/cosmos/interfaces.rb +10 -0
  219. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +28 -47
  220. data/lib/cosmos/interfaces/interface.rb +240 -22
  221. data/lib/cosmos/interfaces/linc_interface.rb +3 -5
  222. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +173 -0
  223. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +141 -0
  224. data/lib/cosmos/{streams/fixed_stream_protocol.rb → interfaces/protocols/fixed_protocol.rb} +40 -37
  225. data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb} +55 -48
  226. data/lib/cosmos/interfaces/protocols/override_protocol.rb +52 -0
  227. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +141 -0
  228. data/lib/cosmos/interfaces/protocols/protocol.rb +60 -0
  229. data/lib/cosmos/interfaces/protocols/template_protocol.rb +209 -0
  230. data/lib/cosmos/interfaces/protocols/terminated_protocol.rb +81 -0
  231. data/lib/cosmos/interfaces/serial_interface.rb +28 -23
  232. data/lib/cosmos/interfaces/simulated_target_interface.rb +27 -16
  233. data/lib/cosmos/interfaces/stream_interface.rb +36 -108
  234. data/lib/cosmos/interfaces/tcpip_client_interface.rb +21 -21
  235. data/lib/cosmos/interfaces/tcpip_server_interface.rb +555 -94
  236. data/lib/cosmos/interfaces/udp_interface.rb +51 -83
  237. data/lib/cosmos/io/buffered_file.rb +92 -2
  238. data/lib/cosmos/io/json_drb.rb +2 -2
  239. data/lib/cosmos/io/posix_serial_driver.rb +3 -1
  240. data/lib/cosmos/io/raw_logger.rb +3 -3
  241. data/lib/cosmos/io/serial_driver.rb +14 -5
  242. data/lib/cosmos/io/win32_serial_driver.rb +16 -4
  243. data/lib/cosmos/packet_logs.rb +0 -1
  244. data/lib/cosmos/packet_logs/packet_log_reader.rb +11 -1
  245. data/lib/cosmos/packet_logs/packet_log_writer.rb +31 -13
  246. data/lib/cosmos/packets/binary_accessor.rb +599 -32
  247. data/lib/cosmos/packets/commands.rb +48 -24
  248. data/lib/cosmos/packets/packet.rb +140 -54
  249. data/lib/cosmos/packets/packet_config.rb +0 -2
  250. data/lib/cosmos/packets/parsers/packet_item_parser.rb +10 -2
  251. data/lib/cosmos/packets/structure.rb +81 -33
  252. data/lib/cosmos/packets/structure_item.rb +45 -5
  253. data/lib/cosmos/packets/telemetry.rb +149 -55
  254. data/lib/cosmos/script/api_shared.rb +1000 -0
  255. data/lib/cosmos/script/commands.rb +2 -2
  256. data/lib/cosmos/script/extract.rb +19 -4
  257. data/lib/cosmos/script/limits.rb +2 -0
  258. data/lib/cosmos/script/script.rb +1 -1
  259. data/lib/cosmos/script/scripting.rb +4 -784
  260. data/lib/cosmos/script/telemetry.rb +44 -23
  261. data/lib/cosmos/script/tools.rb +15 -69
  262. data/lib/cosmos/streams/serial_stream.rb +12 -19
  263. data/lib/cosmos/streams/stream.rb +2 -11
  264. data/lib/cosmos/streams/tcpip_socket_stream.rb +3 -13
  265. data/lib/cosmos/system/system.rb +187 -31
  266. data/lib/cosmos/system/target.rb +11 -2
  267. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -11
  268. data/lib/cosmos/tools/cmd_sender/{cmd_sender_item_delegate.rb → cmd_param_table_item_delegate.rb} +11 -10
  269. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +209 -164
  270. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +652 -0
  271. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +510 -0
  272. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +194 -0
  273. data/lib/cosmos/tools/cmd_tlm_server/api.rb +179 -5
  274. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +31 -14
  275. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +23 -16
  276. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +92 -20
  277. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +1 -1
  278. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -4
  279. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +0 -5
  280. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -2
  281. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +4 -4
  282. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +121 -0
  283. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +8 -4
  284. data/lib/cosmos/tools/config_editor/config_editor.rb +720 -0
  285. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +675 -0
  286. data/lib/cosmos/tools/data_viewer/data_viewer.rb +44 -27
  287. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +8 -22
  288. data/lib/cosmos/tools/launcher/launcher.rb +29 -12
  289. data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
  290. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +153 -42
  291. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +44 -6
  292. data/lib/cosmos/tools/replay/replay.rb +36 -20
  293. data/lib/cosmos/tools/replay/replay_server.rb +1 -1
  294. data/lib/cosmos/tools/script_runner/script_runner_config.rb +1 -1
  295. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +31 -21
  296. data/lib/cosmos/tools/table_manager/table_config.rb +9 -3
  297. data/lib/cosmos/tools/table_manager/table_manager.rb +27 -7
  298. data/lib/cosmos/tools/test_runner/results_writer.rb +6 -6
  299. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -6
  300. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +4 -5
  301. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -1
  302. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
  303. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +23 -6
  304. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +44 -3
  305. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +20 -7
  306. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1 -1
  307. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +11 -4
  308. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +2 -2
  309. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
  310. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +16 -0
  311. data/lib/cosmos/tools/tlm_viewer/screen.rb +36 -32
  312. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +59 -50
  313. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +2 -2
  314. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  315. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +1 -0
  316. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +22 -4
  317. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +9 -0
  318. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +55 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +3 -2
  320. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +3 -2
  321. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +12 -12
  322. data/lib/cosmos/top_level.rb +34 -24
  323. data/lib/cosmos/utilities/crc.rb +108 -6
  324. data/lib/cosmos/utilities/csv.rb +68 -14
  325. data/lib/cosmos/utilities/logger.rb +2 -2
  326. data/lib/cosmos/utilities/low_fragmentation_array.rb +9 -1
  327. data/lib/cosmos/version.rb +6 -6
  328. data/lib/cosmos/win32/win32_main.rb +50 -46
  329. data/run_gui_tests.bat +3 -1
  330. data/spec/conversions/unix_time_formatted_conversion_spec.rb +2 -2
  331. data/spec/conversions/unix_time_seconds_conversion_spec.rb +2 -2
  332. data/spec/core_ext/file_spec.rb +1 -1
  333. data/spec/core_ext/objectspace_spec.rb +12 -9
  334. data/spec/core_ext/string_spec.rb +6 -0
  335. data/spec/core_ext/time_spec.rb +10 -0
  336. data/spec/gui/line_graph/line_clip_spec.rb +226 -224
  337. data/spec/gui/qt_spec.rb +81 -79
  338. data/spec/install/config/system/system.txt +0 -6
  339. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +5 -5
  340. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +8 -8
  341. data/spec/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  342. data/{install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt → spec/install/config/targets/SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  343. data/spec/install/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  344. data/spec/install/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  345. data/spec/install/config/targets/SYSTEM/screens/status.txt +12 -0
  346. data/spec/install/config/targets/SYSTEM/target.txt +12 -0
  347. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +9 -13
  348. data/spec/interfaces/interface_spec.rb +402 -18
  349. data/spec/interfaces/linc_interface_spec.rb +37 -39
  350. data/spec/interfaces/protocols/burst_protocol_spec.rb +300 -0
  351. data/spec/interfaces/protocols/crc_protocol_spec.rb +709 -0
  352. data/spec/interfaces/protocols/fixed_protocol_spec.rb +119 -0
  353. data/spec/interfaces/protocols/length_protocol_spec.rb +499 -0
  354. data/spec/interfaces/protocols/override_protocol_spec.rb +158 -0
  355. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +149 -0
  356. data/spec/interfaces/protocols/template_protocol_spec.rb +218 -0
  357. data/spec/interfaces/protocols/terminated_protocol_spec.rb +174 -0
  358. data/spec/interfaces/serial_interface_spec.rb +35 -34
  359. data/spec/interfaces/simulated_target_interface_spec.rb +13 -13
  360. data/spec/interfaces/tcpip_client_interface_spec.rb +21 -16
  361. data/spec/interfaces/tcpip_server_interface_spec.rb +66 -69
  362. data/spec/interfaces/udp_interface_spec.rb +120 -55
  363. data/spec/io/serial_driver_spec.rb +41 -39
  364. data/spec/io/udp_sockets_spec.rb +13 -8
  365. data/spec/io/win32_serial_driver_spec.rb +62 -59
  366. data/spec/packet_logs/packet_log_reader_spec.rb +68 -47
  367. data/spec/packet_logs/packet_log_writer_spec.rb +7 -5
  368. data/spec/packets/commands_spec.rb +5 -5
  369. data/spec/packets/packet_spec.rb +2 -14
  370. data/spec/script/extract_spec.rb +21 -7
  371. data/spec/script/scripting_spec.rb +261 -6
  372. data/spec/script/telemetry_spec.rb +17 -9
  373. data/spec/spec_helper.rb +26 -10
  374. data/spec/streams/serial_stream_spec.rb +87 -82
  375. data/spec/streams/tcpip_client_stream_spec.rb +12 -4
  376. data/spec/streams/tcpip_socket_stream_spec.rb +5 -0
  377. data/spec/system/system_spec.rb +66 -50
  378. data/spec/system/target_spec.rb +33 -11
  379. data/spec/tools/cmd_tlm_server/api_spec.rb +5 -5
  380. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +75 -15
  381. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +125 -5
  382. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +244 -232
  383. data/spec/tools/cmd_tlm_server/commanding_spec.rb +18 -18
  384. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +124 -29
  385. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +2 -2
  386. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +145 -0
  387. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +50 -10
  388. data/spec/tools/table_manager/tablemanager_core_spec.rb +0 -1
  389. data/spec/top_level/top_level_spec.rb +39 -11
  390. data/spec/utilities/csv_spec.rb +62 -20
  391. data/tasks/gemfile_stats.rake +6 -3
  392. data/test/performance/config/system/system_packets.txt +0 -1
  393. data/test/performance/config/system/system_threads.txt +0 -1
  394. metadata +177 -92
  395. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  396. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  397. data/autohotkey/config/targets/COSMOS/target.txt +0 -5
  398. data/autohotkey/userpath.txt +0 -1
  399. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  400. data/demo/config/targets/COSMOS/screens/limits_change.txt +0 -20
  401. data/demo/config/targets/COSMOS/screens/version.txt +0 -19
  402. data/demo/config/targets/COSMOS/target.txt +0 -11
  403. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +0 -10
  404. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +0 -13
  405. data/demo/userpath.txt +0 -1
  406. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  407. data/install/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  408. data/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  409. data/install/config/targets/COSMOS/screens/version.txt +0 -19
  410. data/install/config/targets/COSMOS/target.txt +0 -9
  411. data/install/config/targets/SYSTEM/README.txt +0 -1
  412. data/install/userpath.txt +0 -1
  413. data/lib/cosmos/io/tcpip_server.rb +0 -571
  414. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +0 -107
  415. data/lib/cosmos/streams/burst_stream_protocol.rb +0 -25
  416. data/lib/cosmos/streams/preidentified_stream_protocol.rb +0 -118
  417. data/lib/cosmos/streams/stream_protocol.rb +0 -373
  418. data/lib/cosmos/streams/template_stream_protocol.rb +0 -140
  419. data/lib/cosmos/streams/terminated_stream_protocol.rb +0 -85
  420. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +0 -41
  421. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  422. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  423. data/spec/install/config/targets/COSMOS/screens/version.txt +0 -19
  424. data/spec/install/config/targets/COSMOS/target.txt +0 -5
  425. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +0 -4
  426. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +0 -4
  427. data/spec/install/userpath.txt +0 -1
  428. data/spec/interfaces/stream_interface_spec.rb +0 -157
  429. data/spec/io/tcpip_server_spec.rb +0 -338
  430. data/spec/packet_logs/meta_packet_log_writer_spec.rb +0 -170
  431. data/spec/streams/burst_stream_protocol_spec.rb +0 -32
  432. data/spec/streams/fixed_stream_protocol_spec.rb +0 -113
  433. data/spec/streams/length_stream_protocol_spec.rb +0 -300
  434. data/spec/streams/preidentified_stream_protocol_spec.rb +0 -121
  435. data/spec/streams/stream_protocol_spec.rb +0 -346
  436. data/spec/streams/template_stream_protocol_spec.rb +0 -156
  437. data/spec/streams/terminated_stream_protocol_spec.rb +0 -127
  438. data/test/performance/userpath.txt +0 -1
@@ -66,13 +66,53 @@ module Cosmos
66
66
  # Set the raw value of a telemetry point to a given value. Note this will
67
67
  # be over written in a live system by incoming new telemetry.
68
68
  # Usage:
69
- # set_tlm(target_name, packet_name, item_name, value)
69
+ # set_tlm_raw(target_name, packet_name, item_name, value)
70
70
  # or
71
- # set_tlm("target_name packet_name item_name = value")
71
+ # set_tlm_raw("target_name packet_name item_name = value")
72
72
  def set_tlm_raw(*args)
73
73
  return $cmd_tlm_server.set_tlm_raw(*args)
74
74
  end
75
75
 
76
+ # Injects a packet into the system as if it was received from an interface
77
+ #
78
+ # @param target_name[String] Target name of the packet
79
+ # @param packet_name[String] Packet name of the packet
80
+ # @param item_hash[Hash] Hash of item_name and value for each item you want to change from the current value table
81
+ # @param value_type[Symbol/String] Type of the values in the item_hash (RAW or CONVERTED)
82
+ # @param send_routers[Boolean] Whether or not to send to routers for the target's interface
83
+ # @param send_packet_log_writers[Boolean] Whether or not to send to the packet log writers for the target's interface
84
+ # @param create_new_logs[Boolean] Whether or not to create new log files before writing this packet to logs
85
+ def inject_tlm(target_name, packet_name, item_hash = nil, value_type = :CONVERTED, send_routers = true, send_packet_log_writers = true, create_new_logs = false)
86
+ return $cmd_tlm_server.inject_tlm(target_name, packet_name, item_hash, value_type, send_routers, send_packet_log_writers, create_new_logs)
87
+ end
88
+
89
+ # Permanently set the converted value of a telemetry point to a given value
90
+ # Usage:
91
+ # override_tlm(target_name, packet_name, item_name, value)
92
+ # or
93
+ # override_tlm("target_name packet_name item_name = value")
94
+ def override_tlm(*args)
95
+ return $cmd_tlm_server.override_tlm(*args)
96
+ end
97
+
98
+ # Permanently set the raw value of a telemetry point to a given value
99
+ # Usage:
100
+ # override_tlm_raw(target_name, packet_name, item_name, value)
101
+ # or
102
+ # override_tlm_raw("target_name packet_name item_name = value")
103
+ def override_tlm_raw(*args)
104
+ return $cmd_tlm_server.override_tlm_raw(*args)
105
+ end
106
+
107
+ # Clear an override of a telemetry point
108
+ # Usage:
109
+ # normalize_tlm(target_name, packet_name, item_name)
110
+ # or
111
+ # normalize_tlm("target_name packet_name item_name")
112
+ def normalize_tlm(*args)
113
+ return $cmd_tlm_server.normalize_tlm(*args)
114
+ end
115
+
76
116
  # Gets all the values from the given packet returned in a two dimensional
77
117
  # array containing the item_name, value, and limits state.
78
118
  # Usage:
@@ -125,7 +165,7 @@ module Cosmos
125
165
  # Returns the buffer from the telemetry packet.
126
166
  def get_tlm_buffer(target_name, packet_name)
127
167
  return $cmd_tlm_server.get_tlm_buffer(target_name, packet_name)
128
- end
168
+ end
129
169
 
130
170
  # Subscribe to one or more telemetry packets. The queue ID is returned for
131
171
  # use in get_packet_data and unsubscribe_packet_data.
@@ -149,31 +189,12 @@ module Cosmos
149
189
  def get_packet_data(id, non_block = false)
150
190
  results = $cmd_tlm_server.get_packet_data(id, non_block)
151
191
  if Array === results and results[3] and results[4]
152
- results[3] = Time.at(results[3], results[4])
192
+ results[3] = Time.at(results[3], results[4]).sys
153
193
  results.delete_at(4)
154
194
  end
155
195
  results
156
196
  end
157
197
 
158
- # Get a packet which was previously subscribed to by
159
- # subscribe_packet_data. This method can block waiting for new packets or
160
- # not based on the second parameter. It returns a single Cosmos::Packet instance
161
- # and will return nil when no more packets are buffered (assuming non_block
162
- # is false).
163
- # Usage:
164
- # get_packet(id, <true or false to block>)
165
- def get_packet(id, non_block = false)
166
- packet = nil
167
- buffer, target_name, packet_name, received_time, received_count = get_packet_data(id, non_block)
168
- if buffer
169
- packet = System.telemetry.packet(target_name, packet_name).clone
170
- packet.buffer = buffer
171
- packet.received_time = received_time
172
- packet.received_count = received_count
173
- end
174
- packet
175
- end
176
-
177
198
  end
178
199
  end
179
200
 
@@ -13,70 +13,6 @@ module Cosmos
13
13
  module Script
14
14
  private
15
15
 
16
- #######################################
17
- # Methods accessing tlm_viewer
18
- #######################################
19
-
20
- def display(display_name, x_pos = nil, y_pos = nil)
21
- run_tlm_viewer("display", display_name) do |tlm_viewer|
22
- tlm_viewer.display(display_name, x_pos, y_pos)
23
- end
24
- end
25
-
26
- def clear(display_name)
27
- run_tlm_viewer("clear", display_name) do |tlm_viewer|
28
- tlm_viewer.clear(display_name)
29
- end
30
- end
31
-
32
- def clear_all(target = nil)
33
- run_tlm_viewer("clear_all") do |tlm_viewer|
34
- tlm_viewer.clear_all(target)
35
- end
36
- end
37
-
38
- def run_tlm_viewer(action, display_name = '')
39
- tlm_viewer = JsonDRbObject.new "localhost", System.ports['TLMVIEWER_API']
40
- begin
41
- yield tlm_viewer
42
- tlm_viewer.disconnect
43
- rescue DRb::DRbConnError
44
- # No Listening Tlm Viewer - So Start One
45
- start_tlm_viewer
46
- max_retries = 60
47
- retry_count = 0
48
- begin
49
- yield tlm_viewer
50
- tlm_viewer.disconnect
51
- rescue DRb::DRbConnError
52
- retry_count += 1
53
- if retry_count < max_retries
54
- canceled = cosmos_script_sleep(1)
55
- retry unless canceled
56
- end
57
- raise "Unable to Successfully Start Listening Telemetry Viewer: Could not #{action} #{display_name}"
58
- rescue Errno::ENOENT
59
- raise "Display Screen File: #{display_name}.txt does not exist"
60
- end
61
- rescue Errno::ENOENT
62
- raise "Display Screen File: #{display_name}.txt does not exist"
63
- end
64
- end
65
-
66
- def start_tlm_viewer
67
- system_file = File.basename(System.initial_filename)
68
- mac_app = File.join(Cosmos::USERPATH, 'tools', 'mac', 'TlmViewer.app')
69
-
70
- if Kernel.is_mac? && File.exist?(mac_app)
71
- Cosmos.run_process("open '#{mac_app}' --args --system #{system_file}")
72
- else
73
- cmd = 'ruby'
74
- cmd << 'w' if Kernel.is_windows? # Windows uses rubyw to avoid creating a DOS shell
75
- Cosmos.run_process("#{cmd} '#{File.join(Cosmos::USERPATH, 'tools', 'TlmViewer')}' --system #{system_file}")
76
- end
77
- cosmos_script_sleep(1)
78
- end
79
-
80
16
  #######################################
81
17
  # Methods accessing script runner
82
18
  #######################################
@@ -86,11 +22,15 @@ module Cosmos
86
22
  end
87
23
 
88
24
  def set_line_delay(delay)
89
- _ensure_script_runner_frame { ScriptRunnerFrame.line_delay = delay if delay >= 0.0 }
25
+ if defined? ScriptRunnerFrame
26
+ ScriptRunnerFrame.line_delay = delay if delay >= 0.0
27
+ end
90
28
  end
91
29
 
92
30
  def get_line_delay
93
- _ensure_script_runner_frame { ScriptRunnerFrame.line_delay }
31
+ if defined? ScriptRunnerFrame
32
+ ScriptRunnerFrame.line_delay
33
+ end
94
34
  end
95
35
 
96
36
  def get_scriptrunner_message_log_filename
@@ -135,15 +75,21 @@ module Cosmos
135
75
  end
136
76
 
137
77
  def step_mode
138
- _ensure_script_runner_frame { ScriptRunnerFrame.step_mode = true }
78
+ if defined? ScriptRunnerFrame
79
+ ScriptRunnerFrame.step_mode = true
80
+ end
139
81
  end
140
82
 
141
83
  def run_mode
142
- _ensure_script_runner_frame { ScriptRunnerFrame.step_mode = false }
84
+ if defined? ScriptRunnerFrame
85
+ ScriptRunnerFrame.step_mode = false
86
+ end
143
87
  end
144
88
 
145
89
  def show_backtrace(value = true)
146
- _ensure_script_runner_frame { ScriptRunnerFrame.show_backtrace = value }
90
+ if defined? ScriptRunnerFrame
91
+ ScriptRunnerFrame.show_backtrace = value
92
+ end
147
93
  end
148
94
 
149
95
  end # module Script
@@ -9,16 +9,13 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'thread' # For Mutex
12
- require 'timeout' # For Timeout::Error
13
12
  require 'cosmos/streams/stream'
14
13
  require 'cosmos/config/config_parser'
15
14
  require 'cosmos/io/serial_driver'
16
15
 
17
16
  module Cosmos
18
-
19
17
  # Stream that reads and writes to serial ports by using {SerialDriver}.
20
18
  class SerialStream < Stream
21
-
22
19
  # @param write_port_name [String] The name of the serial port to write.
23
20
  # Pass nil if the stream is to be read only. On Windows the port name
24
21
  # is typically 'COMX' where X can be any port number. On UNIX the port
@@ -38,13 +35,15 @@ module Cosmos
38
35
  # complete. Pass nil to create no timeout. The {SerialDriver} will
39
36
  # continously try to read data until it has received data or an error
40
37
  # occurs.
38
+ # @param flow_control [Symbol] Currently supported :NONE and :RTSCTS
41
39
  def initialize(write_port_name,
42
40
  read_port_name,
43
41
  baud_rate,
44
42
  parity,
45
43
  stop_bits,
46
44
  write_timeout,
47
- read_timeout)
45
+ read_timeout,
46
+ flow_control = :NONE)
48
47
  super()
49
48
 
50
49
  # The SerialDriver class will validate the parameters
@@ -57,6 +56,7 @@ module Cosmos
57
56
  @write_timeout = @write_timeout.to_f if @write_timeout
58
57
  @read_timeout = ConfigParser.handle_nil(read_timeout)
59
58
  @read_timeout = @read_timeout.to_f if @read_timeout
59
+ @flow_control = flow_control.to_s.intern
60
60
 
61
61
  if @write_port_name
62
62
  @write_serial_port = SerialDriver.new(@write_port_name,
@@ -64,7 +64,8 @@ module Cosmos
64
64
  @parity,
65
65
  @stop_bits,
66
66
  @write_timeout,
67
- @read_timeout)
67
+ @read_timeout,
68
+ @flow_control)
68
69
  else
69
70
  @write_serial_port = nil
70
71
  end
@@ -77,7 +78,8 @@ module Cosmos
77
78
  @parity,
78
79
  @stop_bits,
79
80
  @write_timeout,
80
- @read_timeout)
81
+ @read_timeout,
82
+ @flow_control)
81
83
  end
82
84
  else
83
85
  @read_serial_port = nil
@@ -97,21 +99,15 @@ module Cosmos
97
99
  # @return [String] Returns a binary string of data from the serial port
98
100
  def read
99
101
  raise "Attempt to read from write only stream" unless @read_serial_port
100
- # No read mutex is needed because there is only one stream procesor
101
- # reading
102
- data = @read_serial_port.read
103
- @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
104
- data
102
+ # No read mutex is needed because reads happen serially
103
+ @read_serial_port.read
105
104
  end
106
105
 
107
106
  # @return [String] Returns a binary string of data from the serial port without blocking
108
107
  def read_nonblock
109
108
  raise "Attempt to read from write only stream" unless @read_serial_port
110
- # No read mutex is needed because there is only one stream procesor
111
- # reading
112
- data = @read_serial_port.read_nonblock
113
- @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
114
- data
109
+ # No read mutex is needed because reads happen serially
110
+ @read_serial_port.read_nonblock
115
111
  end
116
112
 
117
113
  # @param data [String] A binary string of data to write to the serial port
@@ -119,7 +115,6 @@ module Cosmos
119
115
  raise "Attempt to write to read only stream" unless @write_serial_port
120
116
  @write_mutex.synchronize do
121
117
  @write_serial_port.write(data)
122
- @raw_logger_pair.write_logger.write(data) if @raw_logger_pair
123
118
  end
124
119
  end
125
120
 
@@ -151,7 +146,5 @@ module Cosmos
151
146
  @connected = false
152
147
  end
153
148
  end
154
-
155
149
  end # class SerialStream
156
-
157
150
  end # module Cosmos
@@ -8,20 +8,13 @@
8
8
  # as published by the Free Software Foundation; version 3 with
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
- require 'timeout' # For Timeout::Error
12
-
13
11
  module Cosmos
14
-
15
12
  # Class that implments the following methods: read, write(data),
16
13
  # connect, connected? and disconnect. Streams are simply data sources which
17
- # {StreamProtocol} classes read and write to. This separation of concerns
14
+ # {Protocol} classes read and write to. This separation of concerns
18
15
  # allows Streams to simply focus on getting and sending raw data while the
19
- # higher level processing occurs in {StreamProtocol}.
16
+ # higher level processing occurs in {Protocol}.
20
17
  class Stream
21
-
22
- # @return [RawLoggerPair] Raw logger pair associated with this stream
23
- attr_accessor :raw_logger_pair
24
-
25
18
  # Expected to return any amount of data on success, or a blank string on
26
19
  # closed/EOF, and may raise Timeout::Error, or other errors
27
20
  def read
@@ -57,7 +50,5 @@ module Cosmos
57
50
  def disconnect
58
51
  raise "disconnect not defined by Stream"
59
52
  end
60
-
61
53
  end # class Stream
62
-
63
54
  end # module Cosmos
@@ -49,8 +49,7 @@ module Cosmos
49
49
  def read
50
50
  raise "Attempt to read from write only stream" unless @read_socket
51
51
 
52
- # No read mutex is needed because there is only one stream procesor
53
- # reading
52
+ # No read mutex is needed because reads happen serially
54
53
  if FAST_READ
55
54
  begin
56
55
  while true # Loop until we get some data
@@ -77,7 +76,6 @@ module Cosmos
77
76
  data = ''
78
77
  end
79
78
  end
80
- @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
81
79
  break
82
80
  end
83
81
  rescue Errno::ECONNRESET, Errno::ECONNABORTED, IOError, Errno::ENOTSOCK
@@ -86,7 +84,6 @@ module Cosmos
86
84
  else
87
85
  begin
88
86
  data = @read_socket.read_nonblock(65535)
89
- @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
90
87
  rescue IO::WaitReadable
91
88
  # Wait for the socket to be ready for reading or for the timeout
92
89
  begin
@@ -118,20 +115,14 @@ module Cosmos
118
115
 
119
116
  # @return [String] Returns a binary string of data from the socket. Always returns immediately
120
117
  def read_nonblock
121
- # No read mutex is needed because there is only one stream procesor
122
- # reading
118
+ # No read mutex is needed because reads happen serially
123
119
  begin
124
120
  if FAST_READ
125
121
  data = @read_socket.read_nonblock(65535, exception: false)
126
122
  raise EOFError, 'end of file reached' unless data
127
- if data == :wait_readable
128
- data = ''
129
- else
130
- @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
131
- end
123
+ data = '' if data == :wait_readable
132
124
  else
133
125
  data = @read_socket.read_nonblock(65535)
134
- @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
135
126
  end
136
127
  rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNRESET, Errno::ECONNABORTED, IOError
137
128
  data = ''
@@ -153,7 +144,6 @@ module Cosmos
153
144
  loop do
154
145
  begin
155
146
  bytes_sent = @write_socket.write_nonblock(data_to_send)
156
- @raw_logger_pair.write_logger.write(data_to_send[0..(bytes_sent - 1)]) if @raw_logger_pair and bytes_sent > 0
157
147
  rescue Errno::EAGAIN, Errno::EWOULDBLOCK
158
148
  # Wait for the socket to be ready for writing or for the timeout
159
149
  result = IO.fast_select(nil, [@write_socket], nil, @write_timeout)
@@ -20,7 +20,6 @@ require 'drb/acl'
20
20
  require 'bundler'
21
21
 
22
22
  module Cosmos
23
-
24
23
  # System is the primary entry point into the COSMOS framework. It captures
25
24
  # system wide configuration items such as the available ports and paths to
26
25
  # various files used by the system. The #commands, #telemetry, and #limits
@@ -32,14 +31,20 @@ module Cosmos
32
31
  class System
33
32
  # @return [Hash<String,Fixnum>] Hash of all the known ports and their values
34
33
  instance_attr_reader :ports
34
+ # @return [Hash<String,String>] Hash of host names or ip addresses for tools to listen on
35
+ instance_attr_reader :listen_hosts
36
+ # @return [Hash<String,String>] Hash of host names or ip addresses for tools to connect to
37
+ instance_attr_reader :connect_hosts
35
38
  # @return [Hash<String,String>] Hash of all the known paths and their values
36
39
  instance_attr_reader :paths
37
- # @return [String] Arbitrary string containing the version
38
- instance_attr_reader :cmd_tlm_version
39
40
  # @return [PacketLogWriter] Class used to create log files
40
41
  instance_attr_reader :default_packet_log_writer
42
+ # @return [Array<String>] Parameters to be used with the default log writer
43
+ instance_attr_reader :default_packet_log_writer_params
41
44
  # @return [PacketLogReader] Class used to read log files
42
45
  instance_attr_reader :default_packet_log_reader
46
+ # @return [Array<String>] Parameters to be used with the default log reader
47
+ instance_attr_reader :default_packet_log_reader_params
43
48
  # @return [Boolean] Whether to use sound for alerts
44
49
  instance_attr_reader :sound
45
50
  # @return [Boolean] Whether to use DNS to lookup IP addresses or not
@@ -58,11 +63,19 @@ module Cosmos
58
63
  instance_attr_reader :staleness_seconds
59
64
  # @return [Symbol] The current limits set
60
65
  instance_attr_reader :limits_set
66
+ # @return [Boolean] Whether to use UTC or local times
67
+ instance_attr_reader :use_utc
68
+ # @return [Array<String>] List of files that are to be included in the MD5
69
+ # calculation in addition to the cmd/tlm definition files that are
70
+ # automatically included
71
+ instance_attr_reader :additional_md5_files
61
72
 
62
73
  # Known COSMOS ports
63
74
  KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED', 'CTS_CMD_ROUTER']
75
+ # Known COSMOS hosts
76
+ KNOWN_HOSTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED', 'CTS_CMD_ROUTER']
64
77
  # Known COSMOS paths
65
- KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES']
78
+ KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES', 'SEQUENCES']
66
79
 
67
80
  @@instance = nil
68
81
  @@instance_mutex = Mutex.new
@@ -81,14 +94,17 @@ module Cosmos
81
94
  @commands = nil
82
95
  @telemetry = nil
83
96
  @limits = nil
84
- @cmd_tlm_version = nil
85
97
  @default_packet_log_writer = PacketLogWriter
98
+ @default_packet_log_writer_params = []
86
99
  @default_packet_log_reader = PacketLogReader
100
+ @default_packet_log_reader_params = []
87
101
  @sound = false
88
102
  @use_dns = false
89
103
  @acl = nil
90
104
  @staleness_seconds = 30
91
105
  @limits_set = :DEFAULT
106
+ @use_utc = false
107
+ @additional_md5_files = []
92
108
 
93
109
  @ports = {}
94
110
  @ports['CTS_API'] = 7777
@@ -96,6 +112,19 @@ module Cosmos
96
112
  @ports['CTS_PREIDENTIFIED'] = 7779
97
113
  @ports['CTS_CMD_ROUTER'] = 7780
98
114
 
115
+ @listen_hosts = {}
116
+ @listen_hosts['CTS_API'] = '127.0.0.1'
117
+ @listen_hosts['TLMVIEWER_API'] = '127.0.0.1'
118
+ # Localhost would be more secure but historically these are open to allow for chaining servers by default
119
+ @listen_hosts['CTS_PREIDENTIFIED'] = '0.0.0.0'
120
+ @listen_hosts['CTS_CMD_ROUTER'] = '0.0.0.0'
121
+
122
+ @connect_hosts = {}
123
+ @connect_hosts['CTS_API'] = '127.0.0.1'
124
+ @connect_hosts['TLMVIEWER_API'] = '127.0.0.1'
125
+ @connect_hosts['CTS_PREIDENTIFIED'] = '127.0.0.1'
126
+ @connect_hosts['CTS_CMD_ROUTER'] = '127.0.0.1'
127
+
99
128
  @paths = {}
100
129
  @paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
101
130
  @paths['TMP'] = File.join(USERPATH, 'outputs', 'tmp')
@@ -103,6 +132,7 @@ module Cosmos
103
132
  @paths['TABLES'] = File.join(USERPATH, 'outputs', 'tables')
104
133
  @paths['HANDBOOKS'] = File.join(USERPATH, 'outputs', 'handbooks')
105
134
  @paths['PROCEDURES'] = [File.join(USERPATH, 'procedures')]
135
+ @paths['SEQUENCES'] = File.join(USERPATH, 'outputs', 'sequences')
106
136
 
107
137
  unless filename
108
138
  system_arg = false
@@ -120,6 +150,7 @@ module Cosmos
120
150
 
121
151
  @initial_filename = filename
122
152
  @initial_config = nil
153
+ @meta_init_filename = nil
123
154
  @@instance = self
124
155
  end
125
156
 
@@ -186,7 +217,7 @@ module Cosmos
186
217
  if @config.limits_sets.include?(new_limits_set)
187
218
  @limits_set = new_limits_set
188
219
  Logger.info("Limits Set Changed to: #{@limits_set}")
189
- CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer and CmdTlmServer.instance
220
+ CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer && CmdTlmServer.instance
190
221
  else
191
222
  raise "Unknown limits set requested: #{new_limits_set}"
192
223
  end
@@ -218,12 +249,14 @@ module Cosmos
218
249
  @targets = {}
219
250
  # Set config to nil so things will lazy load later
220
251
  @config = nil
252
+ @use_utc = false
221
253
  acl_list = []
222
254
  all_allowed = false
223
255
  first_procedures_path = true
256
+ @additional_md5_files = []
224
257
 
225
258
  Cosmos.set_working_dir do
226
- parser = ConfigParser.new
259
+ parser = ConfigParser.new("http://cosmosrb.com/docs/system")
227
260
 
228
261
  # First pass - Everything except targets
229
262
  parser.parse_file(filename) do |keyword, parameters|
@@ -238,6 +271,19 @@ module Cosmos
238
271
  @ports[port_name] = Integer(parameters[1])
239
272
  Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
240
273
 
274
+ when 'LISTEN_HOST', 'CONNECT_HOST'
275
+ usage = "#{keyword} <HOST NAME> <HOST VALUE>"
276
+ parser.verify_num_parameters(2, 2, usage)
277
+ host_name = parameters[0].to_s.upcase
278
+ host = parameters[1]
279
+ host = '127.0.0.1' if host.to_s.upcase == 'LOCALHOST'
280
+ if keyword == 'LISTEN_HOST'
281
+ @listen_hosts[host_name] = host
282
+ else
283
+ @connect_hosts[host_name] = host
284
+ end
285
+ Logger.warn("Unknown host name given: #{host_name}") unless KNOWN_HOSTS.include?(host_name)
286
+
241
287
  when 'PATH'
242
288
  usage = "#{keyword} <PATH NAME> <PATH>"
243
289
  parser.verify_num_parameters(2, 2, usage)
@@ -264,14 +310,16 @@ module Cosmos
264
310
  Logger.warn("Unknown path name given: #{path_name}") unless KNOWN_PATHS.include?(path_name)
265
311
 
266
312
  when 'DEFAULT_PACKET_LOG_WRITER'
267
- usage = "#{keyword} <FILENAME>"
268
- parser.verify_num_parameters(1, 1, usage)
313
+ usage = "#{keyword} <FILENAME> <Specific Parameters>"
314
+ parser.verify_num_parameters(1, nil, usage)
269
315
  @default_packet_log_writer = Cosmos.require_class(parameters[0])
316
+ @default_packet_log_writer_params = parameters[1..-1] if parameters.size > 1
270
317
 
271
318
  when 'DEFAULT_PACKET_LOG_READER'
272
- usage = "#{keyword} <FILENAME>"
273
- parser.verify_num_parameters(1, 1, usage)
319
+ usage = "#{keyword} <FILENAME> <Specific Parameters>"
320
+ parser.verify_num_parameters(1, nil, usage)
274
321
  @default_packet_log_reader = Cosmos.require_class(parameters[0])
322
+ @default_packet_log_reader_params = parameters[1..-1] if parameters.size > 1
275
323
 
276
324
  when 'ENABLE_SOUND'
277
325
  usage = "#{keyword}"
@@ -299,7 +347,7 @@ module Cosmos
299
347
 
300
348
  unless all_allowed
301
349
  first_char = addr[0..0]
302
- if !((first_char =~ /[1234567890]/) or (first_char == '*') or (addr.upcase == 'ALL'))
350
+ if !((first_char =~ /[1234567890]/) || (first_char == '*') || (addr.upcase == 'ALL'))
303
351
  # Try to lookup IP Address
304
352
  info = Socket.gethostbyname(addr)
305
353
  addr = "#{info[3].getbyte(0)}.#{info[3].getbyte(1)}.#{info[3].getbyte(2)}.#{info[3].getbyte(3)}"
@@ -327,10 +375,23 @@ module Cosmos
327
375
  parser.verify_num_parameters(1, 1, "#{keyword} <Value in Seconds>")
328
376
  @staleness_seconds = Integer(parameters[0])
329
377
 
330
- when 'CMD_TLM_VERSION'
331
- usage = "#{keyword} <VERSION>"
332
- parser.verify_num_parameters(1, 1, usage)
333
- @cmd_tlm_version = parameters[0]
378
+ when 'META_INIT'
379
+ parser.verify_num_parameters(1, 1, "#{keyword} <Filename>")
380
+ @meta_init_filename = ConfigParser.handle_nil(parameters[0])
381
+
382
+ when 'TIME_ZONE_UTC'
383
+ parser.verify_num_parameters(0, 0, "#{keyword}")
384
+ @use_utc = true
385
+
386
+ when 'ADD_MD5_FILE'
387
+ parser.verify_num_parameters(1, 1, "#{keyword} <Filename>")
388
+ if File.file?(parameters[0])
389
+ @additional_md5_files << File.expand_path(parameters[0])
390
+ elsif File.file?(File.join(Cosmos::USERPATH, parameters[0]))
391
+ @additional_md5_files << File.expand_path(File.join(Cosmos::USERPATH, parameters[0]))
392
+ else
393
+ raise "Missing expected file: #{parameters[0]}"
394
+ end
334
395
 
335
396
  else
336
397
  # blank lines will have a nil keyword and should not raise an exception
@@ -340,6 +401,13 @@ module Cosmos
340
401
 
341
402
  @acl = ACL.new(acl_list, ACL::ALLOW_DENY) unless acl_list.empty?
342
403
 
404
+ # Explicitly set up time to use UTC or local
405
+ if @use_utc
406
+ Time.use_utc()
407
+ else
408
+ Time.use_local()
409
+ end
410
+
343
411
  # Second pass - Process targets
344
412
  process_targets(parser, filename, configuration_directory)
345
413
 
@@ -362,7 +430,6 @@ module Cosmos
362
430
  unless File.exist? path
363
431
  raise parser.error("#{path} must exist", usage)
364
432
  end
365
- system_found = false
366
433
  dirs = []
367
434
  Dir.foreach(File.join(USERPATH, 'config', 'targets')) { |dir_filename| dirs << dir_filename }
368
435
  dirs.sort!
@@ -373,10 +440,7 @@ module Cosmos
373
440
  # current directory then it must have been already processed by
374
441
  # DECLARE_TARGET so we skip it.
375
442
  next if @targets.select {|name, target| target.original_name == dir_filename }.length > 0
376
- if dir_filename == 'SYSTEM'
377
- system_found = true
378
- next
379
- end
443
+ next if dir_filename == 'SYSTEM'
380
444
  target = Target.new(dir_filename)
381
445
  @targets[target.name] = target
382
446
  else
@@ -387,10 +451,9 @@ module Cosmos
387
451
 
388
452
  auto_detect_gem_based_targets()
389
453
 
390
- if system_found
391
- target = Target.new('SYSTEM')
392
- @targets[target.name] = target
393
- end
454
+ # Make sure SYSTEM target is always present and added last
455
+ target = Target.new('SYSTEM')
456
+ @targets[target.name] = target
394
457
 
395
458
  when 'DECLARE_TARGET'
396
459
  usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
@@ -434,7 +497,7 @@ module Cosmos
434
497
  # configuration. Pass nil to load the default configuration.
435
498
  # @return [String, Exception/nil] The actual configuration loaded
436
499
  def load_configuration(name = nil)
437
- if name and @config
500
+ if name && @config
438
501
  # Make sure they're requesting something other than the current
439
502
  # configuration.
440
503
  if name != @config.name
@@ -481,7 +544,7 @@ module Cosmos
481
544
  def auto_detect_gem_based_targets
482
545
  Bundler.load.specs.each do |spec|
483
546
  spec_name_split = spec.name.split('-')
484
- if spec_name_split.length > 1 and spec_name_split[0] == 'cosmos'
547
+ if spec_name_split.length > 1 && (spec_name_split[0] == 'cosmos')
485
548
  # Filter to just targets and not tools and other extensions
486
549
  if File.exist?(File.join(spec.gem_dir, 'cmd_tlm'))
487
550
  target_name = spec_name_split[1..-1].join('-').to_s.upcase
@@ -514,7 +577,7 @@ module Cosmos
514
577
  Cosmos.set_working_dir do
515
578
  Dir.foreach(@paths['SAVED_CONFIG']) do |filename|
516
579
  full_path = File.join(@paths['SAVED_CONFIG'], filename)
517
- if Dir.exist?(full_path) and filename[-32..-1] == name
580
+ if Dir.exist?(full_path) && (filename[-32..-1] == name)
518
581
  return full_path
519
582
  end
520
583
  end
@@ -573,7 +636,7 @@ module Cosmos
573
636
  end
574
637
  end
575
638
 
576
- md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
639
+ md5 = Cosmos.md5_files(cmd_tlm_files + @additional_md5_files, additional_data)
577
640
  md5_string = md5.hexdigest
578
641
 
579
642
  # Build filename for marshal file
@@ -612,13 +675,106 @@ module Cosmos
612
675
  else
613
676
  @config.name = md5_string
614
677
  end
678
+
615
679
  Cosmos.marshal_dump(marshal_filename, @config)
616
680
  end
681
+ setup_system_meta()
617
682
 
618
683
  @initial_config = @config unless @initial_config
619
684
  save_configuration()
620
685
  end
621
686
 
622
- end # class System
687
+ def setup_system_meta
688
+ # Ensure SYSTEM META is defined and defined correctly
689
+ begin
690
+ tlm_meta = @telemetry.packet('SYSTEM', 'META')
691
+ cmd_meta = @commands.packet('SYSTEM', 'META')
692
+ item = tlm_meta.get_item('PKTID')
693
+ raise "PKTID Incorrect" unless (item.bit_size == 8) && (item.bit_offset == 0)
694
+ item = cmd_meta.get_item('PKTID')
695
+ raise "PKTID Incorrect" unless (item.bit_size == 8) && (item.bit_offset == 0)
696
+ item = tlm_meta.get_item('CONFIG')
697
+ raise "CONFIG Incorrect" unless (item.bit_size == 256) && (item.bit_offset == 8)
698
+ item = cmd_meta.get_item('CONFIG')
699
+ raise "CONFIG Incorrect" unless (item.bit_size == 256) && (item.bit_offset == 8)
700
+ item = tlm_meta.get_item('COSMOS_VERSION')
701
+ raise "CONFIG Incorrect" unless (item.bit_size == 240) && (item.bit_offset == 264)
702
+ item = cmd_meta.get_item('COSMOS_VERSION')
703
+ raise "CONFIG Incorrect" unless (item.bit_size == 240) && (item.bit_offset == 264)
704
+ item = tlm_meta.get_item('USER_VERSION')
705
+ raise "CONFIG Incorrect" unless (item.bit_size == 240) && (item.bit_offset == 504)
706
+ item = cmd_meta.get_item('USER_VERSION')
707
+ raise "CONFIG Incorrect" unless (item.bit_size == 240) && (item.bit_offset == 504)
708
+ item = tlm_meta.get_item('RUBY_VERSION')
709
+ raise "CONFIG Incorrect" unless (item.bit_size == 240) && (item.bit_offset == 744)
710
+ item = cmd_meta.get_item('RUBY_VERSION')
711
+ raise "CONFIG Incorrect" unless (item.bit_size == 240) && (item.bit_offset == 744)
712
+ rescue
713
+ Logger.error "SYSTEM META not defined or defined incorrectly - defaulting"
714
+
715
+ cmd_meta = Packet.new('SYSTEM', 'META', :BIG_ENDIAN)
716
+ item = cmd_meta.append_item('PKTID', 8, :UINT, nil, :BIG_ENDIAN, :ERROR, nil, nil, nil, 1)
717
+ item.range = 1..1
718
+ item.default = 1
719
+ item.description = 'Packet Id'
720
+ item = cmd_meta.append_item('CONFIG', 32 * 8, :STRING)
721
+ item.default = ''
722
+ item.description = 'Configuration Name'
723
+ item = cmd_meta.append_item('COSMOS_VERSION', 30 * 8, :STRING)
724
+ item.default = ''
725
+ item.description = 'COSMOS Version'
726
+ item = cmd_meta.append_item('USER_VERSION', 30 * 8, :STRING)
727
+ item.default = ''
728
+ item.description = 'User Project Version'
729
+ item = cmd_meta.append_item('RUBY_VERSION', 30 * 8, :STRING)
730
+ item.default = ''
731
+ item.description = 'Ruby Version'
732
+ @config.commands['SYSTEM'] ||= {}
733
+ @config.commands['SYSTEM']['META'] = cmd_meta
734
+
735
+ tlm_meta = Packet.new('SYSTEM', 'META', :BIG_ENDIAN)
736
+ item = tlm_meta.append_item('PKTID', 8, :UINT, nil, :BIG_ENDIAN, :ERROR, nil, nil, nil, 1)
737
+ item.description = 'Packet Id'
738
+ item = tlm_meta.append_item('CONFIG', 32 * 8, :STRING)
739
+ item.description = 'Configuration Name'
740
+ item = tlm_meta.append_item('COSMOS_VERSION', 30 * 8, :STRING)
741
+ item.description = 'COSMOS Version'
742
+ item = tlm_meta.append_item('USER_VERSION', 30 * 8, :STRING)
743
+ item.description = 'User Project Version'
744
+ item = tlm_meta.append_item('RUBY_VERSION', 30 * 8, :STRING)
745
+ item.description = 'Ruby Version'
746
+ @config.telemetry['SYSTEM'] ||= {}
747
+ @config.telemetry['SYSTEM']['META'] = tlm_meta
748
+ end
623
749
 
624
- end # module Cosmos
750
+ # Initialize the meta packet (if given init filename)
751
+ if @meta_init_filename
752
+ parser = ConfigParser.new("http://cosmosrb.com/docs/cmdtlm")
753
+ Cosmos.set_working_dir do
754
+ parser.parse_file(@meta_init_filename) do |keyword, params|
755
+ begin
756
+ item = tlm_meta.get_item(keyword)
757
+ if (item.data_type == :STRING) || (item.data_type == :BLOCK)
758
+ value = params[0]
759
+ else
760
+ value = params[0].convert_to_value
761
+ end
762
+ tlm_meta.write(keyword, value)
763
+ rescue => err
764
+ raise parser.error(err, "ITEM_NAME VALUE")
765
+ end
766
+ end
767
+ end
768
+ end
769
+
770
+ # Setup fixed part of SYSTEM META packet
771
+ tlm_meta.write('PKTID', 1)
772
+ tlm_meta.write('CONFIG', @config.name)
773
+ tlm_meta.write('COSMOS_VERSION', "#{COSMOS_VERSION}")
774
+ tlm_meta.write('USER_VERSION', USER_VERSION) if defined? USER_VERSION
775
+ tlm_meta.write('RUBY_VERSION', "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}")
776
+
777
+ cmd_meta.buffer = tlm_meta.buffer
778
+ end
779
+ end
780
+ end