cosmos 4.2.4 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (458) hide show
  1. checksums.yaml +5 -5
  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 +154 -64
  458. data/lib/cosmos/dart/Gemfile +0 -69
@@ -24,7 +24,8 @@ module Cosmos
24
24
  read_polling_period = 0.01,
25
25
  read_max_length = 1000,
26
26
  flow_control = :NONE,
27
- data_bits = 8)
27
+ data_bits = 8,
28
+ struct = [])
28
29
 
29
30
  # Verify Parameters
30
31
  port_name = '\\\\.\\' + port_name if port_name =~ /^COM[0-9]{2,3}$/
@@ -78,10 +79,37 @@ module Cosmos
78
79
  # 0x03 - RTS_CONTROL_TOGGLE - Specifies that the RTS line will be high if bytes are available for transmission. After all buffered bytes have been sent, the RTS line will be low.
79
80
  dcb.write('fRtsControl', 0x03)
80
81
  end
82
+ # Allow the end user to write arbitrary values into the Windows DCB structure
83
+ unless struct.empty?
84
+ struct.each do |key, value|
85
+ dcb.write(key, value.to_i)
86
+ end
87
+ end
81
88
  Win32.set_comm_state(@handle, dcb)
82
89
 
83
- # Configure Timeouts
84
- Win32.set_comm_timeouts(@handle, 4294967295, 0, 0, 0, 0)
90
+ # Configure Timeouts, the WinAPI structure is COMMTIMEOUTS:
91
+ # DWORD ReadIntervalTimeout;
92
+ # DWORD ReadTotalTimeoutMultiplier;
93
+ # DWORD ReadTotalTimeoutConstant;
94
+ # DWORD WriteTotalTimeoutMultiplier;
95
+ # DWORD WriteTotalTimeoutConstant;
96
+ # 0xFFFFFFFF, 0, 0 specifies that the read operation is to return immediately
97
+ # with the bytes that have already been received, even if no bytes have been received.
98
+ # The WriteTotalTimeoutMultiplier is multiplied by the number of bytes to be written
99
+ # and the WriteTotalTimeoutConstant is added to that total (both are in milliseconds).
100
+ bits_per_symbol = data_bits + 1 # 1 start bit
101
+ case stop_bits
102
+ when Win32::ONESTOPBIT
103
+ bits_per_symbol += 1
104
+ when Win32::TWOSTOPBITS
105
+ bits_per_symbol += 2
106
+ end
107
+ case parity
108
+ when Win32::ODDPARITY, Win32::EVENPARITY
109
+ bits_per_symbol += 1
110
+ end
111
+ delay = (1000.0 / (baud_rate / bits_per_symbol.to_f)).ceil
112
+ Win32.set_comm_timeouts(@handle, 0xFFFFFFFF, 0, 0, delay, 1000)
85
113
  end
86
114
 
87
115
  # (see SerialDriver#close)
@@ -35,6 +35,18 @@ module Cosmos
35
35
  COSMOS1_LOG_TYPE_RANGE = 6..8
36
36
  COSMOS1_CONFIGURATION_NAME_RANGE = 10..41
37
37
 
38
+ # COSMOS 4.3+ log file header definition
39
+ COSMOS4_MARKER = 'COSMOS4_'
40
+ COSMOS4_HEADER_LENGTH = COSMOS2_HEADER_LENGTH
41
+ COSMOS4_MARKER_RANGE = COSMOS2_MARKER_RANGE
42
+ COSMOS4_LOG_TYPE_RANGE = COSMOS2_LOG_TYPE_RANGE
43
+ COSMOS4_CONFIGURATION_NAME_RANGE = COSMOS2_CONFIGURATION_NAME_RANGE
44
+ COSMOS4_HOSTNAME_RANGE = COSMOS2_HOSTNAME_RANGE
45
+ COSMOS4_STORED_FLAG_MASK = 0x80
46
+ COSMOS4_EXTRA_FLAG_MASK = 0x40
47
+
48
+ MAX_READ_SIZE = 1000000000
49
+
38
50
  # Create a new log file reader
39
51
  def initialize
40
52
  reset()
@@ -62,10 +74,10 @@ module Cosmos
62
74
  packet = read(identify_and_define)
