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
@@ -19,8 +19,9 @@ module Cosmos
19
19
  signals 'modified()'
20
20
 
21
21
  # Create the SequenceList
22
- def initialize
22
+ def initialize(parent)
23
23
  super()
24
+ @parent = parent
24
25
  @modified = false
25
26
  layout = Qt::VBoxLayout.new()
26
27
  layout.setContentsMargins(0, 0, 0, 0)
@@ -45,7 +46,8 @@ module Cosmos
45
46
  usage = "#{keyword} <Delay Time> <Command>"
46
47
  parser.verify_num_parameters(2, 2, usage)
47
48
  begin
48
- item = SequenceItem.parse(params[0], params[1])
49
+ tgt_name, pkt_name, cmd_params = extract_fields_from_cmd_text(params[1])
50
+ item = SequenceItem.new(@parent, tgt_name, pkt_name, cmd_params, params[0])
49
51
  # Connect the SequenceItems modified signal to propagate it
50
52
  # forward by emitting our own modified signal
51
53
  item.connect(SIGNAL("modified()")) do
@@ -63,12 +65,13 @@ module Cosmos
63
65
  @modified = false # Initially we're not modified
64
66
  end
65
67
 
66
- # Add a new SequenceItem to the list.
67
- # @param command [Packet] Command packet to base the SequenceItem on
68
+ # Add a new SequenceItem to the list based on the given target and packet
69
+ # @param target_name [String] target name containing the command
70
+ # @param packet_name [String] packet name containing the command
68
71
  # @return [SequenceItem] The item added
69
- def add(command)
72
+ def add(target_name, packet_name)
70
73
  @modified = true
71
- item = SequenceItem.new(command)
74
+ item = SequenceItem.new(@parent, target_name, packet_name)
72
75
  # Connect the SequenceItems modified signal to propagate it
73
76
  # forward by emitting our own modified signal
74
77
  item.connect(SIGNAL("modified()")) do
@@ -118,11 +121,13 @@ module Cosmos
118
121
  # application.
119
122
  # @param filename [String] Filename to open and write the sequence
120
123
  def save(filename)
121
- @modified = false
122
- File.open(filename, "w") do |file|
123
- # Each SequenceItem's save method returns the save string
124
- file.write(collect {|item| item.save }.join("\n"))
125
- file.write("\n") # final newline
124
+ begin
125
+ sequence = collect {|item| item.save }.join("\n") + "\n"
126
+ @modified = false
127
+ File.open(filename, "w") {|file| file.write(sequence) }
128
+ rescue Exception => err
129
+ message = "Error saving due to #{err}"
130
+ Qt::MessageBox.critical(self, 'Error', message)
126
131
  end
127
132
  end
128
133
 
@@ -349,7 +349,20 @@ module Cosmos
349
349
  def get_cmd_value(target_name, command_name, parameter_name, value_type = :CONVERTED)
350
350
  packet = System.commands.packet(target_name, command_name)
351
351
  # Virtually support RECEIVED_TIMEFORMATTED, RECEIVED_TIMESECONDS, RECEIVED_COUNT
352
+ # Also PACKET_TIMEFORMATTED and PACKET_TIMESECONDS
352
353
  case parameter_name.to_s.upcase
354
+ when 'PACKET_TIMEFORMATTED'
355
+ if packet.packet_time
356
+ return packet.packet_time.formatted
357
+ else
358
+ return 'No Packet Time'
359
+ end
360
+ when 'PACKET_TIMESECONDS'
361
+ if packet.packet_time
362
+ return packet.packet_time.to_f
363
+ else
364
+ return 0.0
365
+ end
353
366
  when 'RECEIVED_TIMEFORMATTED'
354
367
  if packet.received_time
355
368
  return packet.received_time.formatted
@@ -43,6 +43,8 @@ module Cosmos
43
43
  rescue Exception => err
44
44
  Logger.error "Background Task '#{@config.background_tasks[index].name}' unexpectedly died"
45
45
  Cosmos.handle_fatal_exception(err)
46
+ ensure
47
+ @threads[index] = nil # Remove thread reference
46
48
  end
