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
@@ -27,7 +27,7 @@ describe Socket do
27
27
  it "returns the hostname for the ip address" do
28
28
  if !ENV['APPVEYOR']
29
29
  ipaddr = Resolv.getaddress "localhost"
30
- expect(Socket.lookup_hostname_from_ip(ipaddr)).to match("localhost")
30
+ expect(Socket.lookup_hostname_from_ip(ipaddr)).to_not be_nil
31
31
  end
32
32
  end
33
33
  end
@@ -183,6 +183,10 @@ describe Time do
183
183
  expect(parts[1]).to eql ccsds_ms
184
184
  expect(parts[2]).to be_within(50).of(ccsds_us)
185
185
  end
186
+
187
+ it "maintains precision" do
188
+ expect(Time.ccsds2sec(22766, 65115943, 552).round(6)).to eql(1967047515.943552)
189
+ end
186
190
  end
187
191
 
188
192
  describe "Time.yds2mdy" do
@@ -12,89 +12,70 @@ if RUBY_ENGINE == 'ruby'
12
12
  require 'spec_helper'
13
13
  require 'cosmos/gui/qt'
14
14
  require 'cosmos/script'
15
- require 'cosmos/gui/utilities/script_module_gui'
15
+ require 'cosmos/script/scripting'
16
16
 
17
17
  module Cosmos
18
18
  describe Script do
19
- after(:all) do
20
- # Load the original scripting file over the script_module_gui
21
- load 'cosmos/script/scripting.rb'
22
- end
23
-
24
- def stub_null_object(constant)
25
- class_double(constant).tap do |double|
26
- stub_const(constant, double)
27
- allow(double).to receive(:new).and_return(double(constant).as_null_object)
28
- yield double if block_given?
29
- end
30
- end
31
-
32
- let!(:qt_module) do
33
- class_double('Qt').as_stubbed_const(:transfer_nested_constants => true).tap do |double|
34
- stub_const('Qt', double)
35
- stub_const('Qt::WindowTitleHint', double)
36
- stub_const('Qt::WindowSystemMenuHint', double)
37
- allow(double).to receive(:execute_in_main_thread).and_yield
38
- allow(double).to receive(:debug_level)
39
- end
40
- stub_null_object('Qt::Widget')
41
- stub_null_object('Qt::Dialog') do |double|
42
- instance = double("Qt::Dialog").as_null_object
43
- allow(instance).to receive(:exec).and_return 1 # break the loop by returning 1
44
- allow(double).to receive(:new).and_return(instance)
45
- end
46
- # Stub Accepted to be 1 to match the instance exec returning 1
47
- stub_const('Qt::Dialog::Accepted', 1)
48
- stub_null_object('Qt::VBoxLayout')
49
- stub_null_object('Qt::HBoxLayout')
50
- stub_null_object('Qt::Label')
51
- stub_null_object('Qt::PushButton')
52
- end
53
-
54
19
  describe "combo_box" do
55
- it "should not modify the inputs" do
56
- class_double('Cosmos::ComboboxChooser').as_stubbed_const.tap do |double|
57
- chooser = double("ComboboxChooser").as_null_object
58
- allow(chooser).to receive(:sel_command_callback=) do |args|
59
- # Simulate the user clicking the TEST option in the combobox
60
- args.call("TEST")
61
- end
62
- allow(double).to receive(:new).and_return(chooser)
20
+ it "should not modify the button inputs" do
21
+ expect(self).to receive(:gets) { ' ' }
22
+ capture_io do |stdout|
23
+ buttons = %w(THIS IS A TEST)
24
+ combo_box("Combo box test", *buttons)
25
+ expect(buttons).to eq %w(THIS IS A TEST)
26
+ expect(stdout.string).to match(/Combo box test/)
63
27
  end
28
+ end
64
29
 
65
- buttons = %w(THIS IS A TEST)
66
- combo_box("HI", *buttons)
67
- expect(buttons).to eq %w(THIS IS A TEST)
30
+ it "should display details" do
31
+ expect(self).to receive(:gets) { ' ' }
32
+ capture_io do |stdout|
33
+ buttons = %w(THIS IS A TEST)
34
+ combo_box("HI", *buttons, details: 'These are the details')
35
+ expect(stdout.string).to match(/These are the details/)
36
+ end
68
37
  end
