cosmos 4.1.1-java → 4.2.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 (336) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/.travis.yml +2 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +1 -0
  6. data/Manifest.txt +130 -0
  7. data/autohotkey/tools/ConfigEditorAHK +19 -0
  8. data/autohotkey/tools/cmd_extractor.ahk +4 -4
  9. data/autohotkey/tools/cmd_sequence.ahk +9 -5
  10. data/autohotkey/tools/config_editor.ahk +197 -0
  11. data/autohotkey/tools/packet_viewer.ahk +12 -6
  12. data/autohotkey/tools/replay.ahk +29 -29
  13. data/autohotkey/tools/script_runner.ahk +10 -2
  14. data/autohotkey/tools/tlm_extractor.ahk +7 -8
  15. data/autohotkey/tools/tlm_grapher.ahk +21 -9
  16. data/bin/dart_import +2 -0
  17. data/cosmos.gemspec +18 -16
  18. data/data/config/cmd_tlm_server.yaml +9 -0
  19. data/data/config/interface_modifiers.yaml +17 -0
  20. data/data/config/item_modifiers.yaml +3 -3
  21. data/data/crc.txt +184 -90
  22. data/data/dart.png +0 -0
  23. data/demo/Gemfile +1 -0
  24. data/demo/Rakefile +4 -0
  25. data/demo/config/dart/Gemfile +54 -0
  26. data/demo/config/data/crc.txt +28 -21
  27. data/demo/config/system/system.txt +3 -0
  28. data/demo/config/system/system2.txt +3 -0
  29. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +3 -3
  30. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +1 -1
  31. data/demo/config/targets/INST/lib/sim_inst.rb +1 -1
  32. data/demo/config/targets/INST/screens/adcs.txt +2 -1
  33. data/demo/config/targets/INST/screens/array.txt +1 -1
  34. data/demo/config/targets/INST/screens/block.txt +1 -1
  35. data/demo/config/targets/INST/screens/commanding.txt +7 -2
  36. data/demo/config/targets/INST/screens/graphs.txt +1 -1
  37. data/demo/config/targets/INST/screens/ground.txt +1 -1
  38. data/demo/config/targets/INST/screens/hs.txt +2 -1
  39. data/demo/config/targets/INST/screens/latest.txt +1 -1
  40. data/demo/config/targets/INST/screens/limits.txt +1 -1
  41. data/demo/config/targets/INST/screens/other.txt +1 -1
  42. data/demo/config/targets/INST/screens/tabs.txt +1 -1
  43. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  44. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +3 -1
  45. data/demo/config/tools/launcher/launcher.txt +3 -2
  46. data/demo/tools/Dart +16 -0
  47. data/demo/tools/Dart.bat +9 -0
  48. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
  49. data/demo/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
  50. data/install/Gemfile +1 -0
  51. data/install/Rakefile +4 -0
  52. data/install/config/dart/Gemfile +54 -0
  53. data/install/config/data/crc.txt +6 -3
  54. data/install/config/system/system.txt +3 -0
  55. data/install/config/tools/launcher/launcher.txt +3 -2
  56. data/install/tools/Dart +16 -0
  57. data/install/tools/Dart.bat +9 -0
  58. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
  59. data/install/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
  60. data/lib/cosmos/core_ext/time.rb +8 -8
  61. data/lib/cosmos/dart/.rspec +1 -0
  62. data/lib/cosmos/dart/Gemfile +69 -0
  63. data/lib/cosmos/dart/Rakefile +7 -0
  64. data/lib/cosmos/dart/app/assets/config/manifest.js +4 -0
  65. data/lib/cosmos/dart/app/assets/images/.keep +0 -0
  66. data/lib/cosmos/dart/app/assets/javascripts/application.js +13 -0
  67. data/lib/cosmos/dart/app/assets/javascripts/cable.js +13 -0
  68. data/lib/cosmos/dart/app/assets/stylesheets/application.css.scss +15 -0
  69. data/lib/cosmos/dart/app/channels/application_cable/channel.rb +4 -0
  70. data/lib/cosmos/dart/app/channels/application_cable/connection.rb +4 -0
  71. data/lib/cosmos/dart/app/controllers/application_controller.rb +3 -0
  72. data/lib/cosmos/dart/app/helpers/application_helper.rb +2 -0
  73. data/lib/cosmos/dart/app/jobs/application_job.rb +2 -0
  74. data/lib/cosmos/dart/app/mailers/application_mailer.rb +4 -0
  75. data/lib/cosmos/dart/app/models/application_record.rb +3 -0
  76. data/lib/cosmos/dart/app/models/item.rb +6 -0
  77. data/lib/cosmos/dart/app/models/item_to_decom_table_mapping.rb +9 -0
  78. data/lib/cosmos/dart/app/models/packet.rb +4 -0
  79. data/lib/cosmos/dart/app/models/packet_config.rb +7 -0
  80. data/lib/cosmos/dart/app/models/packet_log.rb +3 -0
  81. data/lib/cosmos/dart/app/models/packet_log_entry.rb +41 -0
  82. data/lib/cosmos/dart/app/models/system_config.rb +2 -0
  83. data/lib/cosmos/dart/app/models/target.rb +4 -0
  84. data/lib/cosmos/dart/app/views/layouts/application.html.erb +14 -0
  85. data/lib/cosmos/dart/app/views/layouts/mailer.html.erb +13 -0
  86. data/lib/cosmos/dart/app/views/layouts/mailer.text.erb +1 -0
  87. data/lib/cosmos/dart/bin/bundle +3 -0
  88. data/lib/cosmos/dart/bin/rails +4 -0
  89. data/lib/cosmos/dart/bin/rake +4 -0
  90. data/lib/cosmos/dart/bin/setup +34 -0
  91. data/lib/cosmos/dart/bin/update +29 -0
  92. data/lib/cosmos/dart/config.ru +5 -0
  93. data/lib/cosmos/dart/config/application.rb +29 -0
  94. data/lib/cosmos/dart/config/boot.rb +3 -0
  95. data/lib/cosmos/dart/config/cable.yml +9 -0
  96. data/lib/cosmos/dart/config/database.yml +23 -0
  97. data/lib/cosmos/dart/config/environment.rb +5 -0
  98. data/lib/cosmos/dart/config/environments/development.rb +62 -0
  99. data/lib/cosmos/dart/config/environments/production.rb +84 -0
  100. data/lib/cosmos/dart/config/environments/test.rb +42 -0
  101. data/lib/cosmos/dart/config/initializers/application_controller_renderer.rb +6 -0
  102. data/lib/cosmos/dart/config/initializers/assets.rb +12 -0
  103. data/lib/cosmos/dart/config/initializers/backtrace_silencers.rb +7 -0
  104. data/lib/cosmos/dart/config/initializers/cookies_serializer.rb +5 -0
  105. data/lib/cosmos/dart/config/initializers/filter_parameter_logging.rb +4 -0
  106. data/lib/cosmos/dart/config/initializers/inflections.rb +16 -0
  107. data/lib/cosmos/dart/config/initializers/mime_types.rb +4 -0
  108. data/lib/cosmos/dart/config/initializers/new_framework_defaults.rb +25 -0
  109. data/lib/cosmos/dart/config/initializers/session_store.rb +3 -0
  110. data/lib/cosmos/dart/config/initializers/wrap_parameters.rb +14 -0
  111. data/lib/cosmos/dart/config/locales/en.yml +23 -0
  112. data/lib/cosmos/dart/config/puma.rb +47 -0
  113. data/lib/cosmos/dart/config/routes.rb +3 -0
  114. data/lib/cosmos/dart/config/secrets.yml +22 -0
  115. data/lib/cosmos/dart/db/migrate/20170406172907_create_targets.rb +8 -0
  116. data/lib/cosmos/dart/db/migrate/20170406172927_create_packets.rb +10 -0
  117. data/lib/cosmos/dart/db/migrate/20170406172937_create_packet_logs.rb +9 -0
  118. data/lib/cosmos/dart/db/migrate/20170406172943_create_packet_log_entries.rb +16 -0
  119. data/lib/cosmos/dart/db/migrate/20170406183500_change_packet_log_entries_primary_key.rb +5 -0
  120. data/lib/cosmos/dart/db/migrate/20170407153618_add_unique_requirements.rb +7 -0
  121. data/lib/cosmos/dart/db/migrate/20170511155447_add_meta_id_to_packet_log_entries.rb +6 -0
  122. data/lib/cosmos/dart/db/migrate/20170523185056_rename_received_time_and_add_is_tlm_to_packet_log_entries.rb +7 -0
  123. data/lib/cosmos/dart/db/migrate/20170525201157_create_items.rb +10 -0
  124. data/lib/cosmos/dart/db/migrate/20170525201315_create_system_configs.rb +9 -0
  125. data/lib/cosmos/dart/db/migrate/20170525201624_create_packet_configs.rb +11 -0
  126. data/lib/cosmos/dart/db/migrate/20170525201745_create_item_to_decom_table_mappings.rb +12 -0
  127. data/lib/cosmos/dart/db/migrate/20170525201939_create_decom_tables.rb +12 -0
  128. data/lib/cosmos/dart/db/migrate/20170525202051_add_decom_state_to_packet_log_entry.rb +5 -0
  129. data/lib/cosmos/dart/db/migrate/20170913160409_update_items.rb +6 -0
  130. data/lib/cosmos/dart/db/migrate/20170913160558_update_item_to_decom_table_mapping.rb +11 -0
  131. data/lib/cosmos/dart/db/migrate/20170913160916_udpate_decom_table.rb +6 -0
  132. data/lib/cosmos/dart/db/migrate/20170913212026_add_ready_to_packet_configs.rb +5 -0
  133. data/lib/cosmos/dart/db/migrate/20170913223556_modify_tables.rb +9 -0
  134. data/lib/cosmos/dart/db/migrate/20170914215744_modify_mapping_table.rb +6 -0
  135. data/lib/cosmos/dart/db/migrate/20170919201433_add_system_config_id_to_packet_config.rb +11 -0
  136. data/lib/cosmos/dart/db/migrate/20170919210307_add_max_table_index_to_packet_configs.rb +5 -0
  137. data/lib/cosmos/dart/db/migrate/20171215225546_add_ready_to_packet_log_entries.rb +5 -0
  138. data/lib/cosmos/dart/db/migrate/20180116214338_add_index_for_ple_ready_to_packet_log_entries.rb +5 -0
  139. data/lib/cosmos/dart/db/schema.rb +103 -0
  140. data/lib/cosmos/dart/db/seeds.rb +7 -0
  141. data/lib/cosmos/dart/examples/dart_decom_client.rb +45 -0
  142. data/lib/cosmos/dart/examples/dart_stream_client.rb +93 -0
  143. data/lib/cosmos/dart/lib/dart_common.rb +749 -0
  144. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +172 -0
  145. data/lib/cosmos/dart/lib/dart_decom_query.rb +184 -0
  146. data/lib/cosmos/dart/lib/dart_decommutator.rb +235 -0
  147. data/lib/cosmos/dart/lib/dart_importer.rb +154 -0
  148. data/lib/cosmos/dart/lib/dart_logging.rb +50 -0
  149. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +139 -0
  150. data/lib/cosmos/dart/lib/dart_reducer_manager.rb +85 -0
  151. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +263 -0
  152. data/lib/cosmos/dart/lib/dart_tcpip_server_interface.rb +142 -0
  153. data/lib/cosmos/dart/processes/dart.rb +145 -0
  154. data/lib/cosmos/dart/processes/dart_decom_server.rb +39 -0
  155. data/lib/cosmos/dart/processes/dart_import.rb +63 -0
  156. data/lib/cosmos/dart/processes/dart_ingester.rb +92 -0
  157. data/lib/cosmos/dart/processes/dart_reducer.rb +27 -0
  158. data/lib/cosmos/dart/processes/dart_stream_server.rb +31 -0
  159. data/lib/cosmos/dart/processes/dart_worker.rb +37 -0
  160. data/lib/cosmos/dart/spec/dart/dart_common_spec.rb +333 -0
  161. data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +455 -0
  162. data/lib/cosmos/dart/spec/dart/dart_decom_query_spec.rb +153 -0
  163. data/lib/cosmos/dart/spec/dart/dart_decommutator_spec.rb +336 -0
  164. data/lib/cosmos/dart/spec/dart/dart_importer_spec.rb +83 -0
  165. data/lib/cosmos/dart/spec/dart/dart_logging_spec.rb +30 -0
  166. data/lib/cosmos/dart/spec/dart/dart_packet_log_writer_spec.rb +149 -0
  167. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +289 -0
  168. data/lib/cosmos/dart/spec/dart/dart_tcpip_server_interface_spec.rb +241 -0
  169. data/lib/cosmos/dart/spec/rails_helper.rb +60 -0
  170. data/lib/cosmos/dart/spec/spec_helper.rb +139 -0
  171. data/lib/cosmos/gui/dialogs/about_dialog.rb +1 -1
  172. data/lib/cosmos/gui/dialogs/dart_dialog.rb +60 -0
  173. data/lib/cosmos/gui/dialogs/legal_dialog.rb +1 -0
  174. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +0 -3
  175. data/lib/cosmos/gui/qt.rb +10 -1
  176. data/lib/cosmos/gui/text/completion.rb +10 -9
  177. data/lib/cosmos/gui/text/completion_text_edit.rb +16 -14
  178. data/lib/cosmos/gui/text/ruby_editor.rb +2 -2
  179. data/lib/cosmos/gui/widgets/dart_frame.rb +142 -0
  180. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +119 -0
  181. data/lib/cosmos/gui/widgets/packet_log_frame.rb +42 -12
  182. data/lib/cosmos/interfaces/interface.rb +1 -2
  183. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +26 -8
  184. data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +8 -2
  185. data/lib/cosmos/interfaces/protocols/protocol.rb +2 -1
  186. data/lib/cosmos/interfaces/protocols/template_protocol.rb +1 -1
  187. data/lib/cosmos/interfaces/stream_interface.rb +1 -0
  188. data/lib/cosmos/interfaces/tcpip_server_interface.rb +2 -3
  189. data/lib/cosmos/io/json_drb_object.rb +1 -1
  190. data/lib/cosmos/io/json_rpc.rb +2 -1
  191. data/lib/cosmos/io/win32_serial_driver.rb +2 -9
  192. data/lib/cosmos/packet_logs/packet_log_writer.rb +1 -1
  193. data/lib/cosmos/packets/packet.rb +22 -12
  194. data/lib/cosmos/packets/packet_config.rb +2 -1
  195. data/lib/cosmos/packets/packet_item.rb +26 -24
  196. data/lib/cosmos/packets/parsers/macro_parser.rb +5 -2
  197. data/lib/cosmos/packets/parsers/packet_item_parser.rb +35 -17
  198. data/lib/cosmos/packets/parsers/packet_parser.rb +3 -10
  199. data/lib/cosmos/packets/parsers/xtce_converter.rb +21 -35
  200. data/lib/cosmos/packets/parsers/xtce_parser.rb +54 -46
  201. data/lib/cosmos/packets/structure.rb +10 -2
  202. data/lib/cosmos/packets/structure_item.rb +22 -8
  203. data/lib/cosmos/processors/statistics_processor.rb +2 -0
  204. data/lib/cosmos/script/api_shared.rb +13 -12
  205. data/lib/cosmos/script/cmd_tlm_server.rb +4 -0
  206. data/lib/cosmos/script/commands.rb +3 -15
  207. data/lib/cosmos/script/script.rb +69 -23
  208. data/lib/cosmos/streams/tcpip_client_stream.rb +2 -2
  209. data/lib/cosmos/system/system.rb +42 -25
  210. data/lib/cosmos/system/target.rb +6 -2
  211. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +177 -36
  212. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +3 -2
  213. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +34 -8
  214. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +80 -25
  215. data/lib/cosmos/tools/cmd_tlm_server/api.rb +19 -4
  216. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +15 -14
  217. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +15 -9
  218. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +1 -9
  219. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -6
  220. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +1 -3
  221. data/lib/cosmos/tools/cmd_tlm_server/gui/replay_tab.rb +84 -7
  222. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +0 -1
  223. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +1 -5
  224. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +3 -2
  225. data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +159 -27
  226. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +1 -1
  227. data/lib/cosmos/tools/config_editor/config_editor.rb +17 -52
  228. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +0 -5
  229. data/lib/cosmos/tools/data_viewer/data_viewer.rb +111 -0
  230. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +31 -18
  231. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +12 -3
  232. data/lib/cosmos/tools/script_runner/script_runner.rb +27 -14
  233. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +104 -37
  234. data/lib/cosmos/tools/table_manager/table_config.rb +1 -1
  235. data/lib/cosmos/tools/table_manager/table_item_parser.rb +4 -2
  236. data/lib/cosmos/tools/table_manager/table_manager.rb +0 -5
  237. data/lib/cosmos/tools/table_manager/table_manager_core.rb +0 -1
  238. data/lib/cosmos/tools/test_runner/test.rb +1 -3
  239. data/lib/cosmos/tools/test_runner/test_runner.rb +26 -15
  240. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +290 -137
  241. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +122 -25
  242. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +67 -0
  243. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +28 -0
  244. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +36 -0
  245. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +42 -3
  246. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +88 -14
  247. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +2 -5
  248. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +2 -6
  249. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +74 -18
  250. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +3 -7
  251. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +159 -0
  252. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +49 -2
  253. data/lib/cosmos/tools/tlm_viewer/screen.rb +3 -0
  254. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +0 -2
  255. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  256. data/lib/cosmos/tools/tlm_viewer/widgets/backgroundbutton_widget.rb +54 -0
  257. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +5 -5
  258. data/lib/cosmos/top_level.rb +1 -0
  259. data/lib/cosmos/utilities/crc.rb +3 -0
  260. data/lib/cosmos/utilities/csv.rb +1 -0
  261. data/lib/cosmos/utilities/message_log.rb +2 -1
  262. data/lib/cosmos/utilities/simulated_target.rb +8 -8
  263. data/lib/cosmos/version.rb +5 -5
  264. data/lib/cosmos/win32/win32.rb +4 -10
  265. data/run_gui_tests.bat +2 -1
  266. data/spec/config/config_parser_spec.rb +4 -4
  267. data/spec/core_ext/array_spec.rb +1 -1
  268. data/spec/core_ext/exception_spec.rb +12 -12
  269. data/spec/core_ext/file_spec.rb +6 -6
  270. data/spec/core_ext/hash_spec.rb +1 -1
  271. data/spec/core_ext/socket_spec.rb +2 -2
  272. data/spec/core_ext/string_spec.rb +13 -13
  273. data/spec/core_ext/time_spec.rb +0 -2
  274. data/spec/gui/utilities/script_module_gui_spec.rb +3 -3
  275. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +6 -6
  276. data/spec/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +4 -0
  277. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +6 -2
  278. data/spec/interfaces/interface_spec.rb +0 -1
  279. data/spec/interfaces/linc_interface_spec.rb +0 -5
  280. data/spec/interfaces/protocols/crc_protocol_spec.rb +201 -85
  281. data/spec/interfaces/protocols/fixed_protocol_spec.rb +33 -9
  282. data/spec/interfaces/protocols/length_protocol_spec.rb +1 -1
  283. data/spec/interfaces/protocols/override_protocol_spec.rb +6 -2
  284. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +1 -5
  285. data/spec/interfaces/protocols/template_protocol_spec.rb +0 -1
  286. data/spec/interfaces/simulated_target_interface_spec.rb +5 -5
  287. data/spec/interfaces/udp_interface_spec.rb +2 -4
  288. data/spec/io/buffered_file_spec.rb +8 -12
  289. data/spec/io/json_drb_spec.rb +9 -9
  290. data/spec/io/json_rpc_spec.rb +4 -4
  291. data/spec/io/raw_logger_spec.rb +4 -3
  292. data/spec/packet_logs/packet_log_reader_spec.rb +3 -6
  293. data/spec/packet_logs/packet_log_writer_spec.rb +4 -4
  294. data/spec/packets/binary_accessor_spec.rb +5 -8
  295. data/spec/packets/commands_spec.rb +2 -2
  296. data/spec/packets/limits_spec.rb +2 -2
  297. data/spec/packets/packet_config_spec.rb +12 -0
  298. data/spec/packets/packet_item_limits_spec.rb +1 -1
  299. data/spec/packets/packet_item_spec.rb +9 -9
  300. data/spec/packets/packet_spec.rb +15 -5
  301. data/spec/packets/parsers/packet_item_parser_spec.rb +27 -0
  302. data/spec/packets/parsers/xtce_parser_spec.rb +27 -30
  303. data/spec/packets/structure_spec.rb +2 -1
  304. data/spec/packets/telemetry_spec.rb +3 -5
  305. data/spec/processors/statistics_processor_spec.rb +35 -0
  306. data/spec/script/cmd_tlm_server_spec.rb +4 -21
  307. data/spec/script/commands_disconnect_spec.rb +46 -58
  308. data/spec/script/commands_spec.rb +40 -61
  309. data/spec/script/limits_spec.rb +1 -21
  310. data/spec/script/script_spec.rb +32 -41
  311. data/spec/script/scripting_spec.rb +166 -185
  312. data/spec/script/telemetry_spec.rb +10 -5
  313. data/spec/script/tools_spec.rb +2 -24
  314. data/spec/spec_helper.rb +11 -5
  315. data/spec/system/system_spec.rb +17 -12
  316. data/spec/tools/cmd_tlm_server/api_spec.rb +21 -10
  317. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -16
  318. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +0 -1
  319. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +16 -27
  320. data/spec/tools/cmd_tlm_server/commanding_spec.rb +2 -6
  321. data/spec/tools/cmd_tlm_server/connections_spec.rb +0 -4
  322. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +13 -13
  323. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +5 -9
  324. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +11 -3
  325. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +0 -4
  326. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +5 -5
  327. data/spec/tools/cmd_tlm_server/routers_spec.rb +5 -9
  328. data/spec/tools/table_manager/table_config_spec.rb +0 -1
  329. data/spec/tools/table_manager/tablemanager_core_spec.rb +23 -23
  330. data/spec/tools/tlm_viewer/tlm_viewer_config_spec.rb +6 -4
  331. data/spec/top_level/top_level_spec.rb +9 -9
  332. data/spec/utilities/csv_spec.rb +2 -12
  333. data/spec/utilities/logger_spec.rb +6 -6
  334. data/spec/utilities/message_log_spec.rb +3 -11
  335. data/tasks/gemfile_stats.rake +2 -2
  336. metadata +167 -60
