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
@@ -12,6 +12,7 @@ require 'spec_helper'
12
12
  require 'cosmos'
13
13
  require 'cosmos/system/target'
14
14
  require 'tempfile'
15
+ require 'pathname'
15
16
 
16
17
  module Cosmos
17
18
 
@@ -167,8 +168,28 @@ module Cosmos
167
168
 
168
169
  # Initial require in target lib shouldn't be reported as error
169
170
  expect(Logger).to_not receive(:error)
170
- Target.new("INST").process_file(tf.path)
171
+ target = Target.new("INST")
172
+ target.process_file(tf.path)
171
173
  expect { SystemFile.new }.to_not raise_error
174
+ expect(Pathname.new(target.requires[0]).absolute?).to be true
175
+ File.delete filename
176
+ tf.unlink
177
+ end
178
+
179
+ it "requires a file with absolute path" do
180
+ filename = File.join(Cosmos::USERPATH, 'abs_path.rb')
181
+ File.open(filename, 'w') do |file|
182
+ file.puts "class AbsPath"
183
+ file.puts "end"
184
+ end
185
+ tf = Tempfile.new('unittest')
186
+ tf.puts("REQUIRE #{File.expand_path(filename)}")
187
+ tf.close
188
+
189
+ # Initial require in target lib shouldn't be reported as error
190
+ expect(Logger).to_not receive(:error)
191
+ Target.new("INST").process_file(tf.path)
192
+ expect { AbsPath.new }.to_not raise_error
172
193
  File.delete filename
173
194
  tf.unlink
174
195
  end
@@ -200,6 +221,46 @@ module Cosmos
200
221
  end
201
222
  end
202
223
 
224
+ context "with TLM_UNIQUE_ID_MODE" do
225
+ it "takes no parameters" do
226
+ tf = Tempfile.new('unittest')
227
+ tf.puts("")
228
+ tf.close
229
+ tgt = Target.new("TGT")
230
+ tgt.process_file(tf.path)
231
+ expect(tgt.tlm_unique_id_mode).to eql false
232
+ tf.unlink
233
+
234
+ tf = Tempfile.new('unittest')
235
+ tf.puts("TLM_UNIQUE_ID_MODE")
236
+ tf.close
237
+ tgt = Target.new("TGT")
238
+ tgt.process_file(tf.path)
239
+ expect(tgt.tlm_unique_id_mode).to eql true
240
+ tf.unlink
241
+ end
242
+ end
243
+
244
+ context "with CMD_UNIQUE_ID_MODE" do
245
+ it "takes no parameters" do
246
+ tf = Tempfile.new('unittest')
247
+ tf.puts("")
248
+ tf.close
249
+ tgt = Target.new("TGT")
250
+ tgt.process_file(tf.path)
251
+ expect(tgt.cmd_unique_id_mode).to eql false
252
+ tf.unlink
253
+
254
+ tf = Tempfile.new('unittest')
255
+ tf.puts("CMD_UNIQUE_ID_MODE")
256
+ tf.close
257
+ tgt = Target.new("TGT")
258
+ tgt.process_file(tf.path)
259
+ expect(tgt.cmd_unique_id_mode).to eql true
260
+ tf.unlink
261
+ end
262
+ end
263
+
203
264
  context "with COMMANDS and TELEMETRY" do
204
265
  it "takes 1 parameters" do
205
266
  tf = Tempfile.new('unittest')
@@ -497,7 +497,7 @@ DOC
497
497
  # Each element in the results array contains:
498
498
  # name, default, states, description, full units, units, required
499
499
  expect(result).to include ['TYPE',0,{"NORMAL"=>0,"SPECIAL"=>1},'Collect type',nil,nil,true,"UINT"]
500
- expect(result).to include ['TEMP',0.0,nil,'Collect temperature','Celcius','C',false,"FLOAT"]
500
+ expect(result).to include ['TEMP',0.0,nil,'Collect temperature','Celsius','C',false,"FLOAT"]
501
501
  end
502
502
 
503
503
  it "returns array parameters for the command" do
@@ -910,28 +910,34 @@ DOC
910
910
  @api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 0, TEMP2: 0, TEMP3: 0, TEMP4: 0}, :RAW)
911
911
 
912
912
  vals = @api.get_tlm_packet("INST","HEALTH_STATUS")
