cosmos 4.2.4-java → 4.5.0-java

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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +2 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  5. data/.github/ISSUE_TEMPLATE/help---usage---general-question.md +12 -0
  6. data/.gitignore +2 -0
  7. data/.travis.yml +6 -6
  8. data/Dockerfile +69 -0
  9. data/Gemfile +1 -1
  10. data/Manifest.txt +130 -46
  11. data/README.md +9 -0
  12. data/Rakefile +57 -0
  13. data/appveyor.yml +18 -7
  14. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  15. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  16. data/autohotkey/config/targets/INST/lib/sim_inst.rb +3 -1
  17. data/autohotkey/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
  18. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  19. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  20. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  21. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  22. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  23. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  24. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  25. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  26. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  27. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  28. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +2 -4
  29. data/autohotkey/config/tools/table_manager/SubTables/OneDimensionalSubTable_def.txt +31 -0
  30. data/autohotkey/config/tools/table_manager/SubTables/TwoDimensionalSubTable_def.txt +28 -0
  31. data/autohotkey/config/tools/test_runner/test_runner.txt +1 -1
  32. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  33. data/autohotkey/config/tools/test_runner/test_runner3.txt +1 -1
  34. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  35. data/autohotkey/lib/cmd_sequence_exporter.rb +52 -0
  36. data/autohotkey/procedures/collect.rb +2 -2
  37. data/autohotkey/procedures/collect_util.rb +1 -1
  38. data/autohotkey/procedures/script_test.rb +1 -1
  39. data/autohotkey/tools/CmdSenderAHK2 +18 -0
  40. data/autohotkey/tools/cmd_sender.ahk +34 -6
  41. data/autohotkey/tools/cmd_sender2.ahk +4 -0
  42. data/autohotkey/tools/cmd_sequence.ahk +36 -22
  43. data/autohotkey/tools/cmd_sequence2.ahk +1 -1
  44. data/autohotkey/tools/config_editor.ahk +5 -5
  45. data/autohotkey/tools/launcher.ahk +1 -0
  46. data/autohotkey/tools/limits_monitor.ahk +1 -1
  47. data/autohotkey/tools/packet_viewer.ahk +7 -6
  48. data/autohotkey/tools/script_runner.ahk +16 -4
  49. data/autohotkey/tools/test_runner.ahk +8 -8
  50. data/bin/cosmos +38 -1
  51. data/bin/cstol_converter +1 -1
  52. data/bin/dart_util +0 -0
  53. data/bin/rubysloc +73 -28
  54. data/bin/xtce_converter +1 -1
  55. data/cosmos.gemspec +7 -9
  56. data/data/config/_interfaces.yaml +4 -0
  57. data/data/config/cmd_sequence.yaml +14 -0
  58. data/data/config/command_modifiers.yaml +16 -1
  59. data/data/config/housekeeping_params.yaml +14 -0
  60. data/data/config/interface_modifiers.yaml +14 -2
  61. data/data/config/item_modifiers.yaml +11 -1
  62. data/data/config/launcher.yaml +12 -2
  63. data/data/config/param_item_modifiers.yaml +7 -2
  64. data/data/config/parameter_modifiers.yaml +20 -0
  65. data/data/config/screen.yaml +2 -0
  66. data/data/config/script_runner.yaml +9 -0
  67. data/data/config/system.yaml +152 -28
  68. data/data/config/table_manager.yaml +7 -0
  69. data/data/config/target.yaml +12 -0
  70. data/data/config/telemetry_modifiers.yaml +19 -2
  71. data/data/config/test_runner.yaml +10 -9
  72. data/data/config/widgets.yaml +174 -11
  73. data/data/crc.txt +428 -415
  74. data/demo/Gemfile +1 -1
  75. data/demo/Launcher.bat +1 -9
  76. data/demo/Launcher2.bat +1 -0
  77. data/demo/LauncherMini.bat +1 -0
  78. data/demo/Rakefile +2 -0
  79. data/demo/config/dart/Gemfile +2 -7
  80. data/demo/config/data/crc.txt +243 -219
  81. data/demo/config/system/system.txt +42 -3
  82. data/demo/config/system/system2.txt +34 -5
  83. data/demo/config/system/system_alt_ports.txt +80 -0
  84. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +1 -0
  85. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +5 -4
  86. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +12 -7
  87. data/demo/config/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
  88. data/demo/config/targets/INST/cmd_tlm_server.txt +2 -0
  89. data/demo/config/targets/INST/lib/sim_inst.rb +15 -3
  90. data/demo/config/targets/INST/screens/adcs.txt +2 -2
  91. data/demo/config/targets/INST/screens/block.txt +1 -1
  92. data/demo/config/targets/INST/screens/commanding.txt +1 -1
  93. data/demo/config/targets/INST/screens/ground.txt +27 -5
  94. data/demo/config/targets/INST/screens/ground_error.gif +0 -0
  95. data/demo/config/{data/groundoff.gif → targets/INST/screens/ground_off.gif} +0 -0
  96. data/demo/config/{data/groundon.gif → targets/INST/screens/ground_on.gif} +0 -0
  97. data/demo/config/targets/INST/screens/limits.txt +69 -31
  98. data/demo/config/targets/INST/screens/other.txt +13 -3
  99. data/demo/config/targets/INST/screens/params.txt +54 -0
  100. data/demo/config/targets/INST/screens/satellite.gif +0 -0
  101. data/demo/config/targets/INST/target.txt +1 -0
  102. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server_chain.txt +18 -0
  103. data/demo/config/tools/data_viewer/data_viewer.txt +3 -0
  104. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  105. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  106. data/demo/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  107. data/demo/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  108. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  109. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  110. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  111. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  112. data/demo/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  113. data/demo/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  114. data/demo/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  115. data/demo/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  116. data/demo/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  117. data/demo/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  118. data/demo/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  119. data/demo/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  120. data/demo/config/tools/handbook_creator/default_toc.xsl +59 -59
  121. data/demo/config/tools/script_runner/script_runner.txt +1 -2
  122. data/demo/config/tools/test_runner/test_runner.txt +3 -1
  123. data/demo/lib/example_background_task.rb +1 -0
  124. data/demo/procedures/cosmos_api_test.rb +26 -22
  125. data/demo/procedures/interactive.rb +22 -0
  126. data/demo/procedures/local_screen_example.rb +51 -0
  127. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +32 -4
  128. data/ext/cosmos/ext/packet/packet.c +6 -77
  129. data/ext/mkrf_conf.rb +2 -2
  130. data/extensions/vscode/.gitignore +4 -0
  131. data/extensions/vscode/.vscode/launch.json +32 -0
  132. data/extensions/vscode/.vscode/settings.json +13 -0
  133. data/extensions/vscode/.vscode/tasks.json +79 -0
  134. data/extensions/vscode/License.txt +879 -0
  135. data/extensions/vscode/README.md +9 -0
  136. data/extensions/vscode/client/License.txt +879 -0
  137. data/extensions/vscode/client/README.md +39 -0
  138. data/extensions/vscode/client/cosmos.configuration.json +23 -0
  139. data/extensions/vscode/client/images/icon.png +0 -0
  140. data/extensions/vscode/client/package-lock.json +414 -0
  141. data/extensions/vscode/client/package.json +105 -0
  142. data/extensions/vscode/client/src/extension.ts +132 -0
  143. data/extensions/vscode/client/src/screen_preview.rb +25 -0
  144. data/extensions/vscode/client/syntaxes/cosmos.tmLanguage.json +219 -0
  145. data/extensions/vscode/client/tsconfig.json +17 -0
  146. data/extensions/vscode/package-lock.json +26 -0
  147. data/extensions/vscode/package.json +35 -0
  148. data/extensions/vscode/server/License.txt +879 -0
  149. data/extensions/vscode/server/package-lock.json +236 -0
  150. data/extensions/vscode/server/package.json +29 -0
  151. data/extensions/vscode/server/src/server.ts +59 -0
  152. data/extensions/vscode/server/tsconfig.json +16 -0
  153. data/install/Gemfile +1 -1
  154. data/install/Launcher.bat +1 -9
  155. data/install/config/dart/Gemfile +3 -8
  156. data/install/config/data/crc.txt +148 -132
  157. data/install/config/system/system.txt +36 -3
  158. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  159. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  160. data/install/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  161. data/install/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  162. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  163. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  164. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  165. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  166. data/install/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  167. data/install/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  168. data/install/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  169. data/install/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  170. data/install/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  171. data/install/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  172. data/install/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  173. data/install/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  174. data/install/config/tools/handbook_creator/default_toc.xsl +59 -59
  175. data/lib/cosmos/config/config_parser.rb +4 -5
  176. data/lib/cosmos/conversions.rb +2 -0
  177. data/lib/cosmos/conversions/packet_time_formatted_conversion.rb +38 -0
  178. data/lib/cosmos/conversions/packet_time_seconds_conversion.rb +38 -0
  179. data/lib/cosmos/core_ext/cosmos_io.rb +2 -1
  180. data/lib/cosmos/core_ext/time.rb +3 -1
  181. data/lib/cosmos/dart/config/boot.rb +1 -1
  182. data/lib/cosmos/dart/config/database.yml +2 -0
  183. data/lib/cosmos/dart/examples/dart_decom_client.rb +1 -1
  184. data/lib/cosmos/dart/examples/dart_stream_client.rb +6 -2
  185. data/lib/cosmos/dart/lib/dart_common.rb +13 -6
  186. data/lib/cosmos/dart/lib/dart_constants.rb +15 -0
  187. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +2 -2
  188. data/lib/cosmos/dart/lib/dart_decom_query.rb +5 -6
  189. data/lib/cosmos/dart/lib/dart_decommutator.rb +64 -54
  190. data/lib/cosmos/dart/lib/dart_importer.rb +3 -3
  191. data/lib/cosmos/dart/lib/dart_master_query.rb +71 -0
  192. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +2 -2
  193. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +165 -134
  194. data/lib/cosmos/dart/processes/dart.rb +4 -2
  195. data/lib/cosmos/dart/processes/dart_decom_server.rb +3 -3
  196. data/lib/cosmos/dart/processes/dart_ingester.rb +40 -1
  197. data/lib/cosmos/dart/processes/dart_master.rb +44 -0
  198. data/lib/cosmos/dart/processes/dart_util.rb +119 -4
  199. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +3 -3
  200. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +9 -5
  201. data/lib/cosmos/gui/dialogs/details_dialog.rb +44 -29
  202. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +1 -1
  203. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +3 -3
  204. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +2 -2
  205. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +1 -1
  206. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +11 -10
  207. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +4 -2
  208. data/lib/cosmos/gui/opengl/earth_model.rb +1 -1
  209. data/lib/cosmos/gui/qt.rb +13 -2
  210. data/lib/cosmos/gui/qt_tool.rb +71 -43
  211. data/lib/cosmos/gui/text/ruby_editor.rb +91 -49
  212. data/lib/cosmos/gui/utilities/classification_banner.rb +60 -0
  213. data/lib/cosmos/gui/utilities/screenshot.rb +1 -1
  214. data/lib/cosmos/gui/utilities/script_module_gui.rb +117 -91
  215. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +22 -3
  216. data/lib/cosmos/interfaces.rb +2 -0
  217. data/lib/cosmos/interfaces/dart_status_interface.rb +1 -1
  218. data/lib/cosmos/interfaces/interface.rb +9 -1
  219. data/lib/cosmos/interfaces/linc_interface.rb +3 -3
  220. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +1 -1
  221. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +1 -1
  222. data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +40 -18
  223. data/lib/cosmos/interfaces/protocols/ignore_packet_protocol.rb +46 -0
  224. data/lib/cosmos/interfaces/protocols/length_protocol.rb +5 -0
  225. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +68 -23
  226. data/lib/cosmos/interfaces/protocols/template_protocol.rb +9 -4
  227. data/lib/cosmos/interfaces/serial_interface.rb +7 -1
  228. data/lib/cosmos/interfaces/simulated_target_interface.rb +14 -5
  229. data/lib/cosmos/interfaces/stream_interface.rb +1 -1
  230. data/lib/cosmos/interfaces/tcpip_server_interface.rb +13 -13
  231. data/lib/cosmos/io/json_drb.rb +16 -12
  232. data/lib/cosmos/io/json_drb_object.rb +7 -2
  233. data/lib/cosmos/io/json_drb_rack.rb +25 -5
  234. data/lib/cosmos/io/json_rpc.rb +1 -1
  235. data/lib/cosmos/io/posix_serial_driver.rb +60 -22
  236. data/lib/cosmos/io/serial_driver.rb +11 -8
  237. data/lib/cosmos/io/win32_serial_driver.rb +31 -3
  238. data/lib/cosmos/packet_logs/packet_log_reader.rb +71 -28
  239. data/lib/cosmos/packet_logs/packet_log_writer.rb +13 -1
  240. data/lib/cosmos/packets/commands.rb +30 -9
  241. data/lib/cosmos/packets/packet.rb +105 -34
  242. data/lib/cosmos/packets/packet_config.rb +60 -10
  243. data/lib/cosmos/packets/parsers/format_string_parser.rb +0 -1
  244. data/lib/cosmos/packets/parsers/state_parser.rb +0 -1
  245. data/lib/cosmos/packets/parsers/xtce_converter.rb +2 -0
  246. data/lib/cosmos/packets/parsers/xtce_parser.rb +5 -4
  247. data/lib/cosmos/packets/structure.rb +32 -4
  248. data/lib/cosmos/packets/structure_item.rb +5 -1
  249. data/lib/cosmos/packets/telemetry.rb +30 -4
  250. data/lib/cosmos/script/api_shared.rb +22 -10
  251. data/lib/cosmos/script/extract.rb +1 -1
  252. data/lib/cosmos/script/limits.rb +4 -0
  253. data/lib/cosmos/script/script.rb +29 -20
  254. data/lib/cosmos/script/scripting.rb +16 -14
  255. data/lib/cosmos/script/telemetry.rb +3 -1
  256. data/lib/cosmos/script/tools.rb +18 -8
  257. data/lib/cosmos/streams/serial_stream.rb +11 -6
  258. data/lib/cosmos/system/system.rb +214 -76
  259. data/lib/cosmos/system/target.rb +39 -9
  260. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +116 -55
  261. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +15 -0
  262. data/lib/cosmos/tools/cmd_sender/cmd_params.rb +382 -0
  263. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +54 -340
  264. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +74 -52
  265. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +40 -333
  266. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +16 -11
  267. data/lib/cosmos/tools/cmd_tlm_server/api.rb +13 -0
  268. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +2 -0
  269. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +44 -15
  270. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +8 -1
  271. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +18 -20
  272. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +13 -2
  273. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
  274. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +13 -13
  275. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +9 -6
  276. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +8 -8
  277. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +5 -5
  278. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +35 -20
  279. data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +15 -11
  280. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +5 -0
  281. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +2 -0
  282. data/lib/cosmos/tools/config_editor/config_editor.rb +181 -94
  283. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +10 -9
  284. data/lib/cosmos/tools/config_editor/system_config_dialog.rb +158 -0
  285. data/lib/cosmos/tools/data_viewer/data_viewer.rb +57 -47
  286. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +1 -0
  287. data/lib/cosmos/tools/data_viewer/dump_component.rb +3 -9
  288. data/lib/cosmos/tools/data_viewer/text_component.rb +77 -0
  289. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +68 -42
  290. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -1
  291. data/lib/cosmos/tools/launcher/launcher.rb +2 -1
  292. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +59 -41
  293. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +42 -42
  294. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +64 -59
  295. data/lib/cosmos/tools/script_runner/script_runner.rb +198 -123
  296. data/lib/cosmos/tools/script_runner/script_runner_config.rb +14 -0
  297. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +87 -35
  298. data/lib/cosmos/tools/table_manager/table_config.rb +5 -3
  299. data/lib/cosmos/tools/table_manager/table_manager.rb +48 -45
  300. data/lib/cosmos/tools/test_runner/test.rb +5 -2
  301. data/lib/cosmos/tools/test_runner/test_runner.rb +61 -38
  302. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +24 -12
  303. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +48 -48
  304. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +5 -8
  305. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +20 -16
  306. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +3 -3
  307. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +7 -7
  308. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +10 -10
  309. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +10 -3
  310. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +6 -6
  311. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +14 -14
  312. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +21 -17
  313. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +5 -8
  314. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +94 -91
  315. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +27 -26
  316. data/lib/cosmos/tools/tlm_viewer/screen.rb +76 -14
  317. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +51 -34
  318. data/lib/cosmos/tools/tlm_viewer/widgets.rb +3 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +4 -5
  320. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +3 -4
  321. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +4 -5
  322. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_clickable.rb +16 -2
  323. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +17 -3
  324. data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +1 -2
  325. data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +40 -0
  326. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +12 -7
  327. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +79 -29
  328. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +1 -0
  329. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +2 -1
  330. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +2 -0
  331. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +4 -0
  332. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +33 -25
  333. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +5 -3
  334. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +5 -3
  335. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +1 -1
  336. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +4 -7
  337. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +5 -5
  338. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +6 -7
  339. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +2 -4
  340. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +10 -8
  341. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +2 -3
  342. data/lib/cosmos/tools/tlm_viewer/widgets/labelled_widget.rb +58 -0
  343. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +3 -4
  344. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +2 -4
  345. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +2 -1
  346. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +3 -5
  347. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +2 -3
  348. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitscolumn_widget.rb +2 -3
  349. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +2 -3
  350. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangecolumn_widget.rb +2 -3
  351. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +3 -5
  352. data/lib/cosmos/tools/tlm_viewer/widgets/led_widget.rb +108 -0
  353. data/lib/cosmos/tools/tlm_viewer/widgets/limits_widget.rb +60 -10
  354. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +22 -8
  355. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolor_widget.rb +19 -13
  356. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolumn_widget.rb +22 -8
  357. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +2 -3
  358. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +4 -3
  359. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +1 -3
  360. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +10 -5
  361. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +7 -4
  362. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +4 -6
  363. data/lib/cosmos/tools/tlm_viewer/widgets/rangecolumn_widget.rb +3 -5
  364. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +4 -3
  365. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +2 -3
  366. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +2 -3
  367. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +4 -6
  368. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +2 -3
  369. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +2 -3
  370. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +13 -4
  371. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +3 -4
  372. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +3 -8
  373. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +6 -12
  374. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +5 -10
  375. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +5 -3
  376. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +4 -4
  377. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +2 -3
  378. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitscolumn_widget.rb +2 -3
  379. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +3 -4
  380. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangecolumn_widget.rb +2 -3
  381. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +8 -7
  382. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +9 -7
  383. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +60 -47
  384. data/lib/cosmos/top_level.rb +37 -13
  385. data/lib/cosmos/utilities/ruby_lex_utils.rb +34 -30
  386. data/lib/cosmos/version.rb +5 -5
  387. data/lib/cosmos/win32/excel.rb +81 -24
  388. data/make_gems.sh +10 -0
  389. data/run_gui_tests.bat +1 -0
  390. data/spec/conversions/packet_time_formatted_conversion_spec.rb +58 -0
  391. data/spec/conversions/packet_time_seconds_conversion_spec.rb +60 -0
  392. data/spec/core_ext/socket_spec.rb +1 -1
  393. data/spec/core_ext/time_spec.rb +4 -0
  394. data/spec/gui/utilities/script_module_gui_spec.rb +44 -63
  395. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  396. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  397. data/spec/install/yaml_docs_spec.rb +132 -0
  398. data/spec/interfaces/linc_interface_spec.rb +1 -1
  399. data/spec/interfaces/protocols/fixed_protocol_spec.rb +20 -9
  400. data/spec/interfaces/protocols/ignore_packet_protocol_spec.rb +243 -0
  401. data/spec/interfaces/protocols/length_protocol_spec.rb +39 -0
  402. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +227 -4
  403. data/spec/interfaces/protocols/template_protocol_spec.rb +78 -25
  404. data/spec/io/json_drb_rack_spec.rb +166 -0
  405. data/spec/io/json_drb_spec.rb +14 -0
  406. data/spec/io/json_rpc_spec.rb +4 -5
  407. data/spec/io/posix_serial_driver_spec.rb +81 -0
  408. data/spec/io/serial_driver_spec.rb +15 -13
  409. data/spec/io/win32_serial_driver_spec.rb +33 -3
  410. data/spec/packet_logs/packet_log_reader_spec.rb +106 -52
  411. data/spec/packets/commands_spec.rb +22 -0
  412. data/spec/packets/packet_config_spec.rb +29 -16
  413. data/spec/packets/packet_item_spec.rb +2 -2
  414. data/spec/packets/packet_spec.rb +39 -6
  415. data/spec/packets/parsers/format_string_parser_spec.rb +0 -11
  416. data/spec/packets/parsers/macro_parser_spec.rb +36 -36
  417. data/spec/packets/parsers/state_parser_spec.rb +69 -11
  418. data/spec/packets/structure_spec.rb +93 -2
  419. data/spec/packets/telemetry_spec.rb +63 -10
  420. data/spec/script/extract_spec.rb +4 -1
  421. data/spec/script/script_spec.rb +2 -3
  422. data/spec/script/scripting_spec.rb +2 -1
  423. data/spec/script/tools_spec.rb +0 -1
  424. data/spec/streams/tcpip_socket_stream_spec.rb +32 -27
  425. data/spec/system/system_spec.rb +187 -4
  426. data/spec/system/target_spec.rb +62 -1
  427. data/spec/tools/cmd_tlm_server/api_spec.rb +29 -21
  428. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -7
  429. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +33 -0
  430. data/spec/tools/cmd_tlm_server/commanding_spec.rb +25 -1
  431. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +15 -0
  432. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +2 -3
  433. data/spec/top_level/top_level_spec.rb +29 -5
  434. data/spec/utilities/message_log_spec.rb +6 -3
  435. data/tasks/gemfile_stats.rake +38 -14
  436. data/test/performance/config/system/system.txt +0 -0
  437. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +5 -5
  438. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  439. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  440. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  441. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  442. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  443. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  444. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  445. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  446. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  447. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  448. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  449. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  450. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  451. data/test/performance/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  452. data/test/performance/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  453. data/test/performance/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  454. data/test/performance/config/tools/test_runner/test_runner.txt +1 -1
  455. data/test/performance/procedures/cosmos_api_test.rb +1 -1
  456. data/test/performance/tools/identify_performance.rb +82 -0
  457. metadata +146 -62
  458. data/lib/cosmos/dart/Gemfile +0 -69