@@ -29,7 +29,6 @@ module Cosmos
29
29
  end
30
30
 
31
31
  # Create the status tab and add it to the tab_widget
32
- # @param tab_widget [Qt::TabWidget] The tab widget to add the tab to
33
32
  def populate
34
33
  reset()
35
34
  @widget = Qt::Widget.new
@@ -12,7 +12,6 @@ require 'cosmos'
12
12
  require 'cosmos/gui/qt'
13
13
 
14
14
  module Cosmos
15
-
16
15
  # Implements the targets tab in the Command and Telemetry Server GUI
17
16
  class TargetsTab
18
17
  def initialize(tab_widget)
@@ -30,8 +29,6 @@ module Cosmos
30
29
  end
31
30
 
32
31
  # Create the targets tab and add it to the tab_widget
33
- #
34
- # @param tab_widget [Qt::TabWidget] The tab widget to add the tab to
35
32
  def populate
36
33
  reset()
37
34
  num_targets = System.targets.length
@@ -92,6 +89,5 @@ module Cosmos
92
89
  row += 1
93
90
  end
94
91
  end
95
-
96
92
  end
97
- end # module Cosmos
93
+ end
@@ -111,9 +111,10 @@ module Cosmos
111
111
  if @groups.include?(method_name.to_s[6..-1].upcase)