913
- expect(vals[0][0]).to eql "RECEIVED_TIMESECONDS"
913
+ expect(vals[0][0]).to eql "PACKET_TIMESECONDS"
914
914
  expect(vals[0][1]).to be > 0
915
915
  expect(vals[0][2]).to be_nil
916
- expect(vals[1][0]).to eql "RECEIVED_TIMEFORMATTED"
916
+ expect(vals[1][0]).to eql "PACKET_TIMEFORMATTED"
917
917
  expect(vals[1][1].split(' ')[0]).to eql Time.now.formatted.split(' ')[0]
918
918
  expect(vals[1][2]).to be_nil
919
- expect(vals[2][0]).to eql "RECEIVED_COUNT"
919
+ expect(vals[2][0]).to eql "RECEIVED_TIMESECONDS"
920
920
  expect(vals[2][1]).to be > 0
921
921
  expect(vals[2][2]).to be_nil
922
+ expect(vals[3][0]).to eql "RECEIVED_TIMEFORMATTED"
923
+ expect(vals[3][1].split(' ')[0]).to eql Time.now.formatted.split(' ')[0]
924
+ expect(vals[3][2]).to be_nil
925
+ expect(vals[4][0]).to eql "RECEIVED_COUNT"
926
+ expect(vals[4][1]).to be > 0
927
+ expect(vals[4][2]).to be_nil
922
928
  # Spot check a few more
923
- expect(vals[22][0]).to eql "TEMP1"
924
- expect(vals[22][1]).to eql -100.0
925
- expect(vals[22][2]).to eql :RED_LOW
926
- expect(vals[23][0]).to eql "TEMP2"
927
- expect(vals[23][1]).to eql -100.0
928
- expect(vals[23][2]).to eql :RED_LOW
929
- expect(vals[24][0]).to eql "TEMP3"
929
+ expect(vals[24][0]).to eql "TEMP1"
930
930
  expect(vals[24][1]).to eql -100.0
931
931
  expect(vals[24][2]).to eql :RED_LOW
932
- expect(vals[25][0]).to eql "TEMP4"
932
+ expect(vals[25][0]).to eql "TEMP2"
933
933
  expect(vals[25][1]).to eql -100.0
934
934
  expect(vals[25][2]).to eql :RED_LOW
935
+ expect(vals[26][0]).to eql "TEMP3"
936
+ expect(vals[26][1]).to eql -100.0
937
+ expect(vals[26][2]).to eql :RED_LOW
938
+ expect(vals[27][0]).to eql "TEMP4"
939
+ expect(vals[27][1]).to eql -100.0
940
+ expect(vals[27][2]).to eql :RED_LOW
935
941
  end
936
942
  end
937
943
 
@@ -1067,16 +1073,18 @@ DOC
1067
1073
 
1068
1074
  it "returns all the items for a target/packet" do
1069
1075
  items = @api.get_tlm_item_list("INST","HEALTH_STATUS")
1070
- expect(items[0][0]).to eql "RECEIVED_TIMESECONDS"
1071
- expect(items[1][0]).to eql "RECEIVED_TIMEFORMATTED"
1072
- expect(items[2][0]).to eql "RECEIVED_COUNT"
1076
+ expect(items[0][0]).to eql "PACKET_TIMESECONDS"
1077
+ expect(items[1][0]).to eql "PACKET_TIMEFORMATTED"
1078
+ expect(items[2][0]).to eql "RECEIVED_TIMESECONDS"
1079
+ expect(items[3][0]).to eql "RECEIVED_TIMEFORMATTED"
1080
+ expect(items[4][0]).to eql "RECEIVED_COUNT"
1073
1081
  # Spot check a few more
1074
- expect(items[22][0]).to eql "TEMP1"
1075
- expect(items[22][1]).to be_nil
1076
- expect(items[22][2]).to eql "Temperature #1"
1077
- expect(items[28][0]).to eql "COLLECT_TYPE"
1078
- expect(items[28][1]).to include("NORMAL"=>0, "SPECIAL"=>1)
1079
- expect(items[28][2]).to eql "Most recent collect type"
1082
+ expect(items[24][0]).to eql "TEMP1"
1083
+ expect(items[24][1]).to be_nil
1084
+ expect(items[24][2]).to eql "Temperature #1"
1085
+ expect(items[30][0]).to eql "COLLECT_TYPE"
1086
+ expect(items[30][1]).to include("NORMAL"=>0, "SPECIAL"=>1)
1087
+ expect(items[30][2]).to eql "Most recent collect type"
1080
1088
  end
