cosmos 4.2.4-java → 4.5.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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +2 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  5. data/.github/ISSUE_TEMPLATE/help---usage---general-question.md +12 -0
  6. data/.gitignore +2 -0
  7. data/.travis.yml +6 -6
  8. data/Dockerfile +69 -0
  9. data/Gemfile +1 -1
  10. data/Manifest.txt +130 -46
  11. data/README.md +9 -0
  12. data/Rakefile +57 -0
  13. data/appveyor.yml +18 -7
  14. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  15. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  16. data/autohotkey/config/targets/INST/lib/sim_inst.rb +3 -1
  17. data/autohotkey/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
  18. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  19. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  20. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  21. data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  22. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  23. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  24. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  25. data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  26. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  27. data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  28. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +2 -4
  29. data/autohotkey/config/tools/table_manager/SubTables/OneDimensionalSubTable_def.txt +31 -0
  30. data/autohotkey/config/tools/table_manager/SubTables/TwoDimensionalSubTable_def.txt +28 -0
  31. data/autohotkey/config/tools/test_runner/test_runner.txt +1 -1
  32. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  33. data/autohotkey/config/tools/test_runner/test_runner3.txt +1 -1
  34. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  35. data/autohotkey/lib/cmd_sequence_exporter.rb +52 -0
  36. data/autohotkey/procedures/collect.rb +2 -2
  37. data/autohotkey/procedures/collect_util.rb +1 -1
  38. data/autohotkey/procedures/script_test.rb +1 -1
  39. data/autohotkey/tools/CmdSenderAHK2 +18 -0
  40. data/autohotkey/tools/cmd_sender.ahk +34 -6
  41. data/autohotkey/tools/cmd_sender2.ahk +4 -0
  42. data/autohotkey/tools/cmd_sequence.ahk +36 -22
  43. data/autohotkey/tools/cmd_sequence2.ahk +1 -1
  44. data/autohotkey/tools/config_editor.ahk +5 -5
  45. data/autohotkey/tools/launcher.ahk +1 -0
  46. data/autohotkey/tools/limits_monitor.ahk +1 -1
  47. data/autohotkey/tools/packet_viewer.ahk +7 -6
  48. data/autohotkey/tools/script_runner.ahk +16 -4
  49. data/autohotkey/tools/test_runner.ahk +8 -8
  50. data/bin/cosmos +38 -1
  51. data/bin/cstol_converter +1 -1
  52. data/bin/dart_util +0 -0
  53. data/bin/rubysloc +73 -28
  54. data/bin/xtce_converter +1 -1
  55. data/cosmos.gemspec +7 -9
  56. data/data/config/_interfaces.yaml +4 -0
  57. data/data/config/cmd_sequence.yaml +14 -0
  58. data/data/config/command_modifiers.yaml +16 -1
  59. data/data/config/housekeeping_params.yaml +14 -0
  60. data/data/config/interface_modifiers.yaml +14 -2
  61. data/data/config/item_modifiers.yaml +11 -1
  62. data/data/config/launcher.yaml +12 -2
  63. data/data/config/param_item_modifiers.yaml +7 -2
  64. data/data/config/parameter_modifiers.yaml +20 -0
  65. data/data/config/screen.yaml +2 -0
  66. data/data/config/script_runner.yaml +9 -0
  67. data/data/config/system.yaml +152 -28
  68. data/data/config/table_manager.yaml +7 -0
  69. data/data/config/target.yaml +12 -0
  70. data/data/config/telemetry_modifiers.yaml +19 -2
  71. data/data/config/test_runner.yaml +10 -9
  72. data/data/config/widgets.yaml +174 -11
  73. data/data/crc.txt +428 -415
  74. data/demo/Gemfile +1 -1
  75. data/demo/Launcher.bat +1 -9
  76. data/demo/Launcher2.bat +1 -0
  77. data/demo/LauncherMini.bat +1 -0
  78. data/demo/Rakefile +2 -0
  79. data/demo/config/dart/Gemfile +2 -7
  80. data/demo/config/data/crc.txt +243 -219
  81. data/demo/config/system/system.txt +42 -3
  82. data/demo/config/system/system2.txt +34 -5
  83. data/demo/config/system/system_alt_ports.txt +80 -0
  84. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +1 -0
  85. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +5 -4
  86. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +12 -7
  87. data/demo/config/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
  88. data/demo/config/targets/INST/cmd_tlm_server.txt +2 -0
  89. data/demo/config/targets/INST/lib/sim_inst.rb +15 -3
  90. data/demo/config/targets/INST/screens/adcs.txt +2 -2
  91. data/demo/config/targets/INST/screens/block.txt +1 -1
  92. data/demo/config/targets/INST/screens/commanding.txt +1 -1
  93. data/demo/config/targets/INST/screens/ground.txt +27 -5
  94. data/demo/config/targets/INST/screens/ground_error.gif +0 -0
  95. data/demo/config/{data/groundoff.gif → targets/INST/screens/ground_off.gif} +0 -0
  96. data/demo/config/{data/groundon.gif → targets/INST/screens/ground_on.gif} +0 -0
  97. data/demo/config/targets/INST/screens/limits.txt +69 -31
  98. data/demo/config/targets/INST/screens/other.txt +13 -3
  99. data/demo/config/targets/INST/screens/params.txt +54 -0
  100. data/demo/config/targets/INST/screens/satellite.gif +0 -0
  101. data/demo/config/targets/INST/target.txt +1 -0
  102. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server_chain.txt +18 -0
  103. data/demo/config/tools/data_viewer/data_viewer.txt +3 -0
  104. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  105. data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  106. data/demo/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  107. data/demo/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  108. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  109. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  110. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  111. data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  112. data/demo/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  113. data/demo/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  114. data/demo/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  115. data/demo/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  116. data/demo/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  117. data/demo/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  118. data/demo/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  119. data/demo/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  120. data/demo/config/tools/handbook_creator/default_toc.xsl +59 -59
  121. data/demo/config/tools/script_runner/script_runner.txt +1 -2
  122. data/demo/config/tools/test_runner/test_runner.txt +3 -1
  123. data/demo/lib/example_background_task.rb +1 -0
  124. data/demo/procedures/cosmos_api_test.rb +26 -22
  125. data/demo/procedures/interactive.rb +22 -0
  126. data/demo/procedures/local_screen_example.rb +51 -0
  127. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +32 -4
  128. data/ext/cosmos/ext/packet/packet.c +6 -77
  129. data/ext/mkrf_conf.rb +2 -2
  130. data/extensions/vscode/.gitignore +4 -0
  131. data/extensions/vscode/.vscode/launch.json +32 -0
  132. data/extensions/vscode/.vscode/settings.json +13 -0
  133. data/extensions/vscode/.vscode/tasks.json +79 -0
  134. data/extensions/vscode/License.txt +879 -0
  135. data/extensions/vscode/README.md +9 -0
  136. data/extensions/vscode/client/License.txt +879 -0
  137. data/extensions/vscode/client/README.md +39 -0
  138. data/extensions/vscode/client/cosmos.configuration.json +23 -0
  139. data/extensions/vscode/client/images/icon.png +0 -0
  140. data/extensions/vscode/client/package-lock.json +414 -0
  141. data/extensions/vscode/client/package.json +105 -0
  142. data/extensions/vscode/client/src/extension.ts +132 -0
  143. data/extensions/vscode/client/src/screen_preview.rb +25 -0
  144. data/extensions/vscode/client/syntaxes/cosmos.tmLanguage.json +219 -0
  145. data/extensions/vscode/client/tsconfig.json +17 -0
  146. data/extensions/vscode/package-lock.json +26 -0
  147. data/extensions/vscode/package.json +35 -0
  148. data/extensions/vscode/server/License.txt +879 -0
  149. data/extensions/vscode/server/package-lock.json +236 -0
  150. data/extensions/vscode/server/package.json +29 -0
  151. data/extensions/vscode/server/src/server.ts +59 -0
  152. data/extensions/vscode/server/tsconfig.json +16 -0
  153. data/install/Gemfile +1 -1
  154. data/install/Launcher.bat +1 -9
  155. data/install/config/dart/Gemfile +3 -8
  156. data/install/config/data/crc.txt +148 -132
  157. data/install/config/system/system.txt +36 -3
  158. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  159. data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  160. data/install/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  161. data/install/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  162. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  163. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  164. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  165. data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  166. data/install/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  167. data/install/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  168. data/install/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  169. data/install/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  170. data/install/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  171. data/install/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  172. data/install/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  173. data/install/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  174. data/install/config/tools/handbook_creator/default_toc.xsl +59 -59
  175. data/lib/cosmos/config/config_parser.rb +4 -5
  176. data/lib/cosmos/conversions.rb +2 -0
  177. data/lib/cosmos/conversions/packet_time_formatted_conversion.rb +38 -0
  178. data/lib/cosmos/conversions/packet_time_seconds_conversion.rb +38 -0
  179. data/lib/cosmos/core_ext/cosmos_io.rb +2 -1
  180. data/lib/cosmos/core_ext/time.rb +3 -1
  181. data/lib/cosmos/dart/config/boot.rb +1 -1
  182. data/lib/cosmos/dart/config/database.yml +2 -0
  183. data/lib/cosmos/dart/examples/dart_decom_client.rb +1 -1
  184. data/lib/cosmos/dart/examples/dart_stream_client.rb +6 -2
  185. data/lib/cosmos/dart/lib/dart_common.rb +13 -6
  186. data/lib/cosmos/dart/lib/dart_constants.rb +15 -0
  187. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +2 -2
  188. data/lib/cosmos/dart/lib/dart_decom_query.rb +5 -6
  189. data/lib/cosmos/dart/lib/dart_decommutator.rb +64 -54
  190. data/lib/cosmos/dart/lib/dart_importer.rb +3 -3
  191. data/lib/cosmos/dart/lib/dart_master_query.rb +71 -0
  192. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +2 -2
  193. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +165 -134
  194. data/lib/cosmos/dart/processes/dart.rb +4 -2
  195. data/lib/cosmos/dart/processes/dart_decom_server.rb +3 -3
  196. data/lib/cosmos/dart/processes/dart_ingester.rb +40 -1
  197. data/lib/cosmos/dart/processes/dart_master.rb +44 -0
  198. data/lib/cosmos/dart/processes/dart_util.rb +119 -4
  199. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +3 -3
  200. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +9 -5
  201. data/lib/cosmos/gui/dialogs/details_dialog.rb +44 -29
  202. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +1 -1
  203. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +3 -3
  204. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +2 -2
  205. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +1 -1
  206. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +11 -10
  207. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +4 -2
  208. data/lib/cosmos/gui/opengl/earth_model.rb +1 -1
  209. data/lib/cosmos/gui/qt.rb +13 -2
  210. data/lib/cosmos/gui/qt_tool.rb +71 -43
  211. data/lib/cosmos/gui/text/ruby_editor.rb +91 -49
  212. data/lib/cosmos/gui/utilities/classification_banner.rb +60 -0
  213. data/lib/cosmos/gui/utilities/screenshot.rb +1 -1
  214. data/lib/cosmos/gui/utilities/script_module_gui.rb +117 -91
  215. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +22 -3
  216. data/lib/cosmos/interfaces.rb +2 -0
  217. data/lib/cosmos/interfaces/dart_status_interface.rb +1 -1
  218. data/lib/cosmos/interfaces/interface.rb +9 -1
  219. data/lib/cosmos/interfaces/linc_interface.rb +3 -3
  220. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +1 -1
  221. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +1 -1
  222. data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +40 -18
  223. data/lib/cosmos/interfaces/protocols/ignore_packet_protocol.rb +46 -0
  224. data/lib/cosmos/interfaces/protocols/length_protocol.rb +5 -0
  225. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +68 -23
  226. data/lib/cosmos/interfaces/protocols/template_protocol.rb +9 -4
  227. data/lib/cosmos/interfaces/serial_interface.rb +7 -1
  228. data/lib/cosmos/interfaces/simulated_target_interface.rb +14 -5
  229. data/lib/cosmos/interfaces/stream_interface.rb +1 -1
  230. data/lib/cosmos/interfaces/tcpip_server_interface.rb +13 -13
  231. data/lib/cosmos/io/json_drb.rb +16 -12
  232. data/lib/cosmos/io/json_drb_object.rb +7 -2
  233. data/lib/cosmos/io/json_drb_rack.rb +25 -5
  234. data/lib/cosmos/io/json_rpc.rb +1 -1
  235. data/lib/cosmos/io/posix_serial_driver.rb +60 -22
  236. data/lib/cosmos/io/serial_driver.rb +11 -8
  237. data/lib/cosmos/io/win32_serial_driver.rb +31 -3
  238. data/lib/cosmos/packet_logs/packet_log_reader.rb +71 -28
  239. data/lib/cosmos/packet_logs/packet_log_writer.rb +13 -1
  240. data/lib/cosmos/packets/commands.rb +30 -9
  241. data/lib/cosmos/packets/packet.rb +105 -34
  242. data/lib/cosmos/packets/packet_config.rb +60 -10
  243. data/lib/cosmos/packets/parsers/format_string_parser.rb +0 -1
  244. data/lib/cosmos/packets/parsers/state_parser.rb +0 -1
  245. data/lib/cosmos/packets/parsers/xtce_converter.rb +2 -0
  246. data/lib/cosmos/packets/parsers/xtce_parser.rb +5 -4
  247. data/lib/cosmos/packets/structure.rb +32 -4
  248. data/lib/cosmos/packets/structure_item.rb +5 -1
  249. data/lib/cosmos/packets/telemetry.rb +30 -4
  250. data/lib/cosmos/script/api_shared.rb +22 -10
  251. data/lib/cosmos/script/extract.rb +1 -1
  252. data/lib/cosmos/script/limits.rb +4 -0
  253. data/lib/cosmos/script/script.rb +29 -20
  254. data/lib/cosmos/script/scripting.rb +16 -14
  255. data/lib/cosmos/script/telemetry.rb +3 -1
  256. data/lib/cosmos/script/tools.rb +18 -8
  257. data/lib/cosmos/streams/serial_stream.rb +11 -6
  258. data/lib/cosmos/system/system.rb +214 -76
  259. data/lib/cosmos/system/target.rb +39 -9
  260. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +116 -55
  261. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +15 -0
  262. data/lib/cosmos/tools/cmd_sender/cmd_params.rb +382 -0
  263. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +54 -340
  264. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +74 -52
  265. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +40 -333
  266. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +16 -11
  267. data/lib/cosmos/tools/cmd_tlm_server/api.rb +13 -0
  268. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +2 -0
  269. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +44 -15
  270. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +8 -1
  271. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +18 -20
  272. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +13 -2
  273. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
  274. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +13 -13
  275. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +9 -6
  276. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +8 -8
  277. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +5 -5
  278. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +35 -20
  279. data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +15 -11
  280. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +5 -0
  281. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +2 -0
  282. data/lib/cosmos/tools/config_editor/config_editor.rb +181 -94
  283. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +10 -9
  284. data/lib/cosmos/tools/config_editor/system_config_dialog.rb +158 -0
  285. data/lib/cosmos/tools/data_viewer/data_viewer.rb +57 -47
  286. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +1 -0
  287. data/lib/cosmos/tools/data_viewer/dump_component.rb +3 -9
  288. data/lib/cosmos/tools/data_viewer/text_component.rb +77 -0
  289. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +68 -42
  290. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -1
  291. data/lib/cosmos/tools/launcher/launcher.rb +2 -1
  292. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +59 -41
  293. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +42 -42
  294. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +64 -59
  295. data/lib/cosmos/tools/script_runner/script_runner.rb +198 -123
  296. data/lib/cosmos/tools/script_runner/script_runner_config.rb +14 -0
  297. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +87 -35
  298. data/lib/cosmos/tools/table_manager/table_config.rb +5 -3
  299. data/lib/cosmos/tools/table_manager/table_manager.rb +48 -45
  300. data/lib/cosmos/tools/test_runner/test.rb +5 -2
  301. data/lib/cosmos/tools/test_runner/test_runner.rb +61 -38
  302. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +24 -12
  303. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +48 -48
  304. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +5 -8
  305. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +20 -16
  306. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +3 -3
  307. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +7 -7
  308. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +10 -10
  309. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +10 -3
  310. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +6 -6
  311. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +14 -14
  312. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +21 -17
  313. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +5 -8
  314. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +94 -91
  315. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +27 -26
  316. data/lib/cosmos/tools/tlm_viewer/screen.rb +76 -14
  317. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +51 -34
  318. data/lib/cosmos/tools/tlm_viewer/widgets.rb +3 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +4 -5
  320. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +3 -4
  321. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +4 -5
  322. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_clickable.rb +16 -2
  323. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +17 -3
  324. data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +1 -2
  325. data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +40 -0
  326. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +12 -7
  327. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +79 -29
  328. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +1 -0
  329. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +2 -1
  330. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +2 -0
  331. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +4 -0
  332. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +33 -25
  333. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +5 -3
  334. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +5 -3
  335. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +1 -1
  336. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +4 -7
  337. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +5 -5
  338. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +6 -7
  339. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +2 -4
  340. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +10 -8
  341. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +2 -3
  342. data/lib/cosmos/tools/tlm_viewer/widgets/labelled_widget.rb +58 -0
  343. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +3 -4
  344. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +2 -4
  345. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +2 -1
  346. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +3 -5
  347. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +2 -3
  348. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitscolumn_widget.rb +2 -3
  349. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +2 -3
  350. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangecolumn_widget.rb +2 -3
  351. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +3 -5
  352. data/lib/cosmos/tools/tlm_viewer/widgets/led_widget.rb +108 -0
  353. data/lib/cosmos/tools/tlm_viewer/widgets/limits_widget.rb +60 -10
  354. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +22 -8
  355. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolor_widget.rb +19 -13
  356. data/lib/cosmos/tools/tlm_viewer/widgets/limitscolumn_widget.rb +22 -8
  357. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +2 -3
  358. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +4 -3
  359. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +1 -3
  360. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +10 -5
  361. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +7 -4
  362. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +4 -6
  363. data/lib/cosmos/tools/tlm_viewer/widgets/rangecolumn_widget.rb +3 -5
  364. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +4 -3
  365. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +2 -3
  366. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +2 -3
  367. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +4 -6
  368. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +2 -3
  369. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +2 -3
  370. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +13 -4
  371. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +3 -4
  372. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +3 -8
  373. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +6 -12
  374. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +5 -10
  375. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +5 -3
  376. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +4 -4
  377. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +2 -3
  378. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitscolumn_widget.rb +2 -3
  379. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +3 -4
  380. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangecolumn_widget.rb +2 -3
  381. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +8 -7
  382. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +9 -7
  383. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +60 -47
  384. data/lib/cosmos/top_level.rb +37 -13
  385. data/lib/cosmos/utilities/ruby_lex_utils.rb +34 -30
  386. data/lib/cosmos/version.rb +5 -5
  387. data/lib/cosmos/win32/excel.rb +81 -24
  388. data/make_gems.sh +10 -0
  389. data/run_gui_tests.bat +1 -0
  390. data/spec/conversions/packet_time_formatted_conversion_spec.rb +58 -0
  391. data/spec/conversions/packet_time_seconds_conversion_spec.rb +60 -0
  392. data/spec/core_ext/socket_spec.rb +1 -1
  393. data/spec/core_ext/time_spec.rb +4 -0
  394. data/spec/gui/utilities/script_module_gui_spec.rb +44 -63
  395. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
  396. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
  397. data/spec/install/yaml_docs_spec.rb +132 -0
  398. data/spec/interfaces/linc_interface_spec.rb +1 -1
  399. data/spec/interfaces/protocols/fixed_protocol_spec.rb +20 -9
  400. data/spec/interfaces/protocols/ignore_packet_protocol_spec.rb +243 -0
  401. data/spec/interfaces/protocols/length_protocol_spec.rb +39 -0
  402. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +227 -4
  403. data/spec/interfaces/protocols/template_protocol_spec.rb +78 -25
  404. data/spec/io/json_drb_rack_spec.rb +166 -0
  405. data/spec/io/json_drb_spec.rb +14 -0
  406. data/spec/io/json_rpc_spec.rb +4 -5
  407. data/spec/io/posix_serial_driver_spec.rb +81 -0
  408. data/spec/io/serial_driver_spec.rb +15 -13
  409. data/spec/io/win32_serial_driver_spec.rb +33 -3
  410. data/spec/packet_logs/packet_log_reader_spec.rb +106 -52
  411. data/spec/packets/commands_spec.rb +22 -0
  412. data/spec/packets/packet_config_spec.rb +29 -16
  413. data/spec/packets/packet_item_spec.rb +2 -2
  414. data/spec/packets/packet_spec.rb +39 -6
  415. data/spec/packets/parsers/format_string_parser_spec.rb +0 -11
  416. data/spec/packets/parsers/macro_parser_spec.rb +36 -36
  417. data/spec/packets/parsers/state_parser_spec.rb +69 -11
  418. data/spec/packets/structure_spec.rb +93 -2
  419. data/spec/packets/telemetry_spec.rb +63 -10
  420. data/spec/script/extract_spec.rb +4 -1
  421. data/spec/script/script_spec.rb +2 -3
  422. data/spec/script/scripting_spec.rb +2 -1
  423. data/spec/script/tools_spec.rb +0 -1
  424. data/spec/streams/tcpip_socket_stream_spec.rb +32 -27
  425. data/spec/system/system_spec.rb +187 -4
  426. data/spec/system/target_spec.rb +62 -1
  427. data/spec/tools/cmd_tlm_server/api_spec.rb +29 -21
  428. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -7
  429. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +33 -0
  430. data/spec/tools/cmd_tlm_server/commanding_spec.rb +25 -1
  431. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +15 -0
  432. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +2 -3
  433. data/spec/top_level/top_level_spec.rb +29 -5
  434. data/spec/utilities/message_log_spec.rb +6 -3
  435. data/tasks/gemfile_stats.rake +38 -14
  436. data/test/performance/config/system/system.txt +0 -0
  437. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +5 -5
  438. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
  439. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
  440. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
  441. data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
  442. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  443. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  444. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  445. data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  446. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
  447. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
  448. data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
  449. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
  450. data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
  451. data/test/performance/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
  452. data/test/performance/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
  453. data/test/performance/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
  454. data/test/performance/config/tools/test_runner/test_runner.txt +1 -1
  455. data/test/performance/procedures/cosmos_api_test.rb +1 -1
  456. data/test/performance/tools/identify_performance.rb +82 -0
  457. metadata +146 -62
  458. data/lib/cosmos/dart/Gemfile +0 -69
