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
@@ -13,6 +13,19 @@ require 'cosmos/gui/qt'
13
13
  require 'cosmos/gui/dialogs/calendar_dialog'
14
14
 
15
15
  module Cosmos
16
+
17
+ class PacketLogFrameListWidget < Qt::ListWidget
18
+ attr_accessor :delete_callback
19
+
20
+ def keyPressEvent(event)
21
+ case event.key
22
+ when Qt::Key_Delete, Qt::Key_Backspace
23
+ @delete_callback.call if @delete_callback
24
+ end
25
+ super(event)
26
+ end
27
+ end
28
+
16
29
  # Widget which displays a button to browse for log files. Files are listed
17
30
  # and can be removed. Buttons exist to display start and stop time choosers
18
31
  # which apply to all files in the list. The widget can also show a button
@@ -88,8 +101,8 @@ module Cosmos
88
101
  row = 0
89
102
 
90
103
  # Chooser for Log Files
91
- label = Qt::Label.new('Log Files:')
92
- @layout.addWidget(label, row, 0, 1, 2)
104
+ @log_files_label = Qt::Label.new('Log Files:')
105
+ @layout.addWidget(@log_files_label, row, 0, 1, 2)
93
106
  @browse_button = Qt::PushButton.new('Browse...')
94
107
  @browse_button.connect(SIGNAL('clicked()')) { handle_browse_button() }
95
108
  @layout.addWidget(@browse_button, row, 2)
@@ -98,13 +111,10 @@ module Cosmos
98
111
  @layout.addWidget(@remove_button, row, 3)
99
112
  row += 1
100
113
 
101
- @filenames = Qt::ListWidget.new(self)
114
+ @filenames = PacketLogFrameListWidget.new(self)
102
115
  @filenames.setSelectionMode(Qt::AbstractItemView::ExtendedSelection)
103
116
  @filenames.setSortingEnabled(true)
104
- delete = Qt::Shortcut.new(Qt::KeySequence.new(Qt::Key_Delete), @filenames)
105
- delete.connect(SIGNAL('activated()')) { handle_remove_button }
106
- backspace = Qt::Shortcut.new(Qt::KeySequence.new(Qt::Key_Backspace), @filenames)
107
- backspace.connect(SIGNAL('activated()')) { handle_remove_button }
117
+ @filenames.delete_callback = method(:handle_remove_button)
108
118
  initial_filenames.each {|filename| @filenames.addItem(filename)}
109
119
  @filenames.setMinimumHeight(90)
110
120
  @layout.addWidget(@filenames, row, 0, 3, 4)
@@ -152,15 +162,15 @@ module Cosmos
152
162
  @packet_log_reader = PacketLogReader.new unless @packet_log_reader
153
163
 
154
164
  # Chooser or label for log reader
155
- label = Qt::Label.new('Packet Log Reader:')
156
- @layout.addWidget(label, row, 0)
165
+ @packet_log_reader_label = Qt::Label.new('Packet Log Reader:')
166
+ @layout.addWidget(@packet_log_reader_label, row, 0)
157
167
  @packet_log_reader_field = Qt::LineEdit.new(@packet_log_reader.class.to_s)
158
168
  @packet_log_reader_field.setMinimumWidth(340)
159
169
  @packet_log_reader_field.setReadOnly(true)
160
170
  @layout.addWidget(@packet_log_reader_field, row, 1, 1, 2)
161
- select_button = Qt::PushButton.new('Select')
162
- select_button.connect(SIGNAL('clicked()')) { handle_log_reader_button() }
163
- @layout.addWidget(select_button, row, 3)
171
+ @plr_select_button = Qt::PushButton.new('Select')
172
+ @plr_select_button.connect(SIGNAL('clicked()')) { handle_log_reader_button() }
173
+ @layout.addWidget(@plr_select_button, row, 3)
164
174
  row += 1
165
175
  end
166
176
 
@@ -216,6 +226,26 @@ module Cosmos
216
226
  end
217
227
  end
218
228
 