1081
1089
  end
1082
1090
 
@@ -23,7 +23,7 @@ module Cosmos
23
23
  file.puts "require 'cosmos/tools/cmd_tlm_server/background_task'"
24
24
  file.puts "class MyBgTask#{i} < Cosmos::BackgroundTask"
25
25
  if i == 3
26
- file.puts " def call; raise 'Error'; end"
26
+ file.puts " def call; puts 'BG#{i} START'; raise 'Error'; end"
27
27
  else
28
28
  file.puts " def call; puts 'BG#{i} START'; @go = true; sleep 1 while @go; end"
29
29
  end
@@ -163,16 +163,24 @@ module Cosmos
163
163
  bt.start_all
164
164
  # 2 because the RSpec main thread plus the background task
165
165
  expect(running_threads.length).to eql(2)
166
+ expect(bt.instance_variable_get("@threads").length).to eq 1
167
+ expect(bt.instance_variable_get("@threads")[0].alive?).to eq true
166
168
  sleep 1.1 # Allow the thread to crash
167
169
  expect(running_threads.length).to eql(1)
168
- expect(bt.instance_variable_get("@threads").length).to eq 1
169
- expect(bt.instance_variable_get("@threads")[0].alive?).to eq false
170
+ expect(bt.instance_variable_get("@threads")[0]).to be_nil
171
+ expect(stdout.string).to match("unexpectedly died")
172
+ end
170
173
 
171
- bt.stop_all
172
- sleep 0.2
174
+ # Try to restart the task
175
+ capture_io do |stdout|
176
+ bt.start_all
177
+ # 2 because the RSpec main thread plus the background task
178
+ expect(running_threads.length).to eql(2)
179
+ expect(bt.instance_variable_get("@threads").length).to eq 1
180
+ expect(bt.instance_variable_get("@threads")[0].alive?).to eq true
181
+ sleep 1.1 # Allow the thread to crash
173
182
  expect(running_threads.length).to eql(1)
174
- expect(bt.instance_variable_get("@threads").length).to eq 0
175
-
183
+ expect(bt.instance_variable_get("@threads")[0]).to be_nil
176
184
  expect(stdout.string).to match("unexpectedly died")
177
185
  end
178
186
  tf.unlink
@@ -435,6 +435,39 @@ module Cosmos
435
435
  end
436
436
  end
437
437
 
438
+ context "with LOG_STORED" do
439
+ it "complains about too many parameters" do
440
+ tf = Tempfile.new('unittest')
441
+ tf.puts "INTERFACE CTSSPEC_INT cts_config_test_interface.rb"
442
+ tf.puts 'LOG_STORED PacketLogWriter TRUE'
443
+ tf.close
444
+ expect { CmdTlmServerConfig.new(tf.path) }.to raise_error(ConfigParser::Error, /Too many parameters for LOG_STORED./)
445
+ tf.unlink
446
+ end
447
+
448
+ it "complains about unknown log writers" do
449
+ tf = Tempfile.new('unittest')
450
+ tf.puts "INTERFACE CTSSPEC_INT cts_config_test_interface.rb"
451
+ tf.puts 'LOG_STORED MyLogWriter'
452
+ tf.close
453
+ expect { CmdTlmServerConfig.new(tf.path) }.to raise_error(ConfigParser::Error, /Unknown packet log writer: MYLOGWRITER/)
454
+ tf.unlink
455
+ end
456
+
457
+ it "adds a packet log writer to the interface" do
458
+ tf = Tempfile.new('unittest')
459
+ tf.puts 'PACKET_LOG_WRITER MY_WRITER packet_log_writer.rb'
460
+ tf.puts "INTERFACE CTSSPEC_INT cts_config_test_interface.rb"
461
+ tf.puts 'LOG DEFAULT'
462
+ tf.puts 'LOG_STORED MY_WRITER'
463
+ tf.close
464
+ config = CmdTlmServerConfig.new(tf.path)
465
+ expect(config.interfaces['CTSSPEC_INT'].packet_log_writer_pairs.length).to eql 1
466
+ expect(config.interfaces['CTSSPEC_INT'].stored_packet_log_writer_pairs.length).to eql 1
467
+ tf.unlink
468
+ end
469
+ end
470
+
438
471
  context "with DONT_LOG" do
