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
@@ -0,0 +1,166 @@
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/io/json_drb_rack'
13
+
14
+ module Cosmos
15
+
16
+ describe JsonDrbRack do
17
+ before(:each) do
18
+ @env = {
19
+ "GATEWAY_INTERFACE" => "CGI/1.1",
20
+ "PATH_INFO" => "/index.html",
21
+ "QUERY_STRING" => "",
22
+ "REMOTE_ADDR" => "::1",
23
+ "REMOTE_HOST" => "localhost",
24
+ "REQUEST_METHOD" => "POST",
25
+ "REQUEST_URI" => "http://localhost:3000/index.html",
26
+ "SCRIPT_NAME" => "",
27
+ "SERVER_NAME" => "localhost",
28
+ "SERVER_PORT" => "3000",
29
+ "SERVER_PROTOCOL" => "HTTP/1.1",
30
+ "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)",
31
+ "HTTP_HOST" => "127.0.0.1:7777",
32
+ "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0",
33
+ "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
34
+ "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3",
35
+ "HTTP_ACCEPT_ENCODING" => "gzip, deflate",
36
+ "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61",
37
+ "HTTP_CONNECTION" => "keep-alive",
38
+ "HTTP_CACHE_CONTROL" => "max-age=0",
39
+ "rack.version" => [1, 2],
40
+ "rack.input" => StringIO.new(""),
41
+ "rack.errors" => nil,
42
+ "rack.multithread" => true,
43
+ "rack.multiprocess" => false,
44
+ "rack.run_once" => false,
45
+ "rack.url_scheme" => "http",
46
+ "HTTP_VERSION" => "HTTP/1.1",
47
+ "REQUEST_PATH" => "/index.html"
48
+ }
49
+ end
50
+
51
+ class MockDRb
52
+ class MockDRbAcl
53
+ def initialize(val = true)
54
+ @val = val
55
+ end
56
+ def allow_addr?(val)
57
+ return @val
58
+ end
59
+ end
60
+
61
+ def initialize(val, response_data = "response", error_code = nil)
62
+ @acl = MockDRbAcl.new(val)
63
+ @response_data = response_data
64
+ @error_code = error_code
65
+ end
66
+
67
+ def acl
68
+ @acl
69
+ end
70
+
71
+ def process_request(request_data, start_time)
72
+ return @response_data, @error_code
73
+ end
74
+ end
75
+
76
+ class MockSystem
77
+ def initialize(token = 'SuperSecret', hosts = ['127.0.0.1:7777'], origins = [])
78
+ @token = token
79
+ @hosts = hosts
80
+ @origins = origins
81
+ end
82
+ def x_csrf_token
83
+ @token
84
+ end
85
+ def allowed_hosts
86
+ @hosts
87
+ end
88
+ def allowed_origins
89
+ @origins
90
+ end
91
+ end
92
+
93
+ describe "call" do
94
+ it "supports the drb acl" do
95
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(false), MockSystem.new)
96
+ status, type, body_array = json_drb_rack.call(@env)
97
+ expect(status).to eql 403
98
+ expect(type).to eql({'Content-Type' => "text/plain"})
99
+ expect(body_array).to eql ["Forbidden"]
100
+ end
101
+
102
+ it "handles X-Csrf-Token" do
103
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
104
+ @env['HTTP_X_CSRF_TOKEN'] = 'TryToGuess'
105
+ status, type, body_array = json_drb_rack.call(@env)
106
+ expect(status).to eql 403
107
+ expect(type).to eql({'Content-Type' => "text/plain"})
108
+ expect(body_array).to eql ["Forbidden: Bad X-Csrf-Token: #{@env['HTTP_X_CSRF_TOKEN']}"]
109
+
110
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
111
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
112
+ status, type, body_array = json_drb_rack.call(@env)
113
+ expect(status).to eql 200
114
+ expect(type).to eql({'Content-Type' => "application/json-rpc"})
115
+ expect(body_array).to eql ["response"]
116
+ end
117
+
118
+ it "Handles Allowed Hosts" do
119
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
120
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
121
+ @env['HTTP_HOST'] = "5.6.7.8:7777"
122
+ status, type, body_array = json_drb_rack.call(@env)
123
+ expect(status).to eql 403
124
+ expect(type).to eql({'Content-Type' => "text/plain"})
125
+ expect(body_array).to eql ["Forbidden: #{@env['HTTP_HOST']} not in allowed hosts"]
126
+
127
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess', ['5.6.7.8:7777']))
128
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
129
+ @env['HTTP_HOST'] = "5.6.7.8:7777"
130
+ status, type, body_array = json_drb_rack.call(@env)
131
+ expect(status).to eql 200
132
+ expect(type).to eql({'Content-Type' => "application/json-rpc"})
133
+ expect(body_array).to eql ["response"]
134
+ end
135
+
136
+ it "Handles Allowed Origins" do
137
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
138
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
139
+ @env['HTTP_ORIGIN'] = "5.6.7.8:7777"
140
+ status, type, body_array = json_drb_rack.call(@env)
141
+ expect(status).to eql 403
142
+ expect(type).to eql({'Content-Type' => "text/plain"})
143
+ expect(body_array).to eql ["Forbidden: #{@env['HTTP_ORIGIN']} not in allowed origins"]
144
+
145
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess', ['127.0.0.1:7777'], ['3.6.7.8:7777']))
146
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
147
+ @env['HTTP_ORIGIN'] = "3.6.7.8:7777"
148
+ status, type, body_array = json_drb_rack.call(@env)
149
+ expect(status).to eql 200
150
+ expect(type).to eql({'Content-Type' => "application/json-rpc"})
151
+ expect(body_array).to eql ["response"]
152
+ end
153
+
154
+ it "Only accepts posts" do
155
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
156
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
157
+ @env["REQUEST_METHOD"] = "GET"
158
+ status, type, body_array = json_drb_rack.call(@env)
159
+ expect(status).to eql 405
160
+ expect(type).to eql({'Content-Type' => "text/plain"})
161
+ expect(body_array).to eql ["Request not allowed"]
162
+ end
163
+
164
+ end
165
+ end
166
+ end
@@ -200,6 +200,20 @@ module Cosmos
200
200
  sleep(0.1)