112
112
  check_methods << method_name.to_s
113
113
  else
114
- raise "Method #{method_name} doesn't match a group name.\n"\
114
+ Logger.warn "Inside class #{self.class}, method #{method_name} doesn't match a group name.\n"\
115
115
  "Methods must begin with 'check_' and end with a valid group name.\n"\
116
- "Groups are #{@groups.join(', ')}."
116
+ "You need to declare 'LIMITS_GROUP #{method_name.to_s[6..-1].upcase}' for #{method_name} to work.\n"\
117
+ "Currently defined groups: #{@groups.join(', ')}\n"\
117
118
  end
118
119
  end
119
120
  end
@@ -15,6 +15,7 @@ module Cosmos
15
15
 
16
16
  # The number of bytes to print when an UNKNOWN packet is received
17
17
  UNKNOWN_BYTES_TO_PRINT = 36
18
+ SLIDER_GRANULARITY = 10000
18
19
 
19
20
  attr_accessor :log_directory
20
21
  attr_accessor :log_filename
@@ -30,6 +31,7 @@ module Cosmos
30
31
 
31
32
  # Reset internal state
32
33
  def reset
34
+ @first = true
33
35
  @cancel = false
34
36
  @playback_delay = 0.0
35
37
  @default_packet_log_reader = System.default_packet_log_reader.new(*System.default_packet_log_reader_params)