439
472
  it "complains about too many parameters" do
440
473
  tf = Tempfile.new('unittest')
@@ -67,7 +67,7 @@ module Cosmos
67
67
  expect(interfaces.all["MY_INT"].packet_log_writer_pairs[0].cmd_log_writer).to receive(:write)
68
68
 
69
69
  # Grab an existing packet
70
- pkt = System.commands.packet('SYSTEM','STARTLOGGING')
70
+ pkt = System.commands.packet('SYSTEM','STARTLOGGING').clone
71
71
 
72
72
  count = System.targets['SYSTEM'].cmd_cnt
73
73
  cmd.send_command_to_target('SYSTEM', pkt)
@@ -77,6 +77,30 @@ module Cosmos
77
77
  tf.unlink
78
78
  end
79
79
 
80
+ it "sends already identified stored commands" do
81
+ tf = Tempfile.new('unittest')
82
+ tf.puts 'PACKET_LOG_WRITER MY_WRITER packet_log_writer.rb'
83
+ tf.puts 'INTERFACE MY_INT interface.rb'
84
+ tf.puts ' LOG_STORED MY_WRITER'
85
+ tf.close
86
+ config = CmdTlmServerConfig.new(tf.path)
87
+ cmd = Commanding.new(config)
88
+ interfaces = Interfaces.new(config)
89
+ interfaces.map_target("SYSTEM","MY_INT")
90
+ expect(interfaces.all["MY_INT"]).to receive(:write)
91
+ expect(interfaces.all["MY_INT"].stored_packet_log_writer_pairs[0].cmd_log_writer).to receive(:write)
92
+
93
+ # Grab an existing packet
94
+ pkt = System.commands.packet('SYSTEM','STARTLOGGING').clone
95
+ pkt.stored = true
96
+
97
+ count = System.targets['SYSTEM'].cmd_cnt
98
+ cmd.send_command_to_target('SYSTEM', pkt)
99
+ # Verify the SYSTEM STARTLOGGING packet has been updated
100
+ expect(System.commands.packet("SYSTEM","STARTLOGGING").buffer).to eql pkt.buffer
101
+ expect(System.targets['SYSTEM'].cmd_cnt).to eq count + 1
102
+ tf.unlink
103
+ end
80
104
 
81
105
  it "logs unknown commands" do
82
106
  Logger.level = Logger::DEBUG
@@ -41,6 +41,7 @@ module Cosmos
41
41
 
42
42
  allow(System).to receive_message_chain(:telemetry,:identify!).and_return(nil)
43
43
  allow(System).to receive_message_chain(:telemetry,:update!).and_return(@packet)
44
+ allow(System).to receive_message_chain(:telemetry,:identify_and_define_packet).and_return(@packet)
44
45
  targets = {'TGT'=>Target.new('TGT')}
45
46
  allow(System).to receive(:targets).and_return(targets)
46
47
  end
@@ -298,6 +299,20 @@ module Cosmos
298
299
  expect(running_threads.length).to eql(1)
299
300
  end
300
301
 
302
+ it "handles stored packet log writers" do
303
+ writer = double("LogWriter")
304
+ allow(writer).to receive_message_chain(:tlm_log_writer,:write)
305
+ @interface.stored_packet_log_writer_pairs = [writer]
306
+ @packet.stored = true
307
+ thread = InterfaceThread.new(@interface)
308
+ thread.start
309
+ sleep 0.1
310
+ expect(running_threads.length).to eql(2)
311
+ thread.stop
312
+ sleep 0.2
313
+ expect(running_threads.length).to eql(1)
314
+ end
315
+
301
316
  end
302
317
  end
303
318
  end
@@ -20,7 +20,7 @@ module Cosmos
20
20
  before(:each) do
21
21
  @packet = Packet.new('TGT','PKT')
22
22
  @packet.buffer = "\x01\x02"
23
-
23
+ System.instance.instance_variable_set(:@allow_router_commanding, true)
24
24
  @interface = Interface.new
25
25
  # Interface#connected? implemented in each test case
26
26
  allow(@interface).to receive(:connect)
@@ -32,7 +32,7 @@ module Cosmos
32
32
  end
33
33
 
34
34
  describe "handle_packet" do
35
- it "handles disconnectd interfaces" do
35
+ it "handles disconnected interfaces" do
36
36
  allow(@interface).to receive(:connected?).and_return(false)
