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
@@ -16,15 +16,12 @@ end
16
16
 
17
17
  module Cosmos
18
18
 
19
- # TlmGrapher class
20
- #
21
- # This class implements the TlmGrapher Application. This application displays multiple line graphs
22
- # that perform various analysis on housekeeping telemetry.
23
- #
19
+ # Telemetry Grapher displays multiple line graphs that perform various
20
+ # analysis on housekeeping telemetry.
24
21
  class TlmGrapher < TabbedPlotsTool
25
22
 
26
23
  # Runs the application
27
- def self.run (opts = nil, options = nil)
24
+ def self.run(opts = nil, options = nil)
28
25
  Cosmos.catch_fatal_exception do
29
26
  unless options
30
27
  opts, options = create_default_options()
@@ -32,8 +29,6 @@ module Cosmos
32
29
  options.width = 1000
33
30
  options.height = 800
34
31
  options.title = "Telemetry Grapher"
35
- options.config_dir = 'tlm_grapher'
36
- options.config_file = 'tlm_grapher.txt'
37
32
  options.tool_short_name = 'tlmgrapher'
38
33
  options.tabbed_plots_type = 'overview'
39
34
  options.data_object_types = ['HOUSEKEEPING', 'XY','SINGLEXY']
@@ -43,12 +38,10 @@ module Cosmos
43
38
  options.adder_orientation = Qt::Horizontal
44
39
  options.items = []
45
40
  options.start = false
41
+ options.replay = false
46
42
  options.about_string = "TlmGrapher provides realtime and log file graphing abilities to the COSMOS system."
47
43
 
48
44
  opts.separator "Telemetry Grapher Specific Options:"
49
- opts.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
50
- options.config_file = arg
51
- end
52
45
  opts.on("-s", "--start", "Start graphing immediately") do |arg|
53
46
  options.start = true
54
47
  end
@@ -60,6 +53,9 @@ module Cosmos
60
53
  end
61
54
  options.items << split
62
55
  end
56
+ opts.on("--replay", "Start Telemetry Grapher in Replay mode") do
57
+ options.replay = true
58
+ end
63
59
  end
64
60
 
65
61
  super(opts, options)
@@ -77,17 +73,24 @@ module Cosmos
77
73
  target_name.upcase!
78
74
  packet_name.upcase!
79
75
  item_name.upcase!