@@ -46,8 +48,17 @@ module Cosmos
46
48
  @progress = 0
47
49
  @status = ''
48
50
  @start_time = ''
51
+ @start_time_object = nil
49
52
  @current_time = ''
53
+ @current_time_object = nil
50
54
  @end_time = ''
55
+ @end_time_object = nil
56
+ @mode = :stream
57
+ @interface = Cosmos::TcpipClientInterface.new(
58
+ Cosmos::System.connect_hosts['DART_STREAM'],
59
+ Cosmos::System.ports['DART_STREAM'],
60
+ Cosmos::System.ports['DART_STREAM'],
61
+ 10, 30, 'PREIDENTIFIED')
51
62
  end
52
63
 
53
64
  # Select and start analyzing a file for replay
@@ -56,6 +67,7 @@ module Cosmos
56
67
  def select_file(filename, packet_log_reader = 'DEFAULT')
57
68
  stop()
58
69
  Cosmos.kill_thread(self, @thread)
70
+ @mode = :file
59
71
  @thread = Thread.new do
60
72
  begin
61
73
  stop()
@@ -80,7 +92,7 @@ module Cosmos
80
92
  @progress = 0
81
93
  @status = "Analyzing: #{@progress}%"
82
94
  start_config_name = System.configuration_name
83
- config_change_success, config_error = Cosmos.check_log_configuration(@packet_log_reader, @log_filename)
95
+ Cosmos.check_log_configuration(@packet_log_reader, @log_filename)
84
96
  if System.configuration_name != start_config_name
