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.
- checksums.yaml +4 -4
- data/.gitignore +0 -2
- data/.travis.yml +2 -0
- data/.yardopts +1 -0
- data/Gemfile +1 -0
- data/Manifest.txt +130 -0
- data/autohotkey/tools/ConfigEditorAHK +19 -0
- data/autohotkey/tools/cmd_extractor.ahk +4 -4
- data/autohotkey/tools/cmd_sequence.ahk +9 -5
- data/autohotkey/tools/config_editor.ahk +197 -0
- data/autohotkey/tools/packet_viewer.ahk +12 -6
- data/autohotkey/tools/replay.ahk +29 -29
- data/autohotkey/tools/script_runner.ahk +10 -2
- data/autohotkey/tools/tlm_extractor.ahk +7 -8
- data/autohotkey/tools/tlm_grapher.ahk +21 -9
- data/bin/dart_import +2 -0
- data/cosmos.gemspec +18 -16
- data/data/config/cmd_tlm_server.yaml +9 -0
- data/data/config/interface_modifiers.yaml +17 -0
- data/data/config/item_modifiers.yaml +3 -3
- data/data/crc.txt +184 -90
- data/data/dart.png +0 -0
- data/demo/Gemfile +1 -0
- data/demo/Rakefile +4 -0
- data/demo/config/dart/Gemfile +54 -0
- data/demo/config/data/crc.txt +28 -21
- data/demo/config/system/system.txt +3 -0
- data/demo/config/system/system2.txt +3 -0
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +3 -3
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +1 -1
- data/demo/config/targets/INST/lib/sim_inst.rb +1 -1
- data/demo/config/targets/INST/screens/adcs.txt +2 -1
- data/demo/config/targets/INST/screens/array.txt +1 -1
- data/demo/config/targets/INST/screens/block.txt +1 -1
- data/demo/config/targets/INST/screens/commanding.txt +7 -2
- data/demo/config/targets/INST/screens/graphs.txt +1 -1
- data/demo/config/targets/INST/screens/ground.txt +1 -1
- data/demo/config/targets/INST/screens/hs.txt +2 -1
- data/demo/config/targets/INST/screens/latest.txt +1 -1
- data/demo/config/targets/INST/screens/limits.txt +1 -1
- data/demo/config/targets/INST/screens/other.txt +1 -1
- data/demo/config/targets/INST/screens/tabs.txt +1 -1
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +3 -1
- data/demo/config/tools/launcher/launcher.txt +3 -2
- data/demo/tools/Dart +16 -0
- data/demo/tools/Dart.bat +9 -0
- data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
- data/demo/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
- data/install/Gemfile +1 -0
- data/install/Rakefile +4 -0
- data/install/config/dart/Gemfile +54 -0
- data/install/config/data/crc.txt +6 -3
- data/install/config/system/system.txt +3 -0
- data/install/config/tools/launcher/launcher.txt +3 -2
- data/install/tools/Dart +16 -0
- data/install/tools/Dart.bat +9 -0
- data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
- data/install/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
- data/lib/cosmos/core_ext/time.rb +8 -8
- data/lib/cosmos/dart/.rspec +1 -0
- data/lib/cosmos/dart/Gemfile +69 -0
- data/lib/cosmos/dart/Rakefile +7 -0
- data/lib/cosmos/dart/app/assets/config/manifest.js +4 -0
- data/lib/cosmos/dart/app/assets/images/.keep +0 -0
- data/lib/cosmos/dart/app/assets/javascripts/application.js +13 -0
- data/lib/cosmos/dart/app/assets/javascripts/cable.js +13 -0
- data/lib/cosmos/dart/app/assets/stylesheets/application.css.scss +15 -0
- data/lib/cosmos/dart/app/channels/application_cable/channel.rb +4 -0
- data/lib/cosmos/dart/app/channels/application_cable/connection.rb +4 -0
- data/lib/cosmos/dart/app/controllers/application_controller.rb +3 -0
- data/lib/cosmos/dart/app/helpers/application_helper.rb +2 -0
- data/lib/cosmos/dart/app/jobs/application_job.rb +2 -0
- data/lib/cosmos/dart/app/mailers/application_mailer.rb +4 -0
- data/lib/cosmos/dart/app/models/application_record.rb +3 -0
- data/lib/cosmos/dart/app/models/item.rb +6 -0
- data/lib/cosmos/dart/app/models/item_to_decom_table_mapping.rb +9 -0
- data/lib/cosmos/dart/app/models/packet.rb +4 -0
- data/lib/cosmos/dart/app/models/packet_config.rb +7 -0
- data/lib/cosmos/dart/app/models/packet_log.rb +3 -0
- data/lib/cosmos/dart/app/models/packet_log_entry.rb +41 -0
- data/lib/cosmos/dart/app/models/system_config.rb +2 -0
- data/lib/cosmos/dart/app/models/target.rb +4 -0
- data/lib/cosmos/dart/app/views/layouts/application.html.erb +14 -0
- data/lib/cosmos/dart/app/views/layouts/mailer.html.erb +13 -0
- data/lib/cosmos/dart/app/views/layouts/mailer.text.erb +1 -0
- data/lib/cosmos/dart/bin/bundle +3 -0
- data/lib/cosmos/dart/bin/rails +4 -0
- data/lib/cosmos/dart/bin/rake +4 -0
- data/lib/cosmos/dart/bin/setup +34 -0
- data/lib/cosmos/dart/bin/update +29 -0
- data/lib/cosmos/dart/config.ru +5 -0
- data/lib/cosmos/dart/config/application.rb +29 -0
- data/lib/cosmos/dart/config/boot.rb +3 -0
- data/lib/cosmos/dart/config/cable.yml +9 -0
- data/lib/cosmos/dart/config/database.yml +23 -0
- data/lib/cosmos/dart/config/environment.rb +5 -0
- data/lib/cosmos/dart/config/environments/development.rb +62 -0
- data/lib/cosmos/dart/config/environments/production.rb +84 -0
- data/lib/cosmos/dart/config/environments/test.rb +42 -0
- data/lib/cosmos/dart/config/initializers/application_controller_renderer.rb +6 -0
- data/lib/cosmos/dart/config/initializers/assets.rb +12 -0
- data/lib/cosmos/dart/config/initializers/backtrace_silencers.rb +7 -0
- data/lib/cosmos/dart/config/initializers/cookies_serializer.rb +5 -0
- data/lib/cosmos/dart/config/initializers/filter_parameter_logging.rb +4 -0
- data/lib/cosmos/dart/config/initializers/inflections.rb +16 -0
- data/lib/cosmos/dart/config/initializers/mime_types.rb +4 -0
- data/lib/cosmos/dart/config/initializers/new_framework_defaults.rb +25 -0
- data/lib/cosmos/dart/config/initializers/session_store.rb +3 -0
- data/lib/cosmos/dart/config/initializers/wrap_parameters.rb +14 -0
- data/lib/cosmos/dart/config/locales/en.yml +23 -0
- data/lib/cosmos/dart/config/puma.rb +47 -0
- data/lib/cosmos/dart/config/routes.rb +3 -0
- data/lib/cosmos/dart/config/secrets.yml +22 -0
- data/lib/cosmos/dart/db/migrate/20170406172907_create_targets.rb +8 -0
- data/lib/cosmos/dart/db/migrate/20170406172927_create_packets.rb +10 -0
- data/lib/cosmos/dart/db/migrate/20170406172937_create_packet_logs.rb +9 -0
- data/lib/cosmos/dart/db/migrate/20170406172943_create_packet_log_entries.rb +16 -0
- data/lib/cosmos/dart/db/migrate/20170406183500_change_packet_log_entries_primary_key.rb +5 -0
- data/lib/cosmos/dart/db/migrate/20170407153618_add_unique_requirements.rb +7 -0
- data/lib/cosmos/dart/db/migrate/20170511155447_add_meta_id_to_packet_log_entries.rb +6 -0
- data/lib/cosmos/dart/db/migrate/20170523185056_rename_received_time_and_add_is_tlm_to_packet_log_entries.rb +7 -0
- data/lib/cosmos/dart/db/migrate/20170525201157_create_items.rb +10 -0
- data/lib/cosmos/dart/db/migrate/20170525201315_create_system_configs.rb +9 -0
- data/lib/cosmos/dart/db/migrate/20170525201624_create_packet_configs.rb +11 -0
- data/lib/cosmos/dart/db/migrate/20170525201745_create_item_to_decom_table_mappings.rb +12 -0
- data/lib/cosmos/dart/db/migrate/20170525201939_create_decom_tables.rb +12 -0
- data/lib/cosmos/dart/db/migrate/20170525202051_add_decom_state_to_packet_log_entry.rb +5 -0
- data/lib/cosmos/dart/db/migrate/20170913160409_update_items.rb +6 -0
- data/lib/cosmos/dart/db/migrate/20170913160558_update_item_to_decom_table_mapping.rb +11 -0
- data/lib/cosmos/dart/db/migrate/20170913160916_udpate_decom_table.rb +6 -0
- data/lib/cosmos/dart/db/migrate/20170913212026_add_ready_to_packet_configs.rb +5 -0
- data/lib/cosmos/dart/db/migrate/20170913223556_modify_tables.rb +9 -0
- data/lib/cosmos/dart/db/migrate/20170914215744_modify_mapping_table.rb +6 -0
- data/lib/cosmos/dart/db/migrate/20170919201433_add_system_config_id_to_packet_config.rb +11 -0
- data/lib/cosmos/dart/db/migrate/20170919210307_add_max_table_index_to_packet_configs.rb +5 -0
- data/lib/cosmos/dart/db/migrate/20171215225546_add_ready_to_packet_log_entries.rb +5 -0
- data/lib/cosmos/dart/db/migrate/20180116214338_add_index_for_ple_ready_to_packet_log_entries.rb +5 -0
- data/lib/cosmos/dart/db/schema.rb +103 -0
- data/lib/cosmos/dart/db/seeds.rb +7 -0
- data/lib/cosmos/dart/examples/dart_decom_client.rb +45 -0
- data/lib/cosmos/dart/examples/dart_stream_client.rb +93 -0
- data/lib/cosmos/dart/lib/dart_common.rb +749 -0
- data/lib/cosmos/dart/lib/dart_database_cleaner.rb +172 -0
- data/lib/cosmos/dart/lib/dart_decom_query.rb +184 -0
- data/lib/cosmos/dart/lib/dart_decommutator.rb +235 -0
- data/lib/cosmos/dart/lib/dart_importer.rb +154 -0
- data/lib/cosmos/dart/lib/dart_logging.rb +50 -0
- data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +139 -0
- data/lib/cosmos/dart/lib/dart_reducer_manager.rb +85 -0
- data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +263 -0
- data/lib/cosmos/dart/lib/dart_tcpip_server_interface.rb +142 -0
- data/lib/cosmos/dart/processes/dart.rb +145 -0
- data/lib/cosmos/dart/processes/dart_decom_server.rb +39 -0
- data/lib/cosmos/dart/processes/dart_import.rb +63 -0
- data/lib/cosmos/dart/processes/dart_ingester.rb +92 -0
- data/lib/cosmos/dart/processes/dart_reducer.rb +27 -0
- data/lib/cosmos/dart/processes/dart_stream_server.rb +31 -0
- data/lib/cosmos/dart/processes/dart_worker.rb +37 -0
- data/lib/cosmos/dart/spec/dart/dart_common_spec.rb +333 -0
- data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +455 -0
- data/lib/cosmos/dart/spec/dart/dart_decom_query_spec.rb +153 -0
- data/lib/cosmos/dart/spec/dart/dart_decommutator_spec.rb +336 -0
- data/lib/cosmos/dart/spec/dart/dart_importer_spec.rb +83 -0
- data/lib/cosmos/dart/spec/dart/dart_logging_spec.rb +30 -0
- data/lib/cosmos/dart/spec/dart/dart_packet_log_writer_spec.rb +149 -0
- data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +289 -0
- data/lib/cosmos/dart/spec/dart/dart_tcpip_server_interface_spec.rb +241 -0
- data/lib/cosmos/dart/spec/rails_helper.rb +60 -0
- data/lib/cosmos/dart/spec/spec_helper.rb +139 -0
- data/lib/cosmos/gui/dialogs/about_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/dart_dialog.rb +60 -0
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +1 -0
- data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +0 -3
- data/lib/cosmos/gui/qt.rb +10 -1
- data/lib/cosmos/gui/text/completion.rb +10 -9
- data/lib/cosmos/gui/text/completion_text_edit.rb +16 -14
- data/lib/cosmos/gui/text/ruby_editor.rb +2 -2
- data/lib/cosmos/gui/widgets/dart_frame.rb +142 -0
- data/lib/cosmos/gui/widgets/dart_meta_frame.rb +119 -0
- data/lib/cosmos/gui/widgets/packet_log_frame.rb +42 -12
- data/lib/cosmos/interfaces/interface.rb +1 -2
- data/lib/cosmos/interfaces/protocols/crc_protocol.rb +26 -8
- data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +8 -2
- data/lib/cosmos/interfaces/protocols/protocol.rb +2 -1
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +1 -1
- data/lib/cosmos/interfaces/stream_interface.rb +1 -0
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +2 -3
- data/lib/cosmos/io/json_drb_object.rb +1 -1
- data/lib/cosmos/io/json_rpc.rb +2 -1
- data/lib/cosmos/io/win32_serial_driver.rb +2 -9
- data/lib/cosmos/packet_logs/packet_log_writer.rb +1 -1
- data/lib/cosmos/packets/packet.rb +22 -12
- data/lib/cosmos/packets/packet_config.rb +2 -1
- data/lib/cosmos/packets/packet_item.rb +26 -24
- data/lib/cosmos/packets/parsers/macro_parser.rb +5 -2
- data/lib/cosmos/packets/parsers/packet_item_parser.rb +35 -17
- data/lib/cosmos/packets/parsers/packet_parser.rb +3 -10
- data/lib/cosmos/packets/parsers/xtce_converter.rb +21 -35
- data/lib/cosmos/packets/parsers/xtce_parser.rb +54 -46
- data/lib/cosmos/packets/structure.rb +10 -2
- data/lib/cosmos/packets/structure_item.rb +22 -8
- data/lib/cosmos/processors/statistics_processor.rb +2 -0
- data/lib/cosmos/script/api_shared.rb +13 -12
- data/lib/cosmos/script/cmd_tlm_server.rb +4 -0
- data/lib/cosmos/script/commands.rb +3 -15
- data/lib/cosmos/script/script.rb +69 -23
- data/lib/cosmos/streams/tcpip_client_stream.rb +2 -2
- data/lib/cosmos/system/system.rb +42 -25
- data/lib/cosmos/system/target.rb +6 -2
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +177 -36
- data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +3 -2
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +34 -8
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +80 -25
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +19 -4
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +15 -14
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +15 -9
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +1 -9
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -6
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +1 -3
- data/lib/cosmos/tools/cmd_tlm_server/gui/replay_tab.rb +84 -7
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +0 -1
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +1 -5
- data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +3 -2
- data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +159 -27
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +1 -1
- data/lib/cosmos/tools/config_editor/config_editor.rb +17 -52
- data/lib/cosmos/tools/config_editor/config_editor_frame.rb +0 -5
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +111 -0
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +31 -18
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +12 -3
- data/lib/cosmos/tools/script_runner/script_runner.rb +27 -14
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +104 -37
- data/lib/cosmos/tools/table_manager/table_config.rb +1 -1
- data/lib/cosmos/tools/table_manager/table_item_parser.rb +4 -2
- data/lib/cosmos/tools/table_manager/table_manager.rb +0 -5
- data/lib/cosmos/tools/table_manager/table_manager_core.rb +0 -1
- data/lib/cosmos/tools/test_runner/test.rb +1 -3
- data/lib/cosmos/tools/test_runner/test_runner.rb +26 -15
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +290 -137
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +122 -25
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +67 -0
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +28 -0
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +36 -0
- data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +42 -3
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +88 -14
- data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +2 -5
- data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +2 -6
- data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +74 -18
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +3 -7
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +159 -0
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +49 -2
- data/lib/cosmos/tools/tlm_viewer/screen.rb +3 -0
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +0 -2
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/backgroundbutton_widget.rb +54 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +5 -5
- data/lib/cosmos/top_level.rb +1 -0
- data/lib/cosmos/utilities/crc.rb +3 -0
- data/lib/cosmos/utilities/csv.rb +1 -0
- data/lib/cosmos/utilities/message_log.rb +2 -1
- data/lib/cosmos/utilities/simulated_target.rb +8 -8
- data/lib/cosmos/version.rb +5 -5
- data/lib/cosmos/win32/win32.rb +4 -10
- data/run_gui_tests.bat +2 -1
- data/spec/config/config_parser_spec.rb +4 -4
- data/spec/core_ext/array_spec.rb +1 -1
- data/spec/core_ext/exception_spec.rb +12 -12
- data/spec/core_ext/file_spec.rb +6 -6
- data/spec/core_ext/hash_spec.rb +1 -1
- data/spec/core_ext/socket_spec.rb +2 -2
- data/spec/core_ext/string_spec.rb +13 -13
- data/spec/core_ext/time_spec.rb +0 -2
- data/spec/gui/utilities/script_module_gui_spec.rb +3 -3
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +6 -6
- data/spec/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +4 -0
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +6 -2
- data/spec/interfaces/interface_spec.rb +0 -1
- data/spec/interfaces/linc_interface_spec.rb +0 -5
- data/spec/interfaces/protocols/crc_protocol_spec.rb +201 -85
- data/spec/interfaces/protocols/fixed_protocol_spec.rb +33 -9
- data/spec/interfaces/protocols/length_protocol_spec.rb +1 -1
- data/spec/interfaces/protocols/override_protocol_spec.rb +6 -2
- data/spec/interfaces/protocols/preidentified_protocol_spec.rb +1 -5
- data/spec/interfaces/protocols/template_protocol_spec.rb +0 -1
- data/spec/interfaces/simulated_target_interface_spec.rb +5 -5
- data/spec/interfaces/udp_interface_spec.rb +2 -4
- data/spec/io/buffered_file_spec.rb +8 -12
- data/spec/io/json_drb_spec.rb +9 -9
- data/spec/io/json_rpc_spec.rb +4 -4
- data/spec/io/raw_logger_spec.rb +4 -3
- data/spec/packet_logs/packet_log_reader_spec.rb +3 -6
- data/spec/packet_logs/packet_log_writer_spec.rb +4 -4
- data/spec/packets/binary_accessor_spec.rb +5 -8
- data/spec/packets/commands_spec.rb +2 -2
- data/spec/packets/limits_spec.rb +2 -2
- data/spec/packets/packet_config_spec.rb +12 -0
- data/spec/packets/packet_item_limits_spec.rb +1 -1
- data/spec/packets/packet_item_spec.rb +9 -9
- data/spec/packets/packet_spec.rb +15 -5
- data/spec/packets/parsers/packet_item_parser_spec.rb +27 -0
- data/spec/packets/parsers/xtce_parser_spec.rb +27 -30
- data/spec/packets/structure_spec.rb +2 -1
- data/spec/packets/telemetry_spec.rb +3 -5
- data/spec/processors/statistics_processor_spec.rb +35 -0
- data/spec/script/cmd_tlm_server_spec.rb +4 -21
- data/spec/script/commands_disconnect_spec.rb +46 -58
- data/spec/script/commands_spec.rb +40 -61
- data/spec/script/limits_spec.rb +1 -21
- data/spec/script/script_spec.rb +32 -41
- data/spec/script/scripting_spec.rb +166 -185
- data/spec/script/telemetry_spec.rb +10 -5
- data/spec/script/tools_spec.rb +2 -24
- data/spec/spec_helper.rb +11 -5
- data/spec/system/system_spec.rb +17 -12
- data/spec/tools/cmd_tlm_server/api_spec.rb +21 -10
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -16
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +0 -1
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +16 -27
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +2 -6
- data/spec/tools/cmd_tlm_server/connections_spec.rb +0 -4
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +13 -13
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +5 -9
- data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +11 -3
- data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +0 -4
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +5 -5
- data/spec/tools/cmd_tlm_server/routers_spec.rb +5 -9
- data/spec/tools/table_manager/table_config_spec.rb +0 -1
- data/spec/tools/table_manager/tablemanager_core_spec.rb +23 -23
- data/spec/tools/tlm_viewer/tlm_viewer_config_spec.rb +6 -4
- data/spec/top_level/top_level_spec.rb +9 -9
- data/spec/utilities/csv_spec.rb +2 -12
- data/spec/utilities/logger_spec.rb +6 -6
- data/spec/utilities/message_log_spec.rb +3 -11
- data/tasks/gemfile_stats.rake +2 -2
- metadata +167 -60
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2018 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'dart_common'
|
|
12
|
+
|
|
13
|
+
class DartDatabaseCleaner
|
|
14
|
+
include DartCommon
|
|
15
|
+
|
|
16
|
+
# Clean the DART database of various issues. Note that this code can exit(1)
|
|
17
|
+
# if the DART packet logs were moved and force is false (default). This is
|
|
18
|
+
# deliberate because force causes all the lost (or moved) files to be deleted
|
|
19
|
+
# which forces them to be re-imported at their new location.
|
|
20
|
+
def self.clean(force)
|
|
21
|
+
Cosmos::Logger::info("Starting database cleanup...")
|
|
22
|
+
cleaner = DartDatabaseCleaner.new
|
|
23
|
+
cleaner.clean_system_configs()
|
|
24
|
+
cleaner.clean_packet_logs(force)
|
|
25
|
+
cleaner.clean_packet_configs()
|
|
26
|
+
cleaner.clean_packet_log_entries()
|
|
27
|
+
cleaner.clean_decommutation_tables()
|
|
28
|
+
cleaner.clean_reductions()
|
|
29
|
+
Cosmos::Logger::info("Database cleanup complete!")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Ensure we have all the System Configs locally on the DART machine
|
|
33
|
+
def clean_system_configs
|
|
34
|
+
Cosmos::Logger::info("Cleaning up SystemConfig...")
|
|
35
|
+
system_config = SystemConfig.all.each do |sc|
|
|
36
|
+
begin
|
|
37
|
+
# This attempts to load the system config and if it can't be found
|
|
38
|
+
# it is copied from the server to the local DART machine
|
|
39
|
+
switch_and_get_system_config(sc.name)
|
|
40
|
+
rescue => err
|
|
41
|
+
Cosmos::Logger.error("Could not load system_config: #{sc.name}: #{err.message}")
|
|
42
|
+
next
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
Cosmos::System.load_configuration
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Ensure all packet log files still exist
|
|
49
|
+
def clean_packet_logs(force)
|
|
50
|
+
Cosmos::Logger::info("Cleaning up PacketLog...")
|
|
51
|
+
PacketLog.find_each do |pl|
|
|
52
|
+
unless File.exist?(pl.filename)
|
|
53
|
+
# Try to see if it is in the current DART_DATA folder
|
|
54
|
+
moved_filename = File.join(Cosmos::System.paths['DART_DATA'], File.basename(pl.filename))
|
|
55
|
+
if File.exist?(moved_filename)
|
|
56
|
+
pl.filename = moved_filename
|
|
57
|
+
pl.save!
|
|
58
|
+
else
|
|
59
|
+
if force
|
|
60
|
+
Cosmos::Logger.error("Packet Log File Missing: #{pl.filename}")
|
|
61
|
+
pl.destroy # This also destroys linked PacketLogEntry(s)
|
|
62
|
+
else
|
|
63
|
+
Cosmos::Logger.fatal("Packet Log File Missing (Cleanup with --force-cleanup): #{pl.filename}")
|
|
64
|
+
exit(1)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Check for bad packet configs and cleanup. This typically doesn't happen because
|
|
72
|
+
# PacketConfig entries are created quickly but if something happens during the setup
|
|
73
|
+
# we attempt to fix it here.
|
|
74
|
+
def clean_packet_configs
|
|
75
|
+
Cosmos::Logger::info("Cleaning up PacketConfig...")
|
|
76
|
+
packet_configs = PacketConfig.where("ready != true")
|
|
77
|
+
return unless packet_configs.length > 0
|
|
78
|
+
Cosmos::Logger::info("Num PacketConfigs requiring cleanup: #{packet_configs.length}")
|
|
79
|
+
packet_configs.each do |packet_config|
|
|
80
|
+
begin
|
|
81
|
+
system_config = SystemConfig.find(packet_config.first_system_config_id)
|
|
82
|
+
packet_model = Packet.find(packet_config.packet_id)
|
|
83
|
+
target_model = Target.find(packet_model.target_id)
|
|
84
|
+
current_config, error = Cosmos::System.load_configuration(system_config.name)
|
|
85
|
+
if current_config == system_config.name
|
|
86
|
+
if packet_model.is_tlm
|
|
87
|
+
packet = Cosmos::System.telemetry.packet(target_model.name, packet_model.name)
|
|
88
|
+
else
|
|
89
|
+
packet = Cosmos::System.commands.packet(target_model.name, packet_model.name)
|
|
90
|
+
end
|
|
91
|
+
setup_packet_config(packet, packet_model.id, packet_config)
|
|
92
|
+
Cosmos::Logger::info("Successfully cleaned up packet_config: #{packet_config.id}")
|
|
93
|
+
else
|
|
94
|
+
Cosmos::Logger::error("Could not switch to system config: #{system_config.name}: #{error}")
|
|
95
|
+
end
|
|
96
|
+
rescue => err
|
|
97
|
+
Cosmos::Logger::error("Error cleaning up packet config: #{packet_config.id}: #{err.formatted}")
|
|
98
|
+
raise "Cleanup failure - Database requires manual correction"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Remove not ready packet log entries as well as partially decommutated data.
|
|
104
|
+
def clean_packet_log_entries
|
|
105
|
+
Cosmos::Logger::info("Cleaning up PacketLogEntry...")
|
|
106
|
+
# Remove not ready packet log entries. Packet log entries remain not ready until the
|
|
107
|
+
# log file containing the packet has been flushed to disk. Thus there are always
|
|
108
|
+
# outstanding entries which are not ready while packets are being received.
|
|
109
|
+
# Note the normal shutdown process attempts to flush the log file and mark
|
|
110
|
+
# all outstanding entries as ready so this would only happen during a crash.
|
|
111
|
+
ples = PacketLogEntry.where("ready != true")
|
|
112
|
+
return unless ples.length > 0
|
|
113
|
+
Cosmos::Logger::info("Removing unready packet log entries: #{ples.length}")
|
|
114
|
+
ples.destroy_all
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def clean_decommutation_tables
|
|
118
|
+
Cosmos::Logger::info("Cleaning up Decommutation tables (tX_Y)...")
|
|
119
|
+
# Check for partially decom data and remove. The DartWorker periodically checks the
|
|
120
|
+
# database for a PacketLogEntry which is ready to be decommutated and starts the
|
|
121
|
+
# process of writing into the decommutation table. If this process is interrupted
|
|
122
|
+
# the state could be IN_PROGRESS instead of COMPLETE. Thus delete all the decommutation
|
|
123
|
+
# table rows which were created and allow this process to start from scratch.
|
|
124
|
+
ples = PacketLogEntry.where("decom_state = #{PacketLogEntry::IN_PROGRESS}")
|
|
125
|
+
return unless ples.length > 0
|
|
126
|
+
Cosmos::Logger::info("Num PacketLogEntries requiring cleanup: #{ples.length}")
|
|
127
|
+
ples.each do |ple|
|
|
128
|
+
begin
|
|
129
|
+
packet = read_packet_from_ple(ple)
|
|
130
|
+
packet_config = PacketConfig.where("packet_id = ? and name = ?", ple.packet_id, packet.config_name).first
|
|
131
|
+
# Need to delete any rows for these ples in the table for this packet_config
|
|
132
|
+
packet_config.max_table_index.times do |table_index|
|
|
133
|
+
model = get_decom_table_model(packet_config.id, table_index)
|
|
134
|
+
model.where("ple_id = ?", ple.id).destroy_all
|
|
135
|
+
end
|
|
136
|
+
ple.decom_state = PacketLogEntry::NOT_STARTED
|
|
137
|
+
ple.save!
|
|
138
|
+
rescue => err
|
|
139
|
+
Cosmos::Logger::error("Error cleaning up packet log entry: #{ple.id}: #{err.formatted}")
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def clean_reductions
|
|
145
|
+
Cosmos::Logger::info("Cleaning up Reductions...")
|
|
146
|
+
# TBR: This cleanup may be too slow to be worth it for a large data set...
|
|
147
|
+
each_decom_and_reduced_table() do |packet_config_id, table_index, decom_model, minute_model, hour_model, day_model|
|
|
148
|
+
decom_model.where("reduced_state = #{REDUCED} and reduced_id IS NULL").update_all(:reduced_state => READY_TO_REDUCE)
|
|
149
|
+
minute_model.where("reduced_state = #{REDUCED} and reduced_id IS NULL").update_all(:reduced_state => READY_TO_REDUCE)
|
|
150
|
+
hour_model.where("reduced_state = #{REDUCED} and reduced_id IS NULL").update_all(:reduced_state => READY_TO_REDUCE)
|
|
151
|
+
# Note: These should be destroyed when cleaning up decom tables
|
|
152
|
+
rows = decom_model.where("reduced_state = #{INITIALIZING}")
|
|
153
|
+
rows.destroy_all
|
|
154
|
+
# This cleanup is only here
|
|
155
|
+
rows = minute_model.where("reduced_state = #{INITIALIZING}")
|
|
156
|
+
rows.each do |row|
|
|
157
|
+
decom_model.where("reduced_id = ?", row.id).update_all(:reduced_state => READY_TO_REDUCE, :reduced_id => nil)
|
|
158
|
+
end
|
|
159
|
+
rows.destroy_all
|
|
160
|
+
rows = hour_model.where("reduced_state = #{INITIALIZING}")
|
|
161
|
+
rows.each do |row|
|
|
162
|
+
minute_model.where("reduced_id = ?", row.id).update_all(:reduced_state => READY_TO_REDUCE, :reduced_id => nil)
|
|
163
|
+
end
|
|
164
|
+
rows.destroy_all
|
|
165
|
+
rows = day_model.where("reduced_state = #{INITIALIZING}")
|
|
166
|
+
rows.each do |row|
|
|
167
|
+
hour_model.where("reduced_id = ?", row.id).update_all(:reduced_state => READY_TO_REDUCE, :reduced_id => nil)
|
|
168
|
+
end
|
|
169
|
+
rows.destroy_all
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2018 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'dart_common'
|
|
12
|
+
require 'dart_logging'
|
|
13
|
+
|
|
14
|
+
# Rails Json screws up COSMOS handling of Nan, etc.
|
|
15
|
+
require "active_support/core_ext/object/json"
|
|
16
|
+
module ActiveSupport
|
|
17
|
+
module ToJsonWithActiveSupportEncoder # :nodoc:
|
|
18
|
+
def to_json(options = nil)
|
|
19
|
+
super(options)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# JsonDRb server which responds to queries for decommutated and reduced data
|
|
25
|
+
# from the database.
|
|
26
|
+
class DartDecomQuery
|
|
27
|
+
include DartCommon
|
|
28
|
+
|
|
29
|
+
# Returns data from the decommutated database tables including the reduced data tables.
|
|
30
|
+
#
|
|
31
|
+
# @param request [Hash] Request for data.
|
|
32
|
+
# The hash must contain the following items:
|
|
33
|
+
# start_time_sec => Start time in UTC seconds
|
|
34
|
+
# start_time_usec => Microseconds to add to start time
|
|
35
|
+
# end_time_sec => End time in UTC seconds
|
|
36
|
+
# end_time_usec => Microseconds to add to end time
|
|
37
|
+
# item => [target name, packet name, item name] Names are all strings
|
|
38
|
+
# reduction => "NONE", "MINUTE", "HOUR", "DAY" for how to reduce the data
|
|
39
|
+
# value_type => "RAW", "RAW_MAX", "RAW_MIN", "RAW_AVG",
|
|
40
|
+
# "CONVERTED", "CONVERTED_MAX", "CONVERTED_MIN", "CONVERTED_AVG"
|
|
41
|
+
#
|
|
42
|
+
# The request can also contain the following optional items:
|
|
43
|
+
# meta_ids => Optional IDs related to the meta data you want to filter by. This requires
|
|
44
|
+
# making a separate request for the particular meta data in question and recording
|
|
45
|
+
# the returned meta_ids for use in a subsequent request.
|
|
46
|
+
# limit => Maximum number of data items to return, must be less than 10000
|
|
47
|
+
# offset => Offset into the data stream. Since the maximum number of values allowed
|
|
48
|
+
# is 10000, you can set the offset to 10000, then 20000, etc to get additional values.
|
|
49
|
+
# By default the offset is 0.
|
|
50
|
+
# cmd_tlm => Whether the item is a command or telemetry. Default is telemetry.
|
|
51
|
+
# @return [Array<Array<String, Integer, Integer, Integer, Integer>>] Array of arrays containing
|
|
52
|
+
# the item name, item seconds, item microseconds, samples (always 1 for NONE reduction, varies
|
|
53
|
+
# for other reduction values), and meta_id.
|
|
54
|
+
def query(request)
|
|
55
|
+
request_start_time = Time.now
|
|
56
|
+
Cosmos::Logger.info("#{request_start_time.formatted}: QUERY: #{request}")
|
|
57
|
+
|
|
58
|
+
begin
|
|
59
|
+
start_time_sec = request['start_time_sec']
|
|
60
|
+
start_time_usec = request['start_time_usec']
|
|
61
|
+
end_time_sec = request['end_time_sec']
|
|
62
|
+
end_time_usec = request['end_time_usec']
|
|
63
|
+
|
|
64
|
+
start_time = nil
|
|
65
|
+
end_time = nil
|
|
66
|
+
begin
|
|
67
|
+
start_time = Time.at(start_time_sec, start_time_usec) if start_time_sec and start_time_usec
|
|
68
|
+
rescue
|
|
69
|
+
raise "Invalid start time: #{start_time_sec}, #{start_time_usec}"
|
|
70
|
+
end
|
|
71
|
+
begin
|
|
72
|
+
end_time = Time.at(end_time_sec, end_time_usec) if end_time_sec and end_time_usec
|
|
73
|
+
rescue
|
|
74
|
+
raise "Invalid end time: #{end_time_sec}, #{end_time_usec}"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
item = request['item']
|
|
78
|
+
raise "Item \"#{item}\" invalid" if !item || item.length != 3
|
|
79
|
+
|
|
80
|
+
reduction = request['reduction'].to_s.upcase
|
|
81
|
+
case reduction
|
|
82
|
+
when "", "NONE"
|
|
83
|
+
reduction = :NONE
|
|
84
|
+
reduction_modifier = ""
|
|
85
|
+
when "MINUTE"
|
|
86
|
+
reduction = :MINUTE
|
|
87
|
+
reduction_modifier = "_m"
|
|
88
|
+
when "HOUR"
|
|
89
|
+
reduction = :HOUR
|
|
90
|
+
reduction_modifier = "_h"
|
|
91
|
+
when "DAY"
|
|
92
|
+
reduction = :DAY
|
|
93
|
+
reduction_modifier = "_d"
|
|
94
|
+
else
|
|
95
|
+
raise "Unknown reduction: #{reduction}"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
requested_value_type = request['value_type'].to_s.upcase
|
|
99
|
+
case requested_value_type
|
|
100
|
+
when 'RAW'
|
|
101
|
+
value_type = ItemToDecomTableMapping::CONVERTED
|
|
102
|
+
item_name_modifier = ""
|
|
103
|
+
raise "RAW value_type is only valid with NONE reduction" if reduction != :NONE
|
|
104
|
+
when 'RAW_MAX', 'RAW_MIN', 'RAW_AVG', 'RAW_STDDEV'
|
|
105
|
+
value_type = ItemToDecomTableMapping::CONVERTED
|
|
106
|
+
item_name_modifier = requested_value_type.split('_')[1].downcase
|
|
107
|
+
raise "#{requested_value_type} value_type is not valid with NONE reduction" if reduction == :NONE
|
|
108
|
+
when 'CONVERTED'
|
|
109
|
+
value_type = ItemToDecomTableMapping::RAW
|
|
110
|
+
item_name_modifier = ""
|
|
111
|
+
raise "CONVERTED value_type is only valid with NONE reduction" if reduction != :NONE
|
|
112
|
+
when 'CONVERTED_MAX', 'CONVERTED_MIN', 'CONVERTED_AVG', 'CONVERTED_STDDEV'
|
|
113
|
+
value_type = ItemToDecomTableMapping::RAW
|
|
114
|
+
item_name_modifier = requested_value_type.split('_')[1].downcase
|
|
115
|
+
raise "#{requested_value_type} value_type is not valid with NONE reduction" if reduction == :NONE
|
|
116
|
+
else
|
|
117
|
+
raise "Unknown value_type: #{requested_value_type}"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
cmd_tlm = request['cmd_tlm']
|
|
121
|
+
if cmd_tlm
|
|
122
|
+
if cmd_tlm.to_s.upcase == 'CMD'
|
|
123
|
+
is_tlm = false
|
|
124
|
+
elsif cmd_tlm.to_s.upcase == 'TLM'
|
|
125
|
+
is_tlm = true
|
|
126
|
+
else
|
|
127
|
+
raise "Unknown cmd_tlm: #{cmd_tlm}"
|
|
128
|
+
end
|
|
129
|
+
else
|
|
130
|
+
is_tlm = true
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
meta_ids = request['meta_ids']
|
|
134
|
+
meta_ids ||= []
|
|
135
|
+
|
|
136
|
+
unless meta_ids.length > 0
|
|
137
|
+
meta_filters = request['meta_filters']
|
|
138
|
+
meta_filters ||= []
|
|
139
|
+
|
|
140
|
+
if meta_filters.length > 0
|
|
141
|
+
meta_ids = process_meta_filters(meta_filters, is_tlm, end_time)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
limit = request['limit'].to_i
|
|
146
|
+
limit = 10000 if limit <= 0 or limit > 10000
|
|
147
|
+
|
|
148
|
+
offset = request['offset'].to_i
|
|
149
|
+
offset = 0 if offset < 0
|
|
150
|
+
|
|
151
|
+
return query_decom_reduced(
|
|
152
|
+
item[0], item[1], item[2],
|
|
153
|
+
value_type, is_tlm,
|
|
154
|
+
start_time, end_time,
|
|
155
|
+
reduction, reduction_modifier,
|
|
156
|
+
item_name_modifier, limit, offset, meta_ids)
|
|
157
|
+
|
|
158
|
+
rescue Exception => error
|
|
159
|
+
msg = "Query Error: #{error.message}"
|
|
160
|
+
raise $!, msg, $!.backtrace
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Gets the list of item names for a given packet
|
|
165
|
+
#
|
|
166
|
+
# @param target_name Target name
|
|
167
|
+
# @param packet_name Packet name
|
|
168
|
+
# @param is_tlm true or false
|
|
169
|
+
# @return [Array<String>] Array of item names
|
|
170
|
+
def item_names(target_name, packet_name, is_tlm = true)
|
|
171
|
+
target = Target.where("name = ?", target_name).first
|
|
172
|
+
raise "Target #{target_name} not found" unless target
|
|
173
|
+
|
|
174
|
+
packet = Packet.where("target_id = ? and name = ? and is_tlm = ?", target.id, packet_name, is_tlm).first
|
|
175
|
+
raise "Packet #{target_name} #{packet_name} not found" unless packet
|
|
176
|
+
|
|
177
|
+
items = Item.where("packet_id = ?", packet.id).select("name")
|
|
178
|
+
item_names = []
|
|
179
|
+
items.each { |item| item_names << item.name }
|
|
180
|
+
|
|
181
|
+
return item_names
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
end
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2018 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'dart_common'
|
|
12
|
+
require 'dart_logging'
|
|
13
|
+
require 'packet_log_entry'
|
|
14
|
+
|
|
15
|
+
class DartDecommutator
|
|
16
|
+
include DartCommon
|
|
17
|
+
|
|
18
|
+
# Wait 60s before giving up on the PacketConfig becoming ready
|
|
19
|
+
PACKET_CONFIG_READY_TIMEOUT = 60
|
|
20
|
+
|
|
21
|
+
def initialize(worker_id = 0, num_workers = 1)
|
|
22
|
+
sync_targets_and_packets()
|
|
23
|
+
@worker_id = worker_id
|
|
24
|
+
@num_workers = num_workers
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Run forever looking for data to decommutate
|
|
28
|
+
def run
|
|
29
|
+
while true
|
|
30
|
+
time_start = Time.now # Remember start time so we can throttle
|
|
31
|
+
# Get all entries that are ready and decommutation hasn't started
|
|
32
|
+
PacketLogEntry.where("decom_state = #{PacketLogEntry::NOT_STARTED} and ready = true").
|
|
33
|
+
# Mod the ID to allow distribution of effort, in_batches processes 1000 at a time
|
|
34
|
+
where("id % #{@num_workers} = #{@worker_id}").in_batches do |group|
|
|
35
|
+
group.each do |ple|
|
|
36
|
+
begin
|
|
37
|
+
# TODO - Optimize and cache meta and system config and packet config lookup
|
|
38
|
+
meta_ple = get_meta_ple(ple)
|
|
39
|
+
next unless meta_ple
|
|
40
|
+
system_meta = get_system_meta(ple, meta_ple)
|
|
41
|
+
next unless system_meta
|
|
42
|
+
system_config = get_system_config(ple, system_meta)
|
|
43
|
+
next unless system_config
|
|
44
|
+
packet = get_packet(ple)
|
|
45
|
+
next unless packet
|
|
46
|
+
packet_config = get_packet_config(ple, packet, system_config)
|
|
47
|
+
next unless packet_config
|
|
48
|
+
# If we timeout this code will simply exit the application
|
|
49
|
+
wait_for_ready_packet_config(packet_config)
|
|
50
|
+
decom_packet(ple, packet, packet_config)
|
|
51
|
+
rescue => err
|
|
52
|
+
Cosmos::Logger.error("PLE:#{ple.id}:ERROR")
|
|
53
|
+
Cosmos::Logger.error(err.formatted)
|
|
54
|
+
end
|
|
55
|
+
end # each ple
|
|
56
|
+
end # batches
|
|
57
|
+
# Throttle to no faster than 1 Hz
|
|
58
|
+
delta = Time.now - time_start
|
|
59
|
+
sleep(1 - delta) if delta < 1 && delta > 0
|
|
60
|
+
end
|
|
61
|
+
rescue Interrupt
|
|
62
|
+
Cosmos::Logger.info("Dart Worker Closing From Signal...")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
protected
|
|
66
|
+
|
|
67
|
+
def get_meta_ple(ple)
|
|
68
|
+
if ple.meta_id != ple.id
|
|
69
|
+
PacketLogEntry.find(ple.meta_id)
|
|
70
|
+
else
|
|
71
|
+
ple
|
|
72
|
+
end
|
|
73
|
+
rescue => err
|
|
74
|
+
ple.decom_state = PacketLogEntry::NO_META_PLE
|
|
75
|
+
ple.save!
|
|
76
|
+
Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
77
|
+
nil
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def get_system_meta(ple, meta_ple)
|
|
81
|
+
system_meta = read_packet_from_ple(meta_ple)
|
|
82
|
+
return system_meta if system_meta
|
|
83
|
+
|
|
84
|
+
ple.decom_state = PacketLogEntry::NO_META_PACKET
|
|
85
|
+
ple.save!
|
|
86
|
+
Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
87
|
+
nil
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def get_system_config(ple, system_meta)
|
|
91
|
+
system_config_name = system_meta.read("CONFIG")
|
|
92
|
+
system_config = SystemConfig.where("name = ?", system_config_name).first
|
|
93
|
+
unless system_config
|
|
94
|
+
begin
|
|
95
|
+
# Try to create a new SystemConfig since it didn't exist
|
|
96
|
+
system_config = SystemConfig.create(:name => system_config_name)
|
|
97
|
+
rescue
|
|
98
|
+
# Another thread probably already created it - Try to get it one more time
|
|
99
|
+
system_config = SystemConfig.where("name = ?", system_config_name).first
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
unless system_config
|
|
103
|
+
ple.decom_state = PacketLogEntry::NO_SYSTEM_CONFIG
|
|
104
|
+
ple.save!
|
|
105
|
+
Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
106
|
+
return nil
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Switch to this system_config
|
|
110
|
+
begin
|
|
111
|
+
switch_and_get_system_config(system_config_name)
|
|
112
|
+
rescue
|
|
113
|
+
Cosmos::Logger.error("Could not load system_config: #{system_config_name}")
|
|
114
|
+
ple.decom_state = PacketLogEntry::NO_CONFIG
|
|
115
|
+
ple.save!
|
|
116
|
+
Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
117
|
+
return nil
|
|
118
|
+
end
|
|
119
|
+
system_config
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def get_packet(ple)
|
|
123
|
+
packet = read_packet_from_ple(ple)
|
|
124
|
+
return packet if packet
|
|
125
|
+
|
|
126
|
+
ple.decom_state = PacketLogEntry::NO_PACKET
|
|
127
|
+
ple.save!
|
|
128
|
+
Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
129
|
+
nil
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def get_packet_config(ple, packet, system_config)
|
|
133
|
+
packet_id = ple.packet_id
|
|
134
|
+
packet_config = PacketConfig.where("packet_id = ? and name = ?", packet_id, packet.config_name).first
|
|
135
|
+
return packet_config if packet_config
|
|
136
|
+
|
|
137
|
+
# The PacketConfig didnt't exist so create one
|
|
138
|
+
begin
|
|
139
|
+
Cosmos::Logger.info("Creating PacketConfig: #{packet.config_name}...")
|
|
140
|
+
packet_config = PacketConfig.create(:packet_id => packet_id, :name => packet.config_name, :first_system_config_id => system_config.id)
|
|
141
|
+
setup_packet_config(packet, packet_id, packet_config)
|
|
142
|
+
Cosmos::Logger.info("Successfully Created PacketConfig: #{packet.config_name}")
|
|
143
|
+
rescue => err
|
|
144
|
+
Cosmos::Logger.error(err.formatted)
|
|
145
|
+
# Another thread probably already created it - Try to get it one more time
|
|
146
|
+
packet_config = PacketConfig.where("packet_id = ? and name = ?", packet_id, packet.config_name).first
|
|
147
|
+
end
|
|
148
|
+
unless packet_config
|
|
149
|
+
ple.decom_state = PacketLogEntry::NO_PACKET_CONFIG
|
|
150
|
+
ple.save!
|
|
151
|
+
Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
152
|
+
return nil
|
|
153
|
+
end
|
|
154
|
+
packet_config
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def wait_for_ready_packet_config(packet_config)
|
|
158
|
+
first = true
|
|
159
|
+
while !packet_config.ready
|
|
160
|
+
if first
|
|
161
|
+
ready_wait_start = Time.now
|
|
162
|
+
Cosmos::Logger.info("Waiting for PacketConfig:#{packet_config.id}...")
|
|
163
|
+
first = false
|
|
164
|
+
end
|
|
165
|
+
sleep(1)
|
|
166
|
+
# Reload the attributes from the database
|
|
167
|
+
packet_config.reload
|
|
168
|
+
|
|
169
|
+
if (Time.now - ready_wait_start) > PACKET_CONFIG_READY_TIMEOUT
|
|
170
|
+
Cosmos::Logger.fatal("Timeout waiting for ready on PacketConfig:#{packet_config.id}")
|
|
171
|
+
exit(1)
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def get_values(packet)
|
|
177
|
+
values = []
|
|
178
|
+
packet.sorted_items.each do |item|
|
|
179
|
+
next unless decommutate_item?(item)
|
|
180
|
+
if separate_raw_con?(item)
|
|
181
|
+
values << packet.read_item(item, :RAW)
|
|
182
|
+
values << packet.read_item(item, :CONVERTED)
|
|
183
|
+
else
|
|
184
|
+
values << packet.read_item(item, :RAW)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
values
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def decom_packet(ple, packet, packet_config)
|
|
191
|
+
# Update packet config times
|
|
192
|
+
if !packet_config.start_time or (packet.received_time < packet_config.start_time)
|
|
193
|
+
packet_config.start_time = packet.received_time
|
|
194
|
+
packet_config.save!
|
|
195
|
+
end
|
|
196
|
+
if !packet_config.end_time or (packet.received_time > packet_config.end_time)
|
|
197
|
+
packet_config.end_time = packet.received_time
|
|
198
|
+
packet_config.save!
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Mark the log entry IN_PROGRESS as we decommutate the data
|
|
202
|
+
ple.decom_state = PacketLogEntry::IN_PROGRESS
|
|
203
|
+
ple.save!
|
|
204
|
+
values = get_values(packet)
|
|
205
|
+
|
|
206
|
+
table_index = 0
|
|
207
|
+
rows = []
|
|
208
|
+
# Create rows in the decommutation table model
|
|
209
|
+
values.each_slice(MAX_COLUMNS_PER_TABLE) do |table_values|
|
|
210
|
+
model = get_decom_table_model(packet_config.id, table_index)
|
|
211
|
+
row = model.new
|
|
212
|
+
row.time = ple.time
|
|
213
|
+
row.ple_id = ple.id
|
|
214
|
+
row.meta_id = ple.meta_id
|
|
215
|
+
row.reduced_state = INITIALIZING
|
|
216
|
+
table_values.each_with_index do |value, index|
|
|
217
|
+
item_index = (table_index * MAX_COLUMNS_PER_TABLE) + index
|
|
218
|
+
row.write_attribute("i#{item_index}", value)
|
|
219
|
+
end
|
|
220
|
+
row.save!
|
|
221
|
+
rows << row
|
|
222
|
+
table_index += 1
|
|
223
|
+
end
|
|
224
|
+
# Mark ready to reduce
|
|
225
|
+
rows.each do |row|
|
|
226
|
+
row.reduced_state = READY_TO_REDUCE
|
|
227
|
+
row.save!
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# The log entry has been decommutated, mark COMPLETE
|
|
231
|
+
ple.decom_state = PacketLogEntry::COMPLETE
|
|
232
|
+
ple.save!
|
|
233
|
+
Cosmos::Logger.debug("PLE:#{ple.id}:#{ple.decom_state_string}")
|
|
234
|
+
end
|
|
235
|
+
end
|