@@ -130,7 +130,7 @@ module Cosmos
130
130
  return [target_name, packet_name, item_name, comparison_to_eval] if split_string.length == 3
131
131
  raise "ERROR: Check improperly specified: #{text}" if split_string.length < 4
132
132
  split_string = text.split(/ /) # Split on regex spaces to preserve spaces in comparison
133
- index = split_string.index(item_name)
133
+ index = split_string.rindex(item_name)
134
134
  comparison_to_eval = split_string[(index + 1)..(split_string.length - 1)].join(" ")
135
135
  raise "ERROR: Use '==' instead of '=': #{text}" if split_string[3] == '='
136
136
  return [target_name, packet_name, item_name, comparison_to_eval]
@@ -98,6 +98,10 @@ module Cosmos
98
98
  if result[0] == :LIMITS_CHANGE
99
99
  result[1][3] = result[1][3].to_s.intern if result[1][3]
100
100
  result[1][4] = result[1][4].to_s.intern if result[1][4]
101
+ if result[1][5] and result[1][6]
102
+ result[1][5] = Time.at(result[1][5], result[1][6]).sys
103
+ result[1].delete_at(6)
104
+ end
101
105
  elsif result[0] == :LIMITS_SETTINGS
102
106
  result[1][3] = result[1][3].to_s.intern if result[1][3]