85
97
  @config_change_callback.call() if @config_change_callback
86
98
  end
@@ -98,7 +110,7 @@ module Cosmos
98
110
 
99
111
  if @cancel
100
112
  @packet_log_reader.close
101
- @log_filename = ''
113
+ @log_filename = nil
102
114
  @packet_offsets = []
103
115
  @playback_index = 0
104
116
  @start_time = ''
@@ -121,6 +133,46 @@ module Cosmos
121
133
  end
122
134
  end
123
135
 
136
+ # Setup streaming with the given arguments
137
+ #
138
+ # start_time [Time] Time at which stream should begin at
139
+ # end_time [Time] Time at which stream should stop
140
+ def select_stream(start_time, end_time, meta_filters = [])
141
+ stop()
142
+ Cosmos.kill_thread(self, @thread)
143
+ @thread = nil
144
+ @mode = :stream
145
+ @log_filename = nil
146
+ @log_directory = System.paths['LOGS']
147
+ @log_directory << '/' unless @log_directory[-1..-1] == '\\' or @log_directory[-1..-1] == '/'
148
+ @packet_offsets = []
149
+
150
+ System.telemetry.reset
151
+ @cancel = false
152
+ @progress = 0
153
+ @status = "Stream Ready"
154
+ # start_config_name = System.configuration_name
155
+ # Cosmos.check_log_configuration(@packet_log_reader, @log_filename)
156
+ # if System.configuration_name != start_config_name
157
+ # @config_change_callback.call() if @config_change_callback
158
+ # end
159
+ @playback_index = 0
160
+ @playback_max_index = SLIDER_GRANULARITY
161
+ start_time = Time.utc(1970, 1, 1).sys unless start_time
162
+ @start_time = start_time.formatted(true, 3, true)
163
+ end_time = Time.now.sys unless end_time
164
+ @end_time = end_time.formatted(true, 3, true)
165
+ @start_time_object = start_time.dup
166
+ @end_time_object = end_time.dup
167
+ @current_time = @start_time.dup
168
+ @current_time_object = start_time.dup
169
+ @meta_filters = meta_filters
170
+ @status = 'Stopped'
171
+ @playing = false
172
+ @playback_sleeper = nil
173
+ @first = true
174
+ end
175
+
124
176
  # Get current replay status
