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
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
-
# All Rights Reserved.
|
|
5
|
-
#
|
|
6
|
-
# This program is free software; you can modify and/or redistribute it
|
|
7
|
-
# under the terms of the GNU General Public License
|
|
8
|
-
# as published by the Free Software Foundation; version 3 with
|
|
9
|
-
# attribution addendums as found in the LICENSE.txt
|
|
10
|
-
|
|
11
|
-
# Usage Notes:
|
|
12
|
-
# The metadata packet must exist with exactly the same fields as both a command and as a telemetry packet
|
|
13
|
-
# The new_packet_log_conversion.rb WRITE_CONVERSION should be placed on at least one item in the meta packets
|
|
14
|
-
|
|
15
|
-
require 'cosmos/packet_logs/packet_log_writer'
|
|
16
|
-
|
|
17
|
-
module Cosmos
|
|
18
|
-
|
|
19
|
-
# Writes a given packet at the beginning of each telemetry packet log file
|
|
20
|
-
class MetaPacketLogWriter < PacketLogWriter
|
|
21
|
-
|
|
22
|
-
# See PacketLogWriter#initialize
|
|
23
|
-
# @param target_name [String] Target name of the metadata packet
|
|
24
|
-
# @param packet_name [String] Packet name of the metadata packet
|
|
25
|
-
# @param meta_default_filename [String] Filename containing key/value pairs for default meta packet values
|
|
26
|
-
# @param log_meta_packet [Boolean] true to log the metadata packet if received during logging. false to only
|
|
27
|
-
# log metadata packets at the beginning of the log.
|
|
28
|
-
# @param use_tlm_packet [Boolean] true to put the data from the telemetry packet into
|
|
29
|
-
# each log. false to put the data from the command packet.
|
|
30
|
-
def initialize(
|
|
31
|
-
log_type,
|
|
32
|
-
target_name = nil,
|
|
33
|
-
packet_name = nil,
|
|
34
|
-
meta_default_filename = nil,
|
|
35
|
-
log_meta_packet = false,
|
|
36
|
-
use_tlm_packet = true,
|
|
37
|
-
log_name = nil,
|
|
38
|
-
logging_enabled = true,
|
|
39
|
-
cycle_time = nil,
|
|
40
|
-
cycle_size = 2000000000,
|
|
41
|
-
log_directory = nil,
|
|
42
|
-
asynchronous = false
|
|
43
|
-
)
|
|
44
|
-
@target_name = ConfigParser.handle_nil(target_name)
|
|
45
|
-
@packet_name = ConfigParser.handle_nil(packet_name)
|
|
46
|
-
@packet = nil
|
|
47
|
-
@log_meta_packet = ConfigParser.handle_true_false(log_meta_packet)
|
|
48
|
-
@meta_default_filename = ConfigParser.handle_nil(meta_default_filename)
|
|
49
|
-
@use_tlm_packet = ConfigParser.handle_true_false(use_tlm_packet)
|
|
50
|
-
|
|
51
|
-
# Make sure the packet exists in both commands and telemetry (if given)
|
|
52
|
-
if @target_name and @packet_name
|
|
53
|
-
packet = System.telemetry.packet(@target_name, @packet_name)
|
|
54
|
-
@packet = packet if @use_tlm_packet
|
|
55
|
-
packet = System.commands.packet(@target_name, @packet_name)
|
|
56
|
-
@packet = packet if !@use_tlm_packet
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Initialize the meta packet (if given)
|
|
60
|
-
if @meta_default_filename and @packet
|
|
61
|
-
parser = ConfigParser.new
|
|
62
|
-
Cosmos.set_working_dir do
|
|
63
|
-
parser.parse_file(@meta_default_filename) do |keyword, params|
|
|
64
|
-
begin
|
|
65
|
-
item = @packet.get_item(keyword)
|
|
66
|
-
if item.data_type == :STRING or item.data_type == :BLOCK
|
|
67
|
-
value = params[0]
|
|
68
|
-
else
|
|
69
|
-
value = params[0].convert_to_value
|
|
70
|
-
end
|
|
71
|
-
@packet.write(keyword, value)
|
|
72
|
-
rescue => err
|
|
73
|
-
raise parser.error(err, "ITEM_NAME VALUE")
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
super(log_type, log_name, logging_enabled, cycle_time, cycle_size, log_directory, asynchronous)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# Optionally doesn't write the meta packet
|
|
83
|
-
def write(packet)
|
|
84
|
-
if @log_meta_packet or !(packet.target_name == @target_name and packet.packet_name == @packet_name)
|
|
85
|
-
super(packet)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
protected
|
|
90
|
-
|
|
91
|
-
# Adds the meta packet at the beginning of telemetry packet logs
|
|
92
|
-
# Mutex is held during this hook
|
|
93
|
-
def start_new_file_hook
|
|
94
|
-
if @target_name and @packet_name
|
|
95
|
-
if @use_tlm_packet
|
|
96
|
-
packet = System.telemetry.packet(@target_name, @packet_name)
|
|
97
|
-
else
|
|
98
|
-
packet = System.commands.packet(@target_name, @packet_name)
|
|
99
|
-
end
|
|
100
|
-
# Don't take the mutex because it is already held
|
|
101
|
-
write_packet(packet, false)
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
end # class MetaPacketLogWriter
|
|
106
|
-
|
|
107
|
-
end # module Cosmos
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
-
# All Rights Reserved.
|
|
5
|
-
#
|
|
6
|
-
# This program is free software; you can modify and/or redistribute it
|
|
7
|
-
# under the terms of the GNU General Public License
|
|
8
|
-
# as published by the Free Software Foundation; version 3 with
|
|
9
|
-
# attribution addendums as found in the LICENSE.txt
|
|
10
|
-
|
|
11
|
-
require 'cosmos/streams/stream_protocol'
|
|
12
|
-
|
|
13
|
-
module Cosmos
|
|
14
|
-
|
|
15
|
-
# Reads all data available in the stream and creates a packet
|
|
16
|
-
# with that data.
|
|
17
|
-
class BurstStreamProtocol < StreamProtocol
|
|
18
|
-
# This class is currently empty because StreamProtocol performs all
|
|
19
|
-
# the necessary functionality. It exists because of the way
|
|
20
|
-
# {StreamInterface} creates the stream protocol by appending
|
|
21
|
-
# 'StreamProtocol' to the name of the protocol. Thus we need a
|
|
22
|
-
# BurstStreamProtocol so 'burst' can be used by the {StreamInterface}.
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
end # module Cosmos
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
-
# All Rights Reserved.
|
|
5
|
-
#
|
|
6
|
-
# This program is free software; you can modify and/or redistribute it
|
|
7
|
-
# under the terms of the GNU General Public License
|
|
8
|
-
# as published by the Free Software Foundation; version 3 with
|
|
9
|
-
# attribution addendums as found in the LICENSE.txt
|
|
10
|
-
|
|
11
|
-
require 'cosmos/streams/stream_protocol'
|
|
12
|
-
|
|
13
|
-
module Cosmos
|
|
14
|
-
|
|
15
|
-
# This StreamProtocol delineates packets using the COSMOS
|
|
16
|
-
# preidentification system
|
|
17
|
-
class PreidentifiedStreamProtocol < StreamProtocol
|
|
18
|
-
|
|
19
|
-
# @param sync_pattern (see StreamProtocol#initialize)
|
|
20
|
-
# @param max_length [Integer] The maximum allowed value of the length field
|
|
21
|
-
def initialize(sync_pattern = nil, max_length = nil)
|
|
22
|
-
super(0, sync_pattern)
|
|
23
|
-
@max_length = ConfigParser.handle_nil(max_length)
|
|
24
|
-
@max_length = Integer(@max_length) if @max_length
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# See StreamProtocol#post_read_packet
|
|
28
|
-
def post_read_packet(packet)
|
|
29
|
-
packet.received_time = @received_time
|
|
30
|
-
packet.target_name = @target_name
|
|
31
|
-
packet.packet_name = @packet_name
|
|
32
|
-
packet
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# See StreamProtocol#pre_write_packet
|
|
36
|
-
def pre_write_packet(packet)
|
|
37
|
-
received_time = packet.received_time
|
|
38
|
-
received_time = Time.now unless received_time
|
|
39
|
-
time_seconds = [received_time.tv_sec].pack('N') # UINT32
|
|
40
|
-
time_microseconds = [received_time.tv_usec].pack('N') # UINT32
|
|
41
|
-
target_name = packet.target_name
|
|
42
|
-
target_name = 'UNKNOWN' unless target_name
|
|
43
|
-
packet_name = packet.packet_name
|
|
44
|
-
packet_name = 'UNKNOWN' unless packet_name
|
|
45
|
-
data = packet.buffer
|
|
46
|
-
data_length = [data.length].pack('N') # UINT32
|
|
47
|
-
data_to_send = ''
|
|
48
|
-
data_to_send << @sync_pattern if @sync_pattern
|
|
49
|
-
data_to_send << time_seconds
|
|
50
|
-
data_to_send << time_microseconds
|
|
51
|
-
data_to_send << target_name.length
|
|
52
|
-
data_to_send << target_name
|
|
53
|
-
data_to_send << packet_name.length
|
|
54
|
-
data_to_send << packet_name
|
|
55
|
-
data_to_send << data_length
|
|
56
|
-
data_to_send << data
|
|
57
|
-
data_to_send
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
protected
|
|
61
|
-
|
|
62
|
-
def read_length_field_followed_by_string(length_num_bytes)
|
|
63
|
-
# Read bytes for string length
|
|
64
|
-
read_minimum_size(length_num_bytes)
|
|
65
|
-
return nil if @data.length <= 0
|
|
66
|
-
string_length = @data[0..(length_num_bytes - 1)]
|
|
67
|
-
|
|
68
|
-
case length_num_bytes
|
|
69
|
-
when 1
|
|
70
|
-
string_length = string_length.unpack('C')[0] # UINT8
|
|
71
|
-
when 2
|
|
72
|
-
string_length = string_length.unpack('n')[0] # UINT16
|
|
73
|
-
when 4
|
|
74
|
-
string_length = string_length.unpack('N')[0] # UINT32
|
|
75
|
-
raise "Length value received larger than max_length: #{string_length} > #{@max_length}" if @max_length and string_length > @max_length
|
|
76
|
-
else
|
|
77
|
-
return nil
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# Read String
|
|
81
|
-
read_minimum_size(string_length + length_num_bytes)
|
|
82
|
-
return nil if @data.length <= 0
|
|
83
|
-
next_index = string_length + length_num_bytes
|
|
84
|
-
string = @data[length_num_bytes..(next_index - 1)]
|
|
85
|
-
|
|
86
|
-
# Remove data from current_data
|
|
87
|
-
@data.replace(@data[next_index..-1])
|
|
88
|
-
|
|
89
|
-
string
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def reduce_to_single_packet
|
|
93
|
-
# Discard sync pattern if present
|
|
94
|
-
@data.replace(@data[(@sync_pattern.length)..-1]) if @sync_pattern
|
|
95
|
-
|
|
96
|
-
# Read and remove packet received time
|
|
97
|
-
read_minimum_size(8)
|
|
98
|
-
return nil if @data.length <= 0
|
|
99
|
-
time_seconds = @data[0..3].unpack('N')[0] # UINT32
|
|
100
|
-
time_microseconds = @data[4..7].unpack('N')[0] # UINT32
|
|
101
|
-
@received_time = Time.at(time_seconds, time_microseconds)
|
|
102
|
-
@data.replace(@data[8..-1])
|
|
103
|
-
|
|
104
|
-
# Read and remove the target name
|
|
105
|
-
@target_name = read_length_field_followed_by_string(1)
|
|
106
|
-
return nil unless @target_name
|
|
107
|
-
|
|
108
|
-
# Read and remove the packet name
|
|
109
|
-
@packet_name = read_length_field_followed_by_string(1)
|
|
110
|
-
return nil unless @packet_name
|
|
111
|
-
|
|
112
|
-
# Read packet data and return
|
|
113
|
-
read_length_field_followed_by_string(4)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
end # class PreidentifiedStreamProtocol
|
|
117
|
-
|
|
118
|
-
end # module Cosmos
|
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
-
# All Rights Reserved.
|
|
5
|
-
#
|
|
6
|
-
# This program is free software; you can modify and/or redistribute it
|
|
7
|
-
# under the terms of the GNU General Public License
|
|
8
|
-
# as published by the Free Software Foundation; version 3 with
|
|
9
|
-
# attribution addendums as found in the LICENSE.txt
|
|
10
|
-
|
|
11
|
-
require 'cosmos/config/config_parser'
|
|
12
|
-
require 'thread'
|
|
13
|
-
|
|
14
|
-
module Cosmos
|
|
15
|
-
|
|
16
|
-
# Processes a {Stream} on behalf of an {Interface}. A {Stream} is a
|
|
17
|
-
# primative interface that simply reads and writes raw binary data. The
|
|
18
|
-
# StreamProtocol adds higher level processing including the ability to
|
|
19
|
-
# discard a certain number of bytes from the stream and to sync the stream
|
|
20
|
-
# on a given synchronization pattern. The StreamProtocol operates at the
|
|
21
|
-
# {Packet} abstraction level while the {Stream} operates on raw bytes.
|
|
22
|
-
class StreamProtocol
|
|
23
|
-
|
|
24
|
-
# @return [Integer] The number of bytes read from the stream
|
|
25
|
-
attr_accessor :bytes_read
|
|
26
|
-
# @return [Integer] The number of bytes written to the stream
|
|
27
|
-
attr_accessor :bytes_written
|
|
28
|
-
# @return [Interface] The interface associated with this
|
|
29
|
-
# StreamProtocol. The interface is a higher level abstraction and is
|
|
30
|
-
# passed down to the StreamProtocol to allow it to call the callbacks in
|
|
31
|
-
# the interface when processing the {Stream}. otherwise subclass wins
|
|
32
|
-
# when calling
|
|
33
|
-
attr_reader :interface
|
|
34
|
-
# @return [Stream] The stream this StreamProtocol is processing data from
|
|
35
|
-
attr_reader :stream
|
|
36
|
-
|
|
37
|
-
# @return [Proc] The name of a method in the {Interface} that #read calls
|
|
38
|
-
# after reading data from the {Stream}. It should take a String binary data
|
|
39
|
-
# buffer and return a String binary data buffer.
|
|
40
|
-
attr_accessor :post_read_data_callback
|
|
41
|
-
# @return [Proc] The name of a method in the {Interface} that #read calls
|
|
42
|
-
# after converting the read data buffer into a {Packet}. It should take a
|
|
43
|
-
# {Packet} and return a {Packet}.
|
|
44
|
-
attr_accessor :post_read_packet_callback
|
|
45
|
-
# @return [Proc] The name of a method in the {Interface} that #write
|
|
46
|
-
# calls before writing the data to the stream.
|
|
47
|
-
# It should take a {Packet} and return a binary String buffer.
|
|
48
|
-
attr_accessor :pre_write_packet_callback
|
|
49
|
-
# @return [Proc] The name of a method in the {Interface} that #write
|
|
50
|
-
# calls after writing the data to the stream. It should take a {Packet} and a String
|
|
51
|
-
# and return nothing.
|
|
52
|
-
attr_accessor :post_write_data_callback
|
|
53
|
-
|
|
54
|
-
# @param discard_leading_bytes [Integer] The number of bytes to discard
|
|
55
|
-
# from the binary data after reading from the {Stream}. Note that this is often
|
|
56
|
-
# used to remove a sync pattern from the final packet data.
|
|
57
|
-
# @param sync_pattern [String] String representing a hex number ("0x1234")
|
|
58
|
-
# that will be searched for in the raw {Stream}. Bytes encountered before
|
|
59
|
-
# this pattern is found are discarded.
|
|
60
|
-
# @param fill_sync_pattern [Boolean] Fill the sync pattern when writing packets
|
|
61
|
-
def initialize(discard_leading_bytes = 0, sync_pattern = nil, fill_sync_pattern = false)
|
|
62
|
-
@discard_leading_bytes = discard_leading_bytes.to_i
|
|
63
|
-
@sync_pattern = ConfigParser.handle_nil(sync_pattern)
|
|
64
|
-
@sync_pattern = @sync_pattern.hex_to_byte_string if @sync_pattern
|
|
65
|
-
@fill_sync_pattern = ConfigParser.handle_true_false(fill_sync_pattern)
|
|
66
|
-
|
|
67
|
-
@stream = nil
|
|
68
|
-
@data = ''
|
|
69
|
-
@bytes_read = 0
|
|
70
|
-
@bytes_written = 0
|
|
71
|
-
|
|
72
|
-
@interface = nil
|
|
73
|
-
@post_read_data_callback = nil
|
|
74
|
-
@post_read_packet_callback = nil
|
|
75
|
-
@pre_write_packet_callback = nil
|
|
76
|
-
@post_write_data_callback = nil
|
|
77
|
-
@write_mutex = Mutex.new
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# @param interface [Interface] Sets the higher level interface which is
|
|
81
|
-
# using this StreamProtocol. If the interface defines post_read_data,
|
|
82
|
-
# post_read_packet, or pre_write_packet, then these methods will be
|
|
83
|
-
# called over any subclass implementations.
|
|
84
|
-
def interface=(interface)
|
|
85
|
-
@interface = interface
|
|
86
|
-
if @interface.respond_to? :post_read_data
|
|
87
|
-
@post_read_data_callback = @interface.method(:post_read_data)
|
|
88
|
-
end
|
|
89
|
-
if @interface.respond_to? :post_read_packet
|
|
90
|
-
@post_read_packet_callback = @interface.method(:post_read_packet)
|
|
91
|
-
end
|
|
92
|
-
if @interface.respond_to? :pre_write_packet
|
|
93
|
-
@pre_write_packet_callback = @interface.method(:pre_write_packet)
|
|
94
|
-
end
|
|
95
|
-
if @interface.respond_to? :post_write_data
|
|
96
|
-
@post_write_data_callback = @interface.method(:post_write_data)
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# @param stream [Stream] The stream this stream protocol should read and
|
|
101
|
-
# write to
|
|
102
|
-
def connect(stream)
|
|
103
|
-
@data = ''
|
|
104
|
-
@data.force_encoding('ASCII-8BIT')
|
|
105
|
-
@stream = stream
|
|
106
|
-
@stream.connect
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
# @return [Boolean] Whether the stream attribute has been set and is
|
|
110
|
-
# connected
|
|
111
|
-
def connected?
|
|
112
|
-
if @stream
|
|
113
|
-
@stream.connected?
|
|
114
|
-
else
|
|
115
|
-
false
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Disconnects from the underlying {Stream} by calling {Stream#disconnect}.
|
|
120
|
-
# Clears the data attribute.
|
|
121
|
-
def disconnect
|
|
122
|
-
@stream.disconnect if @stream
|
|
123
|
-
@data = ''
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Reads from the stream. It can look for a sync pattern before
|
|
127
|
-
# creating a Packet. It can discard a set number of bytes at the beginning
|
|
128
|
-
# of the stream before creating the Packet.
|
|
129
|
-
#
|
|
130
|
-
# If the post_read_data_callback is defined (post_read_data is
|
|
131
|
-
# implemented by the interface) then it is called to translate the
|
|
132
|
-
# raw data. Otherwise post_read_data is called which does nothing
|
|
133
|
-
# unless it is implemented by a subclass.
|
|
134
|
-
#
|
|
135
|
-
# @return [Packet|nil] A Packet of consisting of the bytes read from the
|
|
136
|
-
# stream.
|
|
137
|
-
def read
|
|
138
|
-
# Loop until we have a packet to give
|
|
139
|
-
loop do
|
|
140
|
-
result = handle_sync_pattern()
|
|
141
|
-
return nil unless result
|
|
142
|
-
|
|
143
|
-
# Reduce the data to a single packet
|
|
144
|
-
packet_data = reduce_to_single_packet()
|
|
145
|
-
return nil unless packet_data
|
|
146
|
-
|
|
147
|
-
# Discard leading bytes if necessary
|
|
148
|
-
packet_data.replace(packet_data[@discard_leading_bytes..-1]) if @discard_leading_bytes > 0
|
|
149
|
-
|
|
150
|
-
# Return data based on final_receive_processing
|
|
151
|
-
if @post_read_data_callback
|
|
152
|
-
packet_data = @post_read_data_callback.call(packet_data)
|
|
153
|
-
else
|
|
154
|
-
packet_data = post_read_data(packet_data)
|
|
155
|
-
end
|
|
156
|
-
if packet_data
|
|
157
|
-
if packet_data.length > 0
|
|
158
|
-
# Valid packet
|
|
159
|
-
packet = Packet.new(nil, nil, :BIG_ENDIAN, nil, packet_data)
|
|
160
|
-
if @post_read_packet_callback
|
|
161
|
-
packet = @post_read_packet_callback.call(packet)
|
|
162
|
-
else
|
|
163
|
-
packet = post_read_packet(packet)
|
|
164
|
-
end
|
|
165
|
-
return packet
|
|
166
|
-
else
|
|
167
|
-
# Packet should be ignored
|
|
168
|
-
next
|
|
169
|
-
end
|
|
170
|
-
else
|
|
171
|
-
# Connection lost
|
|
172
|
-
return nil
|
|
173
|
-
end
|
|
174
|
-
end # loop do
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
# Writes the packet data to the stream.
|
|
178
|
-
#
|
|
179
|
-
# If the pre_write_packet_callback is defined (pre_write_packet is
|
|
180
|
-
# implemented by the interface) then that is called to translate the
|
|
181
|
-
# packet into data. Otherwise pre_write_packet is called which
|
|
182
|
-
# returns the packet buffer unless it is implemented by a subclass.
|
|
183
|
-
#
|
|
184
|
-
# @param packet [Packet] Packet data to write to the stream
|
|
185
|
-
def write(packet)
|
|
186
|
-
@write_mutex.synchronize do
|
|
187
|
-
if @pre_write_packet_callback
|
|
188
|
-
data = @pre_write_packet_callback.call(packet)
|
|
189
|
-
else
|
|
190
|
-
data = pre_write_packet(packet)
|
|
191
|
-
end
|
|
192
|
-
if data
|
|
193
|
-
write_raw(data, false)
|
|
194
|
-
if @post_write_data_callback
|
|
195
|
-
@post_write_data_callback.call(packet, data)
|
|
196
|
-
else
|
|
197
|
-
post_write_data(packet, data)
|
|
198
|
-
end
|
|
199
|
-
else
|
|
200
|
-
# write aborted - don't write data
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
# Writes the raw binary string to the stream.
|
|
206
|
-
#
|
|
207
|
-
# @param data [String] Raw binary string
|
|
208
|
-
# @param take_mutex [Boolean] Whether or not to take the write_mutex
|
|
209
|
-
def write_raw(data, take_mutex = true)
|
|
210
|
-
@write_mutex.lock if take_mutex
|
|
211
|
-
begin
|
|
212
|
-
if connected?()
|
|
213
|
-
@stream.write(data)
|
|
214
|
-
@bytes_written += data.length
|
|
215
|
-
else
|
|
216
|
-
raise "Stream not connected for write_raw"
|
|
217
|
-
end
|
|
218
|
-
ensure
|
|
219
|
-
@write_mutex.unlock if take_mutex
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
# Called to perform modifications on read data before making it into a packet
|
|
224
|
-
#
|
|
225
|
-
# @param packet_data [String] Raw packet data
|
|
226
|
-
# @return [String] Potentially modified packet data
|
|
227
|
-
def post_read_data(packet_data)
|
|
228
|
-
packet_data
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
# Called to perform modifications on a read packet before it is given to the user
|
|
232
|
-
#
|
|
233
|
-
# @param packet [Packet] Original packet
|
|
234
|
-
# @return [Packet] Potentially modified packet
|
|
235
|
-
def post_read_packet(packet)
|
|
236
|
-
packet
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
# Called to perform modifications on write data before writing it out the stream
|
|
240
|
-
#
|
|
241
|
-
# @param packet [Packet] packet to write out
|
|
242
|
-
# @return [String] Potentially modified packet data
|
|
243
|
-
def pre_write_packet(packet)
|
|
244
|
-
data = packet.buffer(false)
|
|
245
|
-
if @fill_sync_pattern
|
|
246
|
-
# Put leading bytes back on
|
|
247
|
-
data = ("\x00" * @discard_leading_bytes) << data if @discard_leading_bytes > 0
|
|
248
|
-
|
|
249
|
-
# Fill the sync pattern
|
|
250
|
-
if @sync_pattern
|
|
251
|
-
BinaryAccessor.write(@sync_pattern,
|
|
252
|
-
0,
|
|
253
|
-
@sync_pattern.length * 8,
|
|
254
|
-
:BLOCK,
|
|
255
|
-
data,
|
|
256
|
-
:BIG_ENDIAN,
|
|
257
|
-
:ERROR)
|
|
258
|
-
end
|
|
259
|
-
end
|
|
260
|
-
data
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
# Called to perform actions after writing data to the stream
|
|
264
|
-
#
|
|
265
|
-
# @param packet [Packet] packet that was written out
|
|
266
|
-
# @param data [String] binary data that was written out
|
|
267
|
-
def post_write_data(packet, data)
|
|
268
|
-
# Default do nothing
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
protected
|
|
272
|
-
|
|
273
|
-
# @return [Boolean] Whether we successfully found a sync pattern
|
|
274
|
-
def handle_sync_pattern
|
|
275
|
-
if @sync_pattern
|
|
276
|
-
loop do
|
|
277
|
-
# Make sure we have some data to look for a sync word in
|
|
278
|
-
read_minimum_size(@sync_pattern.length)
|
|
279
|
-
return false if @data.length <= 0
|
|
280
|
-
|
|
281
|
-
# Find the beginning of the sync pattern
|
|
282
|
-
sync_index = @data.index(@sync_pattern.getbyte(0).chr)
|
|
283
|
-
if sync_index
|
|
284
|
-
# Make sure we have enough data for the whole sync pattern past this index
|
|
285
|
-
read_minimum_size(sync_index + @sync_pattern.length)
|
|
286
|
-
return false if @data.length <= 0
|
|
287
|
-
|
|
288
|
-
# Check for the rest of the sync pattern
|
|
289
|
-
found = true
|
|
290
|
-
index = sync_index
|
|
291
|
-
@sync_pattern.each_byte do |byte|
|
|
292
|
-
if @data.getbyte(index) != byte
|
|
293
|
-
found = false
|
|
294
|
-
break
|
|
295
|
-
end
|
|
296
|
-
index += 1
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
if found
|
|
300
|
-
if sync_index != 0
|
|
301
|
-
discard_length = @data[0..(sync_index - 1)].length
|
|
302
|
-
log_discard(discard_length, true)
|
|
303
|
-
# Delete Data Before Sync Pattern
|
|
304
|
-
@data.replace(@data[sync_index..-1])
|
|
305
|
-
end
|
|
306
|
-
return true
|
|
307
|
-
|
|
308
|
-
else # not found
|
|
309
|
-
log_discard(@data[0..sync_index].length, false)
|
|
310
|
-
# Delete Data Before and including first character of suspected sync Pattern
|
|
311
|
-
@data.replace(@data[(sync_index + 1)..-1])
|
|
312
|
-
next
|
|
313
|
-
end # if found
|
|
314
|
-
|
|
315
|
-
else # sync_index = nil
|
|
316
|
-
log_discard(@data.length, false)
|
|
317
|
-
@data.replace('')
|
|
318
|
-
next
|
|
319
|
-
end # unless sync_index.nil?
|
|
320
|
-
end # end loop
|
|
321
|
-
end # if @sync_pattern
|
|
322
|
-
|
|
323
|
-
true
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
def log_discard(length, found)
|
|
327
|
-
Logger.error("Sync #{'not ' unless found}found. Discarding #{length} bytes of data.")
|
|
328
|
-
if @data.length >= 6
|
|
329
|
-
Logger.error(sprintf("Starting: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
|
|
330
|
-
@data.getbyte(0), @data.getbyte(1), @data.getbyte(2), @data.getbyte(3), @data.getbyte(4), @data.getbyte(5)))
|
|
331
|
-
end
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
def reduce_to_single_packet
|
|
335
|
-
if @data.length <= 0
|
|
336
|
-
# Need to get some data
|
|
337
|
-
read_and_handle_timeout()
|
|
338
|
-
return nil if @data.length <= 0
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
# Reduce to packet data and clear data for next packet
|
|
342
|
-
packet_data = @data.clone
|
|
343
|
-
@data.replace('')
|
|
344
|
-
|
|
345
|
-
packet_data
|
|
346
|
-
end
|
|
347
|
-
|
|
348
|
-
def read_and_handle_timeout
|
|
349
|
-
begin
|
|
350
|
-
data = @stream.read
|
|
351
|
-
@bytes_read += data.length
|
|
352
|
-
rescue Timeout::Error
|
|
353
|
-
Logger.instance.error "Timeout waiting for data to be read"
|
|
354
|
-
data = ''
|
|
355
|
-
end
|
|
356
|
-
# data.length == 0 means that the stream was closed. Need to clear out @data and be done.
|
|
357
|
-
if data.length == 0
|
|
358
|
-
@data.replace('')
|
|
359
|
-
return
|
|
360
|
-
end
|
|
361
|
-
@data << data
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
def read_minimum_size(required_num_bytes)
|
|
365
|
-
while (@data.length < required_num_bytes)
|
|
366
|
-
read_and_handle_timeout()
|
|
367
|
-
return if @data.length <= 0
|
|
368
|
-
end
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
end # class StreamProtocol
|
|
372
|
-
|
|
373
|
-
end # module Cosmos
|