@@ -11,6 +11,7 @@
11
11
  require 'dart_common'
12
12
  require 'dart_logging'
13
13
  require 'packet_log_entry'
14
+ require 'cosmos/io/json_drb_object'
14
15
 
15
16
  class DartDecommutatorStatus
16
17
  attr_accessor :count
@@ -36,24 +37,40 @@ class DartDecommutator
36
37
  # Wait 60s before giving up on the PacketConfig becoming ready
37
38
  PACKET_CONFIG_READY_TIMEOUT = 60
38
39
 
40
+ # Delay between updating the DART status packet. Simply throttles this rarely viewed status
41
+ STATUS_UPDATE_PERIOD_SECONDS = 60.seconds
42
+
39
43
  def initialize(worker_id = 0, num_workers = 1)
40
44
  sync_targets_and_packets()
41
45
  @worker_id = worker_id
42
46
  @num_workers = num_workers
43
47
  @status = DartDecommutatorStatus.new
48
+ @master = Cosmos::JsonDRbObject.new(Cosmos::System.connect_hosts['DART_MASTER'], Cosmos::System.ports['DART_MASTER'], 1.0, Cosmos::System.x_csrf_token)
49
+ end
50
+
51
+ def timeit(message, &block)
52
+ time_start = Time.now
53
+ yield
54
+ Cosmos::Logger.info("#{Time.now - time_start}s #{message}")
44
55
  end
