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
@@ -140,6 +140,28 @@ module Cosmos
140
140
  expect(pkt.item4).to eql 4
141
141
  end
142
142
 
143
+ it "works in unique id mode or not" do
144
+ System.targets["TGT1"] = Target.new("TGT1")
145
+ target = System.targets["TGT1"]
146
+ target.cmd_unique_id_mode = false
147
+ buffer = "\x01\x02\x03\x04"
148
+ pkt = @cmd.identify(buffer,["TGT1"])
149
+ pkt.enable_method_missing
150
+ expect(pkt.item1).to eql 1
151
+ expect(pkt.item2).to eql 2
152
+ expect(pkt.item3).to eql 3
153
+ expect(pkt.item4).to eql 4
154
+ target.cmd_unique_id_mode = true
155
+ buffer = "\x01\x02\x01\x02"
156
+ pkt = @cmd.identify(buffer,["TGT1"])
157
+ pkt.enable_method_missing
158
+ expect(pkt.item1).to eql 1
159
+ expect(pkt.item2).to eql 2
160
+ expect(pkt.item3).to eql 1
161
+ expect(pkt.item4).to eql 2
162
+ target.cmd_unique_id_mode = false
163
+ end
164
+
143
165
  it "returns nil with unknown targets given" do
144
166
  buffer = "\x01\x02\x03\x04"
145
167
  expect(@cmd.identify(buffer,["TGTX"])).to be_nil
@@ -114,6 +114,30 @@ module Cosmos
114
114
  tf.unlink
115
115
  end
116
116
  end
117
+
118
+ it "builds the id value hash" do
119
+ @tlm_keywords.each do |keyword|
120
+ next if %w(PROCESSOR META).include? keyword
121
+ tf = Tempfile.new('unittest')
122
+ tf.puts 'TELEMETRY tgt1 pkt1 BIG_ENDIAN "Packet"'
123
+ tf.puts 'ID_ITEM myitem 0 8 UINT 13 "Test Item id=1"'
124
+ tf.puts 'APPEND_ID_ITEM myitem 8 UINT 114 "Test Item id=1"'
125
+ tf.puts 'COMMAND tgt1 pkt1 BIG_ENDIAN "Packet"'
126
+ tf.puts 'ID_PARAMETER myitem 0 8 UINT 12 12 12 "Test Item id=1"'
127
+ tf.puts 'APPEND_ID_PARAMETER myitem 8 UINT 115 115 115 "Test Item id=1"'
128
+ tf.close
129
+ @pc.process_file(tf.path, "TGT1")
130
+ expected_tlm_hash = {}
131
+ expected_tlm_hash["TGT1"] = {}
132
+ expected_tlm_hash["TGT1"][[13, 114]] = @pc.telemetry["TGT1"]["PKT1"]
133
+ expected_cmd_hash = {}
134
+ expected_cmd_hash["TGT1"] = {}
135
+ expected_cmd_hash["TGT1"][[12, 115]] = @pc.commands["TGT1"]["PKT1"]
136
+ expect(@pc.tlm_id_value_hash).to eql expected_tlm_hash
137
+ expect(@pc.cmd_id_value_hash).to eql expected_cmd_hash
138
+ tf.unlink
139
+ end
140
+ end
117
141
 
118
142
  it "complains if there are too many parameters" do
119
143
  @top_keywords.each do |keyword|
@@ -324,11 +348,11 @@ module Cosmos
324
348
  tf.close
325
349
  @pc.process_file(tf.path, "TGT1")
326
350
  pkt = @pc.telemetry["TGT1"]["PKT1"]
327
- expect(pkt.items.length).to eql 6 # 3 plus the RECEIVED_XXX items
351
+ expect(pkt.items.length).to eql 8 # 3 plus the RECEIVED_XXX and PACKET_TIMExxx items
328
352
  expect(pkt.items.keys).to include('BYTE1','BYTE2','BYTE3')
329
- expect(pkt.sorted_items[3].name).to eql 'BYTE1'
330
- expect(pkt.sorted_items[4].name).to eql 'BYTE2'
331
- expect(pkt.sorted_items[5].name).to eql 'BYTE3'
353
+ expect(pkt.sorted_items[5].name).to eql 'BYTE1'
354
+ expect(pkt.sorted_items[6].name).to eql 'BYTE2'
355
+ expect(pkt.sorted_items[7].name).to eql 'BYTE3'
332
356
  tf.unlink