229
+ def show_log_fields(show_fields)
230
+ if show_fields
231
+ @filenames.show if @filenames
232
+ @log_files_label.show if @log_files_label
233
+ @browse_button.show if @browse_button
234
+ @remove_button.show if @remove_button
235
+ @packet_log_reader_field.show if @packet_log_reader_field
236
+ @packet_log_reader_label.show if @packet_log_reader_label
237
+ @plr_select_button.show if @plr_select_button
238
+ else
239
+ @filenames.hide if @filenames
240
+ @log_files_label.hide if @log_files_label
241
+ @browse_button.hide if @browse_button
242
+ @remove_button.hide if @remove_button
243
+ @packet_log_reader_field.hide if @packet_log_reader_field
244
+ @packet_log_reader_label.hide if @packet_log_reader_label
245
+ @plr_select_button.hide if @plr_select_button
246
+ end
247
+ end
248
+
219
249
  protected
220
250
 
221
251
  # Handles removing a selected filename
@@ -394,9 +394,8 @@ module Cosmos
394
394
  # implement this method and call super to count the raw bytes and allow raw
395
395
  # logging.
396
396
  #
397
- #
398
397
  # @param data [String] Raw packet data
399
- # @return data [String] The exact data written
398
+ # @return [String] The exact data written
400
399
  def write_interface_base(data)
401
400
  @written_raw_data_time = Time.now
402
401
  @written_raw_data = data.clone
@@ -64,15 +64,32 @@ module Cosmos
64
64
  raise "Invalid endianness '#{endianness}'. Must be BIG_ENDIAN or LITTLE_ENDIAN."
65
65
  end
66
66
 
67
- @bit_offset = Integer(bit_offset)
68
- raise "Invalid bit offset of #{bit_offset}. Must be divisible by 8." if bit_offset % 8 != 0
69
- @bit_size = Integer(bit_size)
70
- poly = Integer(poly) if poly
71
- seed = Integer(seed) if seed
72
- xor = ConfigParser.handle_true_false(xor) if xor
67
+ begin
68
+ @bit_offset = Integer(bit_offset)
69
+ rescue
70
+ raise "Invalid bit offset of #{bit_offset}. Must be a number."
71
+ end
72
+ raise "Invalid bit offset of #{bit_offset}. Must be divisible by 8." if @bit_offset % 8 != 0
73
+
74
+ poly = ConfigParser.handle_nil(poly)
75
+ begin
76
+ poly = Integer(poly) if poly
77
+ rescue
78
+ raise "Invalid polynomial of #{poly}. Must be a number."
79
+ end
80
+
81
+ seed = ConfigParser.handle_nil(seed)
82
+ begin
83
+ seed = Integer(seed) if seed
84
+ rescue
85
+ raise "Invalid seed of #{seed}. Must be a number."
86
+ end
87
+
88
+ xor = ConfigParser.handle_true_false_nil(xor)
73
89
  raise "Invalid XOR value of '#{xor}'. Must be TRUE or FALSE." if xor && !!xor != xor
74
- reflect = ConfigParser.handle_true_false(reflect) if reflect
90
+ reflect = ConfigParser.handle_true_false_nil(reflect) if reflect
75
91
  raise "Invalid reflect value of '#{reflect}'. Must be TRUE or FALSE." if reflect && !!reflect != reflect
92
+
76
93
  # Built the CRC arguments array. All subsequent arguments are dependent
77
94
  # on the previous ones so we build it up incrementally.
78
95
  args = []
@@ -89,7 +106,8 @@ module Cosmos
89
106
  end
90
107
  end
91
108
 
92
- case bit_size
109
+ @bit_size = bit_size.to_i
110
+ case @bit_size
93
111
  when 16
94
112
  @pack = (@endianness == :BIG_ENDIAN) ? 'n' : 'v'
95
113
  if args.empty?
@@ -39,6 +39,9 @@ module Cosmos
39
39
  @min_id_size = Integer(min_id_size)
40
40
  @telemetry = telemetry
41
41
  @unknown_raise = ConfigParser::handle_true_false(unknown_raise)
42
+ @received_time = nil
43
+ @target_name = nil
44
+ @packet_name = nil
42
45
  end
43
46
 
44
47
  # Set the received_time, target_name and packet_name which we recorded when
@@ -77,7 +80,7 @@ module Cosmos
77
80
  end
78
81
 
79
82
  target_packets.each do |packet_name, packet|
80
- if (packet.identify?(@data))
83
+ if packet.identify?(@data)
81
84
  identified_packet = packet
82
85
  if identified_packet.defined_length > @data.length
83
86
  # Check if need more data to finish packet
@@ -100,7 +103,10 @@ module Cosmos
100
103
 
101
104
  unless identified_packet
102
105
  raise "Unknown data received by FixedProtocol" if @unknown_raise