201
201
  end
202
202
 
203
+ it "processes success requests with uppercase" do
204
+ class MyServer5
205
+ def my_method(param)
206
+ end
207
+ end
208
+
209
+ @json.start_service('127.0.0.1', 7777, MyServer5.new)
210
+ request_data = JsonRpcRequest.new('MY_METHOD', 'param', 1).to_json
211
+ _, error_code = @json.process_request(request_data, Time.now)
212
+ expect(error_code).to eq nil
213
+ @json.stop_service
214
+ sleep(0.1)
215
+ end
216
+
203
217
  it "does not allow dangerous methods" do
204
218
  @json.start_service('127.0.0.1', 7777, self)
205
219
  request_data = JsonRpcRequest.new('send', 'param', 1).to_json
@@ -238,25 +238,25 @@ module Cosmos
238
238
 
239
239
  it "reports an error if there is no 'result' or 'error' key" do
240
240
  json = JsonRpcResponse.new(10).as_json
241
- expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error("Invalid JSON-RPC 2.0 Response")
241
+ expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
242
242
  end
243
243
 
244
244
  it "reports an error if the version isn't 2.0" do
245
245
  json = JsonRpcResponse.new(10).as_json
246
246
  json['jsonrpc'] = "1.1"
247
247
  json['result'] = "true"
248
- expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error("Invalid JSON-RPC 2.0 Response")
248
+ expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
249
249
  end
250
250
 
251
251
  it "reports an error if there is both a 'result' and 'error' key" do
252
252
  json = JsonRpcResponse.new(10).as_json
253
253
  json['result'] = "true"
254
254
  json['error'] = {"code"=>-1, "message"=>"error"}
255
- expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error("Invalid JSON-RPC 2.0 Response")
255
+ expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
256
256
  end
257
257
 
258
258
  it "reports an error if it is not json" do