47
49
  end
48
50
  end
@@ -20,7 +20,6 @@ require 'cosmos/tools/cmd_tlm_server/routers'
20
20
  require 'cosmos/tools/cmd_tlm_server/replay_backend'
21
21
 
22
22
  module Cosmos
23
-
24
23
  # Provides the interface for all applications to get the latest telemetry and
25
24
  # to send commands.
26
25
  class CmdTlmServer
@@ -126,6 +125,9 @@ module Cosmos
126
125
  # receive data. This is useful for testing scripts when actual hardware
127
126
  # is not available.
128
127
  # @param mode [Symbol] :CMD_TLM_SERVER or :REPLAY - Defines overall mode
128
+ # @param replay_routers [Boolean] Whether to keep existing routers when starting
129
+ # the server in REPLAY mode. Default is false which means to clear all
130
+ # existing routers and simply create the preidentified routers.
129
131
  def initialize(
130
132
  config_file = DEFAULT_CONFIG_FILE,
131
133
  production = false,
@@ -199,9 +201,9 @@ module Cosmos
199
201
  @json_drb.method_whitelist = @api_whitelist
200
202
  begin
201
203
  if @mode == :CMD_TLM_SERVER
202
- @json_drb.start_service(System.listen_hosts['CTS_API'], System.ports['CTS_API'], self)
204
+ @json_drb.start_service(System.listen_hosts['CTS_API'], System.ports['CTS_API'], self, 1000, System)
203
205
  else
204
- @json_drb.start_service(System.listen_hosts['REPLAY_API'], System.ports['REPLAY_API'], self)
206
+ @json_drb.start_service(System.listen_hosts['REPLAY_API'], System.ports['REPLAY_API'], self, 1000, System)
205
207
  end
206
208
  rescue Exception
207
209
  # Call packet_logging shutdown here to explicitly kill the logging
@@ -218,16 +220,40 @@ module Cosmos
218
220
  @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.ports['CTS_PREIDENTIFIED'])
219
221
  @routers.add_cmd_preidentified('PREIDENTIFIED_CMD_ROUTER', System.ports['CTS_CMD_ROUTER'])
220
222
  else
223
+ # Create dummy interface for Replay so we can attach the preidentified routers to it.
224
+ # This is needed because interfaces are not mapped to targets when loading a saved_config.
225
+ # Since interfaces are used to access the routers, nothing is send out the preidentified
226
+ # interface port and TlmGrapher (most notably) does not work.
227
+ @replay_interface = Interface.new
228
+ @replay_interface.name = "REPLAY"
221
229
  @routers.all.clear unless replay_routers
222
- @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.ports['REPLAY_PREIDENTIFIED'])
223
- @routers.add_cmd_preidentified('PREIDENTIFIED_CMD_ROUTER', System.ports['REPLAY_CMD_ROUTER'])
230
+ @replay_interface.routers << @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.ports['REPLAY_PREIDENTIFIED'])
231
+ @replay_interface.cmd_routers << @routers.add_cmd_preidentified('PREIDENTIFIED_CMD_ROUTER', System.ports['REPLAY_CMD_ROUTER'])
224
232
  end
225
233
  System.telemetry.limits_change_callback = method(:limits_change_callback)
226
234
  @routers.start
227
235
 
228
236
  start(production)
229
237
  end
230
- end # end def initialize
238
+ end
239
+
240
+ # Map any targets without interfaces to the dummy replay interface.
241
+ # Targets will only have an interface already mapped if the replay_routers
242
+ # flag was passed to the server.
243
+ def replay_map_targets_to_interfaces
244
+ # Try to map existing interfaces to targets
245
+ if @interfaces
246
+ @interfaces.all.each do |name, interface|
247
+ interface.target_names.each do |target|
248
+ System.targets[target].interface = interface
249
+ end
250
+ end
251
+ end
252
+ # If any remaing targets don't have an interface map to the @replay_interface
253
+ System.targets.each do |name, target|
254
+ target.interface = @replay_interface unless target.interface
255
+ end
256
+ end
231
257
 
232
258
  # Properly shuts down the command and telemetry server by stoping the