37
37
  @interface.interfaces = [@interface]
38
38
  thread = RouterThread.new(@interface)
@@ -148,4 +148,3 @@ module Cosmos
148
148
  end
149
149
  end
150
150
  end
151
-
@@ -111,8 +111,8 @@ module Cosmos
111
111
  expect(filename).to eql File.join(Cosmos::PATH,'data','about.txt')
112
112
  end
113
113
 
114
- it "complains if the file is not found" do
115
- expect { Cosmos.data_path('nope.txt') }.to raise_error(/Could not find path/)
114
+ it "returns nil if the file is not found" do
115
+ expect(Cosmos.data_path('nope.txt')).to be_nil
116
116
  end
117
117
  end
118
118
 
@@ -171,6 +171,19 @@ module Cosmos
171
171
  Cosmos.cleanup_exceptions()
172
172
  end
173
173
 
174
+ it "rescues marshal dump errors in a Packet with a Mutex" do
175
+ capture_io do |stdout|
176
+ system_exit_count = $system_exit_count
177
+ pkt = Packet.new("TGT","PKT")
178
+ pkt.append_item("ITEM", 16, :UINT)
179
+ pkt.read_all
180
+ Cosmos.marshal_dump('marshal_test', pkt)
181
+ expect($system_exit_count).to be > system_exit_count
182
+ expect(stdout.string).to match("Mutex exists in a packet")
183
+ end
184
+ Cosmos.cleanup_exceptions()
185
+ end
186
+
174
187
  it "rescues marshal load errors" do
175
188
  # Attempt to load something that doesn't exist
176
189
  expect(Cosmos.marshal_load('blah')).to be_nil
@@ -222,18 +235,29 @@ module Cosmos
222
235
  end
223
236
  end
224
237
 
225
- describe "md5_files" do
226
- it "calculates a MD5 sum across files" do
238
+ describe "hash_files" do
239
+ it "calculates a hashing sum across files in md5 mode" do
227
240
  File.open(File.join(Cosmos::USERPATH,'test1.txt'),'w') {|f| f.puts "test1" }
228
241
  File.open(File.join(Cosmos::USERPATH,'test2.txt'),'w') {|f| f.puts "test2" }
229
- digest = Cosmos.md5_files(["test1.txt", "test2.txt"])
242
+ digest = Cosmos.hash_files(["test1.txt", "test2.txt"])
230
243
  expect(digest.digest.length).to be 16
231
244
  expect(digest.hexdigest).to eql 'e51dfbea83de9c7e6b49560089d8a170'
232
245
  File.delete(File.join(Cosmos::USERPATH, 'test1.txt'))
233
246
  File.delete(File.join(Cosmos::USERPATH, 'test2.txt'))
234
247
  end
248
+
249
+ it "calculates a hashing sum across files in sha256 mode" do
250
+ File.open(File.join(Cosmos::USERPATH,'test1.txt'),'w') {|f| f.puts "test1" }
251
+ File.open(File.join(Cosmos::USERPATH,'test2.txt'),'w') {|f| f.puts "test2" }
252
+ digest = Cosmos.hash_files(["test1.txt", "test2.txt"], nil, 'SHA256')
253
+ expect(digest.digest.length).to be 32
254
+ expect(digest.hexdigest).to eql '49789e7c809eb38ea34864b00e2cfd68825e0c07cd7b7d0c6fe2642ac87a919c'
255
+ File.delete(File.join(Cosmos::USERPATH, 'test1.txt'))
256
+ File.delete(File.join(Cosmos::USERPATH, 'test2.txt'))
257
+ end
235
258
  end
236
259
 
260
+
237
261
  describe "create_log_file" do
238
262
  it "creates a log file in System LOGS" do
239
263
  filename1 = Cosmos.create_log_file('test')
@@ -70,9 +70,12 @@ module Cosmos
70
70
  log = MessageLog.new('TEST')
71
71
  log.start
72
72
  log.stop
73
- Cosmos.set_working_dir do
74
- expect(File.stat(log.filename).writable?).to be false
75
- File.delete log.filename
73
+ if Kernel.is_windows? or Process.uid != 0
74
+ # writable? is always true for root, so skip this check
75
+ Cosmos.set_working_dir do
76
+ expect(File.stat(log.filename).writable?).to be false
77
+ File.delete log.filename
78
+ end
76
79
  end