333
357
  end
334
358
  end
@@ -691,17 +715,6 @@ module Cosmos
691
715
  expect(@pc.telemetry["TGT1"]["PKT1"].read("ITEM1",:WITH_UNITS)).to eql "0 V"
692
716
  tf.unlink
693
717
  end
694
-
695
- it "complains if STATE defined" do
696
- tf = Tempfile.new('unittest')
697
- tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
698
- tf.puts ' ITEM item1 0 8 UINT'
699
- tf.puts ' STATE ONE 1'
700
- tf.puts ' UNITS Volts V'
701
- tf.close
702
- expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Items with STATE can't define UNITS/)
703
- tf.unlink
704
- end
705
718
  end
706
719
 
707
720
  context "with META" do
@@ -842,7 +855,7 @@ module Cosmos
842
855
  expect(@pc.telemetry["TGT1"]["PKT1"].items["ITEM1"].data_type).to be :DERIVED
843
856
  tf.unlink
844
857
  end
845
- end
858
+ end
846
859
 
847
860
  end # describe "process_file"
848
861
  end
@@ -400,7 +400,7 @@ module Cosmos
400
400
  @pi.read_conversion = GenericConversion.new("value / 2")
401
401
  @pi.write_conversion = GenericConversion.new("value * 2")
402
402
  @pi.description = "description"
403
- @pi.units_full = "Celcius"
403
+ @pi.units_full = "Celsius"
404
404
  @pi.units = "C"
405
405
  @pi.default = 0
406
406
  @pi.range = (0..100)
@@ -428,7 +428,7 @@ module Cosmos
428
428
  expect(hash["id_value"]).to eql 10
429
429
  expect(hash["states"]).to include("TRUE"=>1,"FALSE"=>0)
430
430
  expect(hash["description"]).to eql "description"
431
- expect(hash["units_full"]).to eql "Celcius"
431
+ expect(hash["units_full"]).to eql "Celsius"
432
432
  expect(hash["units"]).to eql "C"
433
433
  expect(hash["default"]).to eql 0
434
434
  expect(hash["range"]).to eql (0..100)
@@ -707,7 +707,7 @@ module Cosmos
707
707
  end
708
708
 
709
709
  describe "formatted" do
710
- it "prints out all the items and CONVERTED values" do
710
+ it "prints out all the items" do
711
711
  p = Packet.new("tgt","pkt")
712
712
  p.append_item("test1", 8, :UINT, 16)
713
713
  p.write("test1", [1,2])
@@ -727,6 +727,25 @@ module Cosmos
727
727
  expect(p.formatted).to include("TEST2: TRUE")
728
728
  expect(p.formatted).to include("TEST3: #{0x02030405}")
729
729
  expect(p.formatted).to include("TEST4: Test")
730
+ # Test the data_type parameter
731
+ expect(p.formatted(:RAW)).to include("TEST1: [1, 2]")
732
+ expect(p.formatted(:RAW)).to include("TEST2: #{0x0304}")
733
+ expect(p.formatted(:RAW)).to include("TEST3: #{0x0406080A}")
734
+ expect(p.formatted(:RAW)).to include("00000000: 54 65 73 74") # Raw TEST4 block
735
+ # Test the indent parameter
736
+ expect(p.formatted(:CONVERTED, 4)).to include(" TEST1: [1, 2]")
737
+ # Test the buffer parameter
738
+ buffer = "\x02\x03\x04\x05\x00\x00\x00\x02\x44\x45\x41\x44"
739
+ expect(p.formatted(:CONVERTED, 0, buffer)).to include("TEST1: [2, 3]")
740
+ expect(p.formatted(:CONVERTED, 0, buffer)).to include("TEST2: #{0x0405}")
741
+ expect(p.formatted(:CONVERTED, 0, buffer)).to include("TEST3: 1")
742
+ expect(p.formatted(:CONVERTED, 0, buffer)).to include("TEST4: DEAD")
743
+ # Test the ignored parameter
744
+ string = p.formatted(:CONVERTED, 0, p.buffer, %w(TEST1 TEST4))
745
+ expect(string).not_to include("TEST1")
746
+ expect(string).to include("TEST2: TRUE")
747
+ expect(string).to include("TEST3: #{0x02030405}")
748
+ expect(string).not_to include("TEST4")
730
749
  end
731
750
  end