259
- expect { JsonRpcResponse.from_json(Object.new) }.to raise_error("Invalid JSON-RPC 2.0 Response")
259
+ expect { JsonRpcResponse.from_json(Object.new) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
260
260
  end
261
261
 
262
262
  it "reports an error if the error hash is bad" do
@@ -268,4 +268,3 @@ module Cosmos
268
268
 
269
269
  end
270
270
  end
271
-
@@ -0,0 +1,81 @@
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
+ if RbConfig::CONFIG['target_os'] !~ /mswin|mingw|cygwin/i and RUBY_ENGINE == 'ruby' and !ENV['TRAVIS']
12
+
13
+ require 'spec_helper'
14
+ require 'cosmos/io/posix_serial_driver'
15
+
16
+ module Cosmos
17
+
18
+ describe PosixSerialDriver do
19
+ describe "instance" do
20
+ it "enforces the baud rate to a known value" do
21
+ expect { PosixSerialDriver.new('/dev/ttyS0',10,:NONE) }.to raise_error(ArgumentError, "Invalid baud rate: 10")
22
+ end
23
+
24
+ it "supports even, odd, or no parity" do
25
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:EVEN).close }.to_not raise_error
26
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:ODD).close }.to_not raise_error
27
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE).close }.to_not raise_error
28
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
29
+ end
30
+
31
+ it "supports 1 or 2 stop bits" do
32
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1).close }.to_not raise_error
33
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,2).close }.to_not raise_error
34
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,3) }.to raise_error(ArgumentError, "Invalid stop bits: 3")
35
+ end
36
+
37
+ it "supports 5-8 data bits" do
38
+ (5..8).each do |data_bits|
39
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,data_bits)
40
+ handle = driver.instance_variable_get(:@handle)
41
+ expect(handle.tcgetattr.cflag & Termios::CSIZE).to eq(Termios.const_get("CS#{data_bits}"))
42
+ driver.close
43
+ end
44
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,9) }.to raise_error(ArgumentError, "Invalid data bits: 9")
45
+ end
46
+
47
+ it "sets arbitrary Posix structure elements" do
48
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,8)
49
+ handle = driver.instance_variable_get(:@handle)
50
+ # Verify non of the things we're going to set are already set
51
+ expect(handle.tcgetattr.iflag & Termios::IGNBRK).to eq(0)
52
+ expect(handle.tcgetattr.oflag & Termios::OPOST).to eq(0)
53
+ expect(handle.tcgetattr.cflag & Termios::CLOCAL).to eq(Termios::CLOCAL) # We set this by default
54
+ expect(handle.tcgetattr.lflag & Termios::ECHO).to eq(0)
55
+ expect(handle.tcgetattr.cc[Termios::VMIN]).to eq(1)
56
+ driver.close
57
+ # When setting a field the "1" is optional. When clearing a field the "0" is required.
58
+ # Entries in the "cc" special characters field are automatically converted to integers if they are numbers
59
+ struct = [["iflag", "IGNBRK"], ["oflag", "OPOST", "1"], ["cflag", "CLOCAL", "0"], ["lflag", "ECHO"], ["cc", "VMIN", "2"]]
60
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,8,struct)
61
+ handle = driver.instance_variable_get(:@handle)
62
+ expect(handle.tcgetattr.iflag & Termios::IGNBRK).to eq(Termios::IGNBRK)
63
+ expect(handle.tcgetattr.oflag & Termios::OPOST).to eq(Termios::OPOST)
64
+ expect(handle.tcgetattr.cflag & Termios::CLOCAL).to eq(0)
65
+ expect(handle.tcgetattr.lflag & Termios::ECHO).to eq(Termios::ECHO)
66
+ expect(handle.tcgetattr.cc[Termios::VMIN]).to eq(2)
67
+ driver.close
68
+ end
69
+ end
70
+
71
+ describe "close, closed?" do
72
+ it "closes the handle" do
73
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600)
74
+ expect(driver.closed?).to be false
75
+ driver.close
76
+ expect(driver.closed?).to be true
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -41,20 +41,22 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
41
41
  end
42
42
 
43
43
  it "defers to the posix serial driver on nix" do
44
- class PosixSerialDriver
44
+ if RUBY_ENGINE == 'ruby'
45
+ class PosixSerialDriver
46
+ end
47
+ allow(Kernel).to receive(:is_windows?).and_return(false)
48
+ driver = double("PosixSerialDriver")
49
+ expect(driver).to receive(:close)
50
+ expect(driver).to receive(:closed?)
51
+ expect(driver).to receive(:write)
52
+ expect(driver).to receive(:read)
53
+ allow(PosixSerialDriver).to receive(:new).and_return(driver)
54
+ driver = SerialDriver.new('COM1',9600)
55
+ driver.close
56
+ driver.closed?
57
+ driver.write("hi")
58
+ driver.read
45
59
  end