103
107
  elsif result[0] == :STALE_PACKET
@@ -21,16 +21,10 @@ require 'cosmos/script/tools'
21
21
 
22
22
  $cmd_tlm_server = nil
23
23
  $disconnected_targets = nil
24
+ $disconnect_all_targets = false
24
25
  $cmd_tlm_replay_mode = false
25
26
 
26
27
  module Cosmos
27
- # Error raised by the API when a check fails
28
- class CheckError < RuntimeError; end
29
- # Error raised when a Script should be stopped
30
- class StopScript < StandardError; end
31
- # Error raised when a TestCase should be skipped by TestRunner
32
- class SkipTestCase < StandardError; end
33
-
34
28
  # Provides a proxy to both a disconnected CmdTlmServer instance and the real
35
29
  # JsonDRbObject which communicates with the real CmdTlmServer. If targets
36
30
  # are disconnected their method calls are forwarded to the disconnected
@@ -48,9 +42,9 @@ module Cosmos
48
42
  end
49
43
  # Start a Json connect to the real server
50
44
  if $cmd_tlm_replay_mode
51
- @cmd_tlm_server = JsonDRbObject.new(System.connect_hosts['REPLAY_API'], System.ports['REPLAY_API'])
45
+ @cmd_tlm_server = JsonDRbObject.new(System.connect_hosts['REPLAY_API'], System.ports['REPLAY_API'], 1.0, Cosmos::System.x_csrf_token)
52
46
  else