233
259
  # JSON-RPC server, background tasks, routers, and interfaces. Also kills
@@ -305,21 +331,24 @@ module Cosmos
305
331
  if log_change
306
332
  # Write to Server Messages that limits state has changed
307
333
  tgt_pkt_item_str = "#{packet.target_name} #{packet.packet_name} #{item.name} = #{value} is"
334
+ packet_time = packet.packet_time
335
+ pkt_time_str = ""
336
+ pkt_time_str << " (#{packet.packet_time.sys.formatted})" if packet_time
308
337
  case item.limits.state
309
338
  when :BLUE
310
- Logger.info "<B>#{tgt_pkt_item_str} #{item.limits.state}"
339
+ Logger.info "<B>#{tgt_pkt_item_str} #{item.limits.state}#{pkt_time_str}"
311
340
  when :GREEN, :GREEN_LOW, :GREEN_HIGH
312
- Logger.info "<G>#{tgt_pkt_item_str} #{item.limits.state}"
341
+ Logger.info "<G>#{tgt_pkt_item_str} #{item.limits.state}#{pkt_time_str}"
313
342
  when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
314
- Logger.warn "<Y>#{tgt_pkt_item_str} #{item.limits.state}"
343
+ Logger.warn "<Y>#{tgt_pkt_item_str} #{item.limits.state}#{pkt_time_str}"
315
344
  when :RED, :RED_LOW, :RED_HIGH
316
- Logger.error "<R>#{tgt_pkt_item_str} #{item.limits.state}"
345
+ Logger.error "<R>#{tgt_pkt_item_str} #{item.limits.state}#{pkt_time_str}"
317
346
  else
318
- Logger.error "#{tgt_pkt_item_str} UNKNOWN"
347
+ Logger.error "#{tgt_pkt_item_str} UNKNOWN#{pkt_time_str}"
319
348
  end
320
349
  end
321
350
 
322
- post_limits_event(:LIMITS_CHANGE, [packet.target_name, packet.packet_name, item.name, old_limits_state, item.limits.state])
351
+ post_limits_event(:LIMITS_CHANGE, [packet.target_name, packet.packet_name, item.name, old_limits_state, item.limits.state, packet_time ? packet_time.tv_sec : nil, packet_time ? packet_time.tv_usec : nil])
323
352
 
324
353
  if @mode == :CMD_TLM_SERVER
325
354
  if item.limits.response
@@ -457,7 +486,7 @@ module Cosmos
457
486
  received_time = packet.received_time
458
487
  received_time ||= Time.now.sys
459
488
  queue << [packet.buffer, target_name, packet_name,
460
- received_time.tv_sec, received_time.tv_usec, packet.received_count]
489
+ received_time.tv_sec, received_time.tv_usec, packet.received_count, packet.stored, packet.extra]
461
490
  if queue.length > queue_size
462
491
  # Drop queue
463
492
  queues_to_drop << id
@@ -529,7 +558,7 @@ module Cosmos
529
558
  received_time = packet.received_time
530
559
  received_time ||= Time.now.sys
531
560
  @@instance.packet_data_queues[id][0] << [packet.buffer, 'SYSTEM', 'META',
532
- received_time.tv_sec, received_time.tv_usec, packet.received_count]
561
+ received_time.tv_sec, received_time.tv_usec, packet.received_count, packet.stored, packet.extra]
533
562
  end
534
563
  end
535
564
  return id
@@ -572,7 +601,7 @@ module Cosmos
572
601
  rescue ThreadError
573
602
  received_time ||= Time.now.sys
574
603
  return [@last_subscribed_packet.buffer, @last_subscribed_packet.target_name,
575
- @last_subscribed_packet.packet_name, received_time.tv_sec, received_time.tv_usec, @last_subscribed_packet.received_count]
604
+ @last_subscribed_packet.packet_name, received_time.tv_sec, received_time.tv_usec, @last_subscribed_packet.received_count, @last_subscribed_packet.stored, @last_subscribed_packet.extra]
576
605
  end
577
606
  else
578
607
  return queue.pop(non_block)