69
38
  end
70
39
 
71
40
  describe "message_box" do
72
41
  it "should not modify the inputs" do
73
- class_double('Qt::MessageBox').as_stubbed_const.tap do |double|
74
- msg_box = double("MessageBox").as_null_object
75
- allow(msg_box).to receive_message_chain(:clickedButton, :text).and_return("TEST")
76
- allow(double).to receive(:new).and_return(msg_box)
77
- stub_const('Qt::MessageBox::AcceptRole', 1)
78
- stub_const('Qt::MessageBox::RejectRole', 0)
42
+ expect(self).to receive(:gets) { ' ' }
43
+ capture_io do |stdout|
44
+ buttons = %w(THIS IS A TEST)
45
+ message_box("Message box test", *buttons)
46
+ expect(buttons).to eq %w(THIS IS A TEST)
47
+ expect(stdout.string).to match(/Message box test/)
79
48
  end
49
+ end
80
50
 
81
- buttons = %w(THIS IS A TEST)
82
- message_box("HI", *buttons)
83
- expect(buttons).to eq %w(THIS IS A TEST)
51
+ it "should display details" do
52
+ expect(self).to receive(:gets) { ' ' }
53
+ capture_io do |stdout|
54
+ buttons = %w(THIS IS A TEST)
55
+ message_box("HI", *buttons, details: 'These are the details')
56
+ expect(stdout.string).to match(/These are the details/)
57
+ end
84
58
  end
85
59
  end
86
60
 
87
61
  describe "vertical_message_box" do
88
62
  it "should not modify the inputs" do
89
- stub_null_object('Qt::PushButton') do |double|
90
- instance = double("Qt::PushButton").as_null_object
91
- allow(instance).to receive(:connect).and_yield
92
- allow(double).to receive(:new).and_return(instance)
63
+ expect(self).to receive(:gets) { ' ' }
64
+ capture_io do |stdout|
65
+ buttons = %w(THIS IS A TEST)
66
+ vertical_message_box("Vertical message box test", *buttons)
67
+ expect(buttons).to eq %w(THIS IS A TEST)
68
+ expect(stdout.string).to match(/Vertical message box test/)
93
69
  end
70
+ end
94
71
 
95
- buttons = %w(THIS IS A TEST)
96
- vertical_message_box("HI", *buttons)
97
- expect(buttons).to eq %w(THIS IS A TEST)
72
+ it "should display details" do
73
+ expect(self).to receive(:gets) { ' ' }
74
+ capture_io do |stdout|
75
+ buttons = %w(THIS IS A TEST)
76
+ vertical_message_box("HI", *buttons, details: 'These are the details')
77
+ expect(stdout.string).to match(/These are the details/)
78
+ end
98
79
  end
99
80
  end
100
81
  end
@@ -15,7 +15,7 @@ COMMAND INST COLLECT BIG_ENDIAN "Starts a collect on the instrument"
15
15
  PARAMETER OPCODE 112 8 UINT 0x0 0xFF 0xAB "Collect opcode"
16
16
  FORMAT_STRING "0x%0X"
17
17
  PARAMETER TEMP 120 32 FLOAT 0.0 25.0 0.0 "Collect temperature"
18
- UNITS Celcius C
18
+ UNITS Celsius C
19
19
 
20
20
  COMMAND INST ABORT BIG_ENDIAN "Aborts a collect on the instrument"
21
21
  PARAMETER CCSDSVER 0 3 UINT 0 0 0 "CCSDS primary header version number"
@@ -21,28 +21,28 @@ TELEMETRY INST HEALTH_STATUS BIG_ENDIAN "Health and status from the instrument"
21
21
  ITEM TEMP1 144 16 UINT "Temperature #1"
22
22
  POLY_READ_CONVERSION -100.0 0.00305
23
23
  POLY_WRITE_CONVERSION 32768.885246 327.86885
24
- UNITS CELCIUS C
24
+ UNITS CELSIUS C
25
25
  FORMAT_STRING "%0.3f"
26
26
  LIMITS DEFAULT 1 ENABLED -80.0 -70.0 60.0 80.0 -20.0 20.0
27
27
  LIMITS TVAC 1 ENABLED -80.0 -30.0 30.0 80.0
28
28
  ITEM TEMP2 160 16 UINT "Temperature #2"