45
56
 
46
57
  # Run forever looking for data to decommutate
47
58
  def run
48
- status_time = Time.now + 60.seconds
59
+ status_time = Time.now + STATUS_UPDATE_PERIOD_SECONDS
49
60
  while true
50
- time_start = Time.now # Remember start time so we can throttle
51
- # Get all entries that are ready and decommutation hasn't started
52
- PacketLogEntry.where("decom_state = #{PacketLogEntry::NOT_STARTED} and ready = true").
53
- # Mod the ID to allow distribution of effort, in_batches processes 1000 at a time
54
- where("id % #{@num_workers} = #{@worker_id}").in_batches do |group|
55
- group.each do |ple|
61
+ ple_id = nil
62
+ start_time = nil
63
+ end_time = nil
64
+ begin
65
+ ple_ids = @master.get_decom_ple_ids()
66
+ rescue DRb::DRbConnError
67
+ sleep(1)
68
+ next
69
+ end
70
+ if ple_ids and ple_ids.length > 0
71
+ ple_ids.each do |ple_id|
56
72
  begin
73
+ ple = PacketLogEntry.find(ple_id)
57
74
  meta_ple = get_meta_ple(ple)
58
75
  next unless meta_ple
59
76
  system_meta = get_system_meta(ple, meta_ple)