80
- # Check to see if the item name is followed by an array index,
81
- # notated by square brackets around an integer; i.e. ARRAY_ITEM[1]
82
- if (item_name =~ /\[\d+\]$/)
83
- # We found an array index.
84
- # The $` special variable is the string before the regex match, i.e. ARRAY_ITEM
85
- item_name = $`
86
- # The $& special variable is the string matched by the regex, i.e. [1].
87
- # Strip off the brackets and then convert the array index to an integer.
88
- item_array_index = $&.gsub(/[\[\]]/, "").to_i
89
- else
90
- item_array_index = nil
76
+
77
+ item_array_index = nil
78
+ begin
79
+ # See if we can access the item
80
+ _, item = System.telemetry.packet_and_item(target_name, packet_name, item_name)
81
+ rescue => error
82
+ # Check to see if the item name is followed by an array index,
83
+ # notated by square brackets around an integer; i.e. ARRAY_ITEM[1]
84
+ if (item_name =~ /\[\d+\]$/)
85
+ # The $` special variable is the string before the regex match, i.e. ARRAY_ITEM
86
+ item_name = $`
87
+ # The $& special variable is the string matched by the regex, i.e. [1].
88
+ # Strip off the brackets and then convert the array index to an integer.
89
+ item_array_index = $&.gsub(/[\[\]]/, "").to_i
90
+ else
91
+ # If we couldn't access the item and it's not bracket notation then it's an error
92
+ raise error
93
+ end
91
94
  end
92
95
  # Default configuration has one plot so don't add plot for first item
93
96
  data_object = HousekeepingDataObject.new
@@ -97,7 +100,5 @@ module Cosmos
97
100
  plot_index += 1
98
101
  end
99
102
  end
100
-
101
- end # class TlmGrapher
102
-
103
- end # module Cosmos
103
+ end
104
+ end
@@ -11,8 +11,10 @@
11
11
  require 'cosmos'
12
12
  require 'cosmos/gui/qt'
13
13
  require 'cosmos/gui/qt_tool'
14
+ require 'cosmos/gui/utilities/classification_banner'
14
15
  require 'cosmos/script'
15
16
  require 'cosmos/tools/tlm_viewer/widgets'
17
+ require 'tempfile'
16
18
 
17
19
  module Cosmos
18
20
 
@@ -21,7 +23,9 @@ module Cosmos
21
23
  # close_all_screens is called
22
24
  @@open_screens = []
23
25
 
24
- attr_accessor :full_name, :width, :height, :window, :replay_flag
26
+ attr_accessor :full_name, :width, :height, :window, :replay_flag, :original_target_name
27
+
28
+ include ClassificationBanner
25
29
 
26
30
  class Widgets
27
31
  # Flag to indicate all screens should close
@@ -33,10 +37,12 @@ module Cosmos
33
37
  @@closing_all = value
34
38
  end
35
39
 
36
- def initialize(screen, mode)
40
+ def initialize(screen, mode, local_binding = nil)
37
41
  @screen = screen
38
42
  # The telemetry viewer mode. Must be :REALTIME or basically anything else?
39
43
  @mode = mode
44
+ # Local binding to evaluate LOCAL target
45
+ @local_binding = local_binding
40
46
  # Hash of only the named widgets identifed by the NAMED_WIDGET keyword
41
47
  @named = {}
42
48
  # Array of all widgets which take a value
@@ -84,7 +90,7 @@ module Cosmos
84
90
 
85
91
  def add_widget(klass, parameters, widget, widget_name, substitute, original_target_name, force_substitute)
86
92
  # Add to item or non_item widgets
87
- if klass.takes_value?
93
+ if klass.takes_value? and substitute != 'LOCAL' and parameters[0] != 'LOCAL'
88
94
  if substitute and (original_target_name == parameters[0].upcase or force_substitute)
89
95
  @items << [substitute, parameters[1], parameters[2]]
90
96
  else
@@ -113,7 +119,7 @@ module Cosmos
113
119
  @value_thread = Thread.new do
114
120
  begin
115
121
  while(true)
116
- break if @@closing_all
122
+ break if @@closing_all or !@alive
117
123
  time = Time.now.sys
118
124
 
119
125
  if !@item.empty?
@@ -137,7 +143,7 @@ module Cosmos
137
143
  @limits_set = limits_set
138
144
  end
139
145
  rescue DRb::DRbConnError
140
- break if @@closing_all
146
+ break if @@closing_all or !@alive
141
147
  break if @value_sleeper.sleep(1)
142
148
  next
143
149
  end
@@ -145,7 +151,7 @@ module Cosmos
145
151
 
146
152
  Qt.execute_in_main_thread {update_gui()} if @alive and (@mode == :REALTIME)
147
153
  delta = Time.now.sys - time
148
- break if @@closing_all
154
+ break if @@closing_all or !@alive
149
155
  if @polling_period - delta > 0
150
156
  break if @value_sleeper.sleep(@polling_period - delta)
151
157
  else
@@ -178,7 +184,27 @@ module Cosmos
178
184
 
179
185
  # Update non_item widgets
180
186
  @non_item.each do |widget|
181
- widget.update_widget
187
+ if widget.class.takes_value?
188
+ # LOCAL value
189
+ eval_binding = @local_binding
190
+ begin
191
+ eval_binding = ScriptRunnerFrame.instance.script_binding
192
+ @local_binding = eval_binding
193
+ rescue Exception
194
+ # Fall back on @local_binding
195
+ end
196
+
197
+ begin
198
+ widget.limits_state = nil
199
+ widget.value = eval_binding.eval(widget.item_name)
200
+ rescue Exception
201
+ # Bad local variable or binding no longer valid
202
+ widget.limits_state = :STALE
203
+ widget.value = widget.value
204
+ end
205
+ else
206
+ widget.update_widget
207
+ end
182
208
  end
183
209
  end
184
210
  rescue Exception => error
@@ -190,7 +216,7 @@ module Cosmos
190
216
 
191
217
  def shutdown
192
218
  @alive = false
193
- Cosmos.kill_thread(self, @value_thread)
219
+ Cosmos.kill_thread(self, @value_thread, 2, 0.1, 2)
194
220
 
195
221
  # Shutdown All Widgets
196
222
  widgets().each do |widget|
@@ -203,7 +229,7 @@ module Cosmos
203
229
  end
204
230
  end
205
231
 
206
- def initialize(full_name, filename, notify_on_close = nil, mode = :REALTIME, x_pos = nil, y_pos = nil, original_target_name = nil, substitute = nil, force_substitute = false, single_screen = false)
232
+ def initialize(full_name, filename_or_screen_def, notify_on_close = nil, mode = :REALTIME, x_pos = nil, y_pos = nil, original_target_name = nil, substitute = nil, force_substitute = false, single_screen = false, local_binding = nil)
207
233
  super(nil)
208
234
  # The full name of the widget which goes in the title
209
235
  @full_name = full_name
@@ -224,15 +250,20 @@ module Cosmos
224
250
  # displayed as a stand alone screen and not launched as a part of the
225
251
  # regular TlmViewer application
226
252
  @single_screen = single_screen
253
+ # Binding for use with LOCAL LOCAL
254
+ @local_binding = local_binding
227
255
 
228
256
  # Read the application wide stylesheet if it exists
229
257
  app_style = File.join(Cosmos::USERPATH, 'config', 'tools', 'application.css')
230
258
  setStyleSheet(File.read(app_style)) if File.exist? app_style
231
259
 
232
260
  @replay_flag = nil
233
- @widgets = Widgets.new(self, mode)
234
- @window = process(filename)
261
+ @widgets = Widgets.new(self, mode, @local_binding)
262
+ @window = process(filename_or_screen_def)
235
263
  @@open_screens << self if @window
264
+
265
+ # Add a banner based on system configuration
266
+ add_classification_banner
236
267
  end
237
268
 
238
269
  def widgets
@@ -247,7 +278,7 @@ module Cosmos
247
278
  @widgets.mode
248
279
  end
249
280
 
250
- def process(filename)
281
+ def process(filename_or_screen_def)
251
282
  layout_stack = []
252
283
  layout_stack[0] = nil
253
284
 
@@ -256,6 +287,16 @@ module Cosmos
256
287
  global_settings = {}
257
288
  global_subsettings = {}
258
289
 
290
+ if File.exist?(filename_or_screen_def) or !filename_or_screen_def.to_s.index("SCREEN")
291
+ tempfile = false
292
+ filename = filename_or_screen_def
293
+ else
294
+ tempfile = Tempfile.new('screen')
295
+ tempfile.write(filename_or_screen_def)
296
+ tempfile.close
297
+ filename = tempfile.path
298
+ end
299
+
259
300
  begin
260
301
  parser = ConfigParser.new("http://cosmosrb.com/docs/screens/")
261
302
  parser.instance_variable_set(:@original_target_name, @original_target_name)
@@ -299,6 +340,7 @@ module Cosmos
299
340
  # to the stack and that class doesn't have a complete method.
300
341
  current_widget.complete() if current_widget.respond_to? :complete
301
342
  when 'SETTING'
343
+ next unless current_widget
302
344
  parser.verify_num_parameters(1, nil, "#{keyword} <Setting Name> <Setting Values... (optional)>")
303
345
  if parameters.length > 1
304
346
  current_widget.set_setting(parameters[0], parameters[1..-1])
@@ -306,6 +348,7 @@ module Cosmos
306
348
  current_widget.set_setting(parameters[0], [])
307
349
  end
308
350
  when 'SUBSETTING'
351
+ next unless current_widget
309
352
  parser.verify_num_parameters(2, nil, "#{keyword} <Widget Index (0..?)> <Setting Name> <Setting Values... (optional)>")
310
353
  if parameters.length > 2
311
354
  current_widget.set_subsetting(parameters[0], parameters[1], parameters[2..-1])
@@ -322,6 +365,8 @@ module Cosmos
322
365
  klass = Cosmos.require_class(parameters[0].to_s.downcase + '_widget')
323
366
  global_subsettings[klass] ||= []
324
367
  global_subsettings[klass] << [parameters[1]].concat(parameters[2..-1])
368
+ when 'STAY_ON_TOP'
369
+ setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint)
325
370
  else
326
371
  current_widget = process_widget(parser, keyword, parameters, layout_stack, global_settings, global_subsettings)
327
372
  end # case keyword
@@ -336,6 +381,8 @@ module Cosmos
336
381
  end
337
382
  shutdown()
338
383
  return nil
384
+ ensure
385
+ tempfile.unlink if tempfile
339
386
  end
340
387
 
341
388
  unless @widgets.invalid.empty?
@@ -387,10 +434,14 @@ module Cosmos
387
434
  parser.verify_num_parameters(3, nil, "#{keyword} <Target Name> <Packet Name> <Item Name> <Widget Settings... (optional)>")
388
435
  begin
389
436
  if @substitute and (@original_target_name == parameters[0].upcase or @force_substitute)
390
- System.telemetry.packet_and_item(@substitute, parameters[1], parameters[2])
437
+ if @substitute != 'LOCAL' or parameters[1] != 'LOCAL'
438
+ System.telemetry.packet_and_item(@substitute, parameters[1], parameters[2])
439
+ end
391
440
  widget = klass.new(layout_stack[-1], @substitute, *parameters[1..(parameters.length - 1)])
392
441
  else
393
- System.telemetry.packet_and_item(*parameters[0..2])
442
+ if parameters[0] != 'LOCAL' or parameters[1] != 'LOCAL'
443
+ System.telemetry.packet_and_item(*parameters[0..2])
444
+ end
394
445
  widget = klass.new(layout_stack[-1], *parameters)
395
446
  end
396
447
  rescue => err
@@ -470,6 +521,8 @@ module Cosmos
470
521
  end
471
522
 
472
523
  self.dispose
524
+
525
+ @window = nil
473
526
  end
474
527
 
475
528
  def get_named_widget(widget_name)
@@ -488,6 +541,15 @@ module Cosmos
488
541
  @widgets.graceful_kill
489
542
  end
490
543
 
544
+ def close
545
+ Qt.execute_in_main_thread(true) do
546
+ if @window
547
+ super()
548
+ @window = nil
549
+ end
550
+ end
551
+ end
552
+
491
553
  def self.open_screens
492
554
  @@open_screens
493
555
  end
@@ -10,14 +10,14 @@
10
10
 
11
11
  require 'cosmos'
12
12
  Cosmos.catch_fatal_exception do
13
- require 'cosmos/script'
14
- require 'cosmos/tools/tlm_viewer/screen'
15
13
  require 'cosmos/gui/qt_tool'
16
14
  require 'cosmos/gui/dialogs/splash'
17
15
  require 'cosmos/gui/dialogs/progress_dialog'
18
16
  require 'cosmos/gui/dialogs/select_dialog'
19
17
  require 'cosmos/gui/widgets/full_text_search_line_edit'
20
18
  require 'cosmos/tools/tlm_viewer/tlm_viewer_config'
19
+ require 'cosmos/tools/tlm_viewer/screen'
20
+ require 'cosmos/script'
21
21
  require 'find'
22
22
  require 'fileutils'
23
23
  end
@@ -53,13 +53,19 @@ module Cosmos
53
53
  @@instance = nil
54
54
 
55
55
  def self.instance
56
+ unless @@instance
57
+ _, options = create_default_options()
58
+ options.listen = false
59
+ options.show_main = false
60
+ TlmViewer.new(options)
61
+ end
56
62
  @@instance
57
63
  end
58
64
 
59
65
  def self.load_config(filename)
60
66
  raise "Configuration file #{filename} does not exist." unless filename && File.exist?(filename)
61
67
 
62
- # Find all screen files so we can calculate MD5
68
+ # Find all screen files so we can calculate hashing sum
63
69
  tlmviewer_files = [filename, System.initial_filename]
64
70
  additional_data = ''
65
71
  System.targets.each do |target_name, target|
@@ -79,9 +85,13 @@ module Cosmos
79
85
  end
80
86
  end
81
87
  end
82
- # Calculate MD5 and attempt to load marshal file
83
- md5 = Cosmos.md5_files(tlmviewer_files, additional_data)
84
- marshal_filename = File.join(System.paths['TMP'], "tlmviewer_#{md5.hexdigest}.bin")
88
+ # Calculate the hashing sum and attempt to load marshal file
89
+ hashing_result = Cosmos.hash_files(tlmviewer_files, additional_data, System.hashing_algorithm)
90
+ # Only use at most, 32 characters of the hex
91
+ hash_string = hashing_result.hexdigest
92
+ hash_string = hash_string[-32..-1] if hash_string.length >= 32
93
+
94
+ marshal_filename = File.join(System.paths['TMP'], "tlmviewer_#{hash_string}.bin")
85
95
  config = Cosmos.marshal_load(marshal_filename)
86
96
  unless config
87
97
  # Marshal file load failed - Manually load configuration
@@ -114,12 +124,14 @@ module Cosmos
114
124
 
115
125
  Splash.execute(self) do |splash|
116
126
  ConfigParser.splash = splash
117
- splash.message = "Displaying requested screens"
127
+ if options.show_main
128
+ splash.message = "Displaying requested screens"
118
129
 
119
- # Startup desired screens once we're running
120
- @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
121
- if screen_info.show_on_startup
122
- display(screen_full_name, screen_info.x_pos, screen_info.y_pos)
130
+ # Startup desired screens once we're running
131
+ @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
132
+ if screen_info.show_on_startup
133
+ display(screen_full_name, screen_info.x_pos, screen_info.y_pos)
134
+ end
123
135
  end
124
136
  end
125
137
 
@@ -134,7 +146,7 @@ module Cosmos
134
146
  'clear_all']
135
147
  @json_drb.method_whitelist = whitelist
136
148
  begin
137
- @json_drb.start_service System.listen_hosts['TLMVIEWER_API'], port, self
149
+ @json_drb.start_service System.listen_hosts['TLMVIEWER_API'], port, self, 1000, System
138
150
  rescue Exception
139
151
  raise FatalError.new("Error starting JsonDRb on port #{port}.\nPerhaps a Telemetry Viewer is already running?")
140
152
  end
@@ -145,6 +157,7 @@ module Cosmos
145
157
  @all_telemetry = System.telemetry.all_item_strings(false, splash)
146
158
 
147
159
  Qt.execute_in_main_thread(true) do
160
+ toggle_replay_mode() if options.replay
148
161
  @search_box.completion_list = @tlm_viewer_config.completion_list
149
162
  @search_box.callback = lambda do |tlm|
150
163
  mapping = @tlm_viewer_config.tlm_to_screen_mapping[tlm]
@@ -158,38 +171,40 @@ module Cosmos
158
171
 
159
172
  ConfigParser.splash = nil
160
173
  end
174
+
175
+ hide() unless options.show_main
161
176
  end
162
177
 
163
178
  def initialize_actions
164
179
  super()
165
180
 
166
181
  # File actions
167
- @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save Configuration'), self)
168
- @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
182
+ @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), '&Save Configuration', self)
183
+ @file_save_keyseq = Qt::KeySequence.new('Ctrl+S')
169
184
  @file_save.shortcut = @file_save_keyseq
170
- @file_save.statusTip = tr('Save all screen positions')
185
+ @file_save.statusTip = 'Save all screen positions'
171
186
  @file_save.connect(SIGNAL('triggered()')) { file_save() }
172
187
 
173
- @file_generate = Qt::Action.new(tr('&Generate Screens'), self)
174
- @file_generate_keyseq = Qt::KeySequence.new(tr('Ctrl+G'))
188
+ @file_generate = Qt::Action.new('&Generate Screens', self)
189
+ @file_generate_keyseq = Qt::KeySequence.new('Ctrl+G')
175
190
  @file_generate.shortcut = @file_generate_keyseq
176
- @file_generate.statusTip = tr('Generate screen definition files')
191
+ @file_generate.statusTip = 'Generate screen definition files'
177
192
  @file_generate.connect(SIGNAL('triggered()')) { file_generate() }
178
193
 
179
- @file_audit = Qt::Action.new(tr('Audi&t Screens vs Tlm'), self)
180
- @file_audit_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
194
+ @file_audit = Qt::Action.new('Audi&t Screens vs Tlm', self)
195
+ @file_audit_keyseq = Qt::KeySequence.new('Ctrl+T')
181
196
  @file_audit.shortcut = @file_audit_keyseq
182
- @file_audit.statusTip = tr('Create a report listing which telemetry points are not on screens')
197
+ @file_audit.statusTip = 'Create a report listing which telemetry points are not on screens'
183
198
  @file_audit.connect(SIGNAL('triggered()')) { file_audit() }
184
199
 
185
- @replay_action = Qt::Action.new(tr('Toggle Replay Mode'), self)
186
- @replay_action.statusTip = tr('Toggle Replay Mode')
200
+ @replay_action = Qt::Action.new('Toggle Replay Mode', self)
201
+ @replay_action.statusTip = 'Toggle Replay Mode'
187
202
  @replay_action.connect(SIGNAL('triggered()')) { toggle_replay_mode() }
188
203
  end
189
204
 
190
205
  def initialize_menus(options)
191
206
  # File Menu
192
- @file_menu = menuBar.addMenu(tr('&File'))
207
+ @file_menu = menuBar.addMenu('&File')
193
208
  @file_menu.addAction(@file_save)
194
209
  @file_menu.addAction(@file_generate)
195
210
  @file_menu.addAction(@file_audit)
@@ -546,36 +561,36 @@ module Cosmos
546
561
  options.title = 'Telemetry Viewer'
547
562
  options.screen = nil
548
563
  options.listen = true
549
- options.config_file = nil
564
+ options.show_main = true
550
565
  options.restore_size = false
551
566
  options.production = false
567
+ options.replay = false
568
+ options.config_file = true # config_file is required
552
569
 
553
570
  option_parser.separator "Telemetry Viewer Specific Options:"
554
- option_parser.on("-c", "--config FILE", "Use the specified config file") { |arg| options.config_file = arg }
555
- option_parser.on("-s", "--screen FILE", "Start up the specified screen") { |arg| options.screen = arg }
571
+ option_parser.on("-s", "--screen SCREEN_NAME", "Start up the specified screen") { |arg| options.screen = arg }
556
572
  option_parser.on("-n", "--nolisten", "Don't listen for requests") do
557
573
  options.listen = false
558
574
  options.title << ' : Not Listening'
559
575
  end
560
- option_parser.on("-p", "--production", "Run TlmServer in production mode which disables the edit buttons.") do |arg|
576
+ option_parser.on("-p", "--production", "Run Telemetry Viewer in production mode which disables the edit buttons.") do |arg|
561
577
  options.production = true
562
578
  end
579
+ option_parser.on("--replay", "Run Telemetry Viewer in Replay mode") do
580
+ options.replay = true
581
+ end
563
582
  option_parser.parse!(ARGV)
564
583
  end
565
584
 
566
585
  if options.screen
586
+ normalize_config_options(options)
567
587
  application = nil
568
588
  begin
569
589
  QtTool.redirect_io
570
590
  System.telemetry
571
591
  application = Qt::Application.new(ARGV)
572
592
  application.addLibraryPath(Qt::PLUGIN_PATH) if Kernel.is_windows?
573
- if options.config_file
574
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', options.config_file)
575
- else
576
- filename = File.join(::Cosmos::USERPATH, 'config', 'tools', 'tlm_viewer', 'tlm_viewer.txt')
577
- end
578
- tlm_viewer_config = load_config(filename)
593
+ tlm_viewer_config = load_config(options.config_file)
579
594
  screen_info = tlm_viewer_config.screen_infos[options.screen.upcase]
580
595
  raise "Unknown screen: #{options.screen.upcase}" unless screen_info
581
596
  if not options.auto_position
@@ -583,6 +598,8 @@ module Cosmos
583
598
  else
584
599
  screen_info.screen = Screen.new(screen_info.full_name, screen_info.filename, nil, :REALTIME, screen_info.x_pos, screen_info.y_pos, screen_info.original_target_name, screen_info.substitute, screen_info.force_substitute, true)
585
600
  end
601
+ set_replay_mode(true) if options.replay
602
+ Screen.update_replay_mode
586
603
  application.exec
587
604
  rescue Exception => error
588
605
  unless error.class == SystemExit or error.class == Interrupt