@@ -153,7 +153,7 @@ module Cosmos
153
153
  current_interface_or_router.name = interface_name
154
154
  @interfaces[interface_name] = current_interface_or_router
155
155
 
156
- when 'LOG', 'DONT_LOG', 'TARGET'
156
+ when 'LOG', 'LOG_STORED', 'DONT_LOG', 'TARGET'
157
157
  raise parser.error("No current interface for #{keyword}") unless current_interface_or_router and current_type == :INTERFACE
158
158
 
159
159
  case keyword
@@ -166,6 +166,12 @@ module Cosmos
166
166
  current_interface_log_added = true
167
167
  current_interface_or_router.packet_log_writer_pairs << packet_log_writer_pair unless current_interface_or_router.packet_log_writer_pairs.include?(packet_log_writer_pair)
168
168
 
169
+ when 'LOG_STORED'
170
+ parser.verify_num_parameters(1, 1, "#{keyword} <Packet Log Writer Name>")
171
+ packet_log_writer_pair = @packet_log_writer_pairs[params[0].upcase]
172
+ raise parser.error("Unknown packet log writer: #{params[0].upcase}") unless packet_log_writer_pair
173
+ current_interface_or_router.stored_packet_log_writer_pairs << packet_log_writer_pair unless current_interface_or_router.stored_packet_log_writer_pairs.include?(packet_log_writer_pair)
174
+
169
175
  when 'DONT_LOG'
170
176
  parser.verify_num_parameters(0, 0, "#{keyword}")
171
177
  current_interface_or_router.packet_log_writer_pairs = []
@@ -210,6 +216,7 @@ module Cosmos
210
216
  when 'LOG_RAW', 'ROUTER_LOG_RAW'
211
217
  parser.verify_num_parameters(0, nil, "#{keyword} <Raw Logger Class File (optional)> <Raw Logger Parameters (optional)>")
212
218
  current_interface_or_router.raw_logger_pair = RawLoggerPair.new(current_interface_or_router.name, params)
219
+ current_interface_or_router.start_raw_logging
213
220
 
214
221
  when 'OPTION'
215
222
  parser.verify_num_parameters(2, nil, "#{keyword} <Option Name> <Option Value 1> <Option Value 2 (optional)> <etc>")
@@ -56,9 +56,6 @@ else
56
56
  option_parser.on("--system FILE", "Use an alternative system.txt file") do |arg|
57
57
  System.instance(File.join(USERPATH, 'config', 'system', arg))
58
58
  end
59
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
60
- options.config_file = arg
61
- end
62
59
  end
63
60
 
64
61
  return parser, options
@@ -75,7 +72,6 @@ else
75
72
  end
76
73
 
77
74
  module Cosmos
78
-
79
75
  # Implements the GUI functions of the Command and Telemetry Server. All the
80
76
  # QT calls are implemented here. The non-GUI functionality is contained in
81
77
  # the CmdTlmServer class.
@@ -129,7 +125,7 @@ module Cosmos
129
125
  @first_output = 0
130
126
  @options = options
131
127
 
132
- statusBar.showMessage(tr("")) # Show blank message to initialize status bar
128
+ statusBar.showMessage("") # Show blank message to initialize status bar
133
129
 
134
130
  initialize_actions()
135
131
  initialize_menus()
@@ -194,26 +190,27 @@ module Cosmos
194
190
  super()
195
191
 
196
192
  # File actions
197
- @file_reload = Qt::Action.new(tr('&Reload Configuration'), self)
198
- @file_reload.statusTip = tr('Reload configuraton and reset')
193
+ @file_reload = Qt::Action.new('&Reload Configuration', self)
194
+ @file_reload.shortcut = Qt::KeySequence.new('Ctrl+Shift+R')
195
+ @file_reload.statusTip = 'Reload configuraton and reset'
199
196
  @file_reload.connect(SIGNAL('triggered()')) do
200
197
  CmdTlmServer.instance.reload()
201
198
  end
202
199
 
203
200
  # Edit actions