125
177
  #
126
178
  # @return [status, playback_delay, filename, file_start, file_current, file_end, file_index, file_max_index]
@@ -155,8 +207,8 @@ module Cosmos
155
207
 
156
208
  # Replay start playing forward
157
209
  def play
158
- if @log_filename and !@thread
159
- @playback_index = 1 if @playback_index < 0
210
+ if (@mode == :stream or @log_filename) and !@thread
211
+ @playback_index = 0 if @playback_index < 0
160
212
  start_playback(:FORWARD)
161
213
  else
162
214
  stop()
@@ -165,8 +217,8 @@ module Cosmos
165
217
 
166
218
  # Replay start playing backward
167
219
  def reverse_play
168
- if @log_filename and !@thread
169
- @playback_index = @packet_offsets.length - 2 if @playback_index >= @packet_offsets.length
220
+ if (@mode == :stream or @log_filename) and !@thread
221
+ @playback_index = @packet_offsets.length - 2 if @mode != :stream and @playback_index >= @packet_offsets.length
170
222
  start_playback(:BACKWARD)
171
223
  else
172
224
  stop()
@@ -202,9 +254,15 @@ module Cosmos
202
254
 
203
255
  # Replay move to start of file
204
256
  def move_start
205
- if @log_filename and !@thread
206
- packet = read_at_index(0, :FORWARD)
207
- @start_time = packet.received_time.formatted(true, 3, true) if packet and packet.received_time
257
+ if (@mode == :stream or @log_filename) and !@thread
258
+ if @mode == :stream
259
+ @playback_index = 0
260
+ @current_time = @start_time.dup
261
+ @current_time_object = @start_time_object.dup
262
+ else
263
+ packet = read_at_index(0, :FORWARD)
264
+ @start_time = packet.received_time.formatted(true, 3, true) if packet and packet.received_time
265
+ end
208
266
  else
209
267
  stop()
210
268
  end
@@ -212,9 +270,15 @@ module Cosmos
212
270
 
213
271
  # Replay move to end of file
214
272
  def move_end
215
- if @log_filename and !@thread
216
- packet = read_at_index(@packet_offsets.length - 1, :FORWARD)
217
- @end_time = packet.received_time.formatted(true, 3, true) if packet and packet.received_time
273
+ if (@mode == :stream or @log_filename) and !@thread
274
+ if @mode == :stream
275
+ @playback_index = SLIDER_GRANULARITY
276
+ @current_time = @end_time.dup
277
+ @current_time_object = @end_time_object.dup
278
+ else
279
+ packet = read_at_index(@packet_offsets.length - 1, :FORWARD)
280
+ @end_time = packet.received_time.formatted(true, 3, true) if packet and packet.received_time
281
+ end
218
282
  else
219
283
  stop()
220
284
  end
@@ -224,8 +288,18 @@ module Cosmos
224
288
  #
225
289
  # @param index [Integer] packet index into file
226
290
  def move_index(index)