@@ -86,15 +103,14 @@ class DartDecommutator
86
103
  rescue => err
87
104
  handle_error("PLE:#{ple.id}:ERROR\n#{err.formatted}")
88
105
  end
89
- end # each ple
90
- end # batches
91
-
92
- # Throttle to no faster than 1 Hz
93
- delta = Time.now - time_start
94
- sleep(1 - delta) if delta < 1 && delta > 0
106
+ end
107
+ else
108
+ sleep(1)
109
+ end
95
110
  end
96
111
  rescue Interrupt
97
112
  Cosmos::Logger.info("Dart Worker Closing From Signal...")
113
+ @master.shutdown
98
114
  end
99
115
 
100
116
  protected
@@ -238,51 +254,45 @@ class DartDecommutator
238
254
  end
239
255
 
240
256
  def decom_packet(ple, packet, packet_config)
241
- # Update packet config times
242
- if !packet_config.start_time or (packet.received_time < packet_config.start_time)
243
- packet_config.start_time = packet.received_time
244
- packet_config.save!
245
- end
246
- if !packet_config.end_time or (packet.received_time > packet_config.end_time)
247
- packet_config.end_time = packet.received_time
248
- packet_config.save!
249
- end
257
+ ActiveRecord::Base.transaction do
258
+ # Update packet config times
259
+ if !packet_config.start_time or (packet.packet_time < packet_config.start_time)
260
+ packet_config.start_time = packet.packet_time
261
+ packet_config.save!
262
+ end
263
+ if !packet_config.end_time or (packet.packet_time > packet_config.end_time)
264
+ packet_config.end_time = packet.packet_time
265
+ packet_config.save!
266
+ end
250
267
 