63
75
  break unless packet
64
76
 
65
- received_time = packet.received_time
66
- if received_time
67
- next if start_time and received_time < start_time
68
- break if end_time and received_time > end_time
77
+ time = packet.packet_time
78
+ if time
79
+ next if start_time and time < start_time
80
+ break if end_time and time > end_time
69
81
  end
70
82
 
71
83
  yield packet
@@ -115,6 +127,8 @@ module Cosmos
115
127
  reset()
116
128
  @filename = filename
117
129
  @file = BufferedFile.open(@filename, 'rb')
130
+ @max_read_size = @file.size
131
+ @max_read_size = MAX_READ_SIZE if @max_read_size > MAX_READ_SIZE
118
132
  @bytes_read = 0
119
133
  return read_file_header()
120
134
  rescue => err
@@ -133,12 +147,12 @@ module Cosmos
133
147
  # @return [Packet]
134
148
  def read(identify_and_define = true)
135
149
  # Read the Packet Header
136
- success, target_name, packet_name, received_time = read_entry_header()
150
+ success, target_name, packet_name, received_time, stored, extra = read_entry_header()
137
151
  return nil unless success
138
152
 
139
153
  # Read Packet Data
140
- packet_data = @file.read_length_bytes(4)
141
- return nil unless packet_data and packet_data.length > 0
154
+ packet_data = @file.read_length_bytes(4, @max_read_size)
155
+ return nil unless packet_data and packet_data.length >= 0
142
156
 
143
157
  if identify_and_define
144
158
  packet = identify_and_define_packet_data(target_name, packet_name, received_time, packet_data)
@@ -147,6 +161,8 @@ module Cosmos
147
161
  packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
148
162
  packet.set_received_time_fast(received_time)
149
163
  end
164
+ packet.stored = stored
165
+ packet.extra = extra
150
166
 
151
167
  # Auto change configuration on SYSTEM META
152
168
  if packet.target_name == 'SYSTEM'.freeze and packet.packet_name == 'META'.freeze
@@ -231,11 +247,13 @@ module Cosmos
231
247
 
232
248
  def reset
233
249
  @file = nil
250
+ @max_read_size = MAX_READ_SIZE
234
251
  @filename = nil
235
252
  @log_type = :TLM
236
253
  @configuration_name = nil
237
254
  @hostname = nil
238
- @file_header_length = COSMOS2_HEADER_LENGTH
255
+ @mode = 4
256
+ @file_header_length = COSMOS4_HEADER_LENGTH
239
257
  end
240
258
 
241
259
  # This is best effort. May return unidentified/undefined packets
@@ -257,7 +275,7 @@ module Cosmos
257
275
  end
258
276
  packet.buffer = packet_data
259
277
  packet.set_received_time_fast(received_time)
260
- rescue
278
+ rescue Exception => error
261
279
  # Could not find a definition for this packet
262
280
  Logger.instance.error "Unknown packet #{target_name} #{packet_name}"
263
281
  packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
@@ -269,10 +287,15 @@ module Cosmos
269
287
 
270
288
  # Should return if successfully switched to requested configuration
271
289
  def read_file_header
272
- header = @file.read(COSMOS2_HEADER_LENGTH)
273
- if header and header.length == COSMOS2_HEADER_LENGTH
274
- if header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
275
- # Found COSMOS 2 File Header
290
+ header = @file.read(COSMOS4_HEADER_LENGTH)
291
+ if header and header.length == COSMOS4_HEADER_LENGTH
292
+ if header[COSMOS4_MARKER_RANGE] == COSMOS4_MARKER or header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
293
+ # Found COSMOS 2/4 File Header
294
+ if header[COSMOS4_MARKER_RANGE] == COSMOS4_MARKER
295
+ @mode = 4
296
+ else
297
+ @mode = 2
298
+ end
276
299
  @log_type = header[COSMOS2_LOG_TYPE_RANGE].intern
277
300
  raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
278
301
  @configuration_name = header[COSMOS2_CONFIGURATION_NAME_RANGE]
@@ -283,6 +306,7 @@ module Cosmos
283
306
  return false, error # Did not successfully change to requested configuration name