29
29
  POLY_READ_CONVERSION -100.0 0.00305
30
30
  POLY_WRITE_CONVERSION 32768.885246 327.86885
31
- UNITS CELCIUS C
31
+ UNITS CELSIUS C
32
32
  FORMAT_STRING "%0.3f"
33
33
  LIMITS DEFAULT 1 ENABLED -60.0 -55.0 30.0 35.0
34
34
  LIMITS TVAC 1 ENABLED -60.0 20.0 30.0 35.0
35
35
  ITEM TEMP3 176 16 UINT "Temperature #3"
36
36
  POLY_READ_CONVERSION -100.0 0.00305
37
37
  POLY_WRITE_CONVERSION 32768.885246 327.86885
38
- UNITS CELCIUS C
38
+ UNITS CELSIUS C
39
39
  FORMAT_STRING "%0.3f"
40
40
  LIMITS DEFAULT 1 ENABLED -25.0 -10.0 50.0 55.0
41
41
  LIMITS TVAC 1 ENABLED -15.0 -10.0 20.0 30.0
42
42
  ITEM TEMP4 192 16 UINT "Temperature #4"
43
43
  POLY_READ_CONVERSION -100.0 0.00305
44
44
  POLY_WRITE_CONVERSION 32768.885246 327.86885
45
- UNITS CELCIUS C
45
+ UNITS CELSIUS C
46
46
  FORMAT_STRING "%0.3f"
47
47
  LIMITS DEFAULT 1 ENABLED -80.0 -70.0 60.0 80.0
48
48
  ARRAY_ITEM ARY 208 8 UINT 80 "Array data"
@@ -52,7 +52,7 @@ TELEMETRY INST HEALTH_STATUS BIG_ENDIAN "Health and status from the instrument"
52
52
  STATE NORMAL 0
53
53
  STATE SPECIAL 1
54
54
  APPEND_ARRAY_ITEM ARY2 64 FLOAT 640 "Double array"
55
- UNITS CELCIUS C
55
+ UNITS CELSIUS C
56
56
  APPEND_ITEM ASCIICMD 2048 STRING "Most recent ASCIICMD string"
57
57
  STATE "NOOP" "NOOP"
58
58
  STATE "FIRE LASER" "FIRE LASER"