46
- allow(Kernel).to receive(:is_windows?).and_return(false)
47
- driver = double("PosixSerialDriver")
48
- expect(driver).to receive(:close)
49
- expect(driver).to receive(:closed?)
50
- expect(driver).to receive(:write)
51
- expect(driver).to receive(:read)
52
- allow(PosixSerialDriver).to receive(:new).and_return(driver)
53
- driver = SerialDriver.new('COM1',9600)
54
- driver.close
55
- driver.closed?
56
- driver.write("hi")
57
- driver.read
58
60
  end
59
61
  end
60
62
  end
@@ -19,7 +19,8 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
19
19
  before(:each) do
20
20
  allow(Win32).to receive(:create_file).and_return(Object.new)
21
21
  state = double("comm_state")
22
- allow(state).to receive(:write)
22
+ @dcb_struct = {}
23
+ allow(state).to receive(:write) { |key, value| @dcb_struct[key] = value }
23
24
  allow(Win32).to receive(:get_comm_state).and_return(state)
24
25
  allow(Win32).to receive(:set_comm_state)
25
26
  allow(Win32).to receive(:set_comm_timeouts)
@@ -34,12 +35,14 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
34
35
  expect { Win32SerialDriver.new('COM1',9600,:EVEN) }.to_not raise_error
35
36
  expect { Win32SerialDriver.new('COM1',9600,:ODD) }.to_not raise_error
36
37
  expect { Win32SerialDriver.new('COM1',9600,:NONE) }.to_not raise_error
38
+ expect(@dcb_struct["Parity"]).to_not be_nil # Simply check that Parity was set
37
39
  expect { Win32SerialDriver.new('COM1',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
38
40
  end
39
41
 
40
42
  it "supports 1 or 2 stop bits" do
41
43
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1) }.to_not raise_error
42
44
  expect { Win32SerialDriver.new('COM1',9600,:NONE,2) }.to_not raise_error
45
+ expect(@dcb_struct["StopBits"]).to_not be_nil # Simply check that StopBits was set
43
46
  expect { Win32SerialDriver.new('COM1',9600,:NONE,3) }.to raise_error(ArgumentError, "Invalid stop bits: 3")
44
47
  end
45
48
 
@@ -49,6 +52,35 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
49
52
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,7) }.to_not raise_error
50
53
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,8) }.to_not raise_error
51
54
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,9) }.to raise_error(ArgumentError, "Invalid data bits: 9")
55
+ expect(@dcb_struct["ByteSize"]).to_not be_nil # Simply check that ByteSize was set
56
+ end
57
+
58
+ it "sets arbitrary Windows DCB structure elements" do
59
+ Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,8)
60
+ expect(@dcb_struct["fOutxDsrFlow"]).to be_nil # This isn't set by default
61
+ expect(@dcb_struct["Parity"]).to eq(0)
62
+ # Set a new variable in the Windows DCB struct and override the :NONE parity
63
+ # We pass them in as strings because that's how they're parsed
64
+ struct = [["fOutxDsrFlow", "1"], ["Parity", "4"]]
65
+ Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,8,struct)
66
+ expect(@dcb_struct["fOutxDsrFlow"]).to eq(1)
67
+ expect(@dcb_struct["Parity"]).to eq(4)
68
+ end
69
+
70
+ it "calculates the correct timeouts" do
71
+ Win32::BAUD_RATES.each do |baud|
72
+ (5..8).each do |data_bits|
73
+ (1..2).each do |stop_bits|
74
+ [:EVEN, :ODD, :NONE].each do |parity|
75
+ # data_bits + 1 start bit + stop bits + potentially a parity bit
76
+ symbols = data_bits + 1 + stop_bits + (parity == :NONE ? 0 : 1)
77
+ delay = 1000.0 / (baud.to_f / symbols)
78
+ expect(Win32).to receive(:set_comm_timeouts).with(anything, 0xFFFFFFFF,0,0,delay.ceil,1000)
79
+ Win32SerialDriver.new('COM1',baud,parity,stop_bits,10,nil,0.01,1000,:NONE,data_bits)
80
+ end
81
+ end
82
+ end
83
+ end
52
84
  end
53
85
  end
54
86
 
@@ -92,8 +124,6 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
92
124
  expect { driver.read }.to raise_error(Timeout::Error)
93
125
  end
94
126
  end
95
-
96
127
  end
97
128
  end
98
-
99
129
  end
@@ -23,7 +23,10 @@ module Cosmos
23
23
  plw = PacketLogWriter.new(:CMD,nil,true,nil,10000000,nil,false)