227
- if @log_filename and !@thread
228
- read_at_index(index, :FORWARD)
291
+ if (@mode == :stream or @log_filename) and !@thread
292
+ if @mode == :stream
293
+ @playback_index = index
294
+ total_seconds = @end_time_object - @start_time_object
295
+ delta = (total_seconds / SLIDER_GRANULARITY.to_f) * index
296
+ @current_time_object = @start_time_object + delta
297
+ @current_time = @current_time_object.formatted(true, 3, true)
298
+ else
299
+ read_at_index(index, :FORWARD)
300
+ end
301
+ else
302
+ stop()
229
303
  end
230
304
  end
231
305
 
@@ -244,6 +318,7 @@ module Cosmos
244
318
 
245
319
  def start_playback(direction)
246
320
  @thread = Thread.new do
321
+ packet_count = 0
247
322
  @playback_sleeper = Sleeper.new
248
323
  error = nil
249
324
  begin
@@ -256,6 +331,8 @@ module Cosmos
256
331
  packet_start = Time.now.sys
257
332
  packet = read_at_index(@playback_index, direction)
258
333
  break unless packet
334
+ packet_count += 1
335
+
259
336
  delay_time = 0.0
260
337
  if @playback_delay
261
338
  # Fixed Time Delay
@@ -269,6 +346,7 @@ module Cosmos
269
346
  end
270
347
  end
271
348
  if delay_time > 0.0
349
+ delay_time = 1.0 if delay_time > 1.0 # prevents large delays from gaps
272
350
  break if @playback_sleeper.sleep(delay_time)
273
351
  end
274
352
  previous_packet = packet
@@ -276,39 +354,93 @@ module Cosmos
276
354
  # No Delay
277
355
  packet = read_at_index(@playback_index, direction)
278
356
  break unless packet
357
+ packet_count += 1
279
358
  previous_packet = packet
280
359
  end
281
360
  end
282
361
  rescue Exception => error
283
362
  Logger.error "Error in Playback Thread\n#{error.formatted}"
284
363
  ensure
364
+ Logger.info "Replayed Packet Count = #{packet_count}"
285
365
  @status = 'Stopped'
286
366
  @playing = false
287
367
  @playback_sleeper = nil
288
368
  @thread = nil
369
+ @interface.disconnect
289
370
  end
290
371
  end
291
372
  end
292
373
 
293
374
  def read_at_index(index, direction)
294
- packet_offset = nil
295
- packet_offset = @packet_offsets[index] if index >= 0
296
- if packet_offset
297
- # Read the packet
298
- packet = @packet_log_reader.read_at_offset(packet_offset, false)
299
- handle_packet(packet)
375
+ if @mode == :file
376
+ packet_offset = nil
377
+ packet_offset = @packet_offsets[index] if index >= 0
378
+ if packet_offset
379
+ # Read the packet
380
+ packet = @packet_log_reader.read_at_offset(packet_offset, false)
381
+ handle_packet(packet)
382
+
383
+ # Adjust index for next read
384
+ if direction == :FORWARD
385
+ @playback_index = index + 1
386
+ else
387
+ @playback_index = index - 1
388
+ end
389
+ @current_time_object = packet.received_time
390
+ @current_time = packet.received_time.formatted(true, 3, true) if packet and packet.received_time
300
391
 
301
- # Adjust index for next read
302
- if direction == :FORWARD
303
- @playback_index = index + 1
392
+ return packet
304
393
  else
305
- @playback_index = index - 1
394
+ return nil
395
+ end
396
+ else
397
+ unless @interface.connected?
398
+ request_packet = Cosmos::Packet.new('DART', 'DART')
399
+ request_packet.define_item('REQUEST', 0, 0, :BLOCK)
400
+
401
+ request = {}
402
+ if direction == :FORWARD
403
+ request['start_time_sec'] = @current_time_object.tv_sec
404
+ request['start_time_usec'] = @current_time_object.tv_usec
405
+ request['end_time_sec'] = @end_time_object.tv_sec
406
+ request['end_time_usec'] = @end_time_object.tv_usec
407
+ else
408
+ request['start_time_sec'] = @current_time_object.tv_sec
409
+ request['start_time_usec'] = @current_time_object.tv_usec
410
+ request['end_time_sec'] = @start_time_object.tv_sec
411
+ request['end_time_usec'] = @start_time_object.tv_usec
412
+ end
413
+ request['cmd_tlm'] = 'TLM'
414
+ request['meta_filters'] = @meta_filters unless @meta_filters.empty?
415
+ request_packet.write('REQUEST', JSON.dump(request))
416
+
417
+ @interface.connect
418
+ @interface.write(request_packet)
419
+ end
420
+
421
+ packet = @interface.read
422
+ unless packet
423
+ @interface.disconnect
424
+ return nil
306
425
  end
307
- @current_time = packet.received_time.formatted(true, 3, true) if packet and packet.received_time
426
+
427
+ # Switch to correct configuration from SYSTEM META when needed
428
+ if packet.target_name == 'SYSTEM'.freeze and packet.packet_name == 'META'.freeze
429
+ meta_packet = System.telemetry.update!('SYSTEM', 'META', packet.buffer)
430
+ Cosmos::System.load_configuration(meta_packet.read('CONFIG'))
431
+ end
432
+ handle_packet(packet)
433
+
434
+ @current_time_object = packet.received_time
435
+ @current_time = packet.received_time.formatted(true, 3, true)
436
+ if @first
437
+ @first = false
438
+ @start_time_object = @current_time_object.dup
439
+ @start_time = @current_time.dup
440
+ end
441
+ @playback_index = ((((@end_time_object - @start_time_object) - (@end_time_object - @current_time_object)).to_f / (@end_time_object - @start_time_object).to_f) * SLIDER_GRANULARITY).to_i
308
442
 