251
- # Mark the log entry IN_PROGRESS as we decommutate the data
252
- ple.decom_state = PacketLogEntry::IN_PROGRESS
253
- ple.save!
254
- values = get_values(packet)
268
+ values = get_values(packet)
255
269
 
256
- table_index = 0
257
- rows = []
258
- # Create rows in the decommutation table model
259
- values.each_slice(MAX_COLUMNS_PER_TABLE) do |table_values|
260
- model = get_decom_table_model(packet_config.id, table_index)
261
- row = model.new
262
- row.time = ple.time
263
- row.ple_id = ple.id
264
- row.packet_log_id = ple.packet_log_id
265
- row.meta_id = ple.meta_id
266
- row.reduced_state = INITIALIZING
267
- table_values.each_with_index do |value, index|
268
- item_index = (table_index * MAX_COLUMNS_PER_TABLE) + index
269
- row.write_attribute("i#{item_index}", value)
270
+ table_index = 0
271
+ rows = []
272
+ # Create rows in the decommutation table model
273
+ values.each_slice(MAX_COLUMNS_PER_TABLE) do |table_values|
274
+ model = get_decom_table_model(packet_config.id, table_index)
275
+ row = model.new
276
+ row.time = ple.time
277
+ row.ple_id = ple.id
278
+ row.packet_log_id = ple.packet_log_id
279
+ row.meta_id = ple.meta_id
280
+ row.reduced_state = READY_TO_REDUCE
281
+ table_values.each_with_index do |value, index|
282
+ item_index = (table_index * MAX_COLUMNS_PER_TABLE) + index
283
+ row.write_attribute("i#{item_index}", value)
284
+ end
285
+ row.save!
286
+ rows << row
287
+ table_index += 1
270
288
  end
271
- row.save!
272
- rows << row
273
- table_index += 1
274
- end
275
- # Mark ready to reduce
276
- rows.each do |row|
277
- row.reduced_state = READY_TO_REDUCE
278
- row.save!
279
- end
280
289
 
281
- # The log entry has been decommutated, mark COMPLETE
282
- ple.decom_state = PacketLogEntry::COMPLETE
283
- ple.save!
284
- @status.count += 1
285
- Cosmos::Logger.debug("PLE:#{ple.id}:#{ple.decom_state_string}")
290
+ # The log entry has been decommutated, mark COMPLETE
291
+ ple.decom_state = PacketLogEntry::COMPLETE
292
+ ple.save!
293
+ @status.count += 1
294
+ Cosmos::Logger.debug("PLE:#{ple.id}:#{ple.decom_state_string}")
295
+ end
286
296
  end
287
297
 
288
298
  def handle_error(message)
@@ -80,7 +80,7 @@ class DartImporter
80
80
  Cosmos::Logger.info("First and Last Packet in File not in database")
81
81
 
82
82
  # Check if time range of packets is not present in database
83
- ple = PacketLogEntry.where("time >= ? and time <= ?", first_packet.received_time, last_packet.received_time).first
83
+ ple = PacketLogEntry.where("time >= ? and time <= ?", first_packet.packet_time, last_packet.packet_time).first
84
84
  if !ple # Can go fast if not present at all
85
85
  Cosmos::Logger.info(" Fast Import Enabled...")
86
86
  fast = true
@@ -134,7 +134,7 @@ class DartImporter
134
134
  ple = PacketLogEntry.new
