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,83 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 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 'rails_helper'
12
+ require 'dart_importer'
13
+ require 'tempfile'
14
+ require 'cosmos/packet_logs/packet_log_writer'
15
+
16
+ describe DartImporter do
17
+ before(:all) do
18
+ @importer = DartImporter.new
19
+ # Clean the system logs
20
+ Dir["#{Cosmos::System.paths['LOGS']}/*"].each do |filename|
21
+ FileUtils.rm_f filename
22
+ end
23
+ end
24
+
25
+ before(:each) do
26
+ DatabaseCleaner.strategy = :truncation
27
+ DatabaseCleaner.clean
28
+ # Clean the dart logs
29
+ Dir["#{Cosmos::System.paths['DART_LOGS']}/*"].each do |filename|
30
+ FileUtils.rm_f filename
31
+ end
32
+ @string_output = StringIO.new("", "r+")
33
+ $stdout = @string_output
34
+ end
35
+
36
+ def create_dart_log_file
37
+ plw = Cosmos::PacketLogWriter.new(:TLM,nil,true,nil,10000000,nil,false)
38
+ packet = Cosmos::System.telemetry.packet("INST", "HEALTH_STATUS")
39
+ plw.write(packet)
40
+ plw.shutdown
41
+ filename = File.expand_path(Dir[File.join(Cosmos::System.paths['LOGS'],"*.bin")][-1])
42
+ FileUtils.mv(filename, Cosmos::System.paths['DART_DATA'])
43
+ return File.expand_path(Dir[File.join(Cosmos::System.paths['DART_DATA'],"*.bin")][-1])
44
+ end
45
+
46
+ describe "import" do
47
+ it "ensures file are in the DART_DATA dir" do
48
+ tf = Tempfile.new('unittest')
49
+ tf.puts "HI"
50
+ tf.close
51
+ code = @importer.import(tf, false)
52
+ expect(code).to eq 1 # fail
53
+ expect(@string_output.string).to match(/Imported files must be in \"#{File.expand_path(Cosmos::System.paths['DART_DATA'])}\"/)
54
+ tf.unlink
55
+ end
56
+
57
+ it "checks that file can be opened by PacketLogReader" do
58
+ filename = File.join(Cosmos::System.paths['DART_DATA'], "file.bin")
59
+ File.open(filename, 'w') { |file| file.puts "HI" }
60
+ code = @importer.import(filename, false)
61
+ expect(code).to eq 1 # fail
62
+ expect(@string_output.string).to match(/Unable to open/)
63
+ FileUtils.rm_r filename
64
+ end
65
+
66
+ it "checks that file has packets" do
67
+ filename = create_dart_log_file()
68
+ allow_any_instance_of(Cosmos::PacketLogReader).to receive(:first).and_return(nil)
69
+ code = @importer.import(filename, false)
70
+ expect(code).to eq 1 # fail
71
+ expect(@string_output.string).to match(/No packets found in file/)
72
+ FileUtils.rm_r filename
73
+ end
74
+
75
+ it "warns about importing a file twice" do
76
+ filename = create_dart_log_file()
77
+ @importer.import(filename, false)
78
+ expect(@string_output.string).to match(/Creating PacketLog entry/)
79
+ @importer.import(filename, false)
80
+ expect(@string_output.string).to match(/PacketLog already exists in database/)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 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 'rails_helper'
12
+ require 'dart_logging'
13
+
14
+ describe DartLogging do
15
+ describe "logging" do
16
+ it "starts a log and captures stdout" do
17
+ logger = DartLogging.new('dart_test')
18
+ sleep 0.1
19
+ test_string = "This is a test"
20
+ puts test_string # This should go in the log
21
+ logger.stop
22
+
23
+ Dir["#{Cosmos::System.paths['DART_LOGS']}/*"].each do |file|
24
+ expect(file).to match(/dart_test/)
25
+ data = File.read(file)
26
+ expect(File.read(file)).to include(test_string)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,149 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 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 'rails_helper'
12
+ require 'dart_packet_log_writer'
13
+
14
+ describe DartPacketLogWriter do
15
+ before(:each) do
16
+ DatabaseCleaner.strategy = :truncation
17
+ DatabaseCleaner.clean
18
+ end
19
+
20
+ describe "write" do
21
+ it "creates PacketLogEntries and flushes the file" do
22
+ writer = DartPacketLogWriter.new(
23
+ :TLM, # Log telemetry
24
+ 'test_dart_tlm_', # Put dart_ in the log file name
25
+ true, # Enable logging
26
+ nil, # Don't cycle on time
27
+ 2_000_000_000, # Cycle the log at 2GB
28
+ Cosmos::System.paths['DART_DATA']) # Log into the DART_DATA dir
29
+
30
+ hs_packet = Cosmos::System.telemetry.packet("INST", "HEALTH_STATUS")
31
+ (DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT - 1).times do
32
+ hs_packet.received_time = Time.now
33
+ writer.write(hs_packet)
34
+ sleep 0.01
35
+ end
36
+ sleep 0.1
37
+
38
+ # The first Log Entry is always SYSTEM META
39
+ ple = PacketLogEntry.find(1)
40
+ expect(ple.target.name).to eq "SYSTEM"
41
+ expect(ple.packet.name).to eq "META"
42
+ expect(ple.ready).to eq false # Hasn't been flushed yet
43
+
44
+ packet = writer.read_packet_from_ple(ple)
45
+ expect(packet.class).to eq Cosmos::Packet
46
+ expect(packet.target_name).to eq "SYSTEM"
47
+ expect(packet.packet_name).to eq "META"
48
+
49
+ target = Target.find_by_name("INST")
50
+ packet = Packet.find_by_name("HEALTH_STATUS")
51
+ count = 0
52
+ previous_time = Time.now
53
+ PacketLogEntry.where("target_id = ? and packet_id = ?", target.id, packet.id).each do |ple|
54
+ expect(ple.target.name).to eq "INST"
55
+ expect(ple.packet.name).to eq "HEALTH_STATUS"
56
+ expect(ple.ready).to eq false # Hasn't been flushed yet
57
+
58
+ packet = writer.read_packet_from_ple(ple)
59
+ expect(packet.target_name).to eq "INST"
60
+ expect(packet.packet_name).to eq "HEALTH_STATUS"
61
+ expect(packet.received_time).to_not eq previous_time
62
+ previous_time = packet.received_time
63
+ count += 1
64
+ end
65
+ expect(count).to eq (DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT - 1)
66
+
67
+ hs_packet.received_time = Time.now
68
+ writer.write(hs_packet) # Write the packet that causes the flush
69
+ sleep 0.1
70
+ count = 0
71
+ PacketLogEntry.all.each do |ple|
72
+ if count < DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT
73
+ expect(ple.ready).to eq true # Flushed!
74
+ else
75
+ # The last write isn't flushed
76
+ expect(ple.ready).to eq false
77
+ end
78
+ count += 1
79
+ end
80
+ # We wrote one SYSTEM META plus (DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT - 1)
81
+ # plus one more to cause the flush
82
+ expect(count).to eq DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT + 1
83
+ writer.shutdown
84
+ sleep 0.1
85
+
86
+ files = Dir["#{Cosmos::System.paths['DART_DATA']}/*_test_dart_tlm_*"]
87
+ expect(files.length).to eq 1
88
+ end
89
+
90
+ it "creates command logs" do
91
+ DatabaseCleaner.clean
92
+ meta = Cosmos::System.commands.packet("SYSTEM", "META")
93
+ clr_cmd = Cosmos::System.commands.packet("INST", "CLEAR")
94
+ # 128 byte file header, SYSTEM META has 24 byte header,
95
+ # INST CLEAR has 23 byte header
96
+ length = 128 + 24 + meta.length + 23 + clr_cmd.length
97
+
98
+ writer = DartPacketLogWriter.new(
99
+ :CMD, # Log commands
100
+ 'test_dart_cmd_', # Put dart_ in the log file name
101
+ true, # Enable logging
102
+ nil, # Don't cycle on time
103
+ length, # Cycle the log at 1 Meta plus 1 Cmd
104
+ Cosmos::System.paths['DART_DATA']) # Log into the DART_DATA dir
105
+
106
+ clr_cmd.received_time = Time.now
107
+ writer.write(clr_cmd)
108
+ sleep 0.1
109
+
110
+ # The first Log Entry is always SYSTEM META
111
+ ple = PacketLogEntry.find(1)
112
+ expect(ple.target.name).to eq "SYSTEM"
113
+ expect(ple.packet.name).to eq "META"
114
+ expect(ple.ready).to eq false # Hasn't been flushed yet
115
+
116
+ # The second Log Entry is the command
117
+ ple = PacketLogEntry.find(2)
118
+ expect(ple.target.name).to eq "INST"
119
+ expect(ple.packet.name).to eq "CLEAR"
120
+ expect(ple.ready).to eq false # Hasn't been flushed yet
121
+
122
+ clr_cmd.received_time = Time.now
123
+ writer.write(clr_cmd) # The second command should create a new log
124
+ sleep 0.1
125
+
126
+ # Check the the first two have been flushed
127
+ ple = PacketLogEntry.find(1)
128
+ expect(ple.ready).to eq true # Flushed
129
+ ple = PacketLogEntry.find(2)
130
+ expect(ple.ready).to eq true # Flushed
131
+
132
+ # The third and fourth are SYSTEM META and the command
133
+ ple = PacketLogEntry.find(3)
134
+ expect(ple.target.name).to eq "SYSTEM"
135
+ expect(ple.packet.name).to eq "META"
136
+ expect(ple.ready).to eq false # Hasn't been flushed yet
137
+ ple = PacketLogEntry.find(4)
138
+ expect(ple.target.name).to eq "INST"
139
+ expect(ple.packet.name).to eq "CLEAR"
140
+ expect(ple.ready).to eq false # Hasn't been flushed yet
141
+
142
+ writer.shutdown
143
+ sleep 0.1
144
+
145
+ files = Dir["#{Cosmos::System.paths['DART_DATA']}/*_test_dart_cmd_*"]
146
+ expect(files.length).to eq 2
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,289 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 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 'rails_helper'
12
+ require 'dart_reducer_manager'
13
+ require 'database_cleaner'
14
+ require 'dart_packet_log_writer'
15
+ require 'dart_decommutator'
16
+ require 'dart_common'
17
+
18
+ describe DartReducerManager do
19
+ let(:common) { Object.new.extend(DartCommon) }
20
+
21
+ before(:each) do
22
+ DatabaseCleaner.strategy = :truncation
23
+ DatabaseCleaner.clean
24
+ end
25
+
26
+ def setup_ples(entries, delta_time)
27
+ time = Time.utc(2018, 1, 1, 0, 0, 0)
28
+ meta = Cosmos::System.telemetry.packet("SYSTEM", "META")
29
+ meta.received_time = time
30
+ hs_packet = Cosmos::System.telemetry.packet("INST", "HEALTH_STATUS")
31
+ # 128 byte file header, SYSTEM META has 14 byte header + length of SYSTEM & META
32
+ # INST HEALTH_STATUS has 14 byte header + length of INST & HEALTH_STATUS
33
+ length = 128 + 24 + meta.length + entries * (31 + hs_packet.length)
34
+
35
+ writer = DartPacketLogWriter.new(
36
+ :TLM, # Log telemetry
37
+ 'test_decom_', # File name suffix
38
+ true, # Enable logging
39
+ nil, # Don't cycle on time
40
+ length, # Cycle the log after a single INST HEALTH_STATUS packet
41
+ Cosmos::System.paths['DART_DATA']) # Log into the DART_DATA dir
42
+
43
+ entries.times do |x|
44
+ hs_packet.received_time = time
45
+ hs_packet.write("COLLECTS", x)
46
+ writer.write(hs_packet)
47
+ time += delta_time
48
+ end
49
+ ples = 0
50
+ count = 0
51
+ while ples != (entries + 1) # SYSTEM META is the plus 1
52
+ ples = PacketLogEntry.count
53
+ sleep 0.1 # Allow the log writer to work
54
+ count += 1
55
+ break if count == 100 # 10s
56
+ end
57
+ writer.shutdown
58
+ sleep 0.1
59
+ expect(count).to be < 100
60
+
61
+ thread = Thread.new do
62
+ decom = DartDecommutator.new
63
+ decom.run
64
+ end
65
+ complete = 0
66
+ count = 0
67
+ while complete != (entries + 1) # SYSTEM META is the plus 1
68
+ complete = PacketLogEntry.where("decom_state = #{PacketLogEntry::COMPLETE}").length
69
+ sleep 0.1 # Allow the decommutator to work
70
+ count += 1
71
+ break if count == 200 # 20s
72
+ end
73
+ expect(count).to be < 200
74
+ thread.kill
75
+ end
76
+
77
+ def worker_threads
78
+ count = 0
79
+ Thread.list.each do |t|
80
+ count += 1 if t.inspect.include?("worker_thread")
81
+ end
82
+ count
83
+ end
84
+
85
+ def get_mappings(tgt, pkt, item)
86
+ target_model = Target.where("name = ?", tgt).first
87
+ packet_model = Packet.where("target_id = ? and name = ? and is_tlm = ?", target_model.id, pkt, true).first
88
+ item_model = Item.where("packet_id = ? and name = ?", packet_model.id, item).first
89
+ mappings = ItemToDecomTableMapping.where("item_id = ? and value_type != ?", item_model.id, ItemToDecomTableMapping::RAW)
90
+ end
91
+
92
+ describe "run" do
93
+ it "starts the specified number of worker threads" do
94
+ drm = DartReducerManager.new(1)
95
+ thread = Thread.new { drm.run }
96
+ sleep 0.1
97
+ expect(worker_threads()).to eq 1
98
+ drm.shutdown
99
+ thread.kill
100
+
101
+ drm = DartReducerManager.new(5)
102
+ thread = Thread.new { drm.run }
103
+ sleep 0.1
104
+ expect(worker_threads()).to eq 5
105
+ drm.shutdown
106
+ thread.kill
107
+ end
108
+
109
+ it "reduces per minute" do
110
+ setup_ples(11, 6) # 11 entries with a 6s gap
111
+ drm = DartReducerManager.new(1)
112
+ thread = Thread.new { drm.run }
113
+ sleep 0.5
114
+ drm.shutdown
115
+ thread.kill
116
+
117
+ get_mappings("INST", "HEALTH_STATUS", "COLLECTS").each do |mapping|
118
+ # Grab the base reduction table
119
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index)
120
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
121
+ # The last one doesn't get reduced
122
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
123
+ # Everything else should be reduced
124
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 10
125
+ val = 0
126
+ rows.find_each do |row|
127
+ expect(row.read_attribute("i#{mapping.item_index}")).to eq val
128
+ val += 1
129
+ end
130
+
131
+ # Grab the minute reduction table
132
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index, "_m")
133
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
134
+ # We only spanned a single minute so we have a single packet ready to reduce
135
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
136
+ # None have been actually reduced
137
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 0
138
+ rows.find_each do |row|
139
+ expect(row.num_samples).to eq 10
140
+ expect(row.read_attribute("i#{mapping.item_index}min")).to eq 0
141
+ expect(row.read_attribute("i#{mapping.item_index}max")).to eq 9
142
+ expect(row.read_attribute("i#{mapping.item_index}avg")).to eq ((0..9).to_a.sum / 10.0)
143
+ expect(row.read_attribute("i#{mapping.item_index}stddev")).to be_within(0.0000001).of(Math.stddev_population((0..9).to_a)[1])
144
+ end
145
+ end
146
+ end
147
+
148
+ it "reduces per hour" do
149
+ # 367 entries at 10s apart creates 3670.367s which is 1hr, 1min and 10s of time
150
+ # The extra 10s is due to the last one not getting reduced. The extra minute is due
151
+ # to the last minute reduction table not getting reduced.
152
+ setup_ples(367, 10.001)
153
+ drm = DartReducerManager.new(1)
154
+ thread = Thread.new { drm.run }
155
+ sleep 2
156
+ drm.shutdown
157
+ thread.kill
158
+
159
+ get_mappings("INST", "HEALTH_STATUS", "COLLECTS").each do |mapping|
160
+ # Grab the base reduction table
161
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index)
162
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
163
+ # The last one doesn't get reduced
164
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
165
+ # Everything else should be reduced
166
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 366
167
+ val = 0
168
+ rows.find_each do |row|
169
+ expect(row.read_attribute("i#{mapping.item_index}")).to eq val
170
+ val += 1
171
+ end
172
+
173
+ # Grab the minute reduction table
174
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index, "_m")
175
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
176
+ # The last one doesn't get reduced
177
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
178
+ # We reduced 60 minutes
179
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 60
180
+ row = rows.first
181
+ expect(row.num_samples).to eq 6
182
+ expect(row.read_attribute("i#{mapping.item_index}min")).to eq 0
183
+ expect(row.read_attribute("i#{mapping.item_index}max")).to eq 5
184
+ expect(row.read_attribute("i#{mapping.item_index}avg")).to eq ((0..5).to_a.sum / 6.0)
185
+ expect(row.read_attribute("i#{mapping.item_index}stddev")).to be_within(0.0000001).of(Math.stddev_population((0..5).to_a)[1])
186
+
187
+ # Grab the hour reduction table
188
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index, "_h")
189
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
190
+ # We only spanned a single hour so we have a single packet ready to reduce
191
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
192
+ # None have been actually reduced
193
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 0
194
+ row = rows.first
195
+ expect(row.num_samples).to eq 60
196
+ expect(row.read_attribute("i#{mapping.item_index}min")).to eq 0
197
+ expect(row.read_attribute("i#{mapping.item_index}max")).to eq 359
198
+ expect(row.read_attribute("i#{mapping.item_index}avg")).to eq ((0..359).to_a.sum / 360.0)
199
+ expect(row.read_attribute("i#{mapping.item_index}stddev")).to be_within(0.05).of(Math.stddev_population((0..359).to_a)[1])
200
+ end
201
+ end
202
+
203
+ it "reduces per day" do
204
+ # 72 is three days plus the extra reduction, minute, and hour
205
+ setup_ples(75, 3600.001)
206
+ drm = DartReducerManager.new(1)
207
+ thread = Thread.new { drm.run }
208
+ sleep 2
209
+ drm.shutdown
210
+ thread.kill
211
+
212
+ drm = DartReducerManager.new(1)
213
+ thread = Thread.new { drm.run }
214
+ sleep 2
215
+ drm.shutdown
216
+ thread.kill
217
+
218
+ get_mappings("INST", "HEALTH_STATUS", "COLLECTS").each do |mapping|
219
+ # Grab the base reduction table
220
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index)
221
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
222
+ # The last one doesn't get reduced
223
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
224
+ # Everything else should be reduced
225
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 74
226
+ val = 0
227
+ rows.find_each do |row|
228
+ expect(row.read_attribute("i#{mapping.item_index}")).to eq val
229
+ val += 1
230
+ end
231
+
232
+ # Grab the minute reduction table
233
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index, "_m")
234
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
235
+ # The last one doesn't get reduced
236
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
237
+ # The rest is reduced
238
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 73
239
+ val = 0
240
+ rows.find_each do |row|
241
+ # Since our samples were more than 1 min apart there is only 1 sample per row
242
+ expect(row.num_samples).to eq 1
243
+ # Min, max, and avg are all the same since we only have 1 sample
244
+ expect(row.read_attribute("i#{mapping.item_index}min")).to eq val
245
+ expect(row.read_attribute("i#{mapping.item_index}max")).to eq val
246
+ expect(row.read_attribute("i#{mapping.item_index}avg")).to eq val
247
+ expect(row.read_attribute("i#{mapping.item_index}stddev")).to eq 0
248
+ val += 1
249
+ end
250
+
251
+ # Grab the hour reduction table
252
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index, "_h")
253
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
254
+ # The last one doesn't get reduced
255
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 1
256
+ # The rest is reduced
257
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 72
258
+ val = 0
259
+ rows.find_each do |row|
260
+ # Since our samples were more than 1 hour apart there is only 1 sample per row
261
+ expect(row.num_samples).to eq 1
262
+ # Min, max, and avg are all the same since we only have 1 sample
263
+ expect(row.read_attribute("i#{mapping.item_index}min")).to eq val
264
+ expect(row.read_attribute("i#{mapping.item_index}max")).to eq val
265
+ expect(row.read_attribute("i#{mapping.item_index}avg")).to eq val
266
+ expect(row.read_attribute("i#{mapping.item_index}stddev")).to eq 0
267
+ val += 1
268
+ end
269
+
270
+ # Grab the day reduction table
271
+ rows = common.get_decom_table_model(mapping.packet_config_id, mapping.table_index, "_d")
272
+ expect(rows.where("reduced_state" => DartCommon::INITIALIZING).count).to eq 0
273
+ # Day values are always "READY" since they don't get further reduced
274
+ expect(rows.where("reduced_state" => DartCommon::READY_TO_REDUCE).count).to eq 3
275
+ # Reduced is always 0
276
+ expect(rows.where("reduced_state" => DartCommon::REDUCED).count).to eq 0
277
+ val = 0
278
+ rows.find_each do |row|
279
+ expect(row.num_samples).to eq 24
280
+ expect(row.read_attribute("i#{mapping.item_index}min")).to eq val
281
+ expect(row.read_attribute("i#{mapping.item_index}max")).to eq val + 23
282
+ expect(row.read_attribute("i#{mapping.item_index}avg")).to eq ((val..(val+23)).to_a.sum / 24.0)
283
+ expect(row.read_attribute("i#{mapping.item_index}stddev")).to be_within(0.0000001).of(Math.stddev_population((val..(val+23)).to_a)[1])
284
+ val += 24
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end