103
- # Unknown packet? Just return all the current data
106
+ # Unknown packet? Just return all the current data
107
+ @received_time = nil
108
+ @target_name = nil
109
+ @packet_name = nil
104
110
  packet_data = @data.clone
105
111
  @data.replace('')
106
112
  end
@@ -9,10 +9,11 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'cosmos/config/config_parser'
12
- require 'cosmos/interfaces/protocols/protocol'
13
12
  require 'thread'
14
13
 
15
14
  module Cosmos
15
+ # Base class for all COSMOS protocols which defines a framework which must be
16
+ # implemented by a subclass.
16
17
  class Protocol
17
18
  attr_accessor :interface
18
19
  attr_accessor :allow_empty_data
@@ -225,7 +225,7 @@ module Cosmos
225
225
 
226
226
  # Block the write until the response is received
227
227
  begin
228
- result = @write_block_queue.pop(true)
228
+ @write_block_queue.pop(true)
229
229
  rescue
230
230
  sleep(@response_polling_period)
231
231
  retry if !response_timeout_time
@@ -17,6 +17,7 @@ module Cosmos
17
17
 
18
18
  def initialize(protocol_type = nil, protocol_args = [])
19
19
  super()
20
+ @stream = nil
20
21
  @protocol_type = ConfigParser::handle_nil(protocol_type)
21
22
  @protocol_args = protocol_args
22
23
  if @protocol_type
@@ -161,8 +161,7 @@ module Cosmos
161
161
  end
162
162
 
163
163
  # Shutdowns the listener threads for both the read and write ports as well
164
- # as any client connections. As a part of shutting down client connections,
165
- # the {Protocol#disconnect} method is called.
164
+ # as any client connections.
166
165
  def disconnect
167
166
  @cancel_threads = true
168
167
  @read_queue << nil if @read_queue
@@ -227,7 +226,7 @@ module Cosmos
227
226
  def write(packet)
228
227
  raise "Interface not connected for write: #{@name}" unless connected? && write_allowed?
229
228
  @write_count += 1
230
- @write_queue << packet
229
+ @write_queue << packet.clone
231
230
  @write_condition_variable.broadcast
232
231
  end
233
232
 
@@ -38,7 +38,7 @@ module Cosmos
38
38
  def initialize(hostname, port, connect_timeout = 1.0)
39
39
  hostname = '127.0.0.1' if (hostname.to_s.upcase == 'LOCALHOST')
40
40
  begin
41
- addr = Socket.pack_sockaddr_in(port, hostname)
41
+ Socket.pack_sockaddr_in(port, hostname)
42
42
  rescue => error
43
43
  if error.message =~ /getaddrinfo/
44
44
  raise "Invalid hostname: #{hostname}"
@@ -9,6 +9,7 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'json'
12
+ require 'date'
12
13
 
13
14
  class Object
14
15
  def as_json(options = nil) #:nodoc:
@@ -271,7 +272,7 @@ module Cosmos
271
272
  begin
272
273
  hash = JSON.parse(response_data, :allow_nan => true, :create_additions => true)
273
274
  rescue
274
- raise msg
275
+ raise $!, msg, $!.backtrace
275
276
  end
276
277
 
277
278
  # Verify the jsonrpc version is correct and there is an ID
@@ -8,15 +8,12 @@
8
8
  # as published by the Free Software Foundation; version 3 with
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
- require 'cosmos/io/serial_driver'
12
11
  require 'cosmos/win32/win32'
13
12
  require 'timeout' # For Timeout::Error
14
13
 
15
14
  module Cosmos
16
-
17
15
  # Serial driver for use on Windows serial ports
18
16
  class Win32SerialDriver
19
-
20
17
  # (see SerialDriver#initialize)