53
- @cmd_tlm_server = JsonDRbObject.new(System.connect_hosts['CTS_API'], System.ports['CTS_API'])
47
+ @cmd_tlm_server = JsonDRbObject.new(System.connect_hosts['CTS_API'], System.ports['CTS_API'], 1.0, Cosmos::System.x_csrf_token)
54
48
  end
55
49
  end
56
50
 
@@ -58,16 +52,6 @@ module Cosmos
58
52
  # us to proxy the methods to either the disconnected CmdTlmServer object
59
53
  # or to the real server through the JsonDRbObject.
60
54
  def method_missing(method_name, *method_params)
61
- if $disconnected_targets && method_params[0].is_a?(String)
62
- if method_params.length == 1
63
- target = method_params[0].split(" ")[0]
64
- else
65
- target = method_params[0]
66
- end
67
- if $disconnected_targets.include?(target)
68
- return @disconnected.send(method_name, *method_params)
69
- end
70
- end
71
55
  # Must call shutdown and disconnect on the JsonDrbObject itself
72
56
  # to avoid it being sent to the CmdTlmServer
73
57
  case method_name
@@ -77,6 +61,28 @@ module Cosmos
77
61
  when :disconnect
78
62
  @cmd_tlm_server.disconnect
79
63
  else
64
+ if $disconnect_all_targets
65
+ return @disconnected.send(method_name, *method_params)
66
+ elsif $disconnected_targets
67
+ name_string = nil
68
+ if method_params[0].is_a?(String)
69
+ name_string = method_params[0]
70
+ elsif method_params[0].is_a?(Array)
71
+ if method_params[0][0].is_a?(Array)
72
+ if method_params[0][0][0].is_a?(String)
73
+ name_string = method_params[0][0][0]
74
+ end
75
+ elsif method_params[0][0].is_a?(String)
76
+ name_string = method_params[0][0]
77
+ end
78
+ end
79
+ if name_string
80
+ target = name_string.split(" ")[0]
81
+ if $disconnected_targets.include?(target)
82
+ return @disconnected.send(method_name, *method_params)
83
+ end
84
+ end
85
+ end
80
86
  @cmd_tlm_server.method_missing(method_name, *method_params)
81
87
  end
82
88
  end
@@ -95,6 +101,7 @@ module Cosmos
95
101
  # Called when this module is mixed in using "include Cosmos::Script"
96
102
  def self.included(base)
97
103
  $disconnected_targets = nil
104
+ $disconnect_all_targets = false
98
105
  $cmd_tlm_replay_mode = false
99
106
  $cmd_tlm_server = nil
100
107
  initialize_script_module()
@@ -109,8 +116,9 @@ module Cosmos
109
116
  $cmd_tlm_server.shutdown if $cmd_tlm_server
110
117
  end
111
118
 
112
- def set_disconnected_targets(targets, config_file = CmdTlmServer::DEFAULT_CONFIG_FILE)
119
+ def set_disconnected_targets(targets, all = false, config_file = CmdTlmServer::DEFAULT_CONFIG_FILE)
113
120
  $disconnected_targets = targets
121
+ $disconnect_all_targets = all
114
122
  initialize_script_module(config_file)
115
123
  end
116
124
 
@@ -120,6 +128,7 @@ module Cosmos
120
128
 
121
129
  def clear_disconnected_targets
122
130
  $disconnected_targets = nil
131
+ $disconnect_all_targets = false
123
132
  end
124
133
 
125
134
  def script_disconnect
@@ -56,20 +56,20 @@ module Cosmos
56
56
  return value
57
57
  end
58
58
 
59
- def prompt(string)
60
- prompt_to_continue(string)
59
+ def prompt(string, **options)
60
+ prompt_to_continue(string, options)
61
61
  end
62
62
 
63
- def message_box(string, *buttons)
64
- prompt_message_box(string, buttons)
63
+ def message_box(string, *buttons, **options)
64
+ prompt_message_box(string, buttons, options)
65
65
  end
66
66
 
67
- def vertical_message_box(string, *buttons)
68
- prompt_vertical_message_box(string, buttons)
67
+ def vertical_message_box(string, *buttons, **options)
68
+ prompt_vertical_message_box(string, buttons, options)
69
69
  end
70
70
 
71
- def combo_box(string, *options)
72
- prompt_combo_box(string, options)
71
+ def combo_box(string, *items, **options)
72
+ prompt_combo_box(string, items, options)
73
73
  end
74
74
 
75
75
  def _file_dialog(message, directory, filter, select_files = true)
@@ -123,22 +123,24 @@ module Cosmos
123
123
  end
124
124
  end
125
125
 
126
- def prompt_to_continue(string)
126
+ def prompt_to_continue(string, text_color: nil, background_color: nil, font_size: nil, font_family: nil, details: nil)
127
127
  print "#{string}: "
128
+ print "Details: #{details}\n" if details
128
129
  gets.chomp
129
130
  end
130
131
 
131
- def prompt_message_box(string, buttons)
132
+ def prompt_message_box(string, buttons, text_color: nil, background_color: nil, font_size: nil, font_family: nil, details: nil)
132
133
  print "#{string} (#{buttons.join(", ")}): "