77
80
  end
78
81
  end
@@ -11,33 +11,42 @@
11
11
  desc 'Create a picture of gemfile downloads'
12
12
  task :gemfile_stats do
13
13
  require 'gems'
14
- require 'gruff'
14
+ require 'win32ole'
15
15
 
16
16
  def get_latest_gem_data
17
17
  gem_data = []
18
+ # This is the only API call to Rubygems
18
19
  versions = Gems.versions 'cosmos'
19
20
  versions.each do |version|
20
21
  version_no = version['number']
22
+ next if version_no.split('.')[0] < '3' # anything before 3 is another gem
21
23
  month = version['built_at'].split('-')[0..1].join('-')
22
- gem_data << [month, version_no, Gems.total_downloads("cosmos",version_no)[:version_downloads]] if version_no.split('.')[0] >= '3' # anything before 3 is another gem
24
+ downloads = version['downloads_count'].to_i
25
+ if gem_data.length > 0 && gem_data[-1][1] == version_no
26
+ gem_data[-1][2] += downloads
27
+ else
28
+ gem_data << [month, version_no, downloads]
29
+ end
23
30
  end
24
31
  gem_data
25
32
  end
26
33
 
27
34
  # This is useful for testing to prevent server round trips
28
- #File.open("gemdata.marshall", 'w') {|file| file.write(Marshal.dump(get_latest_gem_data)) }
35
+ # Simply comment out this line when working on the formatting below (after first running once)
36
+ File.open("gemdata.marshall", 'w') {|file| file.write(Marshal.dump(get_latest_gem_data())) }
29
37
  gem_data = Marshal.load(File.read("gemdata.marshall"))
30
38
 
31
- #gem_data = get_latest_gem_data()
32
39
  # Convert all the date text into Ruby Dates
33
40
  gem_data.map! {|x| [Date.strptime(x[0], "%Y-%m"), x[1], x[2]]}
34
41
  # Sort first by date and then version number
35
42
  gem_data.sort_by! {|x| [x[0], x[1]] }
36
43
 
37
- g = Gruff::StackedArea.new
38
- g.title = 'COSMOS Downloads'
44
+ excel = WIN32OLE.new('excel.application')
45
+ excel.visible = true
46
+ book = excel.Workbooks.Add
47
+ sheet = book.Worksheets(1)
39
48
 
40
- # Build up date labels on the bottom of the graph
49
+ # Build up date labels
41
50
  labels = {} # Must be hash with integer keys and label value
42
51
  index = 0
43
52
  start_date = gem_data[0][0]
@@ -66,14 +75,29 @@ task :gemfile_stats do
66
75
  end
67
76
  end
68
77
 
69
- # Reduce the number of labels due to overlap
70
- labels.each do |i, label|
71
- labels[i] = '' if i % 2 == 0
78
+ # Put dates in rows as there are more dates than there are releases
79
+ # Force the date column to be text
80
+ sheet.Columns(1).NumberFormat = "\@"
81
+ labels.values.each_with_index do |val, x|
82
+ sheet.Cells((x+2), 1).Value = val
72
83
  end
73
- g.labels = labels
74
- g.marker_font_size = 12
84
+
85
+ col = 2
75
86
  dataset.each do |version, data|
76
- g.data(version, data)
87
+ # Set the version (e.g. 3.0) in the top row
88
+ sheet.Cells(1, col).Value = version
89
+ # The download values by date appear below the version in the same column
90
+ data.each_with_index do |val, x|
91
+ sheet.Cells((x+2), col).Value = val
92
+ end
93
+ col += 1
77
94
  end
78
- g.write('cosmos_downloads.png')
95
+ # Excel column name lookup, 4 sets of alphabets gives us 104 versions to work with
96
+ letters = ('A'..'Z').to_a.concat(('AA'..'AZ').to_a).concat(('BA'..'BZ').to_a).concat(('CA'..'CZ').to_a)
97
+ chart = book.Charts.Add
98
+ chart.Name = "COSMOS Downloads"
99
+ chart.SetSourceData(sheet.Range("A1:#{letters[dataset.length]}#{labels.length+1}"))
100
+ chart.HasTitle = true
101
+ chart.ChartTitle.Characters.Text = "COSMOS Downloads"
102
+ chart.ChartType = 76 # AreaStacked
79
103
  end