cosmos 3.9.2 → 4.0.0
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/.rubocop.yml +23 -0
- data/.travis.yml +1 -0
- data/.yardopts +3 -0
- data/Gemfile +1 -1
- data/Manifest.txt +137 -52
- data/Rakefile +50 -44
- data/autohotkey/config/system/system.txt +0 -5
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +6 -1
- data/autohotkey/config/targets/INST/screens/extra.txt +19 -0
- data/autohotkey/config/targets/INST/sequences/run_sequence.txt +1 -0
- data/autohotkey/config/targets/META/screens/data.txt +12 -0
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
- data/autohotkey/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
- data/autohotkey/config/targets/SYSTEM/screens/limits_change.txt +14 -0
- data/autohotkey/config/targets/SYSTEM/screens/meta.txt +14 -0
- data/autohotkey/config/targets/SYSTEM/target.txt +12 -0
- data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
- data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
- data/autohotkey/tools/CmdSequence +14 -0
- data/autohotkey/tools/CmdSequenceAHK +23 -0
- data/autohotkey/tools/CmdSequenceAHK2 +16 -0
- data/autohotkey/tools/cmd_extractor.ahk +2 -2
- data/autohotkey/tools/cmd_sender.ahk +4 -6
- data/autohotkey/tools/cmd_sequence.ahk +215 -0
- data/autohotkey/tools/cmd_sequence2.ahk +23 -0
- data/autohotkey/tools/data_viewer.ahk +2 -3
- data/autohotkey/tools/limits_monitor.ahk +9 -11
- data/autohotkey/tools/open_gl_builder.ahk +1 -2
- data/autohotkey/tools/packet_viewer.ahk +51 -35
- data/autohotkey/tools/replay.ahk +1 -2
- data/autohotkey/tools/script_runner.ahk +1 -2
- data/autohotkey/tools/script_runner2.ahk +1 -2
- data/autohotkey/tools/test_runner2.ahk +1 -5
- data/autohotkey/tools/test_runner3.ahk +1 -3
- data/autohotkey/tools/tlm_grapher.ahk +1 -3
- data/autohotkey/tools/tlm_grapher3.ahk +1 -2
- data/autohotkey/tools/tlm_viewer.ahk +8 -3
- data/autohotkey/tools/tlm_viewer2.ahk +2 -3
- data/autohotkey/tools/tlm_viewer5.ahk +1 -2
- data/cosmos.gemspec +26 -20
- data/data/cmd_sequence.png +0 -0
- data/data/config/_array_params.yaml +23 -0
- data/data/config/_id_items.yaml +24 -0
- data/data/config/_id_params.yaml +58 -0
- data/data/config/_interfaces.yaml +206 -0
- data/data/config/_items.yaml +20 -0
- data/data/config/_params.yaml +58 -0
- data/data/config/cmd_tlm_server.yaml +110 -0
- data/data/config/command.yaml +38 -0
- data/data/config/command_modifiers.yaml +127 -0
- data/data/config/command_telemetry.yaml +3 -0
- data/data/config/data_viewer.yaml +43 -0
- data/data/config/handbook_creator.yaml +23 -0
- data/data/config/housekeeping_params.yaml +71 -0
- data/data/config/interface_modifiers.yaml +44 -0
- data/data/config/item_modifiers.yaml +172 -0
- data/data/config/launcher.yaml +117 -0
- data/data/config/limits_monitor.yaml +53 -0
- data/data/config/linegraph_params.yaml +30 -0
- data/data/config/linegraph_plot.yaml +106 -0
- data/data/config/page_modifiers.yaml +128 -0
- data/data/config/param_item_modifiers.yaml +41 -0
- data/data/config/parameter_modifiers.yaml +144 -0
- data/data/config/protocols.yaml +257 -0
- data/data/config/screen.yaml +151 -0
- data/data/config/script_runner.yaml +15 -0
- data/data/config/system.yaml +153 -0
- data/data/config/table_manager.yaml +76 -0
- data/data/config/table_parameter_modifiers.yaml +9 -0
- data/data/config/target.yaml +71 -0
- data/data/config/telemetry.yaml +73 -0
- data/data/config/telemetry_modifiers.yaml +129 -0
- data/data/config/test_runner.yaml +118 -0
- data/data/config/tlm_extractor.yaml +109 -0
- data/data/config/tlm_grapher.yaml +78 -0
- data/data/config/tlm_viewer.yaml +107 -0
- data/data/config/unknown.yaml +3 -0
- data/data/config/widgets.yaml +1339 -0
- data/data/config/xy_params.yaml +50 -0
- data/data/config/xy_plot.yaml +12 -0
- data/data/config_editor.png +0 -0
- data/data/crc.txt +172 -161
- data/data/delete.png +0 -0
- data/demo/config/data/crc.txt +56 -36
- data/demo/config/data/meta_init.txt +1 -4
- data/demo/config/system/system.txt +15 -3
- data/demo/config/system/system2.txt +13 -3
- data/demo/config/targets/EXAMPLE/lib/example_interface.rb +2 -6
- data/demo/config/targets/EXAMPLE/target.txt +3 -1
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -0
- data/demo/config/targets/INST/lib/inst_dump_component.rb +34 -0
- data/demo/config/targets/INST/screens/adcs.txt +39 -15
- data/demo/config/targets/INST/screens/commanding.txt +26 -19
- data/demo/config/targets/INST/screens/spacing_box.txt +44 -0
- data/demo/config/targets/INST/screens/spacing_grid.txt +78 -0
- data/demo/config/targets/INST/screens/tabs.txt +0 -2
- data/demo/config/targets/INST/sequences/sequence.tsv +3 -0
- data/demo/config/targets/INST/tables/EventAction.csv +9 -0
- data/demo/config/targets/INST/tables/EventAction.dat +0 -0
- data/demo/config/targets/INST/tables/McConfigTable.csv +20 -0
- data/demo/config/targets/INST/tables/McConfigTable.dat +0 -0
- data/demo/config/targets/INST/target.txt +4 -0
- data/demo/config/targets/INST/tools/data_viewer/data_viewer.txt +2 -0
- data/demo/config/targets/INST/tools/data_viewer/data_viewer2.txt +2 -0
- data/demo/config/targets/INST/tools/table_manager/EventAction_def.txt +6 -0
- data/demo/config/targets/INST/tools/table_manager/McConfigTable_def.txt +38 -0
- data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -3
- data/demo/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
- data/demo/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
- data/demo/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
- data/demo/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
- data/demo/config/targets/SYSTEM/lib/limits_groups.rb +39 -0
- data/demo/config/targets/SYSTEM/screens/status.txt +1 -1
- data/demo/config/targets/SYSTEM/target.txt +12 -0
- data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +1 -1
- data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +8 -5
- data/demo/config/targets/TEMPLATED/target.txt +2 -0
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +15 -6
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +13 -5
- data/demo/config/tools/data_viewer/data_viewer.txt +9 -0
- data/demo/config/tools/launcher/launcher.txt +9 -6
- data/demo/config/tools/launcher/launcher2.txt +16 -13
- data/demo/config/tools/launcher/launcher_mini.txt +45 -0
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +12 -11
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +12 -11
- data/demo/config/tools/test_runner/test_runner.txt +1 -1
- data/demo/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
- data/demo/lib/example_background_task.rb +9 -5
- data/demo/lib/example_target.rb +5 -15
- data/demo/lib/scpi_target.rb +4 -10
- data/demo/procedures/cosmos_api_test.rb +17 -0
- data/demo/tools/CmdSequence +16 -0
- data/demo/tools/CmdSequence.bat +9 -0
- data/demo/tools/ConfigEditor +16 -0
- data/demo/tools/ConfigEditor.bat +9 -0
- data/demo/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
- data/demo/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
- data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
- data/demo/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
- data/demo/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
- data/ext/cosmos/ext/packet/packet.c +5 -5
- data/install/config/data/crc.txt +12 -8
- data/install/config/system/system.txt +13 -3
- data/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +14 -0
- data/install/config/targets/SYSTEM/target.txt +12 -0
- data/install/tools/CmdSequence +16 -0
- data/install/tools/CmdSequence.bat +9 -0
- data/install/tools/ConfigEditor +16 -0
- data/install/tools/ConfigEditor.bat +9 -0
- data/install/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
- data/install/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
- data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
- data/install/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
- data/install/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
- data/lib/cosmos.rb +1 -1
- data/lib/cosmos/config/config_parser.rb +147 -59
- data/lib/cosmos/config/meta_config_parser.rb +57 -0
- data/lib/cosmos/conversions/polynomial_conversion.rb +20 -4
- data/lib/cosmos/conversions/unix_time_conversion.rb +4 -4
- data/lib/cosmos/core_ext/array.rb +45 -5
- data/lib/cosmos/core_ext/cosmos_io.rb +31 -15
- data/lib/cosmos/core_ext/file.rb +2 -2
- data/lib/cosmos/core_ext/kernel.rb +1 -6
- data/lib/cosmos/core_ext/objectspace.rb +0 -2
- data/lib/cosmos/core_ext/string.rb +27 -4
- data/lib/cosmos/core_ext/time.rb +39 -10
- data/lib/cosmos/gui/choosers/combobox_chooser.rb +37 -26
- data/lib/cosmos/gui/choosers/file_chooser.rb +23 -6
- data/lib/cosmos/gui/choosers/float_chooser.rb +13 -11
- data/lib/cosmos/gui/choosers/integer_chooser.rb +13 -11
- data/lib/cosmos/gui/choosers/string_chooser.rb +18 -36
- data/lib/cosmos/gui/choosers/telemetry_chooser.rb +64 -64
- data/lib/cosmos/gui/choosers/value_chooser.rb +15 -15
- data/lib/cosmos/gui/dialogs/about_dialog.rb +18 -13
- data/lib/cosmos/gui/dialogs/calendar_dialog.rb +11 -3
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/details_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/exception_dialog.rb +7 -7
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +20 -15
- data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +143 -0
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +6 -5
- data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +5 -2
- data/lib/cosmos/gui/dialogs/progress_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/pry_dialog.rb +4 -4
- data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +3 -0
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +7 -6
- data/lib/cosmos/gui/dialogs/splash.rb +1 -1
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +114 -0
- data/lib/cosmos/gui/line_graph/line_graph.rb +9 -10
- data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +7 -5
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -7
- data/lib/cosmos/gui/line_graph/line_graph_popups.rb +3 -8
- data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +2 -7
- data/lib/cosmos/gui/line_graph/overview_graph.rb +6 -1
- data/lib/cosmos/gui/opengl/earth_model.rb +6 -3
- data/lib/cosmos/gui/opengl/gl_bounds.rb +11 -23
- data/lib/cosmos/gui/opengl/gl_light.rb +3 -4
- data/lib/cosmos/gui/opengl/gl_material.rb +3 -4
- data/lib/cosmos/gui/opengl/gl_scene.rb +10 -4
- data/lib/cosmos/gui/opengl/gl_shape.rb +6 -2
- data/lib/cosmos/gui/opengl/gl_viewer.rb +5 -5
- data/lib/cosmos/gui/opengl/gl_viewport.rb +11 -12
- data/lib/cosmos/gui/opengl/moon_model.rb +6 -3
- data/lib/cosmos/gui/opengl/stl_reader.rb +8 -9
- data/lib/cosmos/gui/opengl/stl_shape.rb +4 -5
- data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +7 -7
- data/lib/cosmos/gui/qt.rb +1 -1
- data/lib/cosmos/gui/qt_tool.rb +21 -10
- data/lib/cosmos/gui/text/completion.rb +23 -2
- data/lib/cosmos/gui/text/completion_text_edit.rb +38 -23
- data/lib/cosmos/gui/utilities/analyze_log.rb +1 -1
- data/lib/cosmos/gui/utilities/screenshot.rb +2 -2
- data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +11 -1
- data/lib/cosmos/gui/widgets/packet_log_frame.rb +19 -6
- data/lib/cosmos/interfaces.rb +10 -0
- data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +28 -47
- data/lib/cosmos/interfaces/interface.rb +240 -22
- data/lib/cosmos/interfaces/linc_interface.rb +3 -5
- data/lib/cosmos/interfaces/protocols/burst_protocol.rb +173 -0
- data/lib/cosmos/interfaces/protocols/crc_protocol.rb +141 -0
- data/lib/cosmos/{streams/fixed_stream_protocol.rb → interfaces/protocols/fixed_protocol.rb} +40 -37
- data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb} +55 -48
- data/lib/cosmos/interfaces/protocols/override_protocol.rb +52 -0
- data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +141 -0
- data/lib/cosmos/interfaces/protocols/protocol.rb +60 -0
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +209 -0
- data/lib/cosmos/interfaces/protocols/terminated_protocol.rb +81 -0
- data/lib/cosmos/interfaces/serial_interface.rb +28 -23
- data/lib/cosmos/interfaces/simulated_target_interface.rb +27 -16
- data/lib/cosmos/interfaces/stream_interface.rb +36 -108
- data/lib/cosmos/interfaces/tcpip_client_interface.rb +21 -21
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +555 -94
- data/lib/cosmos/interfaces/udp_interface.rb +51 -83
- data/lib/cosmos/io/buffered_file.rb +92 -2
- data/lib/cosmos/io/json_drb.rb +2 -2
- data/lib/cosmos/io/posix_serial_driver.rb +3 -1
- data/lib/cosmos/io/raw_logger.rb +3 -3
- data/lib/cosmos/io/serial_driver.rb +14 -5
- data/lib/cosmos/io/win32_serial_driver.rb +16 -4
- data/lib/cosmos/packet_logs.rb +0 -1
- data/lib/cosmos/packet_logs/packet_log_reader.rb +11 -1
- data/lib/cosmos/packet_logs/packet_log_writer.rb +31 -13
- data/lib/cosmos/packets/binary_accessor.rb +599 -32
- data/lib/cosmos/packets/commands.rb +48 -24
- data/lib/cosmos/packets/packet.rb +140 -54
- data/lib/cosmos/packets/packet_config.rb +0 -2
- data/lib/cosmos/packets/parsers/packet_item_parser.rb +10 -2
- data/lib/cosmos/packets/structure.rb +81 -33
- data/lib/cosmos/packets/structure_item.rb +45 -5
- data/lib/cosmos/packets/telemetry.rb +149 -55
- data/lib/cosmos/script/api_shared.rb +1000 -0
- data/lib/cosmos/script/commands.rb +2 -2
- data/lib/cosmos/script/extract.rb +19 -4
- data/lib/cosmos/script/limits.rb +2 -0
- data/lib/cosmos/script/script.rb +1 -1
- data/lib/cosmos/script/scripting.rb +4 -784
- data/lib/cosmos/script/telemetry.rb +44 -23
- data/lib/cosmos/script/tools.rb +15 -69
- data/lib/cosmos/streams/serial_stream.rb +12 -19
- data/lib/cosmos/streams/stream.rb +2 -11
- data/lib/cosmos/streams/tcpip_socket_stream.rb +3 -13
- data/lib/cosmos/system/system.rb +187 -31
- data/lib/cosmos/system/target.rb +11 -2
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -11
- data/lib/cosmos/tools/cmd_sender/{cmd_sender_item_delegate.rb → cmd_param_table_item_delegate.rb} +11 -10
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +209 -164
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +652 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +510 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +194 -0
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +179 -5
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +31 -14
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +23 -16
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +92 -20
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +1 -1
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -4
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +0 -5
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -2
- data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +4 -4
- data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +121 -0
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +8 -4
- data/lib/cosmos/tools/config_editor/config_editor.rb +720 -0
- data/lib/cosmos/tools/config_editor/config_editor_frame.rb +675 -0
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +44 -27
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +8 -22
- data/lib/cosmos/tools/launcher/launcher.rb +29 -12
- data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +153 -42
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +44 -6
- data/lib/cosmos/tools/replay/replay.rb +36 -20
- data/lib/cosmos/tools/replay/replay_server.rb +1 -1
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +1 -1
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +31 -21
- data/lib/cosmos/tools/table_manager/table_config.rb +9 -3
- data/lib/cosmos/tools/table_manager/table_manager.rb +27 -7
- data/lib/cosmos/tools/test_runner/results_writer.rb +6 -6
- data/lib/cosmos/tools/test_runner/test_runner.rb +4 -6
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +4 -5
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -1
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +23 -6
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +44 -3
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +20 -7
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1 -1
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +11 -4
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +2 -2
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +16 -0
- data/lib/cosmos/tools/tlm_viewer/screen.rb +36 -32
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +59 -50
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +2 -2
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +22 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +9 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +55 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +3 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +3 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +12 -12
- data/lib/cosmos/top_level.rb +34 -24
- data/lib/cosmos/utilities/crc.rb +108 -6
- data/lib/cosmos/utilities/csv.rb +68 -14
- data/lib/cosmos/utilities/logger.rb +2 -2
- data/lib/cosmos/utilities/low_fragmentation_array.rb +9 -1
- data/lib/cosmos/version.rb +6 -6
- data/lib/cosmos/win32/win32_main.rb +50 -46
- data/run_gui_tests.bat +3 -1
- data/spec/conversions/unix_time_formatted_conversion_spec.rb +2 -2
- data/spec/conversions/unix_time_seconds_conversion_spec.rb +2 -2
- data/spec/core_ext/file_spec.rb +1 -1
- data/spec/core_ext/objectspace_spec.rb +12 -9
- data/spec/core_ext/string_spec.rb +6 -0
- data/spec/core_ext/time_spec.rb +10 -0
- data/spec/gui/line_graph/line_clip_spec.rb +226 -224
- data/spec/gui/qt_spec.rb +81 -79
- data/spec/install/config/system/system.txt +0 -6
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +5 -5
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +8 -8
- data/spec/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
- data/{install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt → spec/install/config/targets/SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
- data/spec/install/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
- data/spec/install/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
- data/spec/install/config/targets/SYSTEM/screens/status.txt +12 -0
- data/spec/install/config/targets/SYSTEM/target.txt +12 -0
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +9 -13
- data/spec/interfaces/interface_spec.rb +402 -18
- data/spec/interfaces/linc_interface_spec.rb +37 -39
- data/spec/interfaces/protocols/burst_protocol_spec.rb +300 -0
- data/spec/interfaces/protocols/crc_protocol_spec.rb +709 -0
- data/spec/interfaces/protocols/fixed_protocol_spec.rb +119 -0
- data/spec/interfaces/protocols/length_protocol_spec.rb +499 -0
- data/spec/interfaces/protocols/override_protocol_spec.rb +158 -0
- data/spec/interfaces/protocols/preidentified_protocol_spec.rb +149 -0
- data/spec/interfaces/protocols/template_protocol_spec.rb +218 -0
- data/spec/interfaces/protocols/terminated_protocol_spec.rb +174 -0
- data/spec/interfaces/serial_interface_spec.rb +35 -34
- data/spec/interfaces/simulated_target_interface_spec.rb +13 -13
- data/spec/interfaces/tcpip_client_interface_spec.rb +21 -16
- data/spec/interfaces/tcpip_server_interface_spec.rb +66 -69
- data/spec/interfaces/udp_interface_spec.rb +120 -55
- data/spec/io/serial_driver_spec.rb +41 -39
- data/spec/io/udp_sockets_spec.rb +13 -8
- data/spec/io/win32_serial_driver_spec.rb +62 -59
- data/spec/packet_logs/packet_log_reader_spec.rb +68 -47
- data/spec/packet_logs/packet_log_writer_spec.rb +7 -5
- data/spec/packets/commands_spec.rb +5 -5
- data/spec/packets/packet_spec.rb +2 -14
- data/spec/script/extract_spec.rb +21 -7
- data/spec/script/scripting_spec.rb +261 -6
- data/spec/script/telemetry_spec.rb +17 -9
- data/spec/spec_helper.rb +26 -10
- data/spec/streams/serial_stream_spec.rb +87 -82
- data/spec/streams/tcpip_client_stream_spec.rb +12 -4
- data/spec/streams/tcpip_socket_stream_spec.rb +5 -0
- data/spec/system/system_spec.rb +66 -50
- data/spec/system/target_spec.rb +33 -11
- data/spec/tools/cmd_tlm_server/api_spec.rb +5 -5
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +75 -15
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +125 -5
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +244 -232
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +18 -18
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +124 -29
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +2 -2
- data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +145 -0
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +50 -10
- data/spec/tools/table_manager/tablemanager_core_spec.rb +0 -1
- data/spec/top_level/top_level_spec.rb +39 -11
- data/spec/utilities/csv_spec.rb +62 -20
- data/tasks/gemfile_stats.rake +6 -3
- data/test/performance/config/system/system_packets.txt +0 -1
- data/test/performance/config/system/system_threads.txt +0 -1
- metadata +177 -92
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
- data/autohotkey/config/targets/COSMOS/target.txt +0 -5
- data/autohotkey/userpath.txt +0 -1
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/demo/config/targets/COSMOS/screens/limits_change.txt +0 -20
- data/demo/config/targets/COSMOS/screens/version.txt +0 -19
- data/demo/config/targets/COSMOS/target.txt +0 -11
- data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +0 -10
- data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +0 -13
- data/demo/userpath.txt +0 -1
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/install/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
- data/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
- data/install/config/targets/COSMOS/screens/version.txt +0 -19
- data/install/config/targets/COSMOS/target.txt +0 -9
- data/install/config/targets/SYSTEM/README.txt +0 -1
- data/install/userpath.txt +0 -1
- data/lib/cosmos/io/tcpip_server.rb +0 -571
- data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +0 -107
- data/lib/cosmos/streams/burst_stream_protocol.rb +0 -25
- data/lib/cosmos/streams/preidentified_stream_protocol.rb +0 -118
- data/lib/cosmos/streams/stream_protocol.rb +0 -373
- data/lib/cosmos/streams/template_stream_protocol.rb +0 -140
- data/lib/cosmos/streams/terminated_stream_protocol.rb +0 -85
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +0 -41
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
- data/spec/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
- data/spec/install/config/targets/COSMOS/screens/version.txt +0 -19
- data/spec/install/config/targets/COSMOS/target.txt +0 -5
- data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +0 -4
- data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +0 -4
- data/spec/install/userpath.txt +0 -1
- data/spec/interfaces/stream_interface_spec.rb +0 -157
- data/spec/io/tcpip_server_spec.rb +0 -338
- data/spec/packet_logs/meta_packet_log_writer_spec.rb +0 -170
- data/spec/streams/burst_stream_protocol_spec.rb +0 -32
- data/spec/streams/fixed_stream_protocol_spec.rb +0 -113
- data/spec/streams/length_stream_protocol_spec.rb +0 -300
- data/spec/streams/preidentified_stream_protocol_spec.rb +0 -121
- data/spec/streams/stream_protocol_spec.rb +0 -346
- data/spec/streams/template_stream_protocol_spec.rb +0 -156
- data/spec/streams/terminated_stream_protocol_spec.rb +0 -127
- data/test/performance/userpath.txt +0 -1
data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: ascii-8bit
|
|
2
2
|
|
|
3
|
-
# Copyright
|
|
3
|
+
# Copyright 2017 Ball Aerospace & Technologies Corp.
|
|
4
4
|
# All Rights Reserved.
|
|
5
5
|
#
|
|
6
6
|
# This program is free software; you can modify and/or redistribute it
|
|
@@ -9,29 +9,27 @@
|
|
|
9
9
|
# attribution addendums as found in the LICENSE.txt
|
|
10
10
|
|
|
11
11
|
require 'cosmos/packets/binary_accessor'
|
|
12
|
-
require 'cosmos/
|
|
12
|
+
require 'cosmos/interfaces/protocols/burst_protocol'
|
|
13
13
|
require 'cosmos/config/config_parser'
|
|
14
14
|
|
|
15
15
|
module Cosmos
|
|
16
|
-
|
|
17
|
-
# This StreamProtocol delineates packets using a length field at a fixed
|
|
16
|
+
# Protocol which delineates packets using a length field at a fixed
|
|
18
17
|
# location in each packet.
|
|
19
|
-
class
|
|
20
|
-
|
|
18
|
+
class LengthProtocol < BurstProtocol
|
|
21
19
|
# @param length_bit_offset [Integer] The bit offset of the length field
|
|
22
20
|
# @param length_bit_size [Integer] The size in bits of the length field
|
|
23
21
|
# @param length_value_offset [Integer] The offset to apply to the length
|
|
24
22
|
# value once it has been read from the packet. The value in the length
|
|
25
|
-
# field itself plus the length value offset MUST equal the total bytes
|
|
26
|
-
#
|
|
23
|
+
# field itself plus the length value offset MUST equal the total bytes
|
|
24
|
+
# including any discarded bytes.
|
|
27
25
|
# For example: if your length field really means "length - 1" this value should be 1.
|
|
28
26
|
# @param length_bytes_per_count [Integer] The number of bytes per each
|
|
29
27
|
# length field 'count'. This is used if the units of the length field is
|
|
30
28
|
# something other than bytes, for example words.
|
|
31
29
|
# @param length_endianness [String] The endianness of the length field.
|
|
32
30
|
# Must be either BIG_ENDIAN or LITTLE_ENDIAN.
|
|
33
|
-
# @param discard_leading_bytes (see
|
|
34
|
-
# @param sync_pattern (see
|
|
31
|
+
# @param discard_leading_bytes (see BurstProtocol#initialize)
|
|
32
|
+
# @param sync_pattern (see BurstProtocol#initialize)
|
|
35
33
|
# @param max_length [Integer] The maximum allowed value of the length field
|
|
36
34
|
# @param fill_length_and_sync_pattern [Boolean] Fill the length field and sync
|
|
37
35
|
# pattern when writing packets
|
|
@@ -75,45 +73,57 @@ module Cosmos
|
|
|
75
73
|
@max_length = Integer(@max_length) if @max_length
|
|
76
74
|
end
|
|
77
75
|
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
76
|
+
# Called to perform modifications on a command packet before it is send
|
|
77
|
+
#
|
|
78
|
+
# @param packet [Packet] Original packet
|
|
79
|
+
# @return [Packet] Potentially modified packet
|
|
80
|
+
def write_packet(packet)
|
|
81
|
+
if @fill_fields
|
|
82
|
+
# If the start of the length field is past what we discard, then the
|
|
83
|
+
# length field is inside the packet
|
|
84
|
+
if @length_bit_offset >= (@discard_leading_bytes * 8)
|
|
85
|
+
length = calculate_length(packet.buffer.length + @discard_leading_bytes)
|
|
86
|
+
# Subtract off the discarded bytes since they haven't been added yet
|
|
87
|
+
# Adding bytes happens in the write_data method
|
|
88
|
+
offset = @length_bit_offset - (@discard_leading_bytes * 8)
|
|
89
|
+
# Directly write the packet buffer and fill in the length
|
|
90
|
+
BinaryAccessor.write(length, offset, @length_bit_size, :UINT,
|
|
91
|
+
packet.buffer(false), @length_endianness, :ERROR)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
return super(packet) # Allow burst_protocol to set the sync if needed
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Called to perform modifications on write data before making it into a packet
|
|
98
|
+
#
|
|
99
|
+
# @param data [String] Raw packet data
|
|
100
|
+
# @return [String] Potentially modified packet data
|
|
101
|
+
def write_data(data)
|
|
102
|
+
data = super(data)
|
|
103
|
+
if @fill_fields
|
|
104
|
+
# If the start of the length field is before what we discard, then the
|
|
105
|
+
# length field is outside the packet
|
|
106
|
+
if @length_bit_offset < (@discard_leading_bytes * 8)
|
|
107
|
+
BinaryAccessor.write(calculate_length(data.length), @length_bit_offset, @length_bit_size, :UINT,
|
|
108
|
+
data, @length_endianness, :ERROR)
|
|
106
109
|
end
|
|
107
110
|
end
|
|
108
|
-
data
|
|
111
|
+
return data
|
|
109
112
|
end
|
|
110
113
|
|
|
111
114
|
protected
|
|
112
115
|
|
|
116
|
+
def calculate_length(buffer_length)
|
|
117
|
+
length = (buffer_length / @length_bytes_per_count) - @length_value_offset
|
|
118
|
+
if @max_length && length > @max_length
|
|
119
|
+
raise "Calculated length #{length} larger than max_length #{@max_length}"
|
|
120
|
+
end
|
|
121
|
+
length
|
|
122
|
+
end
|
|
123
|
+
|
|
113
124
|
def reduce_to_single_packet
|
|
114
125
|
# Make sure we have at least enough data to reach the length field
|
|
115
|
-
|
|
116
|
-
return nil if @data.length <= 0
|
|
126
|
+
return :STOP if @data.length < @length_bytes_needed
|
|
117
127
|
|
|
118
128
|
# Determine the packet's length
|
|
119
129
|
length = BinaryAccessor.read(@length_bit_offset,
|
|
@@ -125,16 +135,13 @@ module Cosmos
|
|
|
125
135
|
packet_length = (length * @length_bytes_per_count) + @length_value_offset
|
|
126
136
|
|
|
127
137
|
# Make sure we have enough data for the packet
|
|
128
|
-
|
|
129
|
-
return nil if @data.length <= 0
|
|
138
|
+
return:STOP if @data.length < packet_length
|
|
130
139
|
|
|
131
140
|
# Reduce to packet data and setup current_data for next packet
|
|
132
141
|
packet_data = @data[0..(packet_length - 1)]
|
|
133
142
|
@data.replace(@data[packet_length..-1])
|
|
134
143
|
|
|
135
|
-
packet_data
|
|
144
|
+
return packet_data
|
|
136
145
|
end
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
end # module Cosmos
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2017 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 'cosmos/interfaces/protocols/protocol'
|
|
12
|
+
|
|
13
|
+
module Cosmos
|
|
14
|
+
# Protocol which permanently overrides an item value such that reading the
|
|
15
|
+
# item returns the overriden value. Methods are prefixed with underscores
|
|
16
|
+
# so the API can include the original name which calls out to these
|
|
17
|
+
# methods. Clearing the override requires calling normalize_tlm.
|
|
18
|
+
class OverrideProtocol < Protocol
|
|
19
|
+
|
|
20
|
+
# @param allow_empty_data [true/false] Whether STOP should be returned on empty data
|
|
21
|
+
def initialize(allow_empty_data = false)
|
|
22
|
+
super(allow_empty_data)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Called to perform modifications on a read packet before it is given to the user
|
|
26
|
+
#
|
|
27
|
+
# @param packet [Packet] Original packet
|
|
28
|
+
# @return [Packet] Potentially modified packet
|
|
29
|
+
def read_packet(packet)
|
|
30
|
+
if @interface.override_tlm && !@interface.override_tlm.empty?
|
|
31
|
+
# Need to make sure packet is identified and defined
|
|
32
|
+
target_names = nil
|
|
33
|
+
target_names = @interface.target_names if @interface
|
|
34
|
+
identified_packet = System.telemetry.identify_and_define_packet(packet, target_names)
|
|
35
|
+
if identified_packet
|
|
36
|
+
packet = identified_packet
|
|
37
|
+
packets = @interface.override_tlm[packet.target_name]
|
|
38
|
+
if packets
|
|
39
|
+
items = packets[packet.packet_name]
|
|
40
|
+
if items
|
|
41
|
+
items.each do |item_name, value|
|
|
42
|
+
# This should be safe because we check at the API level it exists
|
|
43
|
+
packet.write(item_name, value[0], value[1])
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
return packet
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2017 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 'cosmos/interfaces/protocols/burst_protocol'
|
|
12
|
+
|
|
13
|
+
module Cosmos
|
|
14
|
+
# Delineates packets using the COSMOS preidentification system
|
|
15
|
+
class PreidentifiedProtocol < BurstProtocol
|
|
16
|
+
|
|
17
|
+
# @param sync_pattern (see BurstProtocol#initialize)
|
|
18
|
+
# @param max_length [Integer] The maximum allowed value of the length field
|
|
19
|
+
def initialize(sync_pattern = nil, max_length = nil)
|
|
20
|
+
super(0, sync_pattern)
|
|
21
|
+
@max_length = ConfigParser.handle_nil(max_length)
|
|
22
|
+
@max_length = Integer(@max_length) if @max_length
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def reset
|
|
26
|
+
super()
|
|
27
|
+
@reduction_state = :START
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def read_packet(packet)
|
|
31
|
+
packet.received_time = @received_time
|
|
32
|
+
packet.target_name = @target_name
|
|
33
|
+
packet.packet_name = @packet_name
|
|
34
|
+
return packet
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def write_packet(packet)
|
|
38
|
+
received_time = packet.received_time
|
|
39
|
+
received_time = Time.now unless received_time
|
|
40
|
+
@time_seconds = [received_time.tv_sec].pack('N') # UINT32
|
|
41
|
+
@time_microseconds = [received_time.tv_usec].pack('N') # UINT32
|
|
42
|
+
@target_name = packet.target_name
|
|
43
|
+
@target_name = 'UNKNOWN' unless @target_name
|
|
44
|
+
@packet_name = packet.packet_name
|
|
45
|
+
@packet_name = 'UNKNOWN' unless @packet_name
|
|
46
|
+
return packet
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def write_data(data)
|
|
50
|
+
data_length = [data.length].pack('N') # UINT32
|
|
51
|
+
data_to_send = ''
|
|
52
|
+
data_to_send << @sync_pattern if @sync_pattern
|
|
53
|
+
data_to_send << @time_seconds
|
|
54
|
+
data_to_send << @time_microseconds
|
|
55
|
+
data_to_send << @target_name.length
|
|
56
|
+
data_to_send << @target_name
|
|
57
|
+
data_to_send << @packet_name.length
|
|
58
|
+
data_to_send << @packet_name
|
|
59
|
+
data_to_send << data_length
|
|
60
|
+
data_to_send << data
|
|
61
|
+
return data_to_send
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
protected
|
|
65
|
+
|
|
66
|
+
def read_length_field_followed_by_string(length_num_bytes)
|
|
67
|
+
# Read bytes for string length
|
|
68
|
+
return :STOP if @data.length < length_num_bytes
|
|
69
|
+
string_length = @data[0..(length_num_bytes - 1)]
|
|
70
|
+
|
|
71
|
+
case length_num_bytes
|
|
72
|
+
when 1
|
|
73
|
+
string_length = string_length.unpack('C')[0] # UINT8
|
|
74
|
+
when 2
|
|
75
|
+
string_length = string_length.unpack('n')[0] # UINT16
|
|
76
|
+
when 4
|
|
77
|
+
string_length = string_length.unpack('N')[0] # UINT32
|
|
78
|
+
raise "Length value received larger than max_length: #{string_length} > #{@max_length}" if @max_length and string_length > @max_length
|
|
79
|
+
else
|
|
80
|
+
raise "Unsupported length given to read_length_field_followed_by_string: #{length_num_bytes}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Read String
|
|
84
|
+
return :STOP if @data.length < (string_length + length_num_bytes)
|
|
85
|
+
next_index = string_length + length_num_bytes
|
|
86
|
+
string = @data[length_num_bytes..(next_index - 1)]
|
|
87
|
+
|
|
88
|
+
# Remove data from current_data
|
|
89
|
+
@data.replace(@data[next_index..-1])
|
|
90
|
+
|
|
91
|
+
return string
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def reduce_to_single_packet
|
|
95
|
+
# Discard sync pattern if present
|
|
96
|
+
if @sync_pattern
|
|
97
|
+
if @reduction_state == :START
|
|
98
|
+
return :STOP if @data.length < @sync_pattern.length
|
|
99
|
+
@data.replace(@data[(@sync_pattern.length)..-1])
|
|
100
|
+
@reduction_state = :SYNC_REMOVED
|
|
101
|
+
end
|
|
102
|
+
elsif @reduction_state == :START
|
|
103
|
+
@reduction_state = :SYNC_REMOVED
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Read and remove packet received time
|
|
107
|
+
if @reduction_state == :SYNC_REMOVED
|
|
108
|
+
return :STOP if @data.length < 8
|
|
109
|
+
time_seconds = @data[0..3].unpack('N')[0] # UINT32
|
|
110
|
+
time_microseconds = @data[4..7].unpack('N')[0] # UINT32
|
|
111
|
+
@received_time = Time.at(time_seconds, time_microseconds).sys
|
|
112
|
+
@data.replace(@data[8..-1])
|
|
113
|
+
@reduction_state = :TIME_REMOVED
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if @reduction_state == :TIME_REMOVED
|
|
117
|
+
# Read and remove the target name
|
|
118
|
+
@target_name = read_length_field_followed_by_string(1)
|
|
119
|
+
return :STOP if @target_name == :STOP
|
|
120
|
+
@reduction_state = :TARGET_NAME_REMOVED
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
if @reduction_state == :TARGET_NAME_REMOVED
|
|
124
|
+
# Read and remove the packet name
|
|
125
|
+
@packet_name = read_length_field_followed_by_string(1)
|
|
126
|
+
return :STOP if @packet_name == :STOP
|
|
127
|
+
@reduction_state = :PACKET_NAME_REMOVED
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
if @reduction_state == :PACKET_NAME_REMOVED
|
|
131
|
+
# Read packet data and return
|
|
132
|
+
packet_data = read_length_field_followed_by_string(4)
|
|
133
|
+
return :STOP if packet_data == :STOP
|
|
134
|
+
@reduction_state = :START
|
|
135
|
+
return packet_data
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
raise "Error should never reach end of method #{@reduction_state}"
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2017 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 'cosmos/config/config_parser'
|
|
12
|
+
require 'cosmos/interfaces/protocols/protocol'
|
|
13
|
+
require 'thread'
|
|
14
|
+
|
|
15
|
+
module Cosmos
|
|
16
|
+
class Protocol
|
|
17
|
+
attr_accessor :interface
|
|
18
|
+
attr_accessor :allow_empty_data
|
|
19
|
+
|
|
20
|
+
# @param allow_empty_data [true/false] Whether STOP should be returned on empty data
|
|
21
|
+
def initialize(allow_empty_data = false)
|
|
22
|
+
@interface = nil
|
|
23
|
+
@allow_empty_data = ConfigParser.handle_true_false(allow_empty_data)
|
|
24
|
+
reset()
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def reset
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def connect_reset
|
|
31
|
+
reset()
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def disconnect_reset
|
|
35
|
+
reset()
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Ensure we have some data in case this is the only protocol
|
|
39
|
+
def read_data(data)
|
|
40
|
+
return :STOP if (data.length <= 0) && !@allow_empty_data
|
|
41
|
+
data
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def read_packet(packet)
|
|
45
|
+
return packet
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def write_packet(packet)
|
|
49
|
+
return packet
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def write_data(data)
|
|
53
|
+
return data
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def post_write_interface(packet, data)
|
|
57
|
+
return packet, data
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2017 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 'cosmos/config/config_parser'
|
|
12
|
+
require 'cosmos/interfaces/protocols/terminated_protocol'
|
|
13
|
+
require 'thread' # For Queue
|
|
14
|
+
require 'timeout' # For Timeout::Error
|
|
15
|
+
|
|
16
|
+
module Cosmos
|
|
17
|
+
# Protocol which delineates packets using delimiter characters. Designed for
|
|
18
|
+
# text based protocols which expect a command and send a response. The
|
|
19
|
+
# protocol handles sending the command and capturing the response.
|
|
20
|
+
class TemplateProtocol < TerminatedProtocol
|
|
21
|
+
# @param write_termination_characters (see TerminatedProtocol#initialize)
|
|
22
|
+
# @param read_termination_characters (see TerminatedProtocol#initialize)
|
|
23
|
+
# @param ignore_lines [Integer] Number of newline terminated reads to
|
|
24
|
+
# ignore when processing the response
|
|
25
|
+
# @param initial_read_delay [Integer] Initial delay when connecting before
|
|
26
|
+
# trying to read
|
|
27
|
+
# @param response_lines [Integer] Number of newline terminated lines which
|
|
28
|
+
# comprise the response
|
|
29
|
+
# @param strip_read_termination (see TerminatedProtocol#initialize)
|
|
30
|
+
# @param discard_leading_bytes (see TerminatedProtocol#initialize)
|
|
31
|
+
# @param sync_pattern (see TerminatedProtocol#initialize)
|
|
32
|
+
# @param fill_fields (see TerminatedProtocol#initialize)
|
|
33
|
+
def initialize(
|
|
34
|
+
write_termination_characters,
|
|
35
|
+
read_termination_characters,
|
|
36
|
+
ignore_lines = 0,
|
|
37
|
+
initial_read_delay = nil,
|
|
38
|
+
response_lines = 1,
|
|
39
|
+
strip_read_termination = true,
|
|
40
|
+
discard_leading_bytes = 0,
|
|
41
|
+
sync_pattern = nil,
|
|
42
|
+
fill_fields = false,
|
|
43
|
+
response_timeout = 5.0,
|
|
44
|
+
response_polling_period = 0.02
|
|
45
|
+
)
|
|
46
|
+
super(
|
|
47
|
+
write_termination_characters,
|
|
48
|
+
read_termination_characters,
|
|
49
|
+
strip_read_termination,
|
|
50
|
+
discard_leading_bytes,
|
|
51
|
+
sync_pattern,
|
|
52
|
+
fill_fields)
|
|
53
|
+
@response_template = nil
|
|
54
|
+
@response_packet = nil
|
|
55
|
+
@response_packets = []
|
|
56
|
+
@write_block_queue = Queue.new
|
|
57
|
+
@ignore_lines = ignore_lines.to_i
|
|
58
|
+
@response_lines = response_lines.to_i
|
|
59
|
+
@initial_read_delay = ConfigParser.handle_nil(initial_read_delay)
|
|
60
|
+
@initial_read_delay = @initial_read_delay.to_f if @initial_read_delay
|
|
61
|
+
@response_timeout = ConfigParser.handle_nil(response_timeout)
|
|
62
|
+
@response_timeout = @response_timeout.to_f if @response_timeout
|
|
63
|
+
@response_polling_period = response_polling_period.to_f
|
|
64
|
+
@connect_complete_time = nil
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def reset
|
|
68
|
+
super()
|
|
69
|
+
@initial_read_delay_needed = true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def connect_reset
|
|
73
|
+
super()
|
|
74
|
+
begin
|
|
75
|
+
@write_block_queue.pop(true) while @write_block_queue.length > 0
|
|
76
|
+
rescue
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
@connect_complete_time = Time.now + @initial_read_delay if @initial_read_delay
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def disconnect_reset
|
|
83
|
+
super()
|
|
84
|
+
@write_block_queue << nil # Unblock the write block queue
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def read_data(data)
|
|
88
|
+
# Drop all data until the initial_read_delay is complete.
|
|
89
|
+
# This gets rid of unused welcome messages,
|
|
90
|
+
# prompts, and other junk on initial connections
|
|
91
|
+
if @initial_read_delay and @initial_read_delay_needed and @connect_complete_time
|
|
92
|
+
return :STOP if Time.now < @connect_complete_time
|
|
93
|
+
@initial_read_delay_needed = false
|
|
94
|
+
end
|
|
95
|
+
super(data)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def read_packet(packet)
|
|
99
|
+
if @response_template && @response_packet
|
|
100
|
+
# If lines make it this far they are part of a response
|
|
101
|
+
@response_packets << packet
|
|
102
|
+
return :STOP if @response_packets.length < (@ignore_lines + @response_lines)
|
|
103
|
+
|
|
104
|
+
@ignore_lines.times do
|
|
105
|
+
@response_packets.shift
|
|
106
|
+
end
|
|
107
|
+
response_string = ''
|
|
108
|
+
@response_lines.times do
|
|
109
|
+
response = @response_packets.shift
|
|
110
|
+
response_string << response.buffer
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Grab the response packet specified in the command
|
|
114
|
+
result_packet = System.telemetry.packet(@interface.target_names[0], @response_packet).clone
|
|
115
|
+
result_packet.received_time = nil
|
|
116
|
+
|
|
117
|
+
# Convert the response template into a Regexp
|
|
118
|
+
response_item_names = []
|
|
119
|
+
response_template = @response_template.clone
|
|
120
|
+
response_template_items = @response_template.scan(/<.*?>/)
|
|
121
|
+
|
|
122
|
+
response_template_items.each do |item|
|
|
123
|
+
response_item_names << item[1..-2]
|
|
124
|
+
response_template.gsub!(item, "(.*)")
|
|
125
|
+
end
|
|
126
|
+
response_regexp = Regexp.new(response_template)
|
|
127
|
+
|
|
128
|
+
# Scan the response for the variables in brackets <VARIABLE>
|
|
129
|
+
# Write the packet value with each of the values received
|
|
130
|
+
response_values = response_string.scan(response_regexp)[0]
|
|
131
|
+
raise "Unexpected response received: #{response_string}" if !response_values || (response_values.length != response_item_names.length)
|
|
132
|
+
response_values.each_with_index do |value, i|
|
|
133
|
+
result_packet.write(response_item_names[i], value)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
@response_packets.clear
|
|
137
|
+
|
|
138
|
+
# Release the write
|
|
139
|
+
if @response_template && @response_packet
|
|
140
|
+
@write_block_queue << nil
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
return result_packet
|
|
144
|
+
else
|
|
145
|
+
return packet
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def write_packet(packet)
|
|
150
|
+
# Make sure we are past the initial data dropping period
|
|
151
|
+
if @initial_read_delay and @initial_read_delay_needed and @connect_complete_time and Time.now < @connect_complete_time
|
|
152
|
+
delay_needed = @connect_complete_time - Time.now
|
|
153
|
+
sleep(delay_needed) if delay_needed > 0
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# First grab the response template and response packet (if there is one)
|
|
157
|
+
begin
|
|
158
|
+
@response_template = packet.read("RSP_TEMPLATE").strip
|
|
159
|
+
@response_packet = packet.read("RSP_PACKET").strip
|
|
160
|
+
rescue
|
|
161
|
+
# If there is no response template we set to nil
|
|
162
|
+
@response_template = nil
|
|
163
|
+
@response_packet = nil
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Grab the command template because that is all we eventually send
|
|
167
|
+
@template = packet.read("CMD_TEMPLATE")
|
|
168
|
+
# Create a new packet to populate with the template
|
|
169
|
+
raw_packet = Packet.new(nil, nil)
|
|
170
|
+
raw_packet.buffer = @template
|
|
171
|
+
raw_packet = super(raw_packet)
|
|
172
|
+
return raw_packet if Symbol === raw_packet
|
|
173
|
+
|
|
174
|
+
data = raw_packet.buffer(false)
|
|
175
|
+
# Scan the template for variables in brackets <VARIABLE>
|
|
176
|
+
# Read these values from the packet and substitute them in the template
|
|
177
|
+
@template.scan(/<(.*?)>/).each do |variable|
|
|
178
|
+
data.gsub!("<#{variable[0]}>", packet.read(variable[0], :RAW).to_s)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
return raw_packet
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def post_write_interface(packet, data)
|
|
185
|
+
if @response_template && @response_packet
|
|
186
|
+
if @response_timeout
|
|
187
|
+
response_timeout_time = Time.now + @response_timeout
|
|
188
|
+
else
|
|
189
|
+
response_timeout_time = nil
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Block the write until the response is received
|
|
193
|
+
begin
|
|
194
|
+
result = @write_block_queue.pop(true)
|
|
195
|
+
rescue
|
|
196
|
+
sleep(@response_polling_period)
|
|
197
|
+
retry if !response_timeout_time
|
|
198
|
+
retry if response_timeout_time and Time.now < response_timeout_time
|
|
199
|
+
raise Timeout::Error, "Timeout waiting for response"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
@response_template = nil
|
|
203
|
+
@response_packet = nil
|
|
204
|
+
@response_packets.clear
|
|
205
|
+
end
|
|
206
|
+
return super(packet, data)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|