@@ -0,0 +1,132 @@
1
+
2
+ require 'spec_helper'
3
+ require 'find'
4
+ require 'cosmos/system'
5
+ require 'cosmos/config/meta_config_parser'
6
+
7
+ module Cosmos
8
+ describe Cosmos do
9
+ # These are not expected to be documented as they are deprecated
10
+ DEPRECATED = %w(MACRO_APPEND_START MACRO_APPEND_END ROUTER_LOG_RAW IGNORE REQUIRE_UTILITY)
11
+ # These source keywords are ignored in the YAML
12
+ EXCEPTIONS = %w(LAUNCH LAUNCH_TERMINAL LAUNCH_GEM CONVERTED RAW FORMATTED WITH_UNITS NONE)
13
+ EXCEPTIONS.concat(%w(MINUTE HOUR DAY AVG MIN MAX STDDEV AGING CRC OVERRIDE))
14
+ # These are not documented because OpenGL is not officially a tool
15
+ OPENGL = %w(STL_FILE TEXTURE_MAPPED_SPHERE TIP_TEXT POSITION ROTATION_X ROTATION_Y ROTATION_Z)
16
+ OPENGL.concat(%w(ZOOM ORIENTATION CENTER BOUNDS))
17
+
18
+ def process_line(line)
19
+ line.split(',').each do |item|
20
+ item.strip!
21
+ if (item[0] == "'" || item[0] == '"') && (item[-1] == "'" || item[-1] == '"')
22
+ @src_keywords << item[1..-2]
23
+ end
24
+ end
25
+ end
26
+
27
+ def process_continuation(line)
28
+ if line[-1] == "\\"
29
+ continuation = true
30
+ line = line[0..-2] # remove the continuation character
31
+ else
32
+ continuation = false
33
+ end
34
+ return continuation
35
+ end
36
+
37
+ def get_src_keywords
38
+ @src_keywords = []
39
+ path = File.expand_path(File.join(File.dirname(__FILE__), "../../lib/**/*.rb"))
40
+ Dir[path].each do |filename|
41
+ data = File.read(filename)
42
+ part = nil
43
+ if data.include?('parser.parse_file')
44
+ part = data.split('parser.parse_file')[1..-1].join
45
+ elsif data.include?('handle_keyword(parser, keyword, parameters)')
46
+ part = data.split('handle_keyword(parser, keyword, parameters)')[1..-1].join
47
+ end
48
+ if part
49
+ continuation = false
50
+ part.split("\n").each do |line|
51
+ if continuation
52
+ continuation = process_continuation(line)
53
+ process_line(line)
54
+ end
55
+ if match = line.match(/when (.*)/)
56
+ line = match.captures[0]
57
+ continuation = process_continuation(line)
58
+ process_line(line)
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ # All the widgets are referenced in screen definitions
65
+ path = File.expand_path(File.join(File.dirname(__FILE__), "../../lib/cosmos/tools/tlm_viewer/widgets/*_widget.rb"))
66
+ Dir[path].each do |filename|
67
+ @src_keywords << filename.split('/')[-1].split('_widget.rb')[0].upcase
68
+ end
69
+ # Remove the base classes
70
+ @src_keywords -= %w(CANVASVALUE LAYOUT MULTI)
71
+ # Add specific keyword(s) that we want to document
72
+ @src_keywords.concat(%w(NAMED_WIDGET))
73
+
74
+ # All the protocols are referenced as keywords in INTERFACES
75
+ path = File.expand_path(File.join(File.dirname(__FILE__), "../../lib/cosmos/interfaces/protocols/*_protocol.rb"))
76
+ Dir[path].each do |filename|
77
+ @src_keywords << filename.split('/')[-1].split('_protocol.rb')[0].upcase
78
+ end
79
+
80
+ # Remove things we don't document
81
+ @src_keywords.uniq!
82
+ @src_keywords -= (DEPRECATED + EXCEPTIONS + OPENGL)
83
+
84
+ #puts "Total source keywords: #{@src_keywords.length}"
85
+ expect(@src_keywords.length > 100) # Sanity check
86
+ end
87
+
88
+ def process_meta(yaml_keywords, meta)
89
+ meta.each do |keyword, data|
90
+ next unless keyword.is_a?(String) && keyword.upcase == keyword
91
+ next if keyword == 'UNKNOWN' # Ignore the UNKNOWN placeholder
92
+
93
+ if data['modifiers']
94
+ process_meta(yaml_keywords, data['modifiers'])
95
+ end
96
+ yaml_keywords << keyword
97
+ end
98
+ end
99
+
100
+ def get_yaml_keywords
101
+ @yaml_keywords = []
102
+ path = File.expand_path(File.join(File.dirname(__FILE__), "../../data/config/*.yaml"))
103
+ Dir[path].each do |filename|
104
+ meta = Cosmos::MetaConfigParser.load(filename)
105
+ process_meta(@yaml_keywords, meta)
106
+ end
107
+ #puts "Total yaml keywords: #{@yaml_keywords.length}"
108
+ expect(@yaml_keywords.length > 100) # Sanity check
109
+ end
110
+
111
+ before(:all) do
112
+ get_src_keywords()
113
+ get_yaml_keywords()
114
+ end
115
+
116
+ it "should document all source keywords" do
117
+ undocumented = []
118
+ @src_keywords.each do |keyword|
119
+ undocumented << keyword unless @yaml_keywords.include?(keyword)
120
+ end
121
+ expect(undocumented).to be_empty, "Following source keywords not in YAML: #{undocumented}"
122
+ end
123
+
124
+ it "should not have extra keywords" do
125
+ extra = []
126
+ @yaml_keywords.each do |keyword|
127
+ extra << keyword unless @src_keywords.include?(keyword)
128
+ end
129
+ expect(extra).to be_empty, "Following YAML keywords not in source: #{extra}"
130
+ end
131
+ end
132
+ end
@@ -179,7 +179,7 @@ module Cosmos
179
179
  it "warns if an error code is set" do
180
180
  allow_any_instance_of(TcpipClientStream).to receive(:read).and_return @handshake.buffer(false)
181
181
  expect(Logger).to receive(:warn) do |msg|
