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
|
@@ -12,7 +12,6 @@ require 'cosmos/interfaces/tcpip_client_interface'
|
|
|
12
12
|
require 'uuidtools'
|
|
13
13
|
|
|
14
14
|
module Cosmos
|
|
15
|
-
|
|
16
15
|
# Interface for connecting to Ball Aerospace LINC Labview targets
|
|
17
16
|
class LincInterface < TcpipClientInterface
|
|
18
17
|
# The maximum number of asynchronous commands we can wait for at a time.
|
|
@@ -450,12 +449,11 @@ module Cosmos
|
|
|
450
449
|
# make packet - store on object as a defined packet of type command that this handshakes
|
|
451
450
|
@identified_command = System.commands.packet(interface_target_name, packet_name).clone
|
|
452
451
|
@identified_command.buffer = packet_data
|
|
453
|
-
@identified_command.received_time = Time.at(handshake.read('TIME_SECONDS'), handshake.read('TIME_MICROSECONDS'))
|
|
452
|
+
@identified_command.received_time = Time.at(handshake.read('TIME_SECONDS'), handshake.read('TIME_MICROSECONDS')).sys
|
|
454
453
|
end
|
|
455
454
|
|
|
456
455
|
def get_cmd_guid(fieldname_guid)
|
|
457
456
|
return @identified_command.read(fieldname_guid)
|
|
458
457
|
end
|
|
459
|
-
end
|
|
460
|
-
|
|
461
|
-
end # module Cosmos
|
|
458
|
+
end
|
|
459
|
+
end
|
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
# Reads all data available on the interface and creates a packet
|
|
17
|
+
# with that data.
|
|
18
|
+
class BurstProtocol < Protocol
|
|
19
|
+
# @param discard_leading_bytes [Integer] The number of bytes to discard
|
|
20
|
+
# from the binary data after reading. Note that this is often
|
|
21
|
+
# used to remove a sync pattern from the final packet data.
|
|
22
|
+
# @param sync_pattern [String] String representing a hex number ("0x1234")
|
|
23
|
+
# that will be searched for in the raw data. Bytes encountered before
|
|
24
|
+
# this pattern is found are discarded.
|
|
25
|
+
# @param fill_fields [Boolean] Fill any required fields when writing packets
|
|
26
|
+
def initialize(discard_leading_bytes = 0, sync_pattern = nil, fill_fields = false, allow_empty_data = false)
|
|
27
|
+
super(allow_empty_data)
|
|
28
|
+
@discard_leading_bytes = discard_leading_bytes.to_i
|
|
29
|
+
@sync_pattern = ConfigParser.handle_nil(sync_pattern)
|
|
30
|
+
@sync_pattern = @sync_pattern.hex_to_byte_string if @sync_pattern
|
|
31
|
+
@fill_fields = ConfigParser.handle_true_false(fill_fields)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def reset
|
|
35
|
+
super()
|
|
36
|
+
@data = ''
|
|
37
|
+
@data.force_encoding('ASCII-8BIT')
|
|
38
|
+
@sync_state = :SEARCHING
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Reads from the interface. It can look for a sync pattern before
|
|
42
|
+
# creating a Packet. It can discard a set number of bytes at the beginning
|
|
43
|
+
# before creating the Packet.
|
|
44
|
+
#
|
|
45
|
+
# @return [String|nil] Data for a packet consisting of the bytes read
|
|
46
|
+
def read_data(data)
|
|
47
|
+
@data << data
|
|
48
|
+
|
|
49
|
+
control = handle_sync_pattern()
|
|
50
|
+
return control if control
|
|
51
|
+
|
|
52
|
+
# Reduce the data to a single packet
|
|
53
|
+
packet_data = reduce_to_single_packet()
|
|
54
|
+
return packet_data if Symbol === packet_data
|
|
55
|
+
@sync_state = :SEARCHING
|
|
56
|
+
|
|
57
|
+
# Discard leading bytes if necessary
|
|
58
|
+
packet_data.replace(packet_data[@discard_leading_bytes..-1]) if @discard_leading_bytes > 0
|
|
59
|
+
packet_data
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Called to perform modifications on a command packet before it is sent
|
|
63
|
+
#
|
|
64
|
+
# @param packet [Packet] Original packet
|
|
65
|
+
# @return [Packet] Potentially modified packet
|
|
66
|
+
def write_packet(packet)
|
|
67
|
+
# If we're filling the sync pattern and the sync pattern is part of the
|
|
68
|
+
# packet (since we're not discarding any leading bytes) then we have to
|
|
69
|
+
# fill the sync pattern in the actual packet so do it here.
|
|
70
|
+
if @fill_fields && @sync_pattern && @discard_leading_bytes == 0
|
|
71
|
+
# Directly write the packet buffer and fill in the sync pattern
|
|
72
|
+
BinaryAccessor.write(@sync_pattern, 0, @sync_pattern.length * 8, :BLOCK,
|
|
73
|
+
packet.buffer(false), :BIG_ENDIAN, :ERROR)
|
|
74
|
+
end
|
|
75
|
+
packet
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Called to perform modifications on write data before sending it to the interface
|
|
79
|
+
#
|
|
80
|
+
# @param data [String] Raw packet data
|
|
81
|
+
# @return [String] Potentially modified packet data
|
|
82
|
+
def write_data(data)
|
|
83
|
+
# If we're filling the sync pattern and discarding the leading bytes
|
|
84
|
+
# during a read then we need to put them back during a write.
|
|
85
|
+
# If we're discarding the bytes then by definition they can't be part
|
|
86
|
+
# of the packet so we just modify the data.
|
|
87
|
+
if @fill_fields && @discard_leading_bytes > 0
|
|
88
|
+
data = ("\x00" * @discard_leading_bytes) << data
|
|
89
|
+
if @sync_pattern
|
|
90
|
+
BinaryAccessor.write(@sync_pattern, 0, @sync_pattern.length * 8, :BLOCK,
|
|
91
|
+
data, :BIG_ENDIAN, :ERROR)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
super(data)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @return [Boolean] control code (nil, :STOP)
|
|
98
|
+
def handle_sync_pattern
|
|
99
|
+
if @sync_pattern and @sync_state == :SEARCHING
|
|
100
|
+
loop do
|
|
101
|
+
# Make sure we have some data to look for a sync word in
|
|
102
|
+
return :STOP if @data.length < @sync_pattern.length
|
|
103
|
+
|
|
104
|
+
# Find the beginning of the sync pattern
|
|
105
|
+
sync_index = @data.index(@sync_pattern.getbyte(0).chr)
|
|
106
|
+
if sync_index
|
|
107
|
+
# Make sure we have enough data for the whole sync pattern past this index
|
|
108
|
+
return :STOP if @data.length < (sync_index + @sync_pattern.length)
|
|
109
|
+
|
|
110
|
+
# Check for the rest of the sync pattern
|
|
111
|
+
found = true
|
|
112
|
+
index = sync_index
|
|
113
|
+
@sync_pattern.each_byte do |byte|
|
|
114
|
+
if @data.getbyte(index) != byte
|
|
115
|
+
found = false
|
|
116
|
+
break
|
|
117
|
+
end
|
|
118
|
+
index += 1
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
if found
|
|
122
|
+
if sync_index != 0
|
|
123
|
+
discard_length = @data[0..(sync_index - 1)].length
|
|
124
|
+
log_discard(discard_length, true)
|
|
125
|
+
# Delete Data Before Sync Pattern
|
|
126
|
+
@data.replace(@data[sync_index..-1])
|
|
127
|
+
end
|
|
128
|
+
@sync_state = :FOUND
|
|
129
|
+
return nil
|
|
130
|
+
|
|
131
|
+
else # not found
|
|
132
|
+
log_discard(@data[0..sync_index].length, false)
|
|
133
|
+
# Delete Data Before and including first character of suspected sync Pattern
|
|
134
|
+
@data.replace(@data[(sync_index + 1)..-1])
|
|
135
|
+
next
|
|
136
|
+
end # if found
|
|
137
|
+
|
|
138
|
+
else # sync_index = nil
|
|
139
|
+
log_discard(@data.length, false)
|
|
140
|
+
@data.replace('')
|
|
141
|
+
return :STOP
|
|
142
|
+
end # unless sync_index.nil?
|
|
143
|
+
end # end loop
|
|
144
|
+
end # if @sync_pattern
|
|
145
|
+
nil
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def log_discard(length, found)
|
|
149
|
+
Logger.error("Sync #{'not ' unless found}found. Discarding #{length} bytes of data.")
|
|
150
|
+
if @data.length >= 0
|
|
151
|
+
Logger.error(sprintf("Starting: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
|
|
152
|
+
@data.length >= 1 ? @data.getbyte(0) : 0,
|
|
153
|
+
@data.length >= 2 ? @data.getbyte(1) : 0,
|
|
154
|
+
@data.length >= 3 ? @data.getbyte(2) : 0,
|
|
155
|
+
@data.length >= 4 ? @data.getbyte(3) : 0,
|
|
156
|
+
@data.length >= 5 ? @data.getbyte(4) : 0,
|
|
157
|
+
@data.length >= 6 ? @data.getbyte(5) : 0))
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def reduce_to_single_packet
|
|
162
|
+
if @data.length <= 0
|
|
163
|
+
# Need some data
|
|
164
|
+
return :STOP
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Reduce to packet data and clear data for next packet
|
|
168
|
+
packet_data = @data.clone
|
|
169
|
+
@data.replace('')
|
|
170
|
+
packet_data
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
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/config/config_parser'
|
|
12
|
+
require 'cosmos/interfaces/protocols/protocol'
|
|
13
|
+
require 'cosmos/utilities/crc'
|
|
14
|
+
require 'thread'
|
|
15
|
+
|
|
16
|
+
module Cosmos
|
|
17
|
+
# Creates a CRC on write and verifies a CRC on read
|
|
18
|
+
class CrcProtocol < Protocol
|
|
19
|
+
ERROR = "ERROR" # on CRC mismatch
|
|
20
|
+
DISCONNECT = "DISCONNECT" # on CRC mismatch
|
|
21
|
+
|
|
22
|
+
def initialize(write_item_name, strip_crc, bad_strategy, bit_offset,
|
|
23
|
+
bit_size = 32, endianness = 'BIG_ENDIAN',
|
|
24
|
+
poly = nil, seed = nil, xor = nil, reflect = nil)
|
|
25
|
+
@write_item_name = ConfigParser.handle_nil(write_item_name)
|
|
26
|
+
@strip_crc = ConfigParser.handle_true_false(strip_crc)
|
|
27
|
+
raise "Invalid strip CRC of '#{strip_crc}'. Must be TRUE or FALSE." unless !!@strip_crc == @strip_crc
|
|
28
|
+
|
|
29
|
+
case bad_strategy
|
|
30
|
+
when ERROR, DISCONNECT
|
|
31
|
+
@bad_strategy = bad_strategy
|
|
32
|
+
else
|
|
33
|
+
raise "Invalid bad CRC strategy of #{bad_strategy}. Must be ERROR or DISCONNECT."
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
case endianness.to_s.upcase
|
|
37
|
+
when 'BIG_ENDIAN'
|
|
38
|
+
@endianness = :BIG_ENDIAN # Convert to symbol for use in BinaryAccessor.write
|
|
39
|
+
when 'LITTLE_ENDIAN'
|
|
40
|
+
@endianness = :LITTLE_ENDIAN # Convert to symbol for use in BinaryAccessor.write
|
|
41
|
+
else
|
|
42
|
+
raise "Invalid endianness '#{endianness}'. Must be BIG_ENDIAN or LITTLE_ENDIAN."
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
@bit_offset = Integer(bit_offset)
|
|
46
|
+
raise "Invalid bit offset of #{bit_offset}. Must be divisible by 8." if bit_offset % 8 != 0
|
|
47
|
+
@bit_size = Integer(bit_size)
|
|
48
|
+
poly = Integer(poly) if poly
|
|
49
|
+
seed = Integer(seed) if seed
|
|
50
|
+
xor = ConfigParser.handle_true_false(xor) if xor
|
|
51
|
+
raise "Invalid XOR value of '#{xor}'. Must be TRUE or FALSE." if xor && !!xor != xor
|
|
52
|
+
reflect = ConfigParser.handle_true_false(reflect) if reflect
|
|
53
|
+
raise "Invalid reflect value of '#{reflect}'. Must be TRUE or FALSE." if reflect && !!reflect != reflect
|
|
54
|
+
# Built the CRC arguments array. All subsequent arguments are dependent
|
|
55
|
+
# on the previous ones so we build it up incrementally.
|
|
56
|
+
args = []
|
|
57
|
+
if poly
|
|
58
|
+
args << poly
|
|
59
|
+
if seed
|
|
60
|
+
args << seed
|
|
61
|
+
unless xor.nil? # Can't check raw variable because it could be false
|
|
62
|
+
args << xor
|
|
63
|
+
unless reflect.nil? # Can't check raw variable because it could be false
|
|
64
|
+
args << reflect
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
case bit_size
|
|
71
|
+
when 16
|
|
72
|
+
@pack = (@endianness == :BIG_ENDIAN) ? 'n' : 'v'
|
|
73
|
+
if args.empty?
|
|
74
|
+
@crc = Crc16.new
|
|
75
|
+
else
|
|
76
|
+
@crc = Crc16.new(*args)
|
|
77
|
+
end
|
|
78
|
+
when 32
|
|
79
|
+
@pack = (@endianness == :BIG_ENDIAN) ? 'N' : 'V'
|
|
80
|
+
if args.empty?
|
|
81
|
+
@crc = Crc32.new
|
|
82
|
+
else
|
|
83
|
+
@crc = Crc32.new(*args)
|
|
84
|
+
end
|
|
85
|
+
when 64
|
|
86
|
+
@pack = (@endianness == :BIG_ENDIAN) ? 'N' : 'V'
|
|
87
|
+
if args.empty?
|
|
88
|
+
@crc = Crc64.new
|
|
89
|
+
else
|
|
90
|
+
@crc = Crc64.new(*args)
|
|
91
|
+
end
|
|
92
|
+
else
|
|
93
|
+
raise "Invalid bit size of #{bit_size}. Must be 16, 32, or 64."
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def read_data(data)
|
|
98
|
+
crc = BinaryAccessor.read(@bit_offset, @bit_size, :UINT, data, @endianness)
|
|
99
|
+
calculated_crc = @crc.calc(data[0...(@bit_offset / 8)])
|
|
100
|
+
if calculated_crc != crc
|
|
101
|
+
Logger.error "Invalid CRC detected! Calculated 0x#{calculated_crc.to_s(16).upcase} vs found 0x#{crc.to_s(16).upcase}."
|
|
102
|
+
if @bad_strategy == DISCONNECT
|
|
103
|
+
return :DISCONNECT
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
if @strip_crc
|
|
107
|
+
new_data = data.dup
|
|
108
|
+
new_data = new_data[0...(@bit_offset / 8)]
|
|
109
|
+
end_range = (@bit_offset + @bit_size) / 8
|
|
110
|
+
new_data << data[end_range..-1] if end_range != 0
|
|
111
|
+
return new_data
|
|
112
|
+
end
|
|
113
|
+
return data
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def write_packet(packet)
|
|
117
|
+
if @write_item_name
|
|
118
|
+
end_range = packet.get_item(@write_item_name).bit_offset / 8
|
|
119
|
+
crc = @crc.calc(packet.buffer(false)[0...end_range])
|
|
120
|
+
packet.write(@write_item_name, crc)
|
|
121
|
+
end
|
|
122
|
+
packet
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def write_data(data)
|
|
126
|
+
unless @write_item_name
|
|
127
|
+
if @bit_size == 64
|
|
128
|
+
crc = @crc.calc(data)
|
|
129
|
+
data << ("\x00" * 8)
|
|
130
|
+
BinaryAccessor.write((crc >> 32), -64, 32, :UINT, data, @endianness, :ERROR)
|
|
131
|
+
BinaryAccessor.write((crc & 0xFFFFFFFF), -32, 32, :UINT, data, @endianness, :ERROR)
|
|
132
|
+
else
|
|
133
|
+
crc = @crc.calc(data)
|
|
134
|
+
data << ("\x00" * (@bit_size / 8))
|
|
135
|
+
BinaryAccessor.write(crc, -@bit_size, @bit_size, :UINT, data, @endianness, :ERROR)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
data
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -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,41 +9,44 @@
|
|
|
9
9
|
# attribution addendums as found in the LICENSE.txt
|
|
10
10
|
|
|
11
11
|
require 'cosmos/config/config_parser'
|
|
12
|
-
require 'cosmos/
|
|
12
|
+
require 'cosmos/interfaces/protocols/burst_protocol'
|
|
13
13
|
|
|
14
14
|
module Cosmos
|
|
15
15
|
|
|
16
|
-
#
|
|
16
|
+
# Delineates packets by identifying them and then
|
|
17
17
|
# reading out their entire fixed length. Packets lengths can vary but
|
|
18
18
|
# they must all be fixed.
|
|
19
|
-
class
|
|
20
|
-
|
|
19
|
+
class FixedProtocol < BurstProtocol
|
|
21
20
|
# @param min_id_size [Integer] The minimum amount of data needed to
|
|
22
21
|
# identify a packet.
|
|
23
|
-
# @param discard_leading_bytes (see
|
|
24
|
-
# @param sync_pattern (see
|
|
25
|
-
# @param
|
|
22
|
+
# @param discard_leading_bytes (see BurstProtocol#initialize)
|
|
23
|
+
# @param sync_pattern (see BurstProtocol#initialize)
|
|
24
|
+
# @param telemetry [Boolean] Whether the interface is returning
|
|
26
25
|
# telemetry (true) or commands (false)
|
|
27
|
-
# @param
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
# @param fill_fields (see BurstProtocol#initialize)
|
|
27
|
+
# @param unknown_raise Whether to raise an exception on an unknown packet
|
|
28
|
+
def initialize(
|
|
29
|
+
min_id_size,
|
|
30
|
+
discard_leading_bytes = 0,
|
|
31
|
+
sync_pattern = nil,
|
|
32
|
+
telemetry = true,
|
|
33
|
+
fill_fields = false,
|
|
34
|
+
unknown_raise = false
|
|
35
|
+
)
|
|
36
|
+
super(discard_leading_bytes, sync_pattern, fill_fields)
|
|
34
37
|
@min_id_size = Integer(min_id_size)
|
|
35
|
-
@
|
|
38
|
+
@telemetry = telemetry
|
|
39
|
+
@unknown_raise = ConfigParser::handle_true_false(unknown_raise)
|
|
36
40
|
end
|
|
37
41
|
|
|
38
42
|
# Set the received_time, target_name and packet_name which we recorded when
|
|
39
43
|
# we identified this packet. The server will also do this but since we know
|
|
40
44
|
# the information here, we perform this optimization.
|
|
41
|
-
|
|
42
|
-
def post_read_packet(packet)
|
|
45
|
+
def read_packet(packet)
|
|
43
46
|
packet.received_time = @received_time
|
|
44
47
|
packet.target_name = @target_name
|
|
45
48
|
packet.packet_name = @packet_name
|
|
46
|
-
packet
|
|
49
|
+
return packet
|
|
47
50
|
end
|
|
48
51
|
|
|
49
52
|
protected
|
|
@@ -52,16 +55,16 @@ module Cosmos
|
|
|
52
55
|
# returned but the packet that matched is recorded so it can be set in the
|
|
53
56
|
# post_read_packet callback.
|
|
54
57
|
#
|
|
55
|
-
# @return [String|
|
|
56
|
-
#
|
|
58
|
+
# @return [String|Symbol] The identified packet data or :STOP if more data
|
|
59
|
+
# is required to build a packet
|
|
57
60
|
def identify_and_finish_packet
|
|
58
61
|
packet_data = nil
|
|
62
|
+
identified_packet = nil
|
|
59
63
|
|
|
60
|
-
raise "Interface required for FixedStreamProtocol" unless @interface
|
|
61
64
|
@interface.target_names.each do |target_name|
|
|
62
65
|
target_packets = nil
|
|
63
66
|
begin
|
|
64
|
-
if @
|
|
67
|
+
if @telemetry
|
|
65
68
|
target_packets = System.telemetry.packets(target_name)
|
|
66
69
|
else
|
|
67
70
|
target_packets = System.commands.packets(target_name)
|
|
@@ -71,18 +74,16 @@ module Cosmos
|
|
|
71
74
|
next
|
|
72
75
|
end
|
|
73
76
|
|
|
74
|
-
identified_packet = nil
|
|
75
77
|
target_packets.each do |packet_name, packet|
|
|
76
78
|
if (packet.identify?(@data))
|
|
77
79
|
identified_packet = packet
|
|
78
80
|
if identified_packet.defined_length > @data.length
|
|
79
|
-
#
|
|
80
|
-
|
|
81
|
-
return nil if @data.length <= 0
|
|
81
|
+
# Check if need more data to finish packet
|
|
82
|
+
return :STOP if @data.length < identified_packet.defined_length
|
|
82
83
|
end
|
|
83
84
|
# Set some variables so we can update the packet in
|
|
84
85
|
# post_read_packet
|
|
85
|
-
@received_time = Time.now
|
|
86
|
+
@received_time = Time.now.sys
|
|
86
87
|
@target_name = identified_packet.target_name
|
|
87
88
|
@packet_name = identified_packet.packet_name
|
|
88
89
|
|
|
@@ -92,20 +93,22 @@ module Cosmos
|
|
|
92
93
|
break
|
|
93
94
|
end
|
|
94
95
|
end
|
|
95
|
-
|
|
96
96
|
break if identified_packet
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
unless identified_packet
|
|
100
|
+
raise "Unknown data received by FixedProtocol" if @unknown_raise
|
|
101
|
+
# Unknown packet? Just return all the current data
|
|
102
|
+
packet_data = @data.clone
|
|
103
|
+
@data.replace('')
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
return packet_data
|
|
100
107
|
end
|
|
101
108
|
|
|
102
109
|
def reduce_to_single_packet
|
|
103
|
-
|
|
104
|
-
return nil if @data.length <= 0
|
|
105
|
-
|
|
110
|
+
return :STOP if @data.length < @min_id_size
|
|
106
111
|
identify_and_finish_packet()
|
|
107
112
|
end
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
end # module Cosmos
|
|
113
|
+
end
|
|
114
|
+
end
|