204
- @edit_clear_counters = Qt::Action.new(tr('&Clear Counters'), self)
205
- @edit_clear_counters.statusTip = tr('Clear counters for all interfaces and targets')
201
+ @edit_clear_counters = Qt::Action.new('&Clear Counters', self)
202
+ @edit_clear_counters.statusTip = 'Clear counters for all interfaces and targets'
206
203
  @edit_clear_counters.connect(SIGNAL('triggered()')) { CmdTlmServer.clear_counters }
207
204
  end
208
205
 
209
206
  def initialize_menus
210
- @file_menu = menuBar.addMenu(tr('&File'))
207
+ @file_menu = menuBar.addMenu('&File')
211
208
  @file_menu.addAction(@file_reload)
212
209
  @file_menu.addAction(@exit_action)
213
210
 
214
211
  # Do not allow clear counters in production mode
215
212
  unless @production
216
- @edit_menu = menuBar.addMenu(tr('&Edit'))
213
+ @edit_menu = menuBar.addMenu('&Edit')
217
214
  @edit_menu.addAction(@edit_clear_counters)
218
215
  end
219
216
 
@@ -262,7 +259,7 @@ module Cosmos
262
259
  end
263
260
  @targets_tab = TargetsTab.new(@tab_widget)
264
261
  @commands_tab = PacketsTab.new(self, PacketsTab::COMMANDS, @tab_widget)
265
- @telemetry_tab = PacketsTab.new(self, PacketsTab::TELEMETRY, @tab_widget)
262
+ @telemetry_tab = PacketsTab.new(self, PacketsTab::TELEMETRY, @tab_widget, (@mode == :REPLAY))
266
263
  @routers_tab = InterfacesTab.new(self, InterfacesTab::ROUTERS, @tab_widget)
267
264
  if @mode == :CMD_TLM_SERVER
268
265
  @logging_tab = LoggingTab.new(@production, @tab_widget)
@@ -271,6 +268,7 @@ module Cosmos
271
268
  end
272
269
 
273
270
  def config_change_callback
271
+ CmdTlmServer.instance.replay_map_targets_to_interfaces
274
272
  start(nil)
275
273
  end
276
274
 
@@ -546,6 +544,8 @@ module Cosmos
546
544
  def self.post_options_parsed_hook(options)
547
545
  @options = options
548
546
  if options.no_gui
547
+ normalize_config_options(options)
548
+
549
549
  ["TERM", "INT"].each {|sig| Signal.trap(sig) {exit}}
550
550
 
551
551
  begin
@@ -613,16 +613,15 @@ module Cosmos
613
613
  # Set the default title which can be overridden in the config file
614
614
  options.title = TOOL_NAME
615
615
  options.auto_size = false
616
- options.config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
617
616
  options.production = false
618
617
  options.no_prompt = false
619
618
  options.no_gui = false
620
619
  options.replay_routers = false
620
+ options.config_file = true # config_file is required
621
+ # Set config_dir because by default it would be config/tools/cmd_tlm_server_gui
622
+ options.config_dir = File.join(Cosmos::USERPATH, 'config', 'tools', 'cmd_tlm_server')
621
623
 
622
624
  option_parser.separator "CTS Specific Options:"
623
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
624
- options.config_file = arg
625
- end
626
625
  option_parser.on("-p", "--production", "Run the server in production mode which disables the ability to stop logging.") do |arg|
627
626
  options.production = true
628
627
  end
@@ -641,12 +640,11 @@ module Cosmos
641
640
  end
642
641
  else
643
642
  options.replay = false
644
- end
643
+ end
645
644
  end
646
645
 
647
646
  super(option_parser, options)
648
647
  end
649
648
  end
650
-
651
- end # class CmdTlmServerGui
652
- end # module Cosmos
649
+ end
650
+ end
@@ -52,6 +52,8 @@ module Cosmos
52
52
  if identified_command
53
53
  identified_command.received_time = packet.received_time
54
54
  identified_command.raw = packet.raw
55
+ identified_command.stored = packet.stored
56
+ identified_command.extra = packet.extra
55
57
  packet = identified_command
56
58
  end
57
59
  end
@@ -69,6 +71,8 @@ module Cosmos
69
71
  end