134
+ print "Details: #{details}\n" if details
133
135
  gets.chomp
134
136
  end
135
137
 
136
- def prompt_vertical_message_box(string, options)
137
- prompt_message_box(string, options)
138
+ def prompt_vertical_message_box(string, buttons, options)
139
+ prompt_message_box(string, buttons, options)
138
140
  end
139
141
 
140
- def prompt_combo_box(string, options)
141
- prompt_message_box(string, options)
142
+ def prompt_combo_box(string, items, options)
143
+ prompt_message_box(string, items, options)
142
144
  end
143
145
  end
144
146
  end
@@ -203,12 +203,14 @@ module Cosmos
203
203
  packet = nil
204
204
  # The get_packet_data above returns a Ruby time after the packet_name.
205
205
  # This is different from the API.s
206
- buffer, target_name, packet_name, time, rx_count = get_packet_data(id, non_block)
206
+ buffer, target_name, packet_name, time, rx_count, stored, extra = get_packet_data(id, non_block)
207
207
  if buffer
208
208
  packet = System.telemetry.packet(target_name, packet_name).clone
209
209
  packet.buffer = buffer
210
210
  packet.received_time = time
211
211
  packet.received_count = rx_count
212
+ packet.stored = stored
213
+ packet.extra = extra
212
214
  end
213
215
  packet
214
216
  end
@@ -67,20 +67,20 @@ module Cosmos
67
67
  # Methods for debugging
68
68
  #######################################
69
69
 
70
- def insert_return(*params)
71
- _ensure_script_runner_frame do
72
- ScriptRunnerFrame.instance.inline_return = true
73
- ScriptRunnerFrame.instance.inline_return_params = params
74
- end
75
- end
76
-
77
70
  def step_mode
78
71
  if defined? ScriptRunnerFrame
72
+ # Ensure the Frame has toggled to debug so the user can see the Step button
73
+ _ensure_script_runner_frame do
74
+ Qt.execute_in_main_thread do
75
+ ScriptRunnerFrame.instance.toggle_debug(true)
76
+ end
77
+ end
79
78
  ScriptRunnerFrame.step_mode = true
80
79
  end
81
80
  end
82
81
 
83
82
  def run_mode
83
+ # Run mode simply disables step mode. Debug frame may or may not be displayed.
84
84
  if defined? ScriptRunnerFrame
85
85
  ScriptRunnerFrame.step_mode = false
86
86
  end
@@ -104,7 +104,17 @@ module Cosmos
104
104
  # Get a specific screen definition
105
105
  def get_screen_definition(screen_full_name, config_filename = nil, force_refresh = false)
106
106
  $cmd_tlm_server.get_screen_definition(screen_full_name, config_filename, force_refresh)
107
- end
107
+ end
108
+
109
+ # Show a local telemetry screen
110
+ def local_screen(title = 'Local Screen', screen_def = nil, x_pos = nil, y_pos = nil, &block)
111
+ # See script_module_gui.rb
112
+ end
113
+
114
+ # Close all local telemetry screens
115
+ def close_local_screens
116
+ # See script_module_gui.rb
117
+ end
108
118
 
109
119
  end # module Script
110
120
 
@@ -35,8 +35,10 @@ module Cosmos
35
35
  # complete. Pass nil to create no timeout. The {SerialDriver} will
36
36
  # continously try to read data until it has received data or an error
37
37
  # occurs.
38
- # @param flow_control [Symbol] Currently supported :NONE and :RTSCTS (default :NONE)
38
+ # @param flow_control [Symbol] Currently supported :NONE, :RTSCTS (default :NONE)
39
39
  # @param data_bits [Integer] Number of data bits (default 8)
40
+ # @param struct [Array] Array of arrays of fields and values to set in the
41
+ # Windows DCB or POSIX structure
40
42
  def initialize(write_port_name,
41
43
  read_port_name,
42
44
  baud_rate,
@@ -45,7 +47,8 @@ module Cosmos
45
47
  write_timeout,
46
48
  read_timeout,
47
49
  flow_control = :NONE,
48
- data_bits = 8)
50
+ data_bits = 8,
51
+ struct = [])
49
52
  super()
50
53
 
51
54
  # The SerialDriver class will validate the parameters
@@ -69,7 +72,8 @@ module Cosmos
69
72
  @write_timeout,
70
73
  @read_timeout,
71
74
  @flow_control,
72
- @data_bits)
75
+ @data_bits,
76
+ struct)
73
77
  else
74
78
  @write_serial_port = nil
75
79
  end
@@ -84,7 +88,8 @@ module Cosmos
84
88
  @write_timeout,
85
89
  @read_timeout,
86
90
  @flow_control,
87
- @data_bits)
91
+ @data_bits,
92
+ struct)
88
93
  end
89
94
  else
90
95
  @read_serial_port = nil
@@ -151,5 +156,5 @@ module Cosmos
151
156
  @connected = false
152
157
  end
153
158
  end
154
- end # class SerialStream
155
- end # module Cosmos
159
+ end
160
+ end
@@ -20,6 +20,7 @@ require 'drb/acl'
20
20
  require 'zip'
21
21
  require 'zip/filesystem'
22
22
  require 'bundler'
23
+ require 'thread'
23
24
 
24
25
  module Cosmos
25
26
  # System is the primary entry point into the COSMOS framework. It captures
@@ -29,7 +30,7 @@ module Cosmos
29
30
  # #targets variable provides access to all the targets defined by the system.
30
31
  # Its primary responsibily is to load the system configuration file and
31
32
  # create all the Target instances. It also saves and restores configurations
32
- # using a MD5 checksum over the entire configuration to detect changes.
33
+ # using a hashing checksum over the entire configuration to detect changes.
33
34
  class System
34
35
  # @return [Hash<String,Fixnum>] Hash of all the known ports and their values
35
36
  instance_attr_reader :ports
@@ -67,20 +68,36 @@ module Cosmos
67
68
  instance_attr_reader :limits_set
68
69
  # @return [Boolean] Whether to use UTC or local times
69
70
  instance_attr_reader :use_utc
70
- # @return [Array<String>] List of files that are to be included in the MD5
71
+ # @return [Array<String>] List of files that are to be included in the hashing
71
72
  # calculation in addition to the cmd/tlm definition files that are
72
73
  # automatically included
73
- instance_attr_reader :additional_md5_files
74
+ instance_attr_reader :additional_hashing_files
75
+ # @return [Hash<String,String>] Hash of the text/color to use for the classificaiton banner
76
+ instance_attr_reader :classificiation_banner
77
+ # @return [String] Which hashing algorithm is in use
78
+ instance_attr_reader :hashing_algorithm
79
+ # @return [Boolean] Allow router commanding - defaults to false
80
+ instance_attr_reader :allow_router_commanding
81
+ # @return [String] API access secret using X-Csrf-Token - defaults to SuperSecret
82
+ instance_attr_reader :x_csrf_token
83
+ # @return [Array<String>] Allowed origins in http origin header - defaults to no origin header only
84
+ instance_attr_reader :allowed_origins
85
+ # @return [Array<String>] Allowed hosts in http host header - defaults to '127.0.0.1:7777' only
86
+ instance_attr_reader :allowed_hosts
74
87
 
75
88
  # Known COSMOS ports
76
- KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED', 'CTS_CMD_ROUTER', 'REPLAY_API', 'REPLAY_PREIDENTIFIED', 'REPLAY_CMD_ROUTER', 'DART_STREAM', 'DART_DECOM']
89
+ KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED', 'CTS_CMD_ROUTER', 'REPLAY_API', 'REPLAY_PREIDENTIFIED', 'REPLAY_CMD_ROUTER', 'DART_STREAM', 'DART_DECOM', 'DART_MASTER']
90
+ API_PORTS = ['CTS_API', 'TLMVIEWER_API', 'REPLAY_API', 'DART_DECOM', 'DART_MASTER']
77
91
  # Known COSMOS hosts
