cosmos 4.1.1-java → 4.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
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() }