309
443
  return packet
310
- else
311
- return nil
312
444
  end
313
445
  end
314
446
 
@@ -55,7 +55,7 @@ module Cosmos
55
55
  # All interfaces defined by the Command/Telemetry configuration are
56
56
  # directed to this router to output commands
57
57
  #
58
- # @param router_name [String] Name of the command router
58
+ # @param cmd_router_name [String] Name of the command router
59
59
  # @param port [Integer] Port to pass to the {TcpipServerInterface}
60
60
  def add_cmd_preidentified(cmd_router_name, port)
61
61
  cmd_router_name = cmd_router_name.upcase
@@ -326,6 +326,12 @@ module Cosmos
326
326
  @splitter.setSizes([200, 800]) # Rough split of the widget
327
327
  setCentralWidget(@splitter)
328
328
 
329
+ next_child = Qt::Shortcut.new(Qt::KeySequence.new(Qt::CTRL + Qt::Key_Tab), self)
330
+ self.connect(next_child, SIGNAL('activated()')) { next_child() }
331
+ # Note using Qt::KeySequence::PreviousChild does not work due to QT bug
332
+ previous_child = Qt::Shortcut.new(Qt::KeySequence.new(Qt::CTRL + Qt::SHIFT + Qt::Key_Tab), self)
333
+ self.connect(previous_child, SIGNAL('activated()')) { previous_child() }
334
+
329
335
  # Display a blank message to force the statusBar to show
330
336
  statusBar.showMessage("")
331
337
  @status_bar_right_label = Qt::Label.new
@@ -615,46 +621,6 @@ module Cosmos
615
621
  end
616
622
  end
617
623
 
618
- def enable_menu_items
619
- # Enable File Menu Items
620
- @file_new.setEnabled(true)
621
- @file_open.setEnabled(true)
622
- @file_close.setEnabled(true)
623
- @file_reload.setEnabled(true)
624
- @file_save.setEnabled(true)
625
- @file_save_as.setEnabled(true)
626
- @file_options.setEnabled(true)
627
-
628
- # Enable Edit Menu Items
629
- @edit_undo.setEnabled(true)
630
- @edit_redo.setEnabled(true)
631
- @edit_cut.setEnabled(true)
632
- @edit_copy.setEnabled(true)
633
- @edit_paste.setEnabled(true)
634
- @edit_select_all.setEnabled(true)
635
- @edit_comment.setEnabled(true)
636
- end
637
-
638
- def disable_menu_items
639
- # Disable File Menu Items
640
- @file_new.setEnabled(false)
641
- @file_open.setEnabled(false)
642
- @file_close.setEnabled(false)
643
- @file_reload.setEnabled(false)
644
- @file_save.setEnabled(false)
645
- @file_save_as.setEnabled(false)
646
- @file_options.setEnabled(false)
647
-
648
- # Disable Edit Menu Items
649
- @edit_undo.setEnabled(false)
650
- @edit_redo.setEnabled(false)
651
- @edit_cut.setEnabled(false)
652
- @edit_copy.setEnabled(false)
653
- @edit_paste.setEnabled(false)
654
- @edit_select_all.setEnabled(false)
655
- @edit_comment.setEnabled(false)
656
- end
657
-
658
624
  # Handle the user changing tabs
659
625
  def handle_tab_change(index)
660
626
  update_title()
@@ -662,17 +628,18 @@ module Cosmos
662
628
  update_tree()
663
629
  end
664
630
 
665
- def handle_script_keypress(event)
631
+ def next_child
632
+ index = @tab_book.currentIndex + 1
633
+ index = 0 if index >= @tab_book.count
634
+ @tab_book.setCurrentIndex(index)
635
+ update_title()
636
+ end
637
+
638
+ def previous_child
639
+ index = @tab_book.currentIndex - 1
640
+ index = @tab_book.count - 1 if index < 0
641
+ @tab_book.setCurrentIndex(index)
666
642
  update_title()
667
- if event.matches(Qt::KeySequence::NextChild)
668
- index = @tab_book.currentIndex + 1
669
- index = 0 if index >= @tab_book.count
670
- @tab_book.setCurrentIndex(index)
671
- elsif event.matches(Qt::KeySequence::PreviousChild)
672
- index = @tab_book.currentIndex - 1
673
- index = @tab_book.count - 1 if index < 0
674
- @tab_book.setCurrentIndex(index)
675
- end
676
643
  end
677
644
 
678
645
  def tab_context_menu(point)
@@ -779,8 +746,6 @@ module Cosmos
779
746
  SLOT('undo_available(bool)'))
780
747
  config_editor_frame.set_text_from_file(filename) unless filename.empty?
781
748
  config_editor_frame.filename = filename
782
- # Register a keypress handler so we can Ctrl-Tab our way through the tabs
783
- config_editor_frame.key_press_callback = method(:handle_script_keypress)
784
749
  # Update the title if the frame changes so we can add/remove the asterix
785
750
  config_editor_frame.connect(SIGNAL('modificationChanged(bool)')) { update_title() }
786
751
  config_editor_frame.connect(SIGNAL('cursorPositionChanged()')) { update_cursor() }