135
135
  ple.target_id = target_id
136
136
  ple.packet_id = packet_id
137
- ple.time = packet.received_time
137
+ ple.time = packet.packet_time
138
138
  ple.packet_log_id = packet_log.id
139
139
  ple.data_offset = data_offset
140
140
  ple.meta_id = meta_id
@@ -149,7 +149,7 @@ class DartImporter
149
149
  ple.save!(validate: false)
150
150
  else
151
151
  ple_data << "," if ple_data.length > 0
152
- ple_data << "(#{target_id},#{packet_id},'#{packet.received_time.dup.utc.iso8601(6)}',#{packet_log.id},#{data_offset},#{meta_id},#{is_tlm},true)"
152
+ ple_data << "(#{target_id},#{packet_id},'#{packet.packet_time.dup.utc.iso8601(6)}',#{packet_log.id},#{data_offset},#{meta_id},#{is_tlm},true)"
153
153
  ple_data_count += 1
154
154
  end
155
155
 
@@ -0,0 +1,71 @@
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 'thread'
14
+
15
+ # Rails Json screws up COSMOS handling of Nan, etc.
16
+ require "active_support/core_ext/object/json"
17
+ module ActiveSupport
18
+ module ToJsonWithActiveSupportEncoder # :nodoc:
19
+ def to_json(options = nil)
20
+ super(options)
21
+ end
22
+ end
23
+ end
24
+
25
+ # JsonDRb server which responds to queries for decommutated and reduced data
26
+ # from the database.
27
+ class DartMasterQuery
28
+ include DartCommon
29
+
30
+ def initialize(ples_per_request = 5)
31
+ # Keep a thread to make sure we have the current list of items to decom
32
+ @ples_per_request = ples_per_request
33
+ @mutex = Mutex.new
34
+ @decom_list = []
35
+ @thread = Thread.new do
36
+ loop do
37
+ # Get all entries that are ready and decommutation hasn't started
38
+ if @decom_list.length <= 0
39
+ @mutex.synchronize do
40
+ begin
41
+ @decom_list.replace(PacketLogEntry.where("decom_state = #{PacketLogEntry::NOT_STARTED} and ready = true").order("id ASC").limit(1000).pluck(:id))
42
+ rescue Exception => error
43
+ Cosmos::Logger.error("Error getting packets to decom\n#{error.formatted}")
44
+ end
45
+ end
46
+ else
47
+ sleep(1)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ # Returns the id of a ple that needs to be decommed next
54
+ #
55
+ def get_decom_ple_ids()
56
+ begin
57
+ @mutex.synchronize do
58
+ result = []
59
+ @ples_per_request.times do
60
+ ple_id = @decom_list.shift
61
+ result << ple_id if ple_id
62
+ end
63
+ return result
64
+ end
65
+ rescue Exception => error
66
+ msg = "Master Error: #{error.message}"
67
+ raise $!, msg, $!.backtrace
68
+ end
69
+ end
70
+
71
+ end
@@ -114,7 +114,7 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
114
114
  ple = PacketLogEntry.new
115
115
  ple.target_id = target_id
116
116
  ple.packet_id = packet_id
117
- ple.time = packet.received_time
117
+ ple.time = packet.packet_time
118
118
  ple.packet_log_id = @packet_log_id
119
119
  ple.data_offset = @file_size
120
120
  ple.meta_id = @meta_id
@@ -134,7 +134,7 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
134
134
  @sync_count = 0
135
135
  end
136
136
  @ple_data << "," if @ple_data.length > 0
137
- @ple_data << "(#{target_id},#{packet_id},'#{packet.received_time.dup.utc.iso8601(6)}',#{@packet_log_id},#{@file_size},#{@meta_id},#{@is_tlm},true)"
137
+ @ple_data << "(#{target_id},#{packet_id},'#{packet.packet_time.dup.utc.iso8601(6)}',#{@packet_log_id},#{@file_size},#{@meta_id},#{@is_tlm},true)"
138
138
  end
139
139
  end
140
140
 
@@ -14,6 +14,11 @@ ItemToDecomTableMapping
14
14
 
15
15
  # Thread which performs data reduction in the DART database.
16
16
  class DartReducerWorkerThread
17
+ # This constant controls how much spread there must be in the data before doing a reduction. Since our minimum
18
+ # reduction is 1 minute, we will wait until we have at least two minutes of spread. Not as important for higher order
19
+ # reductions but also ensures that there is a spread in the data points.
20
+ HOLD_OFF_TIME = 2.minutes
21
+
17
22
  # Create a new thread and start it
18
23
  #
19
24
  # @param master_queue [Queue] Queue which the new thread will be added to
@@ -61,145 +66,44 @@ class DartReducerWorkerThread
61
66
 
62
67
  time_delta, base_model_time_column, time_method = job_attributes(job_type)
63
68
  rows = []
69
+ done = false
64
70
  # Find all the rows in the decommutation table which are ready to reduce