284
307
  elsif header[COSMOS1_MARKER_RANGE] == COSMOS1_MARKER
285
308
  # Found COSMOS 1 File Header
309
+ @mode = 1
286
310
  @log_type = header[COSMOS1_LOG_TYPE_RANGE].upcase.intern
287
311
  raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
288
312
  @configuration_name = header[COSMOS1_CONFIGURATION_NAME_RANGE]
@@ -297,29 +321,48 @@ module Cosmos
297
321
  raise "COSMOS file header not found on packet log"
298
322
  end
299
323
  else
300
- raise "Failed to read at least #{COSMOS2_HEADER_LENGTH} bytes from packet log"
324
+ raise "Failed to read at least #{COSMOS4_HEADER_LENGTH} bytes from packet log"
301
325
  end
302
326
  end
303
327
 
304
328
  def read_entry_header
329
+ stored = false
330
+ extra = nil
331
+
332
+ if @mode == 4
333
+ # Read Flags
334
+ flags = @file.read(1)
335
+ return [nil, nil, nil, nil, nil, nil] if flags.nil? or flags.length != 1
336
+ flags = flags.unpack('C')[0]
337
+
338
+ stored = true if (flags & COSMOS4_STORED_FLAG_MASK) != 0
339
+
340
+ if (flags & COSMOS4_EXTRA_FLAG_MASK) != 0
341
+ # Read Extra data
342
+ extra_data = @file.read_length_bytes(4, @max_read_size)
343
+ return [nil, nil, nil, nil, nil, nil] unless extra_data and extra_data.length > 0
344
+ extra = JSON.parse(extra_data)
345
+ end
346
+ end
347
+
305
348
  # Read Received Time
306
349
  time_seconds = @file.read(4)