732
751
 
@@ -828,12 +847,26 @@ module Cosmos
828
847
  it "returns an array of the identifying items" do
829
848
  p = Packet.new("tgt","pkt")
830
849
  p.define_item("item1",0,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",nil,nil,nil)
831
- p.define_item("item2",0,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",nil,nil,5)
832
- p.define_item("item3",0,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",nil,nil,nil)
833
- p.define_item("item4",0,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",nil,nil,6)
850
+ p.define_item("item2",64,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",nil,nil,5)
851
+ p.define_item("item3",96,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",nil,nil,nil)
852
+ p.define_item("item4",32,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",nil,nil,6)
834
853
  expect(p.id_items).to be_a Array
835
- expect(p.id_items[0].name).to eq "ITEM2"
836
- expect(p.id_items[1].name).to eq "ITEM4"
854
+ expect(p.id_items[0].name).to eq "ITEM4"
855
+ expect(p.id_items[1].name).to eq "ITEM2"
856
+ end
857
+ end
858
+
859
+ describe "read_id_values" do
860
+ it "to read the right values" do
861
+ buffer = "\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x01"
862
+ p = Packet.new("tgt","pkt")
863
+ p.define_item("item1",0,32,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,nil)
864
+ p.define_item("item2",64,32,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,5)
865
+ p.define_item("item3",96,32,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,nil)
866
+ p.define_item("item4",32,32,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,6)
867
+ values = p.read_id_values(buffer)
868
+ expect(values[0]).to eq 3
869
+ expect(values[1]).to eq 2
837
870
  end
838
871
  end
839
872
 
@@ -53,17 +53,6 @@ module Cosmos
53
53
  tf.unlink
54
54
  end
55
55
 
56
- it "complains if STATE is defined" do
57
- tf = Tempfile.new('unittest')
58
- tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
59
- tf.puts 'ITEM myitem 0 8 UINT "Test Item"'
60
- tf.puts 'STATE ONE 1'
61
- tf.puts "FORMAT_STRING '0x%x'"
62
- tf.close
63
- expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Items with STATE can't define FORMAT_STRING/)
64
- tf.unlink
65
- end
66
-
67
56
  it "complains about invalid format strings" do
68
57
  tf = Tempfile.new('unittest')
69
58
  tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
@@ -69,12 +69,12 @@ module Cosmos
69
69
  tf.close
70
70
  @pc.process_file(tf.path, "TGT1")
71
71
  pkt = @pc.telemetry["TGT1"]["PKT1"]
72
- expect(pkt.items.length).to eql 7 # 4 plus the RECEIVED_XXX items
72
+ expect(pkt.items.length).to eql 9 # 4 plus the RECEIVED_XXX and PACKET_TIMExxx items
73
73
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4')
74
- expect(pkt.sorted_items[3].name).to eql 'BIT4'
75
- expect(pkt.sorted_items[4].name).to eql 'BIT3'
76
- expect(pkt.sorted_items[5].name).to eql 'BIT2'
77
- expect(pkt.sorted_items[6].name).to eql 'BIT1'
74
+ expect(pkt.sorted_items[5].name).to eql 'BIT4'
75
+ expect(pkt.sorted_items[6].name).to eql 'BIT3'
76
+ expect(pkt.sorted_items[7].name).to eql 'BIT2'
77
+ expect(pkt.sorted_items[8].name).to eql 'BIT1'
78
78
  limits_items = []
79
79
  pkt.items.each do |name, item|
80
80
  limits_items << item if name.include?('BIT')
@@ -117,24 +117,24 @@ module Cosmos
117
117
  tf.close
118
118
  @pc.process_file(tf.path, "TGT1")
119
119
  pkt = @pc.telemetry["TGT1"]["PKT1"]
120
- expect(pkt.items.length).to eql 11 # 8 plus the RECEIVED_XXX items
120
+ expect(pkt.items.length).to eql 13 # 8 plus the RECEIVED_XXX and PACKET_TIMExxx items
121
121
  expect(pkt.items.keys).to include('WORD1','WORD2','WORD3','WORD4','DWORD1','DWORD2','DWORD3','DWORD4')
122
- expect(pkt.sorted_items[3].name).to eql 'WORD1'
123
- expect(pkt.sorted_items[3].bit_offset).to eql 0
124
- expect(pkt.sorted_items[4].name).to eql 'DWORD1'
125
- expect(pkt.sorted_items[4].bit_offset).to eql 16
126
- expect(pkt.sorted_items[5].name).to eql 'WORD2'
127
- expect(pkt.sorted_items[5].bit_offset).to eql 48
128
- expect(pkt.sorted_items[6].name).to eql 'DWORD2'
129
- expect(pkt.sorted_items[6].bit_offset).to eql 64
130
- expect(pkt.sorted_items[7].name).to eql 'WORD3'
131
- expect(pkt.sorted_items[7].bit_offset).to eql 96
132
- expect(pkt.sorted_items[8].name).to eql 'DWORD3'
133
- expect(pkt.sorted_items[8].bit_offset).to eql 112
134
- expect(pkt.sorted_items[9].name).to eql 'WORD4'
135
- expect(pkt.sorted_items[9].bit_offset).to eql 144
136
- expect(pkt.sorted_items[10].name).to eql 'DWORD4'
137
- expect(pkt.sorted_items[10].bit_offset).to eql 160
122
+ expect(pkt.sorted_items[5].name).to eql 'WORD1'
123
+ expect(pkt.sorted_items[5].bit_offset).to eql 0
124
+ expect(pkt.sorted_items[6].name).to eql 'DWORD1'
125
+ expect(pkt.sorted_items[6].bit_offset).to eql 16
126
+ expect(pkt.sorted_items[7].name).to eql 'WORD2'
127
+ expect(pkt.sorted_items[7].bit_offset).to eql 48
128
+ expect(pkt.sorted_items[8].name).to eql 'DWORD2'
129
+ expect(pkt.sorted_items[8].bit_offset).to eql 64
130
+ expect(pkt.sorted_items[9].name).to eql 'WORD3'
131
+ expect(pkt.sorted_items[9].bit_offset).to eql 96
132
+ expect(pkt.sorted_items[10].name).to eql 'DWORD3'
133
+ expect(pkt.sorted_items[10].bit_offset).to eql 112
134
+ expect(pkt.sorted_items[11].name).to eql 'WORD4'
135
+ expect(pkt.sorted_items[11].bit_offset).to eql 144
136
+ expect(pkt.sorted_items[12].name).to eql 'DWORD4'
137
+ expect(pkt.sorted_items[12].bit_offset).to eql 160
138
138
  tf.unlink
139
139
  end
140
140
 
@@ -149,18 +149,18 @@ module Cosmos
149
149
  tf.close
150
150
  @pc.process_file(tf.path, "TGT1")
151
151
  pkt = @pc.telemetry["TGT1"]["PKT1"]
152
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
152
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
153
153
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
154
- expect(pkt.sorted_items[3].name).to eql 'BIT1'
155
- expect(pkt.sorted_items[3].bit_offset).to eql 0
156
- expect(pkt.sorted_items[4].name).to eql 'BIT2'
157
- expect(pkt.sorted_items[4].bit_offset).to eql 16
158
- expect(pkt.sorted_items[5].name).to eql 'BIT3'
159
- expect(pkt.sorted_items[5].bit_offset).to eql 32
160
- expect(pkt.sorted_items[6].name).to eql 'BIT4'
161
- expect(pkt.sorted_items[6].bit_offset).to eql 48
162
- expect(pkt.sorted_items[7].name).to eql 'BIT5'
163
- expect(pkt.sorted_items[7].bit_offset).to eql 64
154
+ expect(pkt.sorted_items[5].name).to eql 'BIT1'
155
+ expect(pkt.sorted_items[5].bit_offset).to eql 0
156
+ expect(pkt.sorted_items[6].name).to eql 'BIT2'
157
+ expect(pkt.sorted_items[6].bit_offset).to eql 16
158
+ expect(pkt.sorted_items[7].name).to eql 'BIT3'
159
+ expect(pkt.sorted_items[7].bit_offset).to eql 32
160
+ expect(pkt.sorted_items[8].name).to eql 'BIT4'
161
+ expect(pkt.sorted_items[8].bit_offset).to eql 48
162
+ expect(pkt.sorted_items[9].name).to eql 'BIT5'
163
+ expect(pkt.sorted_items[9].bit_offset).to eql 64
164
164
  limits_items = []
165
165
  pkt.items.each do |name, item|
166
166
  limits_items << item if name.include?('BIT')
@@ -179,7 +179,7 @@ module Cosmos
179
179
  tf.close
180
180
  @pc.process_file(tf.path, "TGT1")
181
181
  pkt = @pc.telemetry["TGT1"]["PKT1"]
182
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
182
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
183
183
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
184
184
  expect(pkt.limits_items.collect{|item| item.name}).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
185
185
  tf.unlink
@@ -194,7 +194,7 @@ module Cosmos
194
194
  tf.close
195
195
  @pc.process_file(tf.path, "TGT1")
196
196
  pkt = @pc.telemetry["TGT1"]["PKT1"]
197
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
197
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
198
198
  expect(pkt.items.keys).to include('BIT1','BIT2','BIT3','BIT4','BIT5')
199
199
  expect(pkt.limits_items).to be_empty
200
200
  tf.unlink
@@ -209,7 +209,7 @@ module Cosmos
209
209
  tf.close
210
210
  @pc.process_file(tf.path, "TGT1")
211
211
  pkt = @pc.telemetry["TGT1"]["PKT1"]
212
- expect(pkt.items.length).to eql 8 # 5 plus the RECEIVED_XXX items
212
+ expect(pkt.items.length).to eql 10 # 5 plus the RECEIVED_XXX and PACKET_TIMExxx items
213
213
  expect(pkt.items.keys).to include('08_BIT','09_BIT','10_BIT','11_BIT','12_BIT')
214
214
  expect(pkt.limits_items).to be_empty
215
215
  tf.unlink
@@ -54,17 +54,6 @@ module Cosmos
54
54
  tf.unlink
55
55
  end
56
56
 
57
- it "complains if FORMAT_STRING defined" do
58
- tf = Tempfile.new('unittest')
59
- tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
60
- tf.puts ' ITEM myitem 0 8 UINT "Test Item"'
61
- tf.puts ' FORMAT_STRING "0x%x"'
62
- tf.puts ' STATE ONE 1'
63
- tf.close
64
- expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Items with FORMAT_STRING can't define STATE/)
65
- tf.unlink
66
- end
67
-
68
57
  it "complains if UNITS defined" do
69
58
  tf = Tempfile.new('unittest')
70
59
  tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
@@ -119,6 +108,75 @@ module Cosmos
119
108
  end
120
109
 
121
110
  context "with telemetry" do
111
+ it "defines states on ARRAY items" do
112
+ tf = Tempfile.new('unittest')
113
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
114
+ tf.puts ' APPEND_ARRAY_ITEM item1 8 UINT 40 "state item"'
115
+ tf.puts ' STATE FALSE 0'
116
+ tf.puts ' STATE TRUE 1'
117
+ tf.puts ' STATE ERROR ANY'
118
+ tf.close
119
+ @pc.process_file(tf.path, "TGT1")
120
+ tlm = Telemetry.new(@pc)
121
+ pkt = tlm.packet("TGT1", "PKT1")
122
+ pkt.write("ITEM1", [0,1,2,1,0])
123
+ expect(pkt.read("ITEM1")).to eql ["FALSE","TRUE","ERROR","TRUE","FALSE"]
124
+ tf.unlink
125
+ end
126
+
127
+ it "uses state or FORMAT_STRING if no state" do
128
+ tf = Tempfile.new('unittest')
129
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
130
+ tf.puts ' APPEND_ITEM item1 8 UINT "Test Item"'
131
+ tf.puts ' FORMAT_STRING "0x%x"'
132
+ tf.puts ' STATE ONE 1'
133
+ tf.close
134
+ @pc.process_file(tf.path, "TGT1")
135
+ tlm = Telemetry.new(@pc)
136
+ pkt = tlm.packet("TGT1", "PKT1")
137
+ pkt.write("ITEM1", 1)
138
+ expect(pkt.read("ITEM1", :FORMATTED)).to eql "ONE"
139
+ pkt.write("ITEM1", 2)
140
+ expect(pkt.read("ITEM1", :FORMATTED)).to eql "0x2"
141
+ tf.unlink
142
+
143
+ # Ensure the order of STATE vs FORMAT_STRING doesn't matter
144
+ tf = Tempfile.new('unittest')
145
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
146
+ tf.puts ' APPEND_ITEM item1 8 UINT "Test Item"'
147
+ tf.puts ' STATE ONE 1'
148
+ tf.puts ' FORMAT_STRING "0x%x"'
149
+ tf.close
150
+ @pc.process_file(tf.path, "TGT1")
151
+ tlm = Telemetry.new(@pc)
152
+ pkt = tlm.packet("TGT1", "PKT1")
153
+ pkt.write("ITEM1", 1)
154
+ expect(pkt.read("ITEM1", :FORMATTED)).to eql "ONE"
155
+ pkt.write("ITEM1", 2)
156
+ expect(pkt.read("ITEM1", :FORMATTED)).to eql "0x2"
157
+ tf.unlink
158
+ end
159
+
160
+ it "allows an 'ANY' state" do
161
+ tf = Tempfile.new('unittest')
162
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
163
+ tf.puts ' APPEND_ITEM item1 8 UINT "state item"'
164
+ tf.puts ' STATE FALSE 0'
165
+ tf.puts ' STATE TRUE 1'
166
+ tf.puts ' STATE ERROR ANY'
167
+ tf.close
168
+ @pc.process_file(tf.path, "TGT1")
169
+ tlm = Telemetry.new(@pc)
170
+ pkt = tlm.packet("TGT1", "PKT1")
171
+ pkt.write("ITEM1", 0)
172
+ expect(pkt.read("ITEM1")).to eql "FALSE"
173
+ pkt.write("ITEM1", 1)
174
+ expect(pkt.read("ITEM1")).to eql "TRUE"
175
+ pkt.write("ITEM1", 2)
176
+ expect(pkt.read("ITEM1")).to eql "ERROR"
177
+ tf.unlink
178
+ end
179
+
122
180
  it "only allows GREEN YELLOW or RED" do
123
181
  tf = Tempfile.new('unittest')
124
182
  tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
@@ -185,6 +185,8 @@ module Cosmos
185
185
  expect(@s.defined_length).to eql 1
186
186
  si = StructureItem.new("test1",0,16,:INT,:BIG_ENDIAN)
187
187
  @s.define(si)
188
+ expect(@s.items.length).to eql 1
189
+ expect(@s.sorted_items.length).to eql 1
188
190
  expect(@s.sorted_items[0].name).to eql "TEST1"
189
191
  expect(@s.items["TEST1"].bit_size).to eql 16
190
192
  expect(@s.items["TEST1"].data_type).to eql :INT
@@ -290,6 +292,56 @@ module Cosmos
290
292
  end
291
293
  end
292
294
 
295
+ describe "delete_item" do
296
+ before(:each) do
297
+ @s = Structure.new(:BIG_ENDIAN)
298
+ @s.define_item("test1", 0, 8, :UINT)
299
+ end
300
+
301
+ it "removes the item and leaves a hole" do
302
+ @s.append_item("test2", 16, :UINT)
303
+ expect(@s.defined_length).to eql 3
304
+ @s.delete_item("test1")
305
+ expect { @s.get_item("test1") }.to raise_error(ArgumentError, "Unknown item: test1")
306
+ expect(@s.defined_length).to eql 3
307
+ expect(@s.items["TEST1"]).to be_nil
308
+ expect(@s.items["TEST2"]).not_to be_nil
309
+ expect(@s.sorted_items.length).to eql 1
310
+ expect(@s.sorted_items[0]).to eql(@s.get_item("test2"))
311
+ buffer = "\x01\x02\x03"
312
+ expect(@s.read("test2", :RAW, buffer)).to eql 0x0203
313
+ end
314
+
315
+ it "allows new items to be defined in place" do
316
+ @s.append_item("test2", 16, :UINT)
317
+ @s.append_item("test3", 8, :UINT)
318
+ expect(@s.defined_length).to eql 4
319
+ # Delete the first 2 items, note a 3 byte hole now exists
320
+ @s.delete_item("test1")
321
+ @s.delete_item("test2")
322
+ expect(@s.defined_length).to eql 4
323
+ expect(@s.items.length).to eql 1
324
+ expect(@s.sorted_items.length).to eql 1
325
+ # Fill the hole and overlap the last byte
326
+ @s.define_item("test4", 0, 16, :UINT)
327
+ @s.define_item("test5", 16, 16, :UINT)
328
+ @s.define_item("test6", 32, 32, :UINT)
329
+ buffer = "\x01\x02\x03\x04\x05\x06\x07\x08"
330
+ expect(@s.read("test4", :RAW, buffer)).to eql 0x0102
331
+ expect(@s.read("test5", :RAW, buffer)).to eql 0x0304
332
+ expect(@s.read("test6", :RAW, buffer)).to eql 0x05060708
333
+ # test3 is still defined
334
+ expect(@s.read("test3", :RAW, buffer)).to eql 0x04
335
+ expect(@s.items.length).to eql 4
336
+ expect(@s.sorted_items.length).to eql 4
337
+ # Check that everything is sorted correctly
338
+ expect(@s.sorted_items[0].name).to eql "TEST4"
339
+ expect(@s.sorted_items[1].name).to eql "TEST5"
340
+ expect(@s.sorted_items[2].name).to eql "TEST3"
341
+ expect(@s.sorted_items[3].name).to eql "TEST6"
342
+ end
343
+ end
344
+
293
345
  describe "read_item" do
294
346
  it "complains if no buffer given" do
295
347
  s = Structure.new
@@ -348,6 +400,20 @@ module Cosmos
348
400
  expect(s.read("test1", :RAW, buffer)).to eql 1
349
401
  end
350
402
 
403
+ it "reads until null byte for STRING items" do
404
+ s = Structure.new
405
+ s.define_item("test1", 0, 80, :STRING)
406
+ buffer = "\x4E\x4F\x4F\x50\x00\x4E\x4F\x4F\x50\x0A" # NOOP<NULL>NOOP\n
407
+ expect(s.read("test1", :CONVERTED, buffer)).to eql "NOOP"
408
+ end
409
+
410
+ it "reads the entire buffer for BLOCK items" do
411
+ s = Structure.new
412
+ s.define_item("test1", 0, 80, :BLOCK)
413
+ buffer = "\x4E\x4F\x4F\x50\x00\x4E\x4F\x4F\x50\x0A" # NOOP<NULL>NOOP\n
414
+ expect(s.read("test1", :CONVERTED, buffer)).to eql "NOOP\x00NOOP\n"
415
+ end
416
+
351
417
  it "reads array data from the buffer" do
352
418
  s = Structure.new
353
419
  s.define_item("test1", 0, 8, :UINT, 16)
@@ -442,6 +508,33 @@ module Cosmos
442
508
  expect(s.formatted(:CONVERTED, 4)).to include(" TEST3")
443
509
  expect(s.formatted(:CONVERTED, 4)).to include(" 00000000: 07 08 09 0A")
444
510
  end
511
+
512
+ it "processes uses a different buffer" do
513
+ s = Structure.new(:BIG_ENDIAN)
514
+ s.append_item("test1", 8, :UINT, 16)
515
+ s.write("test1", [1,2])
516
+ s.append_item("test2", 16, :UINT)
517
+ s.write("test2", 3456)
518
+ s.append_item("test3", 32, :BLOCK)
519
+ s.write("test3", "\x07\x08\x09\x0A")
520
+ buffer = "\x0A\x0B\x0C\x0D\xDE\xAD\xBE\xEF"
521
+ expect(s.formatted(:CONVERTED, 0, buffer)).to include("TEST1: [10, 11]")
522
+ expect(s.formatted(:CONVERTED, 0, buffer)).to include("TEST2: #{0x0C0D}")
523
+ expect(s.formatted(:CONVERTED, 0, buffer)).to include("TEST3")
524
+ expect(s.formatted(:CONVERTED, 0, buffer)).to include("00000000: DE AD BE EF")
525
+ end
526
+
527
+ it "ignores items" do
528
+ s = Structure.new(:BIG_ENDIAN)
529
+ s.append_item("test1", 8, :UINT, 16)
530
+ s.write("test1", [1,2])
531
+ s.append_item("test2", 16, :UINT)
532
+ s.write("test2", 3456)
533
+ s.append_item("test3", 32, :BLOCK)
534
+ s.write("test3", "\x07\x08\x09\x0A")
535
+ expect(s.formatted(:CONVERTED, 0, s.buffer, %w(TEST1 TEST3))).to eq("TEST2: 3456\n")
536
+ expect(s.formatted(:CONVERTED, 0, s.buffer, %w(TEST1 TEST2 TEST3))).to eq("")
537
+ end
445
538
  end
446
539
 
447
540
  describe "buffer" do
@@ -560,7 +653,5 @@ module Cosmos
560
653
  expect { s.test1 }.to raise_error(ArgumentError, "Unknown item: test1")
561
654
  end
562
655
  end
563
-
564
656
  end # describe Structure
565
-
566
657
  end