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
@@ -0,0 +1,172 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2018 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'dart_common'
12
+
13
+ class DartDatabaseCleaner
14
+ include DartCommon
15
+
16
+ # Clean the DART database of various issues. Note that this code can exit(1)
17
+ # if the DART packet logs were moved and force is false (default). This is
18
+ # deliberate because force causes all the lost (or moved) files to be deleted
19
+ # which forces them to be re-imported at their new location.
20
+ def self.clean(force)
21
+ Cosmos::Logger::info("Starting database cleanup...")
22
+ cleaner = DartDatabaseCleaner.new
23
+ cleaner.clean_system_configs()
24
+ cleaner.clean_packet_logs(force)
25
+ cleaner.clean_packet_configs()
26
+ cleaner.clean_packet_log_entries()
27
+ cleaner.clean_decommutation_tables()
28
+ cleaner.clean_reductions()
29
+ Cosmos::Logger::info("Database cleanup complete!")
30
+ end
31
+
32
+ # Ensure we have all the System Configs locally on the DART machine
33
+ def clean_system_configs
34
+ Cosmos::Logger::info("Cleaning up SystemConfig...")
35
+ system_config = SystemConfig.all.each do |sc|
36
+ begin
37
+ # This attempts to load the system config and if it can't be found
38
+ # it is copied from the server to the local DART machine
39
+ switch_and_get_system_config(sc.name)
40
+ rescue => err
41
+ Cosmos::Logger.error("Could not load system_config: #{sc.name}: #{err.message}")
42
+ next
43
+ end
44
+ end
45
+ Cosmos::System.load_configuration
46
+ end
47
+
48
+ # Ensure all packet log files still exist
49
+ def clean_packet_logs(force)
50
+ Cosmos::Logger::info("Cleaning up PacketLog...")
51
+ PacketLog.find_each do |pl|
52
+ unless File.exist?(pl.filename)
53
+ # Try to see if it is in the current DART_DATA folder
54
+ moved_filename = File.join(Cosmos::System.paths['DART_DATA'], File.basename(pl.filename))
55
+ if File.exist?(moved_filename)
56
+ pl.filename = moved_filename
57
+ pl.save!
58
+ else
59
+ if force
60
+ Cosmos::Logger.error("Packet Log File Missing: #{pl.filename}")
61
+ pl.destroy # This also destroys linked PacketLogEntry(s)
62
+ else
63
+ Cosmos::Logger.fatal("Packet Log File Missing (Cleanup with --force-cleanup): #{pl.filename}")
64
+ exit(1)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ # Check for bad packet configs and cleanup. This typically doesn't happen because
72
+ # PacketConfig entries are created quickly but if something happens during the setup
73
+ # we attempt to fix it here.
74
+ def clean_packet_configs
75
+ Cosmos::Logger::info("Cleaning up PacketConfig...")
76
+ packet_configs = PacketConfig.where("ready != true")
77
+ return unless packet_configs.length > 0
78
+ Cosmos::Logger::info("Num PacketConfigs requiring cleanup: #{packet_configs.length}")
79
+ packet_configs.each do |packet_config|
80
+ begin
81
+ system_config = SystemConfig.find(packet_config.first_system_config_id)
82
+ packet_model = Packet.find(packet_config.packet_id)
83
+ target_model = Target.find(packet_model.target_id)
84
+ current_config, error = Cosmos::System.load_configuration(system_config.name)
85
+ if current_config == system_config.name
86
+ if packet_model.is_tlm
87
+ packet = Cosmos::System.telemetry.packet(target_model.name, packet_model.name)
88
+ else
89
+ packet = Cosmos::System.commands.packet(target_model.name, packet_model.name)
90
+ end
91
+ setup_packet_config(packet, packet_model.id, packet_config)
92
+ Cosmos::Logger::info("Successfully cleaned up packet_config: #{packet_config.id}")
93
+ else
94
+ Cosmos::Logger::error("Could not switch to system config: #{system_config.name}: #{error}")
95
+ end
96
+ rescue => err
97
+ Cosmos::Logger::error("Error cleaning up packet config: #{packet_config.id}: #{err.formatted}")
98
+ raise "Cleanup failure - Database requires manual correction"
99
+ end
100
+ end
101
+ end
102
+
103
+ # Remove not ready packet log entries as well as partially decommutated data.
104
+ def clean_packet_log_entries
105
+ Cosmos::Logger::info("Cleaning up PacketLogEntry...")
106
+ # Remove not ready packet log entries. Packet log entries remain not ready until the
107
+ # log file containing the packet has been flushed to disk. Thus there are always
108
+ # outstanding entries which are not ready while packets are being received.
109
+ # Note the normal shutdown process attempts to flush the log file and mark
110
+ # all outstanding entries as ready so this would only happen during a crash.
111
+ ples = PacketLogEntry.where("ready != true")
112
+ return unless ples.length > 0
113
+ Cosmos::Logger::info("Removing unready packet log entries: #{ples.length}")
114
+ ples.destroy_all
115
+ end
116
+
117
+ def clean_decommutation_tables
118
+ Cosmos::Logger::info("Cleaning up Decommutation tables (tX_Y)...")
119
+ # Check for partially decom data and remove. The DartWorker periodically checks the
120
+ # database for a PacketLogEntry which is ready to be decommutated and starts the
121
+ # process of writing into the decommutation table. If this process is interrupted
122
+ # the state could be IN_PROGRESS instead of COMPLETE. Thus delete all the decommutation
123
+ # table rows which were created and allow this process to start from scratch.
124
+ ples = PacketLogEntry.where("decom_state = #{PacketLogEntry::IN_PROGRESS}")
125
+ return unless ples.length > 0
126
+ Cosmos::Logger::info("Num PacketLogEntries requiring cleanup: #{ples.length}")
127
+ ples.each do |ple|
128
+ begin
129
+ packet = read_packet_from_ple(ple)
130
+ packet_config = PacketConfig.where("packet_id = ? and name = ?", ple.packet_id, packet.config_name).first
131
+ # Need to delete any rows for these ples in the table for this packet_config
132
+ packet_config.max_table_index.times do |table_index|
133
+ model = get_decom_table_model(packet_config.id, table_index)
134
+ model.where("ple_id = ?", ple.id).destroy_all
135
+ end
136
+ ple.decom_state = PacketLogEntry::NOT_STARTED
137
+ ple.save!
138
+ rescue => err
139
+ Cosmos::Logger::error("Error cleaning up packet log entry: #{ple.id}: #{err.formatted}")
140
+ end
141
+ end
142
+ end
143
+
144
+ def clean_reductions
145
+ Cosmos::Logger::info("Cleaning up Reductions...")
146
+ # TBR: This cleanup may be too slow to be worth it for a large data set...
147
+ each_decom_and_reduced_table() do |packet_config_id, table_index, decom_model, minute_model, hour_model, day_model|
148
+ decom_model.where("reduced_state = #{REDUCED} and reduced_id IS NULL").update_all(:reduced_state => READY_TO_REDUCE)
149
+ minute_model.where("reduced_state = #{REDUCED} and reduced_id IS NULL").update_all(:reduced_state => READY_TO_REDUCE)
150
+ hour_model.where("reduced_state = #{REDUCED} and reduced_id IS NULL").update_all(:reduced_state => READY_TO_REDUCE)
151
+ # Note: These should be destroyed when cleaning up decom tables
152
+ rows = decom_model.where("reduced_state = #{INITIALIZING}")
153
+ rows.destroy_all
154
+ # This cleanup is only here
155
+ rows = minute_model.where("reduced_state = #{INITIALIZING}")
156
+ rows.each do |row|
157
+ decom_model.where("reduced_id = ?", row.id).update_all(:reduced_state => READY_TO_REDUCE, :reduced_id => nil)
158
+ end
159
+ rows.destroy_all
160
+ rows = hour_model.where("reduced_state = #{INITIALIZING}")
161
+ rows.each do |row|
162
+ minute_model.where("reduced_id = ?", row.id).update_all(:reduced_state => READY_TO_REDUCE, :reduced_id => nil)
163
+ end
164
+ rows.destroy_all
165
+ rows = day_model.where("reduced_state = #{INITIALIZING}")
166
+ rows.each do |row|
167
+ hour_model.where("reduced_id = ?", row.id).update_all(:reduced_state => READY_TO_REDUCE, :reduced_id => nil)
168
+ end
169
+ rows.destroy_all
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,184 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2018 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'dart_common'
12
+ require 'dart_logging'
13
+
14
+ # Rails Json screws up COSMOS handling of Nan, etc.
15
+ require "active_support/core_ext/object/json"
16
+ module ActiveSupport
17
+ module ToJsonWithActiveSupportEncoder # :nodoc:
18
+ def to_json(options = nil)
19
+ super(options)
20
+ end
21
+ end
22
+ end
23
+
24
+ # JsonDRb server which responds to queries for decommutated and reduced data
25
+ # from the database.
26
+ class DartDecomQuery
27
+ include DartCommon
28
+
29
+ # Returns data from the decommutated database tables including the reduced data tables.
30
+ #
31
+ # @param request [Hash] Request for data.
32
+ # The hash must contain the following items:
33
+ # start_time_sec => Start time in UTC seconds
34
+ # start_time_usec => Microseconds to add to start time
35
+ # end_time_sec => End time in UTC seconds
36
+ # end_time_usec => Microseconds to add to end time
37
+ # item => [target name, packet name, item name] Names are all strings
38
+ # reduction => "NONE", "MINUTE", "HOUR", "DAY" for how to reduce the data
39
+ # value_type => "RAW", "RAW_MAX", "RAW_MIN", "RAW_AVG",
40
+ # "CONVERTED", "CONVERTED_MAX", "CONVERTED_MIN", "CONVERTED_AVG"
41
+ #
42
+ # The request can also contain the following optional items:
43
+ # meta_ids => Optional IDs related to the meta data you want to filter by. This requires
44
+ # making a separate request for the particular meta data in question and recording
45
+ # the returned meta_ids for use in a subsequent request.
46
+ # limit => Maximum number of data items to return, must be less than 10000
47
+ # offset => Offset into the data stream. Since the maximum number of values allowed
48
+ # is 10000, you can set the offset to 10000, then 20000, etc to get additional values.
49
+ # By default the offset is 0.
50
+ # cmd_tlm => Whether the item is a command or telemetry. Default is telemetry.
51
+ # @return [Array<Array<String, Integer, Integer, Integer, Integer>>] Array of arrays containing
52
+ # the item name, item seconds, item microseconds, samples (always 1 for NONE reduction, varies
53
+ # for other reduction values), and meta_id.
54
+ def query(request)
55
+ request_start_time = Time.now
56
+ Cosmos::Logger.info("#{request_start_time.formatted}: QUERY: #{request}")
57
+
58
+ begin
59
+ start_time_sec = request['start_time_sec']
60
+ start_time_usec = request['start_time_usec']
61
+ end_time_sec = request['end_time_sec']
62
+ end_time_usec = request['end_time_usec']
63
+
64
+ start_time = nil
65
+ end_time = nil
66
+ begin
67
+ start_time = Time.at(start_time_sec, start_time_usec) if start_time_sec and start_time_usec
68
+ rescue
69
+ raise "Invalid start time: #{start_time_sec}, #{start_time_usec}"
70
+ end
71
+ begin
72
+ end_time = Time.at(end_time_sec, end_time_usec) if end_time_sec and end_time_usec
73
+ rescue
74
+ raise "Invalid end time: #{end_time_sec}, #{end_time_usec}"
75
+ end
76
+
77
+ item = request['item']
78
+ raise "Item \"#{item}\" invalid" if !item || item.length != 3
79
+
80
+ reduction = request['reduction'].to_s.upcase
81
+ case reduction
82
+ when "", "NONE"
83
+ reduction = :NONE
84
+ reduction_modifier = ""
85
+ when "MINUTE"
86
+ reduction = :MINUTE
87
+ reduction_modifier = "_m"
88
+ when "HOUR"
89
+ reduction = :HOUR
90
+ reduction_modifier = "_h"
91
+ when "DAY"
92
+ reduction = :DAY
93
+ reduction_modifier = "_d"
94
+ else
95
+ raise "Unknown reduction: #{reduction}"
96
+ end
97
+
98
+ requested_value_type = request['value_type'].to_s.upcase
99
+ case requested_value_type
100
+ when 'RAW'
101
+ value_type = ItemToDecomTableMapping::CONVERTED
102
+ item_name_modifier = ""
103
+ raise "RAW value_type is only valid with NONE reduction" if reduction != :NONE
104
+ when 'RAW_MAX', 'RAW_MIN', 'RAW_AVG', 'RAW_STDDEV'
105
+ value_type = ItemToDecomTableMapping::CONVERTED
106
+ item_name_modifier = requested_value_type.split('_')[1].downcase
107
+ raise "#{requested_value_type} value_type is not valid with NONE reduction" if reduction == :NONE
108
+ when 'CONVERTED'
109
+ value_type = ItemToDecomTableMapping::RAW
110
+ item_name_modifier = ""
111
+ raise "CONVERTED value_type is only valid with NONE reduction" if reduction != :NONE
112
+ when 'CONVERTED_MAX', 'CONVERTED_MIN', 'CONVERTED_AVG', 'CONVERTED_STDDEV'
113
+ value_type = ItemToDecomTableMapping::RAW
114
+ item_name_modifier = requested_value_type.split('_')[1].downcase
115
+ raise "#{requested_value_type} value_type is not valid with NONE reduction" if reduction == :NONE
116
+ else
117
+ raise "Unknown value_type: #{requested_value_type}"
118
+ end
119
+
120
+ cmd_tlm = request['cmd_tlm']
121
+ if cmd_tlm
122
+ if cmd_tlm.to_s.upcase == 'CMD'
123
+ is_tlm = false
124
+ elsif cmd_tlm.to_s.upcase == 'TLM'
125
+ is_tlm = true
126
+ else
127
+ raise "Unknown cmd_tlm: #{cmd_tlm}"
128
+ end
129
+ else
130
+ is_tlm = true
131
+ end
132
+
133
+ meta_ids = request['meta_ids']
134
+ meta_ids ||= []
135
+
136
+ unless meta_ids.length > 0
137
+ meta_filters = request['meta_filters']
138
+ meta_filters ||= []
139
+
140
+ if meta_filters.length > 0
141
+ meta_ids = process_meta_filters(meta_filters, is_tlm, end_time)
142
+ end
143
+ end
144
+
145
+ limit = request['limit'].to_i
146
+ limit = 10000 if limit <= 0 or limit > 10000
147
+
148
+ offset = request['offset'].to_i
149
+ offset = 0 if offset < 0
150
+
151
+ return query_decom_reduced(
152
+ item[0], item[1], item[2],
153
+ value_type, is_tlm,
154
+ start_time, end_time,
155
+ reduction, reduction_modifier,
156
+ item_name_modifier, limit, offset, meta_ids)
157
+
158
+ rescue Exception => error
159
+ msg = "Query Error: #{error.message}"
160
+ raise $!, msg, $!.backtrace
161
+ end
162
+ end
163
+
164
+ # Gets the list of item names for a given packet
165
+ #
166
+ # @param target_name Target name
167
+ # @param packet_name Packet name
168
+ # @param is_tlm true or false
169
+ # @return [Array<String>] Array of item names
170
+ def item_names(target_name, packet_name, is_tlm = true)
171
+ target = Target.where("name = ?", target_name).first
172
+ raise "Target #{target_name} not found" unless target
173
+
174
+ packet = Packet.where("target_id = ? and name = ? and is_tlm = ?", target.id, packet_name, is_tlm).first
175
+ raise "Packet #{target_name} #{packet_name} not found" unless packet
176
+
177
+ items = Item.where("packet_id = ?", packet.id).select("name")
178
+ item_names = []
179
+ items.each { |item| item_names << item.name }
180
+
181
+ return item_names
182
+ end
183
+
184
+ end
@@ -0,0 +1,235 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2018 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'dart_common'
12
+ require 'dart_logging'
13
+ require 'packet_log_entry'
14
+
15
+ class DartDecommutator
16
+ include DartCommon
17
+
18
+ # Wait 60s before giving up on the PacketConfig becoming ready
19
+ PACKET_CONFIG_READY_TIMEOUT = 60
20
+
21
+ def initialize(worker_id = 0, num_workers = 1)
22
+ sync_targets_and_packets()
23
+ @worker_id = worker_id
24
+ @num_workers = num_workers
25
+ end
26
+
27
+ # Run forever looking for data to decommutate
28
+ def run
29
+ while true
30
+ time_start = Time.now # Remember start time so we can throttle
31
+ # Get all entries that are ready and decommutation hasn't started
32
+ PacketLogEntry.where("decom_state = #{PacketLogEntry::NOT_STARTED} and ready = true").
33
+ # Mod the ID to allow distribution of effort, in_batches processes 1000 at a time
34
+ where("id % #{@num_workers} = #{@worker_id}").in_batches do |group|
35
+ group.each do |ple|
36
+ begin
37
+ # TODO - Optimize and cache meta and system config and packet config lookup
38
+ meta_ple = get_meta_ple(ple)
39
+ next unless meta_ple
40
+ system_meta = get_system_meta(ple, meta_ple)
41
+ next unless system_meta
42
+ system_config = get_system_config(ple, system_meta)
43
+ next unless system_config
44
+ packet = get_packet(ple)
45
+ next unless packet
46
+ packet_config = get_packet_config(ple, packet, system_config)
47
+ next unless packet_config
48
+ # If we timeout this code will simply exit the application
49
+ wait_for_ready_packet_config(packet_config)
50
+ decom_packet(ple, packet, packet_config)
51
+ rescue => err
52
+ Cosmos::Logger.error("PLE:#{ple.id}:ERROR")
53
+ Cosmos::Logger.error(err.formatted)
54
+ end
55
+ end # each ple
56
+ end # batches
57
+ # Throttle to no faster than 1 Hz
58
+ delta = Time.now - time_start
59
+ sleep(1 - delta) if delta < 1 && delta > 0
60
+ end
61
+ rescue Interrupt
62
+ Cosmos::Logger.info("Dart Worker Closing From Signal...")
63
+ end
64
+
65
+ protected
66
+
67
+ def get_meta_ple(ple)
68
+ if ple.meta_id != ple.id
69
+ PacketLogEntry.find(ple.meta_id)
70
+ else
71
+ ple
72
+ end
73
+ rescue => err
74
+ ple.decom_state = PacketLogEntry::NO_META_PLE
75
+ ple.save!
76
+ Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
77
+ nil
78
+ end
79
+
80
+ def get_system_meta(ple, meta_ple)
81
+ system_meta = read_packet_from_ple(meta_ple)
82
+ return system_meta if system_meta
83
+
84
+ ple.decom_state = PacketLogEntry::NO_META_PACKET
85
+ ple.save!
86
+ Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
87
+ nil
88
+ end
89
+
90
+ def get_system_config(ple, system_meta)
91
+ system_config_name = system_meta.read("CONFIG")
92
+ system_config = SystemConfig.where("name = ?", system_config_name).first
93
+ unless system_config
94
+ begin
95
+ # Try to create a new SystemConfig since it didn't exist
96
+ system_config = SystemConfig.create(:name => system_config_name)
97
+ rescue
98
+ # Another thread probably already created it - Try to get it one more time
99
+ system_config = SystemConfig.where("name = ?", system_config_name).first
100
+ end
101
+ end
102
+ unless system_config
103
+ ple.decom_state = PacketLogEntry::NO_SYSTEM_CONFIG
104
+ ple.save!
105
+ Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
106
+ return nil
107
+ end
108
+
109
+ # Switch to this system_config
110
+ begin
111
+ switch_and_get_system_config(system_config_name)
112
+ rescue
113
+ Cosmos::Logger.error("Could not load system_config: #{system_config_name}")
114
+ ple.decom_state = PacketLogEntry::NO_CONFIG
115
+ ple.save!
116
+ Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
117
+ return nil
118
+ end
119
+ system_config
120
+ end
121
+
122
+ def get_packet(ple)
123
+ packet = read_packet_from_ple(ple)
124
+ return packet if packet
125
+
126
+ ple.decom_state = PacketLogEntry::NO_PACKET
127
+ ple.save!
128
+ Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
129
+ nil
130
+ end
131
+
132
+ def get_packet_config(ple, packet, system_config)
133
+ packet_id = ple.packet_id
134
+ packet_config = PacketConfig.where("packet_id = ? and name = ?", packet_id, packet.config_name).first
135
+ return packet_config if packet_config
136
+
137
+ # The PacketConfig didnt't exist so create one
138
+ begin
139
+ Cosmos::Logger.info("Creating PacketConfig: #{packet.config_name}...")
140
+ packet_config = PacketConfig.create(:packet_id => packet_id, :name => packet.config_name, :first_system_config_id => system_config.id)
141
+ setup_packet_config(packet, packet_id, packet_config)
142
+ Cosmos::Logger.info("Successfully Created PacketConfig: #{packet.config_name}")
143
+ rescue => err
144
+ Cosmos::Logger.error(err.formatted)
145
+ # Another thread probably already created it - Try to get it one more time
146
+ packet_config = PacketConfig.where("packet_id = ? and name = ?", packet_id, packet.config_name).first
147
+ end
148
+ unless packet_config
149
+ ple.decom_state = PacketLogEntry::NO_PACKET_CONFIG
150
+ ple.save!
151
+ Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
152
+ return nil
153
+ end
154
+ packet_config
155
+ end
156
+
157
+ def wait_for_ready_packet_config(packet_config)
158
+ first = true
159
+ while !packet_config.ready
160
+ if first
161
+ ready_wait_start = Time.now
162
+ Cosmos::Logger.info("Waiting for PacketConfig:#{packet_config.id}...")
163
+ first = false
164
+ end
165
+ sleep(1)
166
+ # Reload the attributes from the database
167
+ packet_config.reload
168
+
169
+ if (Time.now - ready_wait_start) > PACKET_CONFIG_READY_TIMEOUT
170
+ Cosmos::Logger.fatal("Timeout waiting for ready on PacketConfig:#{packet_config.id}")
171
+ exit(1)
172
+ end
173
+ end
174
+ end
175
+
176
+ def get_values(packet)
177
+ values = []
178
+ packet.sorted_items.each do |item|
179
+ next unless decommutate_item?(item)
180
+ if separate_raw_con?(item)
181
+ values << packet.read_item(item, :RAW)
182
+ values << packet.read_item(item, :CONVERTED)
183
+ else
184
+ values << packet.read_item(item, :RAW)
185
+ end
186
+ end
187
+ values
188
+ end
189
+
190
+ def decom_packet(ple, packet, packet_config)
191
+ # Update packet config times
192
+ if !packet_config.start_time or (packet.received_time < packet_config.start_time)
193
+ packet_config.start_time = packet.received_time
194
+ packet_config.save!
195
+ end
196
+ if !packet_config.end_time or (packet.received_time > packet_config.end_time)
197
+ packet_config.end_time = packet.received_time
198
+ packet_config.save!
199
+ end
200
+
201
+ # Mark the log entry IN_PROGRESS as we decommutate the data
202
+ ple.decom_state = PacketLogEntry::IN_PROGRESS
203
+ ple.save!
204
+ values = get_values(packet)
205
+
206
+ table_index = 0
207
+ rows = []
208
+ # Create rows in the decommutation table model
209
+ values.each_slice(MAX_COLUMNS_PER_TABLE) do |table_values|
210
+ model = get_decom_table_model(packet_config.id, table_index)
211
+ row = model.new
212
+ row.time = ple.time
213
+ row.ple_id = ple.id
214
+ row.meta_id = ple.meta_id
215
+ row.reduced_state = INITIALIZING
216
+ table_values.each_with_index do |value, index|
217
+ item_index = (table_index * MAX_COLUMNS_PER_TABLE) + index
218
+ row.write_attribute("i#{item_index}", value)
219
+ end
220
+ row.save!
221
+ rows << row
222
+ table_index += 1
223
+ end
224
+ # Mark ready to reduce
225
+ rows.each do |row|
226
+ row.reduced_state = READY_TO_REDUCE
227
+ row.save!
228
+ end
229
+
230
+ # The log entry has been decommutated, mark COMPLETE
231
+ ple.decom_state = PacketLogEntry::COMPLETE
232
+ ple.save!
233
+ Cosmos::Logger.debug("PLE:#{ple.id}:#{ple.decom_state_string}")
234
+ end
235
+ end