307
- return [nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
350
+ return [nil, nil, nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
308
351
  time_seconds = time_seconds.unpack('N')[0]
309
352
  time_microseconds = @file.read(4)
310
- return [nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
353
+ return [nil, nil, nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
311
354
  time_microseconds = time_microseconds.unpack('N')[0]
312
355
  received_time = Time.at(time_seconds, time_microseconds).sys
313
356
 
314
357
  # Read Target Name
315
358
  target_name = @file.read_length_bytes(1)
316
- return [nil, nil, nil, nil] unless target_name and target_name.length > 0
359
+ return [nil, nil, nil, nil, nil, nil] unless target_name and target_name.length > 0
317
360
 
318
361
  # Read Packet Name
319
362
  packet_name = @file.read_length_bytes(1)
320
- return [nil, nil, nil, nil] unless packet_name and packet_name.length > 0
363
+ return [nil, nil, nil, nil, nil, nil] unless packet_name and packet_name.length > 0
321
364
 
322
- return [true, target_name, packet_name, received_time]
365
+ return [true, target_name, packet_name, received_time, stored, extra]
323
366
  end
324
367
 
325
368
  def test
@@ -331,7 +374,7 @@ module Cosmos
331
374
  begin
332
375
  # Try to read the packet header
333
376
  # This will fail with file read errors and invalid timestamps
334
- success, target_name, packet_name, _ = read_entry_header()
377
+ success, target_name, packet_name, _, _, _ = read_entry_header()
335
378
  if success
336
379
  if target_name !~ File::NON_ASCII_PRINTABLE and packet_name !~ File::NON_ASCII_PRINTABLE
337
380
  packet_data_length = @file.read(4)
@@ -402,17 +445,17 @@ module Cosmos
402
445
  # Read the first packet in the log
403
446
  first_packet = first()
404
447
  raise "Error reading first packet" unless first
405
- raise "First Packet does not contain a packet received time" unless first_packet.received_time
448
+ raise "First Packet does not contain a packet received time" unless first_packet.packet_time
406
449
 
407
450
  # Read the last packet in the log
408
451
  file_size = size()
409
452
  last_packet = last()
410
453
  raise "Search failed looking for last packet" unless last_packet
411
- raise "Last Packet does not contain a packet received time" unless last_packet.received_time
454
+ raise "Last Packet does not contain a packet received time" unless last_packet.packet_time
412
455
 
413
- if time >= first_packet.received_time and time <= last_packet.received_time
456
+ if time >= first_packet.packet_time and time <= last_packet.packet_time
414
457
  # Guess at where to start looking for time in log
415
- percentage = (time - first_packet.received_time) / (last_packet.received_time - first_packet.received_time)
458
+ percentage = (time - first_packet.packet_time) / (last_packet.packet_time - first_packet.packet_time)
416
459
  offset = (percentage * file_size.to_f).to_i
417
460
  offset = @file_header_length if offset < @file_header_length
418
461
  @file.seek(offset, IO::SEEK_SET)
@@ -420,10 +463,10 @@ module Cosmos
420
463
  # Move backwards until a packet before the time is found
421
464
  while true
422
465
  packet = search(-1, :BEFORE)
423
- break if !packet or packet.received_time <= time
466
+ break if !packet or packet.packet_time <= time
424
467
 
425
468
  # Guess again
426
- percentage = 1.0 - ((packet.received_time - time) / (packet.received_time - first_packet.received_time))
469
+ percentage = 1.0 - ((packet.packet_time - time) / (packet.packet_time - first_packet.packet_time))
427
470
  offset = (percentage * @file.pos.to_f).to_i
428
471
  offset = @file_header_length if offset < @file_header_length
429
472
  @file.seek(offset, IO::SEEK_SET)
@@ -434,7 +477,7 @@ module Cosmos
434
477
  position = @file.pos
435
478
  packet = read(false)
436
479
  raise "Search failed looking for packet after time" unless packet
437
- if packet.received_time >= time
480
+ if packet.packet_time >= time
438
481
  # Back up this packet so the read can get it because we want it
439
482
  @file.seek(position, IO::SEEK_SET)
440
483
  break
@@ -442,7 +485,7 @@ module Cosmos
442
485
  end
443
486
 
444
487
  else
445
- if time > last_packet.received_time
488
+ if time > last_packet.packet_time
446
489
  # File is entirely before time, so jump to the end
447
490
  @file.seek(0, IO::SEEK_END)
448
491
  else
@@ -311,7 +311,7 @@ module Cosmos
311
311
 
312
312
  def build_file_header(configuration_name = System.configuration_name)
313
313
  hostname = Socket.gethostname.to_s
314
- file_header = "COSMOS2_#{@log_type}_#{configuration_name.ljust(32, ' ')[0..31]}_"
314
+ file_header = "COSMOS4_#{@log_type}_#{configuration_name.ljust(32, ' ')[0..31]}_"
315
315
  file_header << hostname.ljust(83)
316
316
  return file_header
317
317
  end
@@ -322,6 +322,18 @@ module Cosmos
322
322
  # This is an optimization to avoid creating a new entry_header object
323
323
  # each time we create an entry_header which we do a LOT!
324
324
  @entry_header.clear
325
+ flags = 0
326
+ flags |= PacketLogReader::COSMOS4_STORED_FLAG_MASK if packet.stored
327
+ extra = packet.extra
328
+ if extra
329
+ flags |= PacketLogReader::COSMOS4_EXTRA_FLAG_MASK
330
+ extra = extra.to_json
331
+ end
332
+ @entry_header << [flags].pack('C'.freeze)
333
+ if extra
334
+ @entry_header << [extra.length].pack('N'.freeze)
335
+ @entry_header << extra
336
+ end
325
337
  @entry_header << [received_time.tv_sec].pack('N'.freeze)
326
338
  @entry_header << [received_time.tv_usec].pack('N'.freeze)
327
339
  target_name = packet.target_name
@@ -90,6 +90,8 @@ module Cosmos
90
90
  target_names = target_names() unless target_names
91
91
 
92
92
  target_names.each do |target_name|
93
+ target_name = target_name.to_s.upcase
94
+
93
95
  target_packets = nil
94
96
  begin
95
97
  target_packets = packets(target_name)
@@ -98,18 +100,35 @@ module Cosmos
98
100
  next
99
101
  end
100
102
 
101
- # Iterate through the packets and see if any represent the buffer
102
- target_packets.each do |packet_name, packet|
103
- if (packet.identify?(packet_data))
104
- identified_packet = packet.clone
105
- identified_packet.received_time = nil
106
- identified_packet.received_count = 0
107
- identified_packet.buffer = packet_data
108
- break
103
+ target = System.targets[target_name]
104
+ if target and target.cmd_unique_id_mode
105
+ # Iterate through the packets and see if any represent the buffer
106
+ target_packets.each do |packet_name, packet|
107
+ if packet.identify?(packet_data)
108
+ identified_packet = packet
109
+ break
110
+ end
109
111
  end
112
+ else
113
+ # Do a hash lookup to quickly identify the packet
114
+ if target_packets.length > 0
115
+ packet = target_packets.first[1]
116
+ key = packet.read_id_values(packet_data)
117
+ hash = @config.cmd_id_value_hash[target_name]
118
+ identified_packet = hash[key]
119
+ identified_packet = hash['CATCHALL'.freeze] unless identified_packet
120
+ end
110
121
  end
111
122
 
112
- break if identified_packet
123
+ if identified_packet
124
+ identified_packet = identified_packet.clone
125
+ identified_packet.received_time = nil
126
+ identified_packet.stored = false
127
+ identified_packet.extra = nil
128
+ identified_packet.received_count = 0
129
+ identified_packet.buffer = packet_data
130
+ break
131
+ end
113
132
  end
114
133
 
115
134
  return identified_packet
@@ -141,6 +160,8 @@ module Cosmos
141
160
 
142
161
  # Set time, parameters, and restore defaults
143
162
  command.received_time = Time.now.sys
163
+ command.stored = false
164
+ command.extra = nil
144
165
  command.given_values = params
145
166
  command.restore_defaults(command.buffer(false), params.keys)
146
167
  command.raw = raw
@@ -8,7 +8,7 @@
8
8
  # as published by the Free Software Foundation; version 3 with
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
- require 'digest/md5'
11
+ require 'digest'
12
12
  require 'cosmos/packets/structure'
13
13
  require 'cosmos/packets/packet_item'
14
14
  require 'cosmos/ext/packet' if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
@@ -19,7 +19,8 @@ module Cosmos
19
19
  # Packet adds is the ability to apply formatting to PacketItem values as well
20
20
  # as managing PacketItem's limit states.
21
21
  class Packet < Structure
22
- RESERVED_ITEM_NAMES = ['RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
22
+ RESERVED_ITEM_NAMES = ['PACKET_TIMESECONDS'.freeze, 'PACKET_TIMEFORMATTED'.freeze, 'RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
23
+ CATCH_ALL_STATE = 'ANY'
23
24
 
24
25
  # @return [String] Name of the target this packet is associated with
25
26
  attr_reader :target_name
@@ -66,6 +67,12 @@ module Cosmos
66
67
  # @return [Boolean] Whether or not this is a 'abstract' packet
67
68
  attr_accessor :abstract
68
69
 
70
+ # @return [Boolean] Whether or not this was a stored packet
71
+ attr_accessor :stored
72
+
73
+ # @return [Hash] Extra data to be logged/transferred with packet
74
+ attr_accessor :extra
75
+
69
76
  # Valid format types
70
77
  VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
71
78
 
@@ -100,6 +107,8 @@ module Cosmos
100
107
  @meta = nil
101
108
  @hidden = false
102
109
  @disabled = false
110
+ @stored = false
111
+ @extra = nil
103
112
  end
104
113
 
105
114
  # Sets the target name this packet is associated with. Unidentified packets
@@ -177,37 +186,70 @@ module Cosmos
177
186
  @read_conversion_cache.clear if @read_conversion_cache
178
187
  @received_count
179
188
  end
189
+
190
+ end # if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
191
+
192
+ # Tries to identify if a buffer represents the currently defined packet. It
193
+ # does this by iterating over all the packet items that were created with
194
+ # an ID value and checking whether that ID value is present at the correct
195
+ # location in the buffer.
196
+ #
197
+ # Incorrectly sized buffers will still positively identify if there is
198
+ # enough data to match the ID values. This is to allow incorrectly sized
199
+ # packets to still be processed as well as possible given the incorrectly
200
+ # sized data.
201
+ #
202
+ # @param buffer [String] Raw buffer of binary data
203
+ # @return [Boolean] Whether or not the buffer of data is this packet
204
+ def identify?(buffer)
205
+ return false unless buffer
206
+ return true unless @id_items
180
207
 
181
- # Tries to identify if a buffer represents the currently defined packet. It
182
- # does this by iterating over all the packet items that were created with
183
- # an ID value and checking whether that ID value is present at the correct
184
- # location in the buffer.
185
- #
186
- # Incorrectly sized buffers will still positively identify if there is
187
- # enough data to match the ID values. This is to allow incorrectly sized
188
- # packets to still be processed as well as possible given the incorrectly
189
- # sized data.
190
- #
191
- # @param buffer [String] Raw buffer of binary data
192
- # @return [Boolean] Whether or not the buffer of data is this packet
193
- def identify?(buffer)
194
- return false unless buffer
195
- return true unless @id_items
196
-
197
- @id_items.each do |item|
198
- begin
199
- value = read_item(item, :RAW, buffer)
200
- rescue Exception
201
- value = nil
202
- end
203
- return false if item.id_value != value
208
+ @id_items.each do |item|
209
+ begin
210
+ value = read_item(item, :RAW, buffer)
211
+ rescue Exception
212
+ value = nil
204
213
  end
214
+ return false if item.id_value != value
215
+ end
205
216
 
206
- true
217
+ true
218
+ end
219
+
220
+ # Reads the values from a buffer at the position of each id_item defined
221
+ # in the packet.
222
+ #
223
+ # @param buffer [String] Raw buffer of binary data
224
+ # @return [Array] Array of read id values in order
225
+ def read_id_values(buffer)
226
+ return [] unless buffer
227
+ return [] unless @id_items
228
+ values = []
229
+
230
+ @id_items.each do |item|
231
+ begin
232
+ values << read_item(item, :RAW, buffer)
233
+ rescue Exception
234
+ values << nil
235
+ end
236
+ end
237
+
238
+ values
239
+ end
240
+
241
+ # Returns @received_time unless a packet item called PACKET_TIME exists that returns
242
+ # a Ruby Time object that represents a different timestamp for the packet
243
+ def packet_time
244
+ item = @items['PACKET_TIME'.freeze]
245
+ if item
246
+ return read_item(item, :CONVERTED, @buffer)
247
+ else
248
+ return @received_time
207
249
  end
208
- end # if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
250
+ end
209
251
 
210
- # Calculates a unique MD5Sum that changes if the parts of the packet configuration change that could affect
252
+ # Calculates a unique hashing sum that changes if the parts of the packet configuration change that could affect
211
253
  # the "shape" of the packet. This value is cached and that packet should not be changed if this method is being used
212
254
  def config_name
213
255
  return @config_name if @config_name
@@ -215,7 +257,9 @@ module Cosmos
215
257
  @sorted_items.each do |item|
216
258
  string << " ITEM #{item.name} #{item.bit_offset} #{item.bit_size} #{item.data_type} #{item.array_size} #{item.endianness} #{item.overflow} #{item.states} #{item.read_conversion ? item.read_conversion.class : 'NO_CONVERSION'}"
217
259
  end
218
- digest = Digest::MD5.new
260
+
261
+ # Use the hashing algorithm established by Cosmos::System
262
+ digest = Digest.const_get(System.hashing_algorithm).send('new')
219
263
  digest << string
220
264
  @config_name = digest.hexdigest
221
265
  @config_name
@@ -297,7 +341,7 @@ module Cosmos
297
341
  previous_item = nil
298
342
  warnings = []
299
343
  @sorted_items.each do |item|
300
- if expected_next_offset and item.bit_offset < expected_next_offset
344
+ if expected_next_offset and (item.bit_offset < expected_next_offset) and !item.overlap
301
345
  msg = "Bit definition overlap at bit offset #{item.bit_offset} for packet #{@target_name} #{@packet_name} items #{item.name} and #{previous_item.name}"
302
346
  Logger.instance.warn(msg)
303
347
  warnings << msg
@@ -529,6 +573,8 @@ module Cosmos
529
573
  value = value.map do |val, index|
530
574
  if item.states.key(val)
531
575
  item.states.key(val)
576
+ elsif item.states.values.include?(CATCH_ALL_STATE)
577
+ item.states.key(CATCH_ALL_STATE)
532
578
  else
533
579
  apply_format_string_and_units(item, val, value_type)
534
580
  end
@@ -537,6 +583,8 @@ module Cosmos
537
583
  state_value = item.states.key(value)
538
584
  if state_value
539
585
  value = state_value
586
+ elsif item.states.values.include?(CATCH_ALL_STATE)
587
+ value = item.states.key(CATCH_ALL_STATE)
540
588
  else
541
589
  value = apply_format_string_and_units(item, value, value_type)
542
590
  end
@@ -652,9 +700,10 @@ module Cosmos
652
700
  # @param value_type (see #read_item)
653
701
  # @param indent (see Structure#formatted)
654
702
  # @param buffer (see Structure#formatted)
703
+ # @param ignored (see Structure#ignored)
655
704
  # @return (see Structure#formatted)
656
- def formatted(value_type = :CONVERTED, indent = 0, buffer = @buffer)
657
- return super(value_type, indent, buffer)
705
+ def formatted(value_type = :CONVERTED, indent = 0, buffer = @buffer, ignored = nil)
706
+ return super(value_type, indent, buffer, ignored)
658
707
  end
659
708
 
660
709
  # Restore all items in the packet to their default value
@@ -670,6 +719,12 @@ module Cosmos
670
719
 
671
720
  # Define the reserved items on the current telemetry packet
672
721
  def define_reserved_items
722
+ item = define_item('PACKET_TIMESECONDS', 0, 0, :DERIVED, nil, @default_endianness,
723
+ :ERROR, '%0.6f', PacketTimeSecondsConversion.new)
724
+ item.description = 'COSMOS Packet Time (UTC, Floating point, Unix epoch)'
725
+ item = define_item('PACKET_TIMEFORMATTED', 0, 0, :DERIVED, nil, @default_endianness,
726
+ :ERROR, nil, PacketTimeFormattedConversion.new)
727
+ item.description = 'COSMOS Packet Time (Local time zone, Formatted string)'
673
728
  item = define_item('RECEIVED_TIMESECONDS', 0, 0, :DERIVED, nil, @default_endianness,
674
729
  :ERROR, '%0.6f', ReceivedTimeSecondsConversion.new)
675
730
  item.description = 'COSMOS Received Time (UTC, Floating point, Unix epoch)'
@@ -750,7 +805,8 @@ module Cosmos
750
805
  def check_limits(limits_set = :DEFAULT, ignore_persistence = false)
751
806
  # If check_limits is being called, then a new packet has arrived and
752
807
  # this packet is no longer stale
753
- if @stale
808
+ # Stored telemetry doesn't affect the current value table and such doesn't affect stale
809
+ if @stale and !@stored
754
810
  @stale = false
755
811
  set_all_limits_states(nil)
756
812
  end
@@ -786,6 +842,8 @@ module Cosmos
786
842
 
787
843
  @received_time = nil
788
844
  @received_count = 0
845
+ @stored = false
846
+ @extra = nil
789
847
  if @read_conversion_cache
790
848
  synchronize() do
791
849
  @read_conversion_cache.clear
@@ -811,6 +869,7 @@ module Cosmos
811
869
  end
812
870
  end
813
871
  packet.instance_variable_set("@read_conversion_cache".freeze, nil)
872
+ packet.extra = JSON.parse(packet.extra.to_json) if packet.extra # Deep copy using JSON
814
873
  packet
815
874
  end
816
875
  alias dup clone
@@ -818,7 +877,19 @@ module Cosmos
818
877
  def update_id_items(item)
819
878
  if item.id_value
820
879
  @id_items ||= []
821
- @id_items << item
880
+ # Add to Id Items
881
+ unless @id_items.empty?
882
+ last_item = @id_items[-1]
883
+ @id_items << item
884
+ # If the current item or last item have a negative offset then we have
885
+ # to re-sort. We also re-sort if the current item is less than the last
886
+ # item because we are inserting.
887
+ if last_item.bit_offset <= 0 or item.bit_offset <= 0 or item.bit_offset < last_item.bit_offset
888
+ @id_items = @id_items.sort
889
+ end
890
+ else
891
+ @id_items << item
892
+ end
822
893
  end
823
894
  item
824
895
  end