21
18
  def initialize(port_name = 'COM1',
22
19
  baud_rate = 9600,
@@ -150,16 +147,12 @@ module Cosmos
150
147
  # (see SerialDriver#read_nonblock)
151
148
  def read_nonblock
152
149
  data = ''
153
-
154
150
  loop do
155
151
  buffer = Win32.read_file(@handle, @read_max_length - data.length)
156
152
  data << buffer
157
153
  break if buffer.length <= 0 or data.length >= @read_max_length
158
154
  end
159
-
160
155
  data
161
156
  end
162
-
163
- end # class Win32SerialDriver
164
-
165
- end # module Cosmos
157
+ end
158
+ end
@@ -138,7 +138,7 @@ module Cosmos
138
138
  new_label = label.to_s.strip
139
139
  if new_label.length == 0
140
140
  @label = nil
141
- elsif new_label =~ /^[a-zA-Z0-9]*$/
141
+ elsif new_label =~ /^[a-zA-Z0-9_-]*$/
142
142
  @label = new_label
143
143
  else
144
144
  # Invalid label - Clear out existing
@@ -14,13 +14,11 @@ require 'cosmos/packets/packet_item'
14
14
  require 'cosmos/ext/packet' if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
15
15
 
16
16
  module Cosmos
17
-
18
17
  # Adds features common to all COSMOS packets of data to the Structure class.
19
18
  # This includes the additional attributes listed below. The primary behavior
20
19
  # Packet adds is the ability to apply formatting to PacketItem values as well
21
20
  # as managing PacketItem's limit states.
22
21
  class Packet < Structure
23
-
24
22
  RESERVED_ITEM_NAMES = ['RECEIVED_TIMESECONDS'.freeze, 'RECEIVED_TIMEFORMATTED'.freeze, 'RECEIVED_COUNT'.freeze]
25
23
 
26
24
  # @return [String] Name of the target this packet is associated with
@@ -207,8 +205,7 @@ module Cosmos
207
205
 
208
206
  true
209
207
  end
210
-
211
- end
208
+ end # if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
212
209
 
213
210
  # Calculates a unique MD5Sum that changes if the parts of the packet configuration change that could affect
214
211
  # the "shape" of the packet. This value is cached and that packet should not be changed if this method is being used
@@ -339,9 +336,7 @@ module Cosmos
339
336
  else
340
337
  next_offset = nil
341
338
  if item.bit_offset > 0
342
- # Handle little-endian bit fields
343
- byte_aligned = ((item.bit_offset % 8) == 0)
344
- if item.endianness == :LITTLE_ENDIAN and (item.data_type == :INT or item.data_type == :UINT) and !(byte_aligned and (item.bit_size == 8 or item.bit_size == 16 or item.bit_size == 32 or item.bit_size == 64))
339
+ if item.little_endian_bit_field?
345
340
  # Bit offset always refers to the most significant bit of a bitfield
346
341
  bits_remaining_in_last_byte = 8 - (item.bit_offset % 8)
347
342
  if item.bit_size > bits_remaining_in_last_byte
@@ -673,6 +668,19 @@ module Cosmos
673
668
  end
674
669
  end
675
670
 
671
+ # Define the reserved items on the current telemetry packet
672
+ def define_reserved_items
673
+ item = define_item('RECEIVED_TIMESECONDS', 0, 0, :DERIVED, nil, @default_endianness,
674
+ :ERROR, '%0.6f', ReceivedTimeSecondsConversion.new)
675
+ item.description = 'COSMOS Received Time (UTC, Floating point, Unix epoch)'
676
+ item = define_item('RECEIVED_TIMEFORMATTED', 0, 0, :DERIVED, nil, @default_endianness,
677
+ :ERROR, nil, ReceivedTimeFormattedConversion.new)
678
+ item.description = 'COSMOS Received Time (Local time zone, Formatted string)'
679
+ item = define_item('RECEIVED_COUNT', 0, 0, :DERIVED, nil, @default_endianness,
680
+ :ERROR, nil, ReceivedCountConversion.new)
681
+ item.description = 'COSMOS packet received count'
682
+ end
683
+
676
684
  # Enable limits on an item by name
677
685
  #
678
686
  # @param name [String] Name of the item to enable limits
@@ -773,6 +781,9 @@ module Cosmos
773
781
  # Reset temporary packet data
774
782
  # This includes packet received time, received count, and processor state
775
783
  def reset
784
+ # The SYSTEM META packet is a special case that does not get reset
785
+ return if @target_name == 'SYSTEM' && @packet_name == 'META'
786
+
776
787
  @received_time = nil
777
788
  @received_count = 0
778
789
  if @read_conversion_cache
@@ -860,7 +871,8 @@ module Cosmos
860
871
 
861
872
  protected
862
873
 
863
- # Performs packet specific processing on the packet. Intended to only be run once for each packet received
874
+ # Performs packet specific processing on the packet.
875
+ # Intended to only be run once for each packet received
864
876
  def process(buffer = @buffer)
865
877
  return unless @processors
866
878
  @processors.each do |processor_name, processor|
@@ -988,7 +1000,5 @@ module Cosmos
988
1000
  end
989
1001
  item
990
1002
  end
991
-
992
- end # class Packet
993
-
994
- end # module Cosmos
1003
+ end
1004
+ end
@@ -109,6 +109,7 @@ module Cosmos
109
109
 
110
110
  process_target_name = process_target_name.upcase
111
111
  parser = ConfigParser.new("http://cosmosrb.com/docs/cmdtlm")
112
+ parser.instance_variable_set(:@target_name, process_target_name)
112
113
  parser.parse_file(filename) do |keyword, params|
113
114
 
114
115
  if @building_generic_conversion
@@ -532,7 +533,7 @@ module Cosmos
532
533
 
533
534
  def start_item(parser)
534
535
  finish_item()
535
- @current_item = PacketItemParser.parse(parser, @current_packet, @current_cmd_or_tlm)
536
+ @current_item = PacketItemParser.parse(parser, @current_packet, @current_cmd_or_tlm, @warnings)
536
537
  MacroParser.new_item()
537
538
  end
538
539
 
@@ -348,33 +348,11 @@ module Cosmos
348
348
  else # :COMMAND
349
349
  if self.array_size
350
350
  config << " ARRAY_PARAMETER #{self.name.to_s.quote_if_necessary} #{self.bit_offset} #{self.bit_size} #{self.data_type} #{self.array_size} \"#{self.description.to_s.gsub("\"", "'")}\""