70
72
  command.received_time = packet.received_time
71
73
  command.raw = packet.raw
74
+ command.stored = packet.stored
75
+ command.extra = packet.extra
72
76
  command.buffer = packet.buffer
73
77
  command.received_count += 1
74
78
  Logger.info System.commands.format(command, target.ignored_parameters) if !command.messages_disabled and command.target_name != 'UNKNOWN'
@@ -99,8 +103,15 @@ module Cosmos
99
103
  end
100
104
 
101
105
  # Write to command packet logs
102
- interface.packet_log_writer_pairs.each do |packet_log_writer_pair|
103
- packet_log_writer_pair.cmd_log_writer.write(command)
106
+ if command.stored and !interface.stored_packet_log_writer_pairs.empty?
107
+ interface.stored_packet_log_writer_pairs.each do |packet_log_writer_pair|
108
+ packet_log_writer_pair.cmd_log_writer.write(command)
109
+ end
110
+ else
111
+ interface.packet_log_writer_pairs.each do |packet_log_writer_pair|
112
+ # Write errors are handled by the log writer
113
+ packet_log_writer_pair.cmd_log_writer.write(command)
114
+ end
104
115
  end
105
116
  end
106
117
 
@@ -127,7 +127,7 @@ module Cosmos
127
127
  def populate_interface_table(interfaces, interfaces_table)
128
128
  row = 0
129
129
  interfaces.all.each do |interface_name, interface|
130
- item = Qt::TableWidgetItem.new(Qt::Object.tr(interface_name))
130
+ item = Qt::TableWidgetItem.new(interface_name)
131
131
  item.setTextAlignment(ALIGN_CENTER)
132
132
  interfaces_table.setItem(row, 0, item)
133
133
  interfaces_table.setCellWidget(row, 1, create_button(interface, interface_name))
@@ -138,7 +138,7 @@ module Cosmos
138
138
  interface.bytes_written, interface.bytes_read,
139
139
  interface.write_count, interface.read_count].each do |val|
140
140
 
141
- item = Qt::TableWidgetItem.new(val.to_s)#Qt::Object.tr(val.to_s))
141
+ item = Qt::TableWidgetItem.new(val.to_s)
142
142
  item.setTextAlignment(ALIGN_CENTER)
143
143
  interfaces_table.setItem(row, index, item)
144
144
  index += 1
@@ -77,7 +77,7 @@ module Cosmos
77
77
 
78
78
  def populate_logging_actions(layout)
79
79
  # Add all the action buttons
80
- actions = Qt::GroupBox.new(Qt::Object.tr("Actions"))
80
+ actions = Qt::GroupBox.new("Actions")
81
81
  actions_layout = Qt::VBoxLayout.new(actions)
82
82
  button_layout = Qt::GridLayout.new
83
83
 
@@ -92,13 +92,13 @@ module Cosmos
92
92
 
93
93
  log_buttons.each do |text, location, method|
94
94
  next if text =~ /Stop/ and @production
95
- button = Qt::PushButton.new(Qt::Object.tr(text))
95
+ button = Qt::PushButton.new(text)
96
96
  button_layout.addWidget(button, location[0], location[1])
97
97
  button.connect(SIGNAL('clicked()')) do
98
98
  begin
99
99
  CmdTlmServer.instance.send(method, 'ALL')
100
100
  rescue Exception => error
101
- statusBar.showMessage(Qt::Object.tr(error.message))
101
+ statusBar.showMessage(error.message)
102
102
  end
103
103
  end
104
104
  end
@@ -109,13 +109,13 @@ module Cosmos
109
109
  end
110
110
 
111
111
  def create_log_layout(form_layout, log_writer, label_prefix)
112
- label = Qt::Label.new(Qt::Object.tr(log_writer.logging_enabled.to_s))
112
+ label = Qt::Label.new(log_writer.logging_enabled.to_s)
113
113
  label.setTextInteractionFlags(Qt::TextSelectableByMouse)
114
114
  form_layout.addRow("#{label_prefix} Logging:", label)