182
- expect(msg).to eql "Warning sending command (12345): BAD"
182
+ expect(msg).to eql "LincInterface: Warning sending command (12345): BAD"
183
183
  end
184
184
  t = Thread.new do
185
185
  sleep 0.1
@@ -90,6 +90,7 @@ module Cosmos
90
90
  end
91
91
 
92
92
  it "reads telemetry data from the stream" do
93
+ target = System.targets['SYSTEM']
93
94
  @interface.add_protocol(FixedProtocol, [1], :READ_WRITE)
94
95
  @interface.instance_variable_set(:@stream, FixedStream.new)
95
96
  @interface.target_names = ['SYSTEM']
@@ -103,6 +104,7 @@ module Cosmos
103
104
  expect(packet.received_time.to_f).to be_within(0.1).of(Time.now.to_f)
104
105
  expect(packet.target_name).to eql 'SYSTEM'
105
106
  expect(packet.packet_name).to eql 'LIMITS_CHANGE'
107
+ target.tlm_unique_id_mode = true
106
108
  $index = 1
107
109
  packet = @interface.read
108
110
  expect(packet.received_time.to_f).to be_within(0.1).of(Time.now.to_f)
@@ -113,30 +115,39 @@ module Cosmos
113
115
  expect(packet.received_time.to_f).to be_within(0.1).of(Time.now.to_f)
114
116
  expect(packet.target_name).to eql 'SYSTEM'
115
117
  expect(packet.packet_name).to eql 'LIMITS_CHANGE'
118
+ target.tlm_unique_id_mode = false
116
119
  end
117
120
 
118
121
  it "reads command data from the stream" do
119
- $index = 0
122
+ target = System.targets['SYSTEM']
123
+ packet = System.commands.packet("SYSTEM", "STARTLOGGING")
124
+ packet.restore_defaults
125
+ $buffer = packet.buffer.clone
120
126
  class FixedStream2 < Stream
121
127
  def connect; end
122
128
  def connected?; true; end
123
129
  def read
124
- case $index
125
- when 0
126
- $index += 1
127
- "\x1A\xCF\xFC\x1D\x00\x00\x00\x02"
128
- else
129
- "\x00\x00\x00\x00\x00\x00\x00\x00"
130
- end
130
+ # Prepend a matching sync pattern to test the discard
131
+ "\x1A\xCF\xFC\x1D\x55\x55" << $buffer
131
132
  end
132
133
  end
133
- @interface.add_protocol(FixedProtocol, [8, 0, '0x1ACFFC1D', false], :READ_WRITE)
134
+ # Require 8 bytes, discard 6 leading bytes, use 0x1ACFFC1D sync, telemetry = false (command)
135
+ @interface.add_protocol(FixedProtocol, [8, 6, '0x1ACFFC1D', false], :READ_WRITE)
134
136
  @interface.instance_variable_set(:@stream, FixedStream2.new)
135
137
  @interface.target_names = ['SYSTEM']
138
+ target.cmd_unique_id_mode = false
136
139
  packet = @interface.read
137
140
  expect(packet.received_time.to_f).to be_within(0.01).of(Time.now.to_f)
138
141
  expect(packet.target_name).to eql 'SYSTEM'
139
142
  expect(packet.packet_name).to eql 'STARTLOGGING'
143
+ expect(packet.buffer).to eql $buffer
144
+ target.cmd_unique_id_mode = true
145
+ packet = @interface.read
146
+ expect(packet.received_time.to_f).to be_within(0.01).of(Time.now.to_f)
147
+ expect(packet.target_name).to eql 'SYSTEM'
148
+ expect(packet.packet_name).to eql 'STARTLOGGING'
149
+ expect(packet.buffer).to eql $buffer
150
+ target.cmd_unique_id_mode = false
140
151
  end
141
152
  end
142
153
  end