24
24
  @cmd_packets = []
25
25
  pkt = System.commands.packet("SYSTEM","STARTLOGGING").clone
26
- pkt.received_time = Time.new(2020,1,31,12,30,15)
26
+ # Avoid precision errors by rounding to nearest second and then add 1 to ensure
27
+ # the time is AFTER the initial META packet with the current time
28
+ @time = Time.now.round + 1
29
+ pkt.received_time = @time
27
30
  pkt.write('label','PKT1')
28
31
  plw.write(pkt)
29
32
  @cmd_packet_length = pkt.length
@@ -43,7 +46,7 @@ module Cosmos
43
46
  plw = PacketLogWriter.new(:TLM,nil,true,nil,10000000,nil,false)
44
47
  @tlm_packets = []
45
48
  pkt = System.telemetry.packet("SYSTEM","LIMITS_CHANGE").clone
46
- pkt.received_time = Time.new(2020,2,1,12,30,15)
49
+ pkt.received_time = @time
47
50
  pkt.write('PACKET','PKT1')
48
51
  plw.write(pkt)
49
52
  @tlm_packet_length = pkt.length
@@ -121,7 +124,35 @@ module Cosmos
121
124
  file.write [pkt.buffer.length].pack('N')
122
125
  file.write pkt.buffer
123
126
  end
124
- expect(@plr.open(filename)).to eql [false, nil]
127
+ expect(@plr.open(filename)[0]).to eql false
128
+ pkt1 = @plr.read
129
+ expect(pkt1.target_name).to eql 'TGT1'
130
+ expect(pkt1.packet_name).to eql 'PKT1'
131
+ pkt2 = @plr.read
132
+ expect(pkt2.target_name).to eql 'TGT2'
133
+ expect(pkt2.packet_name).to eql 'PKT2'
134
+ pkt3 = @plr.read
135
+ expect(pkt3.target_name).to eql 'TGT3'
136
+ expect(pkt3.packet_name).to eql 'PKT3'
137
+ @plr.close
138
+ end
139
+
140
+ it "opens COSMOS2 log files" do
141
+ pkt = System.telemetry.packet("SYSTEM","LIMITS_CHANGE").clone
142
+ filename = File.join(@log_path,'test.bin')
143
+ File.open(filename,'wb') do |file|
144
+ file.write ("COSMOS2_CMD TEST " + (" " * 83))
145
+ file.write [1000,100,4,"TGT1",4,"PKT1"].pack('NNCA4CA4')
146
+ file.write [pkt.buffer.length].pack('N')
147
+ file.write pkt.buffer
148
+ file.write [1000,100,4,"TGT2",4,"PKT2"].pack('NNCA4CA4')
149
+ file.write [pkt.buffer.length].pack('N')
150
+ file.write pkt.buffer
151
+ file.write [1000,100,4,"TGT3",4,"PKT3"].pack('NNCA4CA4')
152
+ file.write [pkt.buffer.length].pack('N')
153
+ file.write pkt.buffer
154
+ end
155
+ expect(@plr.open(filename)[0]).to eql false
125
156
  pkt1 = @plr.read
126
157
  expect(pkt1.target_name).to eql 'TGT1'
127
158
  expect(pkt1.packet_name).to eql 'PKT1'
@@ -205,16 +236,17 @@ module Cosmos
205
236
  expect(@plr.log_type).to eql :CMD
206
237
  expect(@plr.configuration_name).not_to be_nil
207
238
  expect(@plr.hostname).to eql Socket.gethostname
208
- header_length = 8 + 1 + 6 + 1 + 12 + 4
209
- meta_header_length = 8 + 1 + 6 + 1 + 4 + 4
239
+ header_length = 1 + 8 + 1 + 6 + 1 + 12 + 4
240
+ meta_header_length = 1 + 8 + 1 + 6 + 1 + 4 + 4
210
241
  meta_length = System.telemetry.packet('SYSTEM', 'META').length
211
- expect(packet_offsets).to eql [PacketLogReader::COSMOS2_HEADER_LENGTH, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + header_length + @cmd_packet_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @cmd_packet_length) * 2]
242
+ expect(packet_offsets).to eql [PacketLogReader::COSMOS4_HEADER_LENGTH, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + header_length + @cmd_packet_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @cmd_packet_length) * 2]
212
243
 
213
244
  expect(@plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])).to eql [true, nil]