78
- KNOWN_HOSTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED', 'CTS_CMD_ROUTER', 'REPLAY_API', 'REPLAY_PREIDENTIFIED', 'REPLAY_CMD_ROUTER', 'DART_STREAM', 'DART_DECOM']
92
+ KNOWN_HOSTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED', 'CTS_CMD_ROUTER', 'REPLAY_API', 'REPLAY_PREIDENTIFIED', 'REPLAY_CMD_ROUTER', 'DART_STREAM', 'DART_DECOM', 'DART_MASTER']
79
93
  # Known COSMOS paths
80
94
  KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES', 'SEQUENCES', 'DART_DATA', 'DART_LOGS']
95
+ # Supported hashing algorithms
96
+ SUPPORTED_HASHING_ALGORITHMS = ['MD5', 'RMD160', 'SHA1', 'SHA256', 'SHA384', 'SHA512']
81
97
 
82
98
  @@instance = nil
83
99
  @@instance_mutex = Mutex.new
100
+ @@instance_filename = nil
84
101
 
85
102
  # Create a new System object. Note, this should not be called directly but
86
103
  # you should instead use System.instance and treat this class as a
@@ -90,6 +107,7 @@ module Cosmos
90
107
  # read. Be default this is <Cosmos::USERPATH>/config/system/system.txt
91
108
  def initialize(filename = nil)
92
109
  raise "Cosmos::System created twice" unless @@instance.nil?
110
+ @@instance_filename = filename
93
111
  reset_variables(filename)
94
112
  @@instance = self
95
113
  end
@@ -189,11 +207,12 @@ module Cosmos
189
207
  @targets = {}
190
208
  # Set config to nil so things will lazy load later
191
209
  @config = nil
210
+ @meta_init_filename = nil
192
211
  @use_utc = false
193
212
  acl_list = []
194
213
  all_allowed = false
195
214
  first_procedures_path = true
196
- @additional_md5_files = []
215
+ @additional_hashing_files = []
197
216
 
198
217
  Cosmos.set_working_dir do
199
218
  parser = ConfigParser.new("http://cosmosrb.com/docs/system")
@@ -201,7 +220,7 @@ module Cosmos
201
220
  # First pass - Everything except targets
202
221
  parser.parse_file(filename) do |keyword, parameters|
203
222
  case keyword
204
- when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET', 'DECLARE_GEM_TARGET'
223
+ when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET', 'DECLARE_GEM_TARGET', 'DECLARE_GEM_MULTI_TARGET'
205
224
  # Will be handled by second pass
206
225
 
207
226
  when 'PORT'
@@ -209,6 +228,7 @@ module Cosmos
209
228
  parser.verify_num_parameters(2, 2, usage)
210
229
  port_name = parameters[0].to_s.upcase
211
230
  @ports[port_name] = Integer(parameters[1])
231
+ @allowed_hosts << "127.0.0.1:#{parameters[1]}" if API_PORTS.include?(port_name)
212
232
  Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
213
233
 
214
234
  when 'LISTEN_HOST', 'CONNECT_HOST'
@@ -327,16 +347,60 @@ module Cosmos
327
347
  parser.verify_num_parameters(0, 0, "#{keyword}")
328
348
  @use_utc = true
329
349
 
330
- when 'ADD_MD5_FILE'
350
+ when 'ADD_HASH_FILE', 'ADD_MD5_FILE' # MD5 is here for backwards compatibility
331
351
  parser.verify_num_parameters(1, 1, "#{keyword} <Filename>")
332
352
  if File.file?(parameters[0])
333
- @additional_md5_files << File.expand_path(parameters[0])
353
+ @additional_hashing_files << File.expand_path(parameters[0])
334
354
  elsif File.file?(File.join(Cosmos::USERPATH, parameters[0]))
335
- @additional_md5_files << File.expand_path(File.join(Cosmos::USERPATH, parameters[0]))
355
+ @additional_hashing_files << File.expand_path(File.join(Cosmos::USERPATH, parameters[0]))
336
356
  else
337
357
  raise "Missing expected file: #{parameters[0]}"
338
358
  end
339
359
 
360
+ when 'HASHING_ALGORITHM'
361
+ parser.verify_num_parameters(1, 1, "#{keyword} <Hashing Algorithm>")
362
+ if SUPPORTED_HASHING_ALGORITHMS.include? parameters[0]
363
+ @hashing_algorithm = parameters[0]
364
+ else
365
+ Logger.error "Unrecognized hashing algorithm: #{parameters[0]}, using default algorithm MD5"
366
+ @hashing_algorithm = 'MD5'
367
+ end
368
+
369
+ when 'CLASSIFICATION'
370
+ parser.verify_num_parameters(2, 4, "#{keyword} <Display_Text> <Color Name|Red> <Green> <Blue>")
371
+ # Determine if the COSMOS color already exists, otherwise create a new one
372
+ if Cosmos.constants.include? parameters[1].upcase.to_sym
373
+ # We were given a named color that already exists in COSMOS
374
+ color = eval("Cosmos::#{parameters[1].upcase}")
375
+ else
376
+ if parameters.length < 4
377
+ # We were given a named color, but it didn't exist in COSMOS already
378
+ color = Cosmos::getColor(parameters[1].upcase)
379
+ else
380
+ # We were given RGB values
381
+ color = Cosmos::getColor(parameters[1], parameters[2], parameters[3])
382
+ end
383
+ end
384
+
385
+ @classificiation_banner = {'display_text' => parameters[0],
386
+ 'color' => color}
387
+
388
+ when 'ALLOW_ROUTER_COMMANDING'
389
+ parser.verify_num_parameters(0, 0, "#{keyword}")
390
+ @allow_router_commanding = true
391
+
392
+ when 'X_CSRF_TOKEN'
393
+ parser.verify_num_parameters(1, 1, "#{keyword} <Token>")
394
+ @x_csrf_token = ConfigParser.handle_nil(parameters[0])
395
+
396
+ when 'ALLOW_ORIGIN'
397
+ parser.verify_num_parameters(1, 1, "#{keyword} <Origin>")
398
+ @allowed_origins << parameters[0]
399
+
400
+ when 'ALLOW_HOST'
401
+ parser.verify_num_parameters(1, 1, "#{keyword} <Host:Port>")
402
+ @allowed_hosts << parameters[0]
403
+
340
404
  else
341
405
  # blank lines will have a nil keyword and should not raise an exception
342
406
  raise parser.error("Unknown keyword '#{keyword}'") if keyword
@@ -392,13 +456,8 @@ module Cosmos
392
456
  end
393
457
  end
394
458
  end
395
-
396
459
  auto_detect_gem_based_targets()
397
460
 
398
- # Make sure SYSTEM target is always present and added last
399
- target = Target.new('SYSTEM')
400
- @targets[target.name] = target
401
-
402
461
  when 'DECLARE_TARGET'
403
462
  usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
404
463
  parser.verify_num_parameters(1, 3, usage)
@@ -429,60 +488,96 @@ module Cosmos
429
488
  target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]), gem_dir)
430
489
  @targets[target.name] = target
431
490
 