@@ -0,0 +1,243 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos/interfaces/protocols/ignore_packet_protocol'
13
+ require 'cosmos/interfaces/interface'
14
+ require 'cosmos/streams/stream'
15
+
16
+ module Cosmos
17
+ describe IgnorePacketProtocol do
18
+ before(:each) do
19
+ $buffer = nil
20
+ @interface = StreamInterface.new
21
+ @interface.target_names = ['SYSTEM', 'INST']
22
+ allow(@interface).to receive(:connected?) { true }
23
+ end
24
+
25
+ class PreStream < Stream
26
+ def connect; end
27
+ def connected?; true; end
28
+ def disconnect; end
29
+ def read; $buffer; end
30
+ def write(data); $buffer = data; end
31
+ end
32
+
33
+ describe "initialize" do
34
+ it "complains if target is not given" do
35
+ expect { @interface.add_protocol(IgnorePacketProtocol, [], :READ_WRITE) }.to raise_error(ArgumentError)
36
+ end
37
+
38
+ it "complains if packet is not given" do
39
+ expect { @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM'], :READ_WRITE) }.to raise_error(ArgumentError)
40
+ end
41
+
42
+ it "complains if the target is not found" do
43
+ expect { @interface.add_protocol(IgnorePacketProtocol, ['BLAH', 'META'], :READ_WRITE) }.to raise_error(/target 'BLAH' does not exist/)
44
+ end
45
+
46
+ it "complains if the target is not found" do
47
+ expect { @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'BLAH'], :READ_WRITE) }.to raise_error(/packet 'SYSTEM BLAH' does not exist/)
48
+ end
49
+ end
50
+
51
+ describe "read" do
52
+ it "ignores the packet specified" do
53
+ @interface.instance_variable_set(:@stream, PreStream.new)
54
+ pkt = System.telemetry.packet("SYSTEM","META")
55
+ # Ensure the ID items are set so this packet can be identified
56
+ pkt.id_items.each do |item|
57
+ pkt.write_item(item, item.id_value)
58
+ end
59
+ pkt.received_time = Time.now
60
+ $buffer = nil
61
+ @interface.write(pkt)
62
+ # Verify the write went out
63
+ expect(pkt.buffer).to eql $buffer
64
+ # Verify we read the packet back
65
+ packet = @interface.read
66
+ expect(packet.buffer).to eql $buffer
67
+
68
+ # Now add the protocol to ignore the packet
69
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :READ)
70
+ $buffer = nil
71
+ @interface.write(pkt)
72
+ packet = nil
73
+ # Try to read the interface
74
+ # We put this in a thread because it calls it continuously
75
+ thread = Thread.new do
76
+ packet = @interface.read
77
+ end
78
+ sleep 0.1
79
+ thread.kill
80
+ sleep 0.2 # Allow thread to die
81
+ expect(packet).to be_nil
82
+ end
83
+
84
+ it "can be added multiple times to ignore different packets" do
85
+ @interface.instance_variable_set(:@stream, PreStream.new)
86
+
87
+ pkt = System.telemetry.packet("INST","HEALTH_STATUS")
88
+ # Ensure the ID items are set so this packet can be identified
89
+ pkt.id_items.each do |item|
90
+ pkt.write_item(item, item.id_value)
91
+ end
92
+ pkt.received_time = Time.now
93
+ $buffer = nil
94
+ @interface.write(pkt)
95
+ expect($buffer).to eql pkt.buffer
96
+
97
+ # Verify we read the packet back
98
+ packet = @interface.read
99
+ expect(packet.buffer).to eql $buffer
100
+
101
+ # Now add the protocol to ignore the packet
102
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'HEALTH_STATUS'], :READ)
103
+ $buffer = nil
104
+ @interface.write(pkt)
105
+ expect($buffer).to eql pkt.buffer
106
+ packet = nil
107
+ # Try to read the interface
108
+ # We put this in a thread because it calls it continuously
109
+ thread = Thread.new do
110
+ packet = @interface.read
111
+ end
112
+ sleep 0.1
113
+ thread.kill
114
+ sleep 0.2 # Allow thread to die
115
+ expect(packet).to be_nil
116
+
117
+ # Add another protocol to ignore another packet
118
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'ADCS'], :READ)
119
+
120
+ pkt = System.telemetry.packet("INST","ADCS")
121
+ # Ensure the ID items are set so this packet can be identified
122
+ pkt.id_items.each do |item|
123
+ pkt.write_item(item, item.id_value)
124
+ end
125
+ pkt.received_time = Time.now
126
+ $buffer = nil
127
+ @interface.write(pkt)
128
+ expect($buffer).to eql pkt.buffer
129
+
130
+ packet = nil
131
+ # Try to read the interface
132
+ # We put this in a thread because it calls it continuously
133
+ thread = Thread.new do
134
+ packet = @interface.read
135
+ end
136
+ sleep 0.1
137
+ thread.kill
138
+ sleep 0.2 # Allow thread to die
139
+ expect(packet).to be_nil
140
+
141
+ pkt = System.telemetry.packet("INST","PARAMS")
142
+ # Ensure the ID items are set so this packet can be identified
143
+ pkt.id_items.each do |item|
144
+ pkt.write_item(item, item.id_value)
145
+ end
146
+ pkt.received_time = Time.now
147
+ $buffer = nil
148
+ @interface.write(pkt)
149
+ # Verify the write went out
150
+ expect($buffer).to eql pkt.buffer
151
+
152
+ packet = @interface.read
153
+ expect(packet.buffer).to eql pkt.buffer
154
+ end
155
+ end
156
+
157
+ describe "write" do
158
+ it "ignores the packet specified" do
159
+ @interface.instance_variable_set(:@stream, PreStream.new)
160
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :WRITE)
161
+ pkt = System.telemetry.packet("SYSTEM","META")
162
+ pkt.write("COSMOS_VERSION", "TEST")
163
+ pkt.received_time = Time.now
164
+ $buffer = nil
165
+ @interface.write(pkt)
166
+ # Verify the write was ignored
167
+ expect($buffer).to be_nil
168
+
169
+ # Verify reading the interface works
170
+ $buffer = pkt.buffer
171
+ packet = @interface.read
172
+ expect(packet.buffer).to eql $buffer
173
+ end
174
+
175
+ it "can be added multiple times to ignore different packets" do
176
+ @interface.instance_variable_set(:@stream, PreStream.new)
177
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'HEALTH_STATUS'], :WRITE)
178
+ @interface.add_protocol(IgnorePacketProtocol, ['INST', 'ADCS'], :WRITE)
179
+
180
+ pkt = System.telemetry.packet("INST","HEALTH_STATUS")
181
+ pkt.received_time = Time.now
182
+ $buffer = nil
183
+ @interface.write(pkt)
184
+ # Verify the write was ignored
185
+ expect($buffer).to be_nil
186
+
187
+ pkt = System.telemetry.packet("INST","ADCS")
188
+ pkt.received_time = Time.now
189
+ $buffer = nil
190
+ @interface.write(pkt)
191
+ # Verify the write was ignored
192
+ expect($buffer).to be_nil
193
+
194
+ pkt = System.telemetry.packet("INST","PARAMS")
195
+ pkt.received_time = Time.now
196
+ $buffer = nil
197
+ @interface.write(pkt)
198
+ # Verify the write went out
199
+ expect($buffer).to eql pkt.buffer
200
+ end
201
+ end
202
+
203
+ describe "read/write" do
204
+ it "ignores the packet specified" do
205
+ @interface.instance_variable_set(:@stream, PreStream.new)
206
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :READ_WRITE)
207
+ pkt = System.telemetry.packet("SYSTEM","META")
208
+ pkt.write("COSMOS_VERSION", "TEST")
209
+ pkt.received_time = Time.now
210
+ $buffer = nil
211
+ @interface.write(pkt)
212
+ # Verify the write was ignored
213
+ expect($buffer).to be_nil
214
+
215
+ packet = nil
216
+ # Try to read the interface
217
+ thread = Thread.new do
218
+ packet = @interface.read
219
+ end
220
+ sleep 0.1
221
+ thread.kill
222
+ sleep 0.2 # Allow thread to die
223
+ expect(packet).to be_nil
224
+ end
225
+
226
+ it "reads and writes unknown packets" do
227
+ @interface.instance_variable_set(:@stream, PreStream.new)
228
+ @interface.add_protocol(IgnorePacketProtocol, ['SYSTEM', 'META'], :READ_WRITE)
229
+ $buffer = nil
230
+ pkt = Packet.new("TGT","PTK")
231
+ pkt.append_item("ITEM", 8, :INT)
232
+ pkt.write("ITEM", 33, :RAW)
233
+ @interface.write(pkt)
234
+ # Verify the write went out
235
+ expect(pkt.buffer).to eql $buffer
236
+
237
+ # Verify the read works
238
+ packet = @interface.read
239
+ expect(packet.buffer).to eq $buffer
240
+ end
241
+ end
242
+ end
243
+ end