214
- pkt = @plr.read_at_offset(packet_offsets[2])
245
+ pkt = @plr.read_at_offset(packet_offsets[2]) # Grab the second STARTLOGGING (META is 0)
215
246
  expect(pkt.target_name).to eql "SYSTEM"
216
247
  expect(pkt.packet_name).to eql "STARTLOGGING"
217
- expect(pkt.received_time).to eql Time.new(2020,1,31,12,30,16)
248
+ expect(pkt.read('LABEL')).to eql "PKT2"
249
+ expect(pkt.received_time).to eql @time + 1
218
250
  @plr.close
219
251
  end
220
252
 
@@ -223,16 +255,17 @@ module Cosmos
223
255
  expect(@plr.log_type).to eql :TLM
224
256
  expect(@plr.configuration_name).not_to be_nil
225
257
  expect(@plr.hostname).to eql Socket.gethostname
226
- header_length = 8 + 1 + 6 + 1 + 13 + 4
227
- meta_header_length = 8 + 1 + 6 + 1 + 4 + 4
258
+ header_length = 1 + 8 + 1 + 6 + 1 + 13 + 4
259
+ meta_header_length = 1 + 8 + 1 + 6 + 1 + 4 + 4
228
260
  meta_length = System.telemetry.packet('SYSTEM', 'META').length
229
- expect(packet_offsets).to eql [PacketLogReader::COSMOS2_HEADER_LENGTH, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + header_length + @tlm_packet_length, PacketLogReader::COSMOS2_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @tlm_packet_length) * 2]
261
+ expect(packet_offsets).to eql [PacketLogReader::COSMOS4_HEADER_LENGTH, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + header_length + @tlm_packet_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @tlm_packet_length) * 2]
230
262
 
231
263
  expect(@plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])).to eql [true, nil]
232
- pkt = @plr.read_at_offset(packet_offsets[2])
264
+ pkt = @plr.read_at_offset(packet_offsets[2]) # Grab the second LIMITS_CHANGE (META is 0)
233
265
  expect(pkt.target_name).to eql "SYSTEM"
234
266
  expect(pkt.packet_name).to eql "LIMITS_CHANGE"
235
- expect(pkt.received_time).to eql Time.new(2020,2,1,12,30,16)
267
+ expect(pkt.read('PACKET')).to eql "PKT2"
268
+ expect(pkt.received_time).to eql @time + 1
236
269
  @plr.close
237
270
  end
238
271
  end
@@ -240,10 +273,10 @@ module Cosmos
240
273
  describe "each" do
241
274
  it "returns packets" do
242
275
  index = 0
243
- meta_header_length = 8 + 1 + 6 + 1 + 4 + 4
276
+ meta_header_length = 1 + 8 + 1 + 6 + 1 + 4 + 4
244
277
  meta_length = System.telemetry.packet('SYSTEM', 'META').length
245
278
  packet_length = System.commands.packet('SYSTEM', 'STARTLOGGING').length
246
- packet_header_length = 8 + 1 + 'SYSTEM'.length + 1 + 'STARTLOGGING'.length + 4
279
+ packet_header_length = 1 + 8 + 1 + 'SYSTEM'.length + 1 + 'STARTLOGGING'.length + 4
247
280
  bytes_read = 128 + packet_header_length + packet_length + meta_header_length + meta_length
248
281
  @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0]) do |packet|
249
282
  next if packet.packet_name == 'META'
@@ -257,7 +290,7 @@ module Cosmos
257
290
  end
258
291
  index = 0
259
292
  packet_length = System.telemetry.packet('SYSTEM', 'LIMITS_CHANGE').length
260
- packet_header_length = 8 + 1 + 'SYSTEM'.length + 1 + 'LIMITS_CHANGE'.length + 4
293
+ packet_header_length = 1 + 8 + 1 + 'SYSTEM'.length + 1 + 'LIMITS_CHANGE'.length + 4
261
294
  bytes_read = 128 + packet_header_length + packet_length + meta_header_length + meta_length
262
295
  @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0]) do |packet|
263
296
  next if packet.packet_name == 'META'
@@ -294,12 +327,20 @@ module Cosmos
294
327
 
295
328
  it "increments the command received count" do
296
329
  plw = PacketLogWriter.new(:CMD,'cnt',true,nil,10000000,nil,false)