65
- base_model.where("reduced_state = #{DartCommon::READY_TO_REDUCE}").order("meta_id ASC, #{base_model_time_column} ASC").find_each do |row|
66
- rows << row
67
- first_row_time = rows[0].send(base_model_time_column)
68
- last_row_time = rows[-1].send(base_model_time_column)
69
- # Ensure we have conditions to process the reduction data
70
- next unless (last_row_time - first_row_time) > time_delta || # Enough samples or
71
- # The time attribute (min, hour, day) has changed or
72
- first_row_time.send(time_method) != last_row_time.send(time_method) ||
73
- rows[0].meta_id != rows[-1].meta_id # New meta data
74
-
75
- # Sample from the start to the second to last row because the last row
76
- # is where we detected a change. The last row will be part of a new sample set.
77
- sample_rows = rows[0..-2]
78
- new_row = reduction_model.new
79
- new_row.start_time = first_row_time
80
- new_row.num_samples = sample_rows.length
81
- new_row.meta_id = sample_rows[0].meta_id
82
- new_row.packet_log_id = sample_rows[0].packet_log_id
83
- # Process each of the ItemToDecomTableMapping to get the item to be reduced
84
- mappings.each do |mapping|
85
- item_name = "i#{mapping.item_index}"
86
- min_item_name = "i#{mapping.item_index}min"
87
- max_item_name = "i#{mapping.item_index}max"
88
- avg_item_name = "i#{mapping.item_index}avg"
89
- stddev_item_name = "i#{mapping.item_index}stddev"
90
- min_value = nil
91
- max_value = nil
92
- total_samples = 0 # s0
93
- avg_value = 0.0 # s1
94
- s2 = 0.0
95
- stddev_value = 0.0
96
- min_nan_found = false
97
- max_nan_found = false
98
- avg_nan_found = false
99
- stddev_nan_found = false
100
- # Process each of the rows in the base model which is the decommutation table
101
- # or a lesser reduction table (the minute or hour table).
102
- sample_rows.each do |row_to_reduce|
103
- # If we processing minute data we're reading from the base decommutation table
104
- # thus there is only raw values to read
105
- if job_type == :MINUTE
106
- value = row_to_reduce.read_attribute(item_name)
107
- min_sample = value
108
- max_sample = value
109
- avg_sample = value
110
- if value.nil?
111
- handle_error("#{item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
112
- next
113
- end
114
- else # :HOUR or :DAY
115
- # We're processing hour or day data so we're reducing previously reduced data
116
- # thus there are min, max, and average values to read
117
- min_sample = row_to_reduce.read_attribute(min_item_name)
118
- max_sample = row_to_reduce.read_attribute(max_item_name)
119
- avg_sample = row_to_reduce.read_attribute(avg_item_name)
120
- stddev_sample = row_to_reduce.read_attribute(stddev_item_name)
121
- if min_sample.nil?
122
- handle_error("#{min_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
123
- next
124
- end
125
- if max_sample.nil?
126
- handle_error("#{max_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
127
- next
128
- end
129
- if avg_sample.nil?
130
- handle_error("#{avg_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
131
- next
132
- end
133
- if stddev_sample.nil?
134
- handle_error("#{stddev_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
135
- next
136
- end
137
- end
138
-
139
- if nan_value?(min_sample)
140
- min_nan_found = true
141
- else
142
- if !min_value or min_sample < min_value
143
- min_value = min_sample
144
- end
145
- end
146
-
147
- if nan_value?(max_sample)
148
- max_nan_found = true
149
- else
150
- if !max_value or max_sample > max_value
151
- max_value = max_sample
152
- end
153
- end
154
-
155
- if nan_value?(avg_sample)
156
- avg_nan_found = true
157
- else
158
- # MINUTE data is reducing the decommutated values
159
- if job_type == :MINUTE
160
- total_samples += 1 # s0
161
- avg_value += avg_sample # s1
162
- s2 += (avg_sample * avg_sample)
163
- else # :HOUR or :DAY
164
- # Aggregated Stddev
165
- # See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
166
- total_samples += row_to_reduce.num_samples # s0
167
- avg_value += (avg_sample * row_to_reduce.num_samples) # s1
168
- s2 += row_to_reduce.num_samples * (avg_sample * avg_sample + stddev_sample * stddev_sample)
71
+ row_ids = base_model.where("reduced_state = #{DartCommon::READY_TO_REDUCE}").order("meta_id ASC, #{base_model_time_column} ASC").pluck(:id)
72
+ if row_ids.length > 0
73
+ first_row = base_model.find(row_ids[0])
74
+ last_row = base_model.find(row_ids[-1])
75
+ first_query_row_time = first_row.send(base_model_time_column)
76
+ last_query_row_time = last_row.send(base_model_time_column)
77
+ # Require at least a 2 minute spread to ensure a full minute of context is available
78
+ if (last_query_row_time - first_query_row_time) > HOLD_OFF_TIME
79
+ row_ids.in_groups_of(1000, false).each do |group_row_ids|
80
+ break if done
81
+ query_rows = base_model.order("meta_id ASC, #{base_model_time_column} ASC").where(id: group_row_ids)
82
+ query_rows.each do |row|
83
+ rows << row
84
+ first_row_time = rows[0].send(base_model_time_column)
85
+ last_row_time = rows[-1].send(base_model_time_column)
86
+
87
+ # Break if we are near the end of a minute
88
+ if (last_query_row_time - last_row_time) < 1.minute
89
+ done = true
90
+ break
169
91
  end
92
+
93
+ # Ensure we have conditions to process the reduction data
94
+ next unless (last_row_time - first_row_time) > time_delta || # Enough samples or
95
+ # The time attribute (min, hour, day) has changed or
96
+ first_row_time.send(time_method) != last_row_time.send(time_method) ||
97
+ rows[0].meta_id != rows[-1].meta_id # New meta data
98
+
99
+ # Sample from the start to the second to last row because the last row
100
+ # is where we detected a change. The last row will be part of a new sample set.
101
+ sample_rows = rows[0..-2]
102
+ create_reduced_row(sample_rows, base_model, reduction_model, base_model_time_column, mappings, job_type)
103
+ rows = rows[-1..-1] # Start a new sample with the last item in the previous sample
170
104
  end
171
105
  end
172
- if total_samples != 0
173
- # Aggregated Stddev
174
- # See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
175
- avg_value = avg_value.to_f / total_samples
176
- # Note: For very large numbers with very small deviations this sqrt can fail. If so then just set the stddev to 0.
177
- begin
178
- stddev_value = sqrt((s2 / total_samples) - (avg_value * avg_value))
179
- rescue Exception
180
- stddev_value = 0.0
181
- end
182
- end
183
- min_value = Float::NAN if min_nan_found and !min_value
184
- max_value = Float::NAN if max_nan_found and !max_value
185
- if avg_nan_found and total_samples == 0
186
- avg_value = Float::NAN
187
- stddev_value = Float::NAN
188
- end
189
- new_row.write_attribute(min_item_name, min_value)
190
- new_row.write_attribute(max_item_name, max_value)
191
- new_row.write_attribute(avg_item_name, avg_value)
192
- new_row.write_attribute(stddev_item_name, stddev_value)
193
106
  end
194
- base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_state => DartCommon::REDUCED)
195
- new_row.save! # Create the reduced data row in the database
196
- base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_id => new_row.id)
197
- new_row.reduced_state = DartCommon::READY_TO_REDUCE
198
- new_row.save!
199
- @status.count += 1
200
-
201
- rows = rows[-1..-1] # Start a new sample with the last item in the previous sample
202
- Cosmos::Logger.debug("Created #{new_row.class}:#{new_row.id} with #{mappings.length} items from #{new_row.num_samples} samples")
203
107
  end
204
108
  complete_job(job_type, packet_config_id, table_index)
205
109
  end # while @running
@@ -208,6 +112,133 @@ class DartReducerWorkerThread
208
112
  handle_error("Reducer Thread Unexpectedly Died: #{error.formatted}")
209
113
  end
210
114
 
115
+ def create_reduced_row(sample_rows, base_model, reduction_model, base_model_time_column, mappings, job_type)
116
+ new_row = reduction_model.new
117
+ new_row.start_time = sample_rows[0].send(base_model_time_column)
118
+ new_row.num_samples = sample_rows.length
119
+ new_row.meta_id = sample_rows[0].meta_id
120
+ new_row.packet_log_id = sample_rows[0].packet_log_id
121
+ # Process each of the ItemToDecomTableMapping to get the item to be reduced
122
+ mappings.each do |mapping|
123
+ item_name = "i#{mapping.item_index}"
124
+ min_item_name = "i#{mapping.item_index}min"
125
+ max_item_name = "i#{mapping.item_index}max"
126
+ avg_item_name = "i#{mapping.item_index}avg"
127
+ stddev_item_name = "i#{mapping.item_index}stddev"
128
+ min_value = nil
129
+ max_value = nil
130
+ total_samples = 0 # s0
131
+ avg_value = 0.0 # s1
132
+ s2 = 0.0
133
+ stddev_value = 0.0
134
+ min_nan_found = false
135
+ max_nan_found = false
136
+ avg_nan_found = false
137
+ stddev_nan_found = false
138
+ # Process each of the rows in the base model which is the decommutation table
139
+ # or a lesser reduction table (the minute or hour table).
140
+ sample_rows.each do |row_to_reduce|
141
+ # If we processing minute data we're reading from the base decommutation table
142
+ # thus there is only raw values to read
143
+ if job_type == :MINUTE
144
+ value = row_to_reduce.read_attribute(item_name)
145
+ min_sample = value
146
+ max_sample = value
147
+ avg_sample = value
148
+ if value.nil?
149
+ handle_error("#{item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
150
+ next
151
+ end
152
+ else # :HOUR or :DAY
153
+ # We're processing hour or day data so we're reducing previously reduced data
154
+ # thus there are min, max, and average values to read
155
+ min_sample = row_to_reduce.read_attribute(min_item_name)
156
+ max_sample = row_to_reduce.read_attribute(max_item_name)
157
+ avg_sample = row_to_reduce.read_attribute(avg_item_name)
158
+ stddev_sample = row_to_reduce.read_attribute(stddev_item_name)
159
+ if min_sample.nil?
160
+ handle_error("#{min_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
161
+ next
162
+ end
163
+ if max_sample.nil?
164
+ handle_error("#{max_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
165
+ next
166
+ end
167
+ if avg_sample.nil?
168
+ handle_error("#{avg_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
169
+ next
170
+ end
171
+ if stddev_sample.nil?
172
+ handle_error("#{stddev_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
173
+ next
174
+ end
175
+ end
176
+
177
+ if nan_value?(min_sample)
178
+ min_nan_found = true
179
+ else
180
+ if !min_value or min_sample < min_value
181
+ min_value = min_sample
182
+ end
183
+ end
184
+
185
+ if nan_value?(max_sample)
186
+ max_nan_found = true
187
+ else
188
+ if !max_value or max_sample > max_value
189
+ max_value = max_sample
190
+ end
191
+ end
192
+
193
+ if nan_value?(avg_sample)
194
+ avg_nan_found = true
195
+ else
196
+ # MINUTE data is reducing the decommutated values
197
+ if job_type == :MINUTE
198
+ total_samples += 1 # s0
199
+ avg_value += avg_sample # s1
200
+ s2 += (avg_sample * avg_sample)
201
+ else # :HOUR or :DAY
202
+ # Aggregated Stddev
203
+ # See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
204
+ total_samples += row_to_reduce.num_samples # s0
205
+ avg_value += (avg_sample * row_to_reduce.num_samples) # s1
206
+ s2 += row_to_reduce.num_samples * (avg_sample * avg_sample + stddev_sample * stddev_sample)
207
+ end
208
+ end
209
+ end
210
+ if total_samples != 0
211
+ # Aggregated Stddev
212
+ # See https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point
213
+ avg_value = avg_value.to_f / total_samples
214
+ # Note: For very large numbers with very small deviations this sqrt can fail. If so then just set the stddev to 0.
215
+ begin
216
+ stddev_value = sqrt((s2 / total_samples) - (avg_value * avg_value))
217
+ rescue Exception
218
+ stddev_value = 0.0
219
+ end
220
+ end
221
+ min_value = Float::NAN if min_nan_found and !min_value
222
+ max_value = Float::NAN if max_nan_found and !max_value
223
+ if avg_nan_found and total_samples == 0
224
+ avg_value = Float::NAN
225
+ stddev_value = Float::NAN
226
+ end
227
+ new_row.write_attribute(min_item_name, min_value)
228
+ new_row.write_attribute(max_item_name, max_value)
229
+ new_row.write_attribute(avg_item_name, avg_value)
230
+ new_row.write_attribute(stddev_item_name, stddev_value)
231
+ end
232
+ base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_state => DartCommon::REDUCED)
233
+ new_row.save! # Create the reduced data row in the database
234
+ base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_id => new_row.id)
235
+ new_row.reduced_state = DartCommon::READY_TO_REDUCE
236
+ new_row.save!
237
+ @status.count += 1
238
+
239
+ Cosmos::Logger.debug("Created #{new_row.class}:#{new_row.id} with #{mappings.length} items from #{new_row.num_samples} samples")
240
+ end
241
+
211
242
  # Shutdown the worker thread
212
243
  def shutdown
213
244
  @running = false