351
- elsif self.id_value
352
- if self.data_type == :BLOCK or self.data_type == :STRING
353
- unless self.id_value.is_printable?
354
- id_value = "0x" + self.id_value.simple_formatted
355
- else
356
- id_value = "\"#{self.id_value}\""
357
- end
358
- config << " ID_PARAMETER #{self.name.to_s.quote_if_necessary} #{self.bit_offset} #{self.bit_size} #{self.data_type} #{id_value} \"#{self.description.to_s.gsub("\"", "'")}\""
359
- else
360
- first, last = calculate_range()
361
- config << " ID_PARAMETER #{self.name.to_s.quote_if_necessary} #{self.bit_offset} #{self.bit_size} #{self.data_type} #{first} #{last} #{self.id_value} \"#{self.description.to_s.gsub("\"", "'")}\""
362
- end
363
351
  else
364
- if self.data_type == :BLOCK or self.data_type == :STRING
365
- unless self.default.is_printable?
366
- default = "0x" + self.default.simple_formatted
367
- else
368
- default = "\"#{self.default}\""
369
- end
370
- config << " PARAMETER #{self.name.to_s.quote_if_necessary} #{self.bit_offset} #{self.bit_size} #{self.data_type} #{default} \"#{self.description.to_s.gsub("\"", "'")}\""
371
- else
372
- first, last = calculate_range()
373
- config << " PARAMETER #{self.name.to_s.quote_if_necessary} #{self.bit_offset} #{self.bit_size} #{self.data_type} #{first} #{last} #{self.default} \"#{self.description.to_s.gsub("\"", "'")}\""
374
- end
352
+ config << parameter_config()
375
353
  end
376
354
  end
377
- config << " #{self.endianness}" if self.endianness != default_endianness
355
+ config << " #{self.endianness}" if (self.endianness != default_endianness && self.data_type != :STRING && self.data_type != :BLOCK)
378
356
  config << "\n"
379
357
 
380
358
  config << " REQUIRED\n" if self.required
@@ -423,6 +401,30 @@ module Cosmos
423
401
 
424
402
  protected
425
403
 
404
+ def parameter_config
405
+ if @id_value
406
+ value = @id_value
407
+ config = " ID_PARAMETER "
408
+ else
409
+ value = @default
410
+ config = " PARAMETER "
411
+ end
412
+ config << "#{@name.to_s.quote_if_necessary} #{@bit_offset} #{@bit_size} #{@data_type} "
413
+
414
+ if @data_type == :BLOCK || @data_type == :STRING
415
+ unless value.is_printable?
416
+ val_string = "0x" + value.simple_formatted
417
+ else
418
+ val_string = "\"#{value}\""
419
+ end
420
+ else
421
+ first, last = calculate_range()
422
+ config << "#{first} #{last} "
423
+ val_string = value.to_s
424
+ end
425
+ config << "#{val_string} \"#{@description.to_s.gsub("\"", "'")}\""
426
+ end
427
+
426
428
  # Convert a value into the given data type
427
429
  def convert(value, data_type)
428
430
  case data_type