297
- plw.write(System.commands.packet("INST","COLLECT").clone)
298
- plw.write(System.commands.packet("INST","ABORT").clone)
299
- plw.write(System.commands.packet("INST","ABORT").clone)
300
- plw.write(System.commands.packet("INST","COLLECT").clone)
301
- plw.write(System.commands.packet("SYSTEM","STOPLOGGING").clone)
302
- plw.write(System.commands.packet("INST","ABORT").clone)
330
+ collect_packet = System.commands.packet("INST","COLLECT").clone
331
+ collect_packet.stored = false
332
+ collect_packet.extra = {"vcid" => 2}
333
+ abort_packet = System.commands.packet("INST","ABORT").clone
334
+ abort_packet.stored = true
335
+ abort_packet.extra = {"test" => 1}
336
+ stop_packet = System.commands.packet("SYSTEM","STOPLOGGING").clone
337
+ stop_packet.stored = true
338
+ plw.write(collect_packet)
339
+ plw.write(abort_packet)
340
+ plw.write(abort_packet)
341
+ plw.write(collect_packet)
342
+ plw.write(stop_packet)
343
+ plw.write(abort_packet)
303
344
  plw.stop
304
345
 
305
346
  cnt = {}
@@ -308,6 +349,15 @@ module Cosmos
308
349
  cnt["#{packet.target_name}_#{packet.packet_name}"] ||= 0
309
350
  cnt["#{packet.target_name}_#{packet.packet_name}"] += 1
310
351
  expect(packet.received_count).to eql cnt["#{packet.target_name}_#{packet.packet_name}"]
352
+ if packet.packet_name == 'ABORT'
353
+ expect(packet.stored).to eql true
354
+ expect(packet.extra).to eql({"test" => 1})
355
+ elsif packet.packet_name == 'COLLECT'
356
+ expect(packet.stored).to eql false
357
+ expect(packet.extra).to eql({"vcid" => 2})
358
+ elsif packet.packet_name == 'STOPLOGGING'
359
+ expect(packet.stored).to eql true
360
+ end
311
361
  end
312
362
 
313
363
  # Resetting a packet should reset only that packet's received_count
@@ -328,10 +378,13 @@ module Cosmos
328
378
 
329
379
  it "increments the telemetry received count" do
330
380
  plw = PacketLogWriter.new(:TLM,'cnt',true,nil,10000000,nil,false)
331
- plw.write(System.telemetry.packet("INST","HEALTH_STATUS").clone)
381
+ hs_packet = System.telemetry.packet("INST","HEALTH_STATUS").clone
382
+ hs_packet.stored = true
383
+ hs_packet.extra = {"vcid" => 2}
384
+ plw.write(hs_packet)
332
385
  plw.write(System.telemetry.packet("INST","ADCS").clone)
333
386
  plw.write(System.telemetry.packet("INST","ADCS").clone)
334
- plw.write(System.telemetry.packet("INST","HEALTH_STATUS").clone)
387
+ plw.write(hs_packet)
335
388
  plw.write(System.telemetry.packet("INST","ADCS").clone)
336
389
  plw.stop
337
390
 
@@ -341,6 +394,13 @@ module Cosmos
341
394
  cnt["#{packet.target_name}_#{packet.packet_name}"] ||= 0
342
395
  cnt["#{packet.target_name}_#{packet.packet_name}"] += 1
343
396
  expect(packet.received_count).to eql cnt["#{packet.target_name}_#{packet.packet_name}"]
397
+ if packet.packet_name == 'HEALTH_STATUS'
398
+ expect(packet.stored).to eql true
399
+ expect(packet.extra).to eql({"vcid" => 2})
400
+ elsif packet.packet_name == 'ADCS'
401
+ expect(packet.stored).to eql false
402
+ expect(packet.extra).to eql nil
403
+ end
344
404
  end
345
405
 
346
406
  # Resetting a packet should reset only that packet's received_count
@@ -360,9 +420,8 @@ module Cosmos
360
420
  end
361
421
 
362
422
  it "returns all packets if the start time is before all" do
363
- time = Time.new(2000,1,31,12,30,16)
364
423
  index = 0
365
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, time) do |packet|
424
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, @time) do |packet|
366
425
  next if packet.packet_name == 'META'
367
426
  expect(packet.target_name).to eql @cmd_packets[index].target_name
368
427
  expect(packet.packet_name).to eql @cmd_packets[index].packet_name
@@ -374,51 +433,48 @@ module Cosmos
374
433
  end