491
+ when 'DECLARE_GEM_MULTI_TARGET'
492
+ usage = "#{keyword} <GEM NAME> <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
493
+ parser.verify_num_parameters(2, 4, usage)
494
+
495
+ target_name = parameters[1].to_s.upcase
496
+ substitute_name = nil
497
+ substitute_name = ConfigParser.handle_nil(parameters[2])
498
+ substitute_name.to_s.upcase if substitute_name
499
+ gem_dir = Gem::Specification.find_by_name(parameters[0]).gem_dir
500
+ gem_dir = File.join(gem_dir, target_name)
501
+ target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[3]), gem_dir)
502
+ @targets[target.name] = target
503
+
432
504
  end # case keyword
433
505
  end # parser.parse_file
506
+
507
+ # Make sure SYSTEM target is always present and added last
508
+ unless @targets.key?('SYSTEM')
509
+ target = Target.new('SYSTEM')
510
+ @targets[target.name] = target
511
+ end
434
512
  end
435
513
 
436
514
  # Load the specified configuration by iterating through the SAVED_CONFIG
437
- # directory looking for a matching MD5 sum. Updates the internal state so
515
+ # directory looking for a matching hashing sum. Updates the internal state so
438
516
  # subsequent commands and telemetry methods return the new configuration.
439
517
  #
440
- # @param name [String] MD5 string which identifies the
518
+ # @param name [String] hash string which identifies the
441
519
  # configuration. Pass nil to load the default configuration.
442
520
  # @return [String, Exception/nil] The actual configuration loaded
443
521
  def load_configuration(name = nil)
444
- unless @config
445
- # Ensure packets have been lazy loaded
446
- System.commands
447
- end
522
+ # Ensure packets have been lazy loaded
523
+ load_packets() unless @config
448
524
 
449
- if name && @config
450
- # Make sure they're requesting something other than the current
451
- # configuration.
452
- if name != @config.name
453
- # If they want the initial configuration we can just swap out the
454
- # current configuration without doing any file processing
455
- if name == @initial_config.name
456
- update_config(@initial_config)
457
- else
458
- # Look for the requested configuration in the saved configurations
459
- configuration = find_configuration(name)
460
- if configuration
461
- # We found the configuration requested. Reprocess the system.txt
462
- # and reload the packets
463
- begin
464
- unless File.directory?(configuration)
465
- # Zip file configuration so unzip and reset configuration path
466
- configuration = unzip(configuration)
525
+ @@instance_mutex.synchronize do
526
+ if @config_blacklist[name]
527
+ Logger.warn "Ignoring failed config #{name}"
528
+ update_config(@initial_config)
529
+ return @config.name, RuntimeError.new("Ignoring failed config #{name}")
530
+ end
531
+
532
+ if name && @config
533
+ # Make sure they're requesting something other than the current
534
+ # configuration.
535
+ if name != @config.name
536
+ # If they want the initial configuration we can just swap out the
537
+ # current configuration without doing any file processing
538
+ if name == @initial_config.name
539
+ Logger.info "Switching to initial configuration: #{name}"
540
+ update_config(@initial_config)
541
+ else
542
+ # Look for the requested configuration in the saved configurations
543
+ configuration = find_configuration(name)
544
+ if configuration
545
+ # We found the configuration requested. Reprocess the system.txt
546
+ # and reload the packets
547
+ begin
548
+ unless File.directory?(configuration)
549
+ # Zip file configuration so unzip and reset configuration path
550
+ configuration = unzip(configuration)
551
+ end
552
+
553
+ Logger.info "Switching to configuration: #{name}"
554
+ process_file(File.join(configuration, 'system.txt'), configuration)
555
+ load_packets(name, false)
556
+ rescue Exception => error
557
+ # Failed to load - Restore initial
558
+ @config_blacklist[name] = true # Prevent wasting time trying to load the bad configuration again
559
+ Logger.error "Problem loading configuration from #{configuration}: #{error.class}:#{error.message}\n#{error.backtrace.join("\n")}\n"
560
+ Logger.info "Switching to initial configuration: #{@initial_config.name}"
561
+ update_config(@initial_config)
562
+ return @config.name, error
467
563
  end
468
- process_file(File.join(configuration, 'system.txt'), configuration)
469
- load_packets(name)
470
- rescue Exception => error
471
- # Failed to load - Restore initial
564
+ else
565
+ # We couldn't find the configuration request. Reload the
566
+ # initial configuration
567
+ Logger.error "Unable to find configuration: #{name}"
568
+ Logger.info "Switching to initial configuration: #{@initial_config.name}"
472
569
  update_config(@initial_config)
473
- return @config.name, error
570
+ return @config.name, RuntimeError.new("Unable to find configuration: #{name}")
474
571
  end
475
- else
476
- # We couldn't find the configuration request. Reload the
477
- # initial configuration
478
- update_config(@initial_config)
479
572
  end
480
573
  end
574
+ else
575
+ Logger.info "Switching to initial configuration: #{@initial_config.name}"
576
+ update_config(@initial_config)
481
577
  end
482
- else
483
- update_config(@initial_config)
578
+
579
+ return @config.name, nil
484
580
  end
485
- return @config.name, nil
486
581
  end
487
582
 
488
583
  # (see #load_configuration)
@@ -495,7 +590,6 @@ module Cosmos
495
590
  # @param filename [String] Path to system.txt config file to process. Defaults to config/system/system.txt
496
591
  def reset_variables(filename = nil)
497
592
  @targets = {}
498
- @targets['UNKNOWN'] = Target.new('UNKNOWN')
499
593
  @config = nil
500
594
  @commands = nil
501
595
  @telemetry = nil
@@ -510,8 +604,9 @@ module Cosmos
510
604
  @staleness_seconds = 30
511
605
  @limits_set = :DEFAULT
512
606
  @use_utc = false
513
- @additional_md5_files = []
607
+ @additional_hashing_files = []
514
608
  @meta_init_filename = nil
609
+ @hashing_algorithm = 'MD5'
515
610
 
516
611
  @ports = {}
517
612
  @ports['CTS_API'] = 7777
@@ -521,21 +616,22 @@ module Cosmos
521
616
  @ports['REPLAY_API'] = 7877
522
617
  @ports['REPLAY_PREIDENTIFIED'] = 7879
523
618
  @ports['REPLAY_CMD_ROUTER'] = 7880
524
- @ports['DART_DECOM'] = 8777
525
- @ports['DART_STREAM'] = 8779
619
+
620
+ @ports['DART_STREAM'] = 8777
621
+ @ports['DART_DECOM'] = 8779
622
+ @ports['DART_MASTER'] = 8780
526
623
 
527
624
  @listen_hosts = {}
528
625
  @listen_hosts['CTS_API'] = '127.0.0.1'
529
626
  @listen_hosts['TLMVIEWER_API'] = '127.0.0.1'
530
- # Localhost would be more secure but historically these are open to allow for chaining servers by default
531
- @listen_hosts['CTS_PREIDENTIFIED'] = '0.0.0.0'
532
- @listen_hosts['CTS_CMD_ROUTER'] = '0.0.0.0'
627
+ @listen_hosts['CTS_PREIDENTIFIED'] = '127.0.0.1'
628
+ @listen_hosts['CTS_CMD_ROUTER'] = '127.0.0.1'
533
629
  @listen_hosts['REPLAY_API'] = '127.0.0.1'
534
- # Localhost would be more secure but historically these are open to allow for chaining servers by default
535
- @listen_hosts['REPLAY_PREIDENTIFIED'] = '0.0.0.0'
536
- @listen_hosts['REPLAY_CMD_ROUTER'] = '0.0.0.0'
537
- @listen_hosts['DART_STREAM'] = '0.0.0.0'
538
- @listen_hosts['DART_DECOM'] = '0.0.0.0'
630
+ @listen_hosts['REPLAY_PREIDENTIFIED'] = '127.0.0.1'
631
+ @listen_hosts['REPLAY_CMD_ROUTER'] = '127.0.0.1'
632
+ @listen_hosts['DART_STREAM'] = '127.0.0.1'
633
+ @listen_hosts['DART_DECOM'] = '127.0.0.1'
634
+ @listen_hosts['DART_MASTER'] = '127.0.0.1'
539
635
 