115
- label = Qt::Label.new(Qt::Object.tr(log_writer.queue.size.to_s))
115
+ label = Qt::Label.new(log_writer.queue.size.to_s)
116
116
  label.setTextInteractionFlags(Qt::TextSelectableByMouse)
117
117
  form_layout.addRow("#{label_prefix} Queue Size:", label)
118
- label = Qt::Label.new(Qt::Object.tr(log_writer.filename))
118
+ label = Qt::Label.new(log_writer.filename)
119
119
  label.setTextInteractionFlags(Qt::TextSelectableByMouse)
120
120
  form_layout.addRow("#{label_prefix} Filename:", label)
121
121
  file_size = 0
@@ -124,7 +124,7 @@ module Cosmos
124
124
  rescue Exception
125
125
  # Do nothing on error
126
126
  end
127
- label = Qt::Label.new(Qt::Object.tr(file_size.to_s))
127
+ label = Qt::Label.new(file_size.to_s)
128
128
  label.setTextInteractionFlags(Qt::TextSelectableByMouse)
129
129
  form_layout.addRow("#{label_prefix} File Size:", label)
130
130
  end
@@ -142,30 +142,30 @@ module Cosmos
142
142
 
143
143
  form_layout = Qt::FormLayout.new
144
144
  @logging_layouts[packet_log_writer_pair_name] = form_layout
145
- label = Qt::Label.new(Qt::Object.tr(interfaces.join(", ")))
145
+ label = Qt::Label.new(interfaces.join(", "))
146
146
  label.setTextInteractionFlags(Qt::TextSelectableByMouse)
147
147
  form_layout.addRow("Interfaces:", label)
148
148
  create_log_layout(form_layout, packet_log_writer_pair.cmd_log_writer, 'Cmd')
149
149
  create_log_layout(form_layout, packet_log_writer_pair.tlm_log_writer, 'Tlm')
150
150
 
151
151
  button_layout = Qt::HBoxLayout.new
152
- start_button = Qt::PushButton.new(Qt::Object.tr('Start Cmd Logging'))
152
+ start_button = Qt::PushButton.new('Start Cmd Logging')
153
153
  button_layout.addWidget(start_button)
154
154
  start_button.connect(SIGNAL('clicked()')) do
155
155
  CmdTlmServer.instance.start_cmd_log(packet_log_writer_pair_name)
156
156
  end
157
- start_button = Qt::PushButton.new(Qt::Object.tr('Start Tlm Logging'))
157
+ start_button = Qt::PushButton.new('Start Tlm Logging')
158
158
  button_layout.addWidget(start_button)
159
159
  start_button.connect(SIGNAL('clicked()')) do
160
160
  CmdTlmServer.instance.start_tlm_log(packet_log_writer_pair_name)
161
161
  end
162
162
  if @production == false
163
- stop_button = Qt::PushButton.new(Qt::Object.tr('Stop Cmd Logging'))
163
+ stop_button = Qt::PushButton.new('Stop Cmd Logging')
164
164
  button_layout.addWidget(stop_button)
165
165
  stop_button.connect(SIGNAL('clicked()')) do
166
166
  CmdTlmServer.instance.stop_cmd_log(packet_log_writer_pair_name)
167
167
  end
168
- stop_button = Qt::PushButton.new(Qt::Object.tr('Stop Tlm Logging'))
168
+ stop_button = Qt::PushButton.new('Stop Tlm Logging')
169
169
  button_layout.addWidget(stop_button)
170
170
  stop_button.connect(SIGNAL('clicked()')) do
171
171
  CmdTlmServer.instance.stop_tlm_log(packet_log_writer_pair_name)
@@ -175,7 +175,7 @@ module Cosmos
175
175
  log_layout.addLayout(form_layout)
176
176
  layout.addWidget(log)
177
177
  end
178
- layout.addWidget(Qt::Label.new(Qt::Object.tr("Note: Buffered IO operations cause file size to not reflect total logged data size until the log file is closed.")))
178
+ layout.addWidget(Qt::Label.new("Note: Buffered IO operations cause file size to not reflect total logged data size until the log file is closed."))
179
179
  end
180
180
  end
181
181
  end