375
434
 
376
435
  it "returns no packets if the start time is after all" do
377
- time = Time.new(2030,2,1,12,30,16)
378
436
  index = 0
379
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, time) do |packet|
437
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, @time + 100) do |packet|
380
438
  index += 1
381
439
  end
382
440
  expect(index).to eql 0
383
441
  end
384
442
 
385
443
  it "returns all packets after a start time" do
386
- time = Time.new(2020,1,31,12,30,16)
387
444
  index = 0
388
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, time) do |packet|
389
- expect(packet.target_name).to eql @cmd_packets[index+1].target_name
390
- expect(packet.packet_name).to eql @cmd_packets[index+1].packet_name
391
- expect(packet.received_time).to eql @cmd_packets[index+1].received_time
392
- expect(packet.read('LABEL')).to eql @cmd_packets[index+1].read('LABEL')
445
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, @time) do |packet|
446
+ next if packet.packet_name == 'META'
447
+ expect(packet.target_name).to eql @cmd_packets[index].target_name
448
+ expect(packet.packet_name).to eql @cmd_packets[index].packet_name
449
+ expect(packet.received_time).to eql @cmd_packets[index].received_time
450
+ expect(packet.read('LABEL')).to eql @cmd_packets[index].read('LABEL')
393
451
  index += 1
394
452
  end
395
- expect(index).to eql 2
453
+ expect(index).to eql 3
396
454
 
397
- time = Time.new(2020,2,1,12,30,16)
398
- index = 0
399
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, time) do |packet|
400
- expect(packet.target_name).to eql @tlm_packets[index+1].target_name
401
- expect(packet.packet_name).to eql @tlm_packets[index+1].packet_name
402
- expect(packet.received_time).to eql @tlm_packets[index+1].received_time
403
- expect(packet.read('PACKET')).to eql @tlm_packets[index+1].read('PACKET')
455
+ index = 1 # @time + 1
456
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, @time + 1) do |packet|
457
+ next if packet.packet_name == 'META'
458
+ expect(packet.target_name).to eql @tlm_packets[index].target_name
459
+ expect(packet.packet_name).to eql @tlm_packets[index].packet_name
460
+ expect(packet.received_time).to eql @tlm_packets[index].received_time
461
+ expect(packet.read('PACKET')).to eql @tlm_packets[index].read('PACKET')
404
462
  index += 1
405
463
  end
406
- expect(index).to eql 2
464
+ expect(index).to eql 3
407
465
  end
408
466
 
409
467
  it "returns no packets if the end time is before all" do
410
- time = Time.new(2000,1,31,12,30,16)
411
468
  index = 0
412
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, time) do |packet|
469
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, @time - 10) do |packet|
413
470
  index += 1
414
471
  end
415
472
  expect(index).to eql 0
416
473
  end
417
474
 
418
475
  it "returns all packets if the end time is after all" do
419
- time = Time.new(2030,2,1,12,30,16)
420
476
  index = 0
421
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, time) do |packet|
477
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, @time + 10) do |packet|
422
478
  next if packet.packet_name == 'META'
423
479
  expect(packet.target_name).to eql @cmd_packets[index].target_name
424
480
  expect(packet.packet_name).to eql @cmd_packets[index].packet_name
@@ -430,9 +486,8 @@ module Cosmos
430
486
  end
431
487
 
432
488
  it "returns all packets before an end time" do
433
- time = Time.new(2020,1,31,12,30,16)
434
489
  index = 0
435
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, time) do |packet|
490
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, @time) do |packet|
436
491
  next if packet.packet_name == 'META'
437
492
  expect(packet.target_name).to eql @cmd_packets[index].target_name
438
493
  expect(packet.packet_name).to eql @cmd_packets[index].packet_name
@@ -440,11 +495,10 @@ module Cosmos
440
495
  expect(packet.read('LABEL')).to eql @cmd_packets[index].read('LABEL')
441
496
  index += 1
442
497
  end
443
- expect(index).to eql 2
498
+ expect(index).to eql 1
444
499
 
445
- time = Time.new(2020,2,1,12,30,16)
446
500
  index = 0
447
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, time) do |packet|
501
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, @time + 1) do |packet|
448
502
  next if packet.packet_name == 'META'
449
503
  expect(packet.target_name).to eql @tlm_packets[index].target_name
450
504
  expect(packet.packet_name).to eql @tlm_packets[index].packet_name