540
636
  @connect_hosts = {}
541
637
  @connect_hosts['CTS_API'] = '127.0.0.1'
@@ -547,6 +643,7 @@ module Cosmos
547
643
  @connect_hosts['REPLAY_CMD_ROUTER'] = '127.0.0.1'
548
644
  @connect_hosts['DART_STREAM'] = '127.0.0.1'
549
645
  @connect_hosts['DART_DECOM'] = '127.0.0.1'
646
+ @connect_hosts['DART_MASTER'] = '127.0.0.1'
550
647
 
551
648
  @paths = {}
552
649
  @paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
@@ -559,6 +656,11 @@ module Cosmos
559
656
  @paths['DART_DATA'] = File.join(USERPATH, 'outputs', 'dart', 'data')
560
657
  @paths['DART_LOGS'] = File.join(USERPATH, 'outputs', 'dart', 'logs')
561
658
 
659
+ @allow_router_commanding = false
660
+ @x_csrf_token = 'SuperSecret'
661
+ @allowed_origins = []
662
+ @allowed_hosts = ['127.0.0.1:7777', '127.0.0.1:7778', '127.0.0.1:7877', '127.0.0.1:8779', '127.0.0.1:8780']
663
+
562
664
  unless filename
563
665
  system_arg = false
564
666
  ARGV.each do |arg|
@@ -575,10 +677,11 @@ module Cosmos
575
677
 
576
678
  @initial_filename = filename
577
679
  @initial_config = nil
680
+ @config_blacklist = {}
578
681
  end
579
682
 
580
683
  # Reset variables and load packets
581
- def reset(filename = nil)
684
+ def reset(filename = @@instance_filename)
582
685
  reset_variables(filename)
583
686
  load_packets()
584
687
  end
@@ -653,11 +756,31 @@ module Cosmos
653
756
  Bundler.load.specs.each do |spec|
654
757
  spec_name_split = spec.name.split('-')
655
758
  if spec_name_split.length > 1 && (spec_name_split[0] == 'cosmos')
656
- # Filter to just targets and not tools and other extensions
657
- if File.exist?(File.join(spec.gem_dir, 'cmd_tlm'))
658
- target_name = spec_name_split[1..-1].join('-').to_s.upcase
659
- target = Target.new(target_name, nil, nil, nil, spec.gem_dir)
660
- @targets[target.name] = target
759
+ # search for multiple targets packaged in a single gem
760
+ dirs = []
761
+ Dir.foreach(spec.gem_dir) { |dir_filename| dirs << dir_filename }
762
+ dirs.sort!
763
+ dirs.each do |dir_filename|
764
+ if dir_filename == "."
765
+ # check the base directory
766
+ curr_dir = spec.gem_dir
767
+ target_name = spec_name_split[1..-1].join('-').to_s.upcase
768
+ else
769
+ #check for targets in other directories 1 level deep
770
+ next if dir_filename[0] == '.' #skip dot directories and ".."
771
+ next if dir_filename != dir_filename.upcase #skip non uppercase directories
772
+ curr_dir = File.join(spec.gem_dir, dir_filename)
773
+ target_name = dir_filename
774
+ end
775
+ # check for the cmd_tlm directory - if it has it, then we have found a target
776
+ if File.directory?(File.join(curr_dir,'cmd_tlm'))
777
+ # If any of the targets original directory name matches the
778
+ # current directory then it must have been already processed by
779
+ # DECLARE_TARGET so we skip it.
780
+ next if @targets.select {|name, target| target.original_name == target_name }.length > 0
781
+ target = Target.new(target_name,nil, nil, nil, spec.gem_dir)
782
+ @targets[target.name] = target
783
+ end
661
784
  end
662
785
  end
663
786
  end
@@ -686,9 +809,10 @@ module Cosmos
686
809
  configuration = find_configuration(@config.name)
687
810
  configuration = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename([@config.name], '.zip')) unless configuration
688
811
  unless File.exist?(configuration)
812
+ configuration_tmp = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename(['tmp_' + @config.name], '.zip.tmp'))
689
813
  begin
690
814
  Zip.continue_on_exists_proc = true
691
- Zip::File.open(configuration, Zip::File::CREATE) do |zipfile|
815
+ Zip::File.open(configuration_tmp, Zip::File::CREATE) do |zipfile|
692
816
  zip_file_path = File.basename(configuration, ".zip")
693
817
  zipfile.mkdir zip_file_path
694
818
 
@@ -720,6 +844,7 @@ module Cosmos
720
844
  end
721
845
  end
722
846
  end
847
+ File.rename(configuration_tmp, configuration)
723
848
  File.chmod(0444, configuration) # Mark readonly
724
849
  rescue Exception => error
725
850
  Logger.error "Problem saving configuration to #{configuration}: #{error.class}:#{error.message}\n#{error.backtrace.join("\n")}\n"
@@ -728,12 +853,13 @@ module Cosmos
728
853
  end
729
854
  end
730
855
 
731
- def load_packets(configuration_name = nil)
732
- # Determine MD5 over all targets cmd_tlm files
856
+ def load_packets_internal(configuration_name = nil)
857
+ # Determine hashing over all targets cmd_tlm files
733
858
  cmd_tlm_files = []
734
859
  additional_data = ''
735
860
  @targets.each do |target_name, target|
736
861
  cmd_tlm_files << target.filename if File.exist?(target.filename)
862
+ cmd_tlm_files.concat(target.requires)
737
863
  cmd_tlm_files.concat(target.cmd_tlm_files)
738
864
  if target.substitute
739
865
  additional_data << target.original_name
@@ -743,11 +869,13 @@ module Cosmos
743
869
  end
744
870
  end
745
871
 
746
- md5 = Cosmos.md5_files(cmd_tlm_files + @additional_md5_files, additional_data)
747
- md5_string = md5.hexdigest
872
+ hashing_result = Cosmos.hash_files(cmd_tlm_files + @additional_hashing_files, additional_data, @hashing_algorithm)
873
+ hash_string = hashing_result.hexdigest
874
+ # Only use at most, 32 characters of the hex
875
+ hash_string = hash_string[-32..-1] if hash_string.length >= 32
748
876
 
749
877
  # Build filename for marshal file
750
- marshal_filename = File.join(@paths['TMP'], 'marshal_' << md5_string << '.bin')
878
+ marshal_filename = File.join(@paths['TMP'], 'marshal_' << hash_string << '.bin')
751
879
 
752
880
  # Attempt to load marshal file
753
881
  config = Cosmos.marshal_load(marshal_filename)
@@ -780,7 +908,7 @@ module Cosmos
780
908
  if configuration_name
781
909
  @config.name = configuration_name
782
910
  else
783
- @config.name = md5_string
911
+ @config.name = hash_string
784
912
  end
785
913
 
786
914
  Cosmos.marshal_dump(marshal_filename, @config)
@@ -791,6 +919,16 @@ module Cosmos
791
919
  save_configuration()
792
920
  end
793
921
 
922
+ def load_packets(configuration_name = nil, take_mutex = true)
923
+ if take_mutex
924
+ @@instance_mutex.synchronize do
925
+ load_packets_internal(configuration_name)
926
+ end
927
+ else
928
+ load_packets_internal(configuration_name)
929
+ end
930
+ end
931
+
794
932
  def setup_system_meta
795
933
  # Ensure SYSTEM META is defined and defined correctly
796
934
  begin