cosmos 4.3.0 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- data/.github/ISSUE_TEMPLATE/help---usage---general-question.md +12 -0
- data/.gitignore +1 -0
- data/.travis.yml +5 -5
- data/Manifest.txt +81 -44
- data/Rakefile +9 -0
- data/appveyor.yml +2 -1
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
- data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
- data/autohotkey/config/targets/INST/lib/sim_inst.rb +3 -1
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/autohotkey/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/autohotkey/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +2 -4
- data/autohotkey/config/tools/table_manager/SubTables/OneDimensionalSubTable_def.txt +31 -0
- data/autohotkey/config/tools/table_manager/SubTables/TwoDimensionalSubTable_def.txt +28 -0
- data/autohotkey/config/tools/test_runner/test_runner.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner3.txt +1 -1
- data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
- data/autohotkey/tools/limits_monitor.ahk +1 -1
- data/autohotkey/tools/packet_viewer.ahk +1 -1
- data/autohotkey/tools/script_runner.ahk +16 -4
- data/bin/cosmos +1 -1
- data/bin/xtce_converter +1 -1
- data/cosmos.gemspec +5 -7
- data/data/config/_interfaces.yaml +4 -0
- data/data/config/cmd_sequence.yaml +14 -0
- data/data/config/housekeeping_params.yaml +14 -0
- data/data/config/interface_modifiers.yaml +11 -0
- data/data/config/item_modifiers.yaml +2 -1
- data/data/config/launcher.yaml +12 -2
- data/data/config/param_item_modifiers.yaml +2 -2
- data/data/config/parameter_modifiers.yaml +20 -0
- data/data/config/screen.yaml +2 -0
- data/data/config/script_runner.yaml +9 -0
- data/data/config/system.yaml +47 -10
- data/data/config/table_manager.yaml +7 -0
- data/data/config/target.yaml +12 -0
- data/data/config/telemetry_modifiers.yaml +3 -1
- data/data/config/test_runner.yaml +10 -9
- data/data/config/widgets.yaml +174 -11
- data/data/crc.txt +128 -125
- data/demo/Gemfile +1 -1
- data/demo/Launcher.bat +1 -9
- data/demo/Launcher2.bat +1 -0
- data/demo/LauncherMini.bat +1 -0
- data/demo/config/data/crc.txt +40 -20
- data/demo/config/system/system.txt +1 -1
- data/demo/config/system/system_alt_ports.txt +1 -1
- data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +1 -0
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +2 -1
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +7 -7
- data/demo/config/targets/INST/cmd_tlm_server.txt +2 -0
- data/demo/config/targets/INST/lib/sim_inst.rb +15 -3
- data/demo/config/targets/INST/screens/adcs.txt +2 -2
- data/demo/config/targets/INST/screens/block.txt +1 -1
- data/demo/config/targets/INST/screens/commanding.txt +1 -1
- data/demo/config/targets/INST/screens/ground.txt +27 -5
- data/demo/config/targets/INST/screens/ground_error.gif +0 -0
- data/demo/config/{data/groundoff.gif → targets/INST/screens/ground_off.gif} +0 -0
- data/demo/config/{data/groundon.gif → targets/INST/screens/ground_on.gif} +0 -0
- data/demo/config/targets/INST/screens/limits.txt +69 -31
- data/demo/config/targets/INST/screens/other.txt +13 -3
- data/demo/config/targets/INST/screens/params.txt +54 -0
- data/demo/config/targets/INST/screens/satellite.gif +0 -0
- data/demo/config/tools/data_viewer/data_viewer.txt +3 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/demo/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/demo/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/demo/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/demo/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/demo/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/demo/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/demo/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/demo/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/demo/config/tools/script_runner/script_runner.txt +1 -2
- data/demo/config/tools/test_runner/test_runner.txt +3 -1
- data/demo/lib/example_background_task.rb +1 -0
- data/demo/procedures/cosmos_api_test.rb +1 -1
- data/demo/procedures/interactive.rb +22 -0
- data/ext/cosmos/ext/packet/packet.c +0 -77
- data/install/Gemfile +1 -1
- data/install/Launcher.bat +1 -9
- data/install/config/data/crc.txt +17 -1
- data/install/config/system/system.txt +1 -1
- data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/install/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/install/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/install/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/install/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/install/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/install/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/install/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/install/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/lib/cosmos/config/config_parser.rb +4 -5
- data/lib/cosmos/dart/lib/dart_common.rb +1 -1
- data/lib/cosmos/gui/dialogs/details_dialog.rb +16 -1
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -0
- data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +4 -2
- data/lib/cosmos/gui/opengl/earth_model.rb +1 -1
- data/lib/cosmos/gui/qt.rb +3 -1
- data/lib/cosmos/gui/qt_tool.rb +46 -23
- data/lib/cosmos/gui/text/ruby_editor.rb +44 -41
- data/lib/cosmos/gui/utilities/screenshot.rb +1 -1
- data/lib/cosmos/gui/utilities/script_module_gui.rb +92 -92
- data/lib/cosmos/interfaces.rb +1 -0
- data/lib/cosmos/interfaces/interface.rb +5 -1
- data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +40 -18
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +6 -1
- data/lib/cosmos/interfaces/simulated_target_interface.rb +14 -5
- data/lib/cosmos/io/json_drb.rb +11 -7
- data/lib/cosmos/packets/commands.rb +28 -11
- data/lib/cosmos/packets/packet.rb +69 -32
- data/lib/cosmos/packets/packet_config.rb +34 -1
- data/lib/cosmos/packets/parsers/state_parser.rb +0 -1
- data/lib/cosmos/packets/parsers/xtce_converter.rb +2 -0
- data/lib/cosmos/packets/parsers/xtce_parser.rb +4 -3
- data/lib/cosmos/packets/structure.rb +4 -2
- data/lib/cosmos/packets/telemetry.rb +19 -3
- data/lib/cosmos/script/api_shared.rb +12 -9
- data/lib/cosmos/script/scripting.rb +16 -14
- data/lib/cosmos/system/system.rb +39 -20
- data/lib/cosmos/system/target.rb +39 -9
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +94 -35
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +3 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +1 -1
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +2 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +30 -4
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +1 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +9 -12
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +5 -2
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +2 -0
- data/lib/cosmos/tools/config_editor/config_editor.rb +80 -24
- data/lib/cosmos/tools/config_editor/config_editor_frame.rb +2 -0
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +15 -9
- data/lib/cosmos/tools/data_viewer/dump_component.rb +2 -9
- data/lib/cosmos/tools/data_viewer/text_component.rb +77 -0
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +64 -38
- data/lib/cosmos/tools/launcher/launcher.rb +1 -0
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +31 -17
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +8 -6
- data/lib/cosmos/tools/script_runner/script_runner.rb +87 -29
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +14 -0
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +41 -7
- data/lib/cosmos/tools/table_manager/table_config.rb +5 -3
- data/lib/cosmos/tools/table_manager/table_manager.rb +6 -3
- data/lib/cosmos/tools/test_runner/test_runner.rb +14 -9
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +21 -9
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +3 -3
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +5 -8
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +11 -8
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +9 -15
- data/lib/cosmos/tools/tlm_viewer/screen.rb +3 -1
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +19 -13
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +2 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +4 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +4 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_clickable.rb +16 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +17 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +1 -2
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +12 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +79 -29
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +2 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +2 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +4 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +33 -25
- data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +4 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +5 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +6 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +2 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +10 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelled_widget.rb +58 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +2 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +2 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitscolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangecolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/led_widget.rb +108 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/limits_widget.rb +60 -10
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +22 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/limitscolor_widget.rb +19 -13
- data/lib/cosmos/tools/tlm_viewer/widgets/limitscolumn_widget.rb +22 -8
- data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +4 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +1 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +10 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +7 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +4 -6
- data/lib/cosmos/tools/tlm_viewer/widgets/rangecolumn_widget.rb +3 -5
- data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +4 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +4 -6
- data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +13 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +2 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +6 -12
- data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +5 -10
- data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +5 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +4 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitscolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +3 -4
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangecolumn_widget.rb +2 -3
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +8 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +9 -7
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +54 -46
- data/lib/cosmos/top_level.rb +23 -12
- data/lib/cosmos/version.rb +4 -4
- data/spec/gui/utilities/script_module_gui_spec.rb +44 -63
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -1
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +5 -5
- data/spec/install/yaml_docs_spec.rb +112 -0
- data/spec/interfaces/protocols/fixed_protocol_spec.rb +20 -9
- data/spec/interfaces/protocols/template_protocol_spec.rb +78 -25
- data/spec/packets/commands_spec.rb +22 -0
- data/spec/packets/packet_config_spec.rb +24 -0
- data/spec/packets/packet_item_spec.rb +2 -2
- data/spec/packets/packet_spec.rb +39 -6
- data/spec/packets/parsers/state_parser_spec.rb +33 -11
- data/spec/packets/structure_spec.rb +41 -0
- data/spec/packets/telemetry_spec.rb +23 -0
- data/spec/streams/tcpip_socket_stream_spec.rb +32 -27
- data/spec/system/system_spec.rb +77 -2
- data/spec/system/target_spec.rb +62 -1
- data/spec/tools/cmd_tlm_server/api_spec.rb +1 -1
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -7
- data/spec/top_level/top_level_spec.rb +29 -5
- data/tasks/gemfile_stats.rake +28 -14
- data/test/performance/config/system/system.txt +0 -0
- data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +5 -5
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.css +397 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap-theme.min.css +7 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.css +7118 -0
- data/test/performance/config/tools/handbook_creator/assets/css/bootstrap.min.css +7 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/test/performance/config/tools/handbook_creator/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.bmp +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.gif +0 -0
- data/test/performance/config/tools/handbook_creator/assets/img/ball_logo.jpg +0 -0
- data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.js +2006 -0
- data/test/performance/config/tools/handbook_creator/assets/js/bootstrap.min.js +7 -0
- data/test/performance/config/tools/handbook_creator/assets/js/html5shiv.js +8 -0
- data/test/performance/config/tools/handbook_creator/assets/js/jquery-1.10.2.min.js +6 -0
- data/test/performance/config/tools/handbook_creator/assets/js/respond.min.js +6 -0
- data/test/performance/config/tools/test_runner/test_runner.txt +1 -1
- data/test/performance/procedures/cosmos_api_test.rb +1 -1
- data/test/performance/tools/identify_performance.rb +82 -0
- metadata +92 -55
@@ -12,7 +12,7 @@ require 'cosmos/tools/tlm_viewer/widgets/widget'
|
|
12
12
|
require 'cosmos/tools/tlm_viewer/widgets/layout_widget'
|
13
13
|
|
14
14
|
module Cosmos
|
15
|
-
|
15
|
+
# Layout widget which creates a scrollable window
|
16
16
|
class ScrollwindowWidget < Qt::VBoxLayout
|
17
17
|
include Widget
|
18
18
|
include LayoutWidget
|
@@ -31,5 +31,4 @@ module Cosmos
|
|
31
31
|
@parent_layout.addWidget(scroll)
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
end # module Cosmos
|
34
|
+
end
|
@@ -14,7 +14,7 @@ require 'cosmos/tools/tlm_viewer/widgets/label_widget'
|
|
14
14
|
require 'cosmos/tools/tlm_viewer/widgets/horizontalline_widget'
|
15
15
|
|
16
16
|
module Cosmos
|
17
|
-
|
17
|
+
# Vertically stacks a LabelWidget on top of a HorizontallineWidget
|
18
18
|
class SectionheaderWidget < Qt::Widget
|
19
19
|
include Widget
|
20
20
|
include MultiWidget
|
@@ -29,5 +29,4 @@ module Cosmos
|
|
29
29
|
parent_layout.addWidget(self) if parent_layout
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
33
|
-
end # module Cosmos
|
32
|
+
end
|
@@ -12,9 +12,9 @@ require 'cosmos'
|
|
12
12
|
require 'cosmos/tools/tlm_viewer/widgets/widget'
|
13
13
|
|
14
14
|
module Cosmos
|
15
|
-
|
16
|
-
#
|
17
|
-
#
|
15
|
+
# Creates a Qt::SpacerItem which affects the positioning of other
|
16
|
+
# widgets around it. The width and height must be given and the
|
17
|
+
# size policy follows. See the Qt documentation for more details.
|
18
18
|
class SpacerWidget < Qt::Widget
|
19
19
|
include Widget
|
20
20
|
|
@@ -49,7 +49,5 @@ module Cosmos
|
|
49
49
|
return Qt::SizePolicy::Minimum
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
53
52
|
end
|
54
|
-
|
55
|
-
end # module Cosmos
|
53
|
+
end
|
@@ -12,7 +12,7 @@ require 'cosmos/tools/tlm_viewer/widgets/widget'
|
|
12
12
|
require 'cosmos/tools/tlm_viewer/widgets/layout_widget'
|
13
13
|
|
14
14
|
module Cosmos
|
15
|
-
|
15
|
+
# Layout widget which creates a Qt::TabWidget to contain TABITEM widgets
|
16
16
|
class TabbookWidget < Qt::TabWidget
|
17
17
|
include Widget
|
18
18
|
include LayoutWidget
|
@@ -22,5 +22,4 @@ module Cosmos
|
|
22
22
|
parent_layout.addWidget(self) if parent_layout
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
26
|
-
end # module Cosmos
|
25
|
+
end
|
@@ -12,7 +12,7 @@ require 'cosmos/tools/tlm_viewer/widgets/widget'
|
|
12
12
|
require 'cosmos/tools/tlm_viewer/widgets/layout_widget'
|
13
13
|
|
14
14
|
module Cosmos
|
15
|
-
|
15
|
+
# Layout widget used within the TABBOOK widget to create tabs
|
16
16
|
class TabitemWidget < Qt::VBoxLayout
|
17
17
|
include Widget
|
18
18
|
include LayoutWidget
|
@@ -24,5 +24,4 @@ module Cosmos
|
|
24
24
|
parent_layout.addTab(w, text.to_s) if parent_layout
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
28
|
-
end # module Cosmos
|
27
|
+
end
|
@@ -13,7 +13,8 @@ require 'cosmos/tools/tlm_viewer/widgets/widget'
|
|
13
13
|
require 'cosmos/tools/tlm_viewer/widgets/aging_widget'
|
14
14
|
|
15
15
|
module Cosmos
|
16
|
-
|
16
|
+
# Displays a text box with the telemetry value. The box creates scrollbars
|
17
|
+
# if the data content is too large to completely display.
|
17
18
|
class TextboxWidget < Qt::TextEdit
|
18
19
|
include Widget
|
19
20
|
include AgingWidget
|
@@ -24,6 +25,15 @@ module Cosmos
|
|
24
25
|
setFixedSize(width.to_i, height.to_i)
|
25
26
|
setReadOnly(true)
|
26
27
|
parent_layout.addWidget(self) if parent_layout
|
28
|
+
|
29
|
+
# Create update flag and don't update when the scroll bars are down
|
30
|
+
@update = true
|
31
|
+
verticalScrollBar().connect(SIGNAL('sliderPressed()')) do
|
32
|
+
@update = false
|
33
|
+
end
|
34
|
+
verticalScrollBar().connect(SIGNAL('sliderReleased()')) do
|
35
|
+
@update = true
|
36
|
+
end
|
27
37
|
end
|
28
38
|
|
29
39
|
def format_value(data)
|
@@ -31,6 +41,7 @@ module Cosmos
|
|
31
41
|
end
|
32
42
|
|
33
43
|
def value=(data)
|
44
|
+
return unless @update
|
34
45
|
scroll_pos = self.verticalScrollBar.value
|
35
46
|
self.text = super(data, format_value(data))
|
36
47
|
self.setColors(@foreground, @background)
|
@@ -41,7 +52,5 @@ module Cosmos
|
|
41
52
|
super
|
42
53
|
process_aging_settings
|
43
54
|
end
|
44
|
-
|
45
55
|
end
|
46
|
-
|
47
|
-
end # module Cosmos
|
56
|
+
end
|
@@ -11,16 +11,15 @@
|
|
11
11
|
require 'cosmos/tools/tlm_viewer/widgets/widget'
|
12
12
|
|
13
13
|
module Cosmos
|
14
|
-
|
14
|
+
# Creates a text field
|
15
15
|
class TextfieldWidget < Qt::LineEdit
|
16
16
|
include Widget
|
17
17
|
|
18
|
-
def initialize
|
18
|
+
def initialize(parent_layout, num_characters = 12, default_text = '')
|
19
19
|
super()
|
20
20
|
setText(default_text.to_s)
|
21
21
|
setMaxLength(num_characters.to_i)
|
22
22
|
parent_layout.addWidget(self) if parent_layout
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
26
|
-
end # module Cosmos
|
25
|
+
end
|
@@ -13,10 +13,7 @@ require 'cosmos/tools/tlm_viewer/widgets/linegraph_widget'
|
|
13
13
|
require 'cosmos/script'
|
14
14
|
|
15
15
|
module Cosmos
|
16
|
-
|
17
|
-
# TimegraphWidget class
|
18
|
-
#
|
19
|
-
# This class creates a graph of the supplied data value versus time.
|
16
|
+
# This class creates a graph of the supplied data value versus time
|
20
17
|
class TimegraphWidget < LinegraphWidget
|
21
18
|
|
22
19
|
def initialize(parent_layout, target_name, packet_name, item_name, num_samples = 100, width = 300, height = 200, point_size = 5, time_item_name = 'PACKET_TIMESECONDS', value_type = :CONVERTED)
|
@@ -85,7 +82,5 @@ module Cosmos
|
|
85
82
|
self.graph
|
86
83
|
end
|
87
84
|
end
|
88
|
-
|
89
85
|
end
|
90
|
-
|
91
|
-
end # module Cosmos
|
86
|
+
end
|
@@ -8,20 +8,14 @@
|
|
8
8
|
# as published by the Free Software Foundation; version 3 with
|
9
9
|
# attribution addendums as found in the LICENSE.txt
|
10
10
|
|
11
|
-
require 'cosmos/tools/tlm_viewer/widgets/
|
11
|
+
require 'cosmos/tools/tlm_viewer/widgets/label_widget'
|
12
12
|
|
13
13
|
module Cosmos
|
14
|
-
|
15
|
-
class TitleWidget <
|
16
|
-
|
17
|
-
|
18
|
-
def initialize(parent_layout, text)
|
19
|
-
super()
|
20
|
-
self.text = text.to_s.remove_quotes
|
21
|
-
setFont(Cosmos.getFont("helvetica", 14, Qt::Font::Bold))
|
14
|
+
# Creates a centered label with the specified font
|
15
|
+
class TitleWidget < LabelWidget
|
16
|
+
def initialize(parent_layout, text, font_name = "Helvetica", point_size = 14, bold = "BOLD", italic = false)
|
17
|
+
super(parent_layout, text, font_name, point_size, bold, italic)
|
22
18
|
setAlignment(Qt::AlignCenter)
|
23
|
-
parent_layout.addWidget(self) if parent_layout
|
24
19
|
end
|
25
20
|
end
|
26
|
-
|
27
|
-
end # module Cosmos
|
21
|
+
end
|
@@ -15,9 +15,10 @@
|
|
15
15
|
require 'cosmos/tools/tlm_viewer/widgets/limitsbar_widget'
|
16
16
|
|
17
17
|
module Cosmos
|
18
|
-
|
18
|
+
# Displays a limits bar with the defined limits and a vertical bar indicating
|
19
|
+
# the current value. A black dot is displayed that indicates the value from X
|
20
|
+
# seconds ago (60s by default).
|
19
21
|
class TrendbarWidget < LimitsbarWidget
|
20
|
-
|
21
22
|
MAX_TREND_SECONDS = 3600.0
|
22
23
|
|
23
24
|
def initialize (parent_layout, target_name, packet_name, item_name, value_type = :CONVERTED, trend_seconds = 60.0, width = 160, height = 25, trend_value_handle = nil)
|
@@ -30,9 +31,6 @@ module Cosmos
|
|
30
31
|
# Track the total number of samples received. This will help us to know how many
|
31
32
|
# trendlines to plot before we reach the maximum.
|
32
33
|
@samples_received = 0
|
33
|
-
|
34
|
-
# The actual difference (delta) between the current value and the desired trend value.
|
35
|
-
@trend_delta = nil
|
36
34
|
@trend_points = 1
|
37
35
|
@trend_data = [0]
|
38
36
|
end
|
@@ -42,9 +40,8 @@ module Cosmos
|
|
42
40
|
adjust_trend_points_and_data()
|
43
41
|
end
|
44
42
|
|
45
|
-
def value=
|
43
|
+
def value=(data)
|
46
44
|
@value = data.to_f
|
47
|
-
|
48
45
|
@samples_received += 1
|
49
46
|
|
50
47
|
# Remove the oldest value off the end (right) and insert on the
|
@@ -123,8 +120,6 @@ module Cosmos
|
|
123
120
|
adjust_trend_points_and_data()
|
124
121
|
end
|
125
122
|
end
|
126
|
-
|
127
123
|
end
|
128
|
-
|
129
|
-
end # module Cosmos
|
124
|
+
end
|
130
125
|
|
@@ -21,7 +21,10 @@ require 'cosmos/tools/tlm_viewer/widgets/textfield_widget'
|
|
21
21
|
require 'cosmos/tools/tlm_viewer/widgets/trendbar_widget'
|
22
22
|
|
23
23
|
module Cosmos
|
24
|
-
|
24
|
+
# Displays the current value followed by the current trend value
|
25
|
+
# (the current value minus the value X samples ago) followed by a
|
26
|
+
# limits bar with the defined limits. The limits bar shows the current
|
27
|
+
# value as a vertical line and the trend value as a black dot.
|
25
28
|
class TrendlimitsbarWidget < Qt::Widget
|
26
29
|
include Widget
|
27
30
|
include MultiWidget
|
@@ -42,5 +45,4 @@ module Cosmos
|
|
42
45
|
return true
|
43
46
|
end
|
44
47
|
end
|
45
|
-
|
46
|
-
end # module Cosmos
|
48
|
+
end
|
@@ -13,7 +13,9 @@ require 'cosmos/tools/tlm_viewer/widgets/widget'
|
|
13
13
|
require 'cosmos/tools/tlm_viewer/widgets/aging_widget'
|
14
14
|
|
15
15
|
module Cosmos
|
16
|
-
|
16
|
+
# Displays a telemetry value that ages over time by the background fading
|
17
|
+
# from white to grey if the telemetry value is not changing. A new telemetry
|
18
|
+
# value updates the display back to a white background.
|
17
19
|
class ValueWidget < Qt::LineEdit
|
18
20
|
include Widget
|
19
21
|
include AgingWidget
|
@@ -37,7 +39,5 @@ module Cosmos
|
|
37
39
|
super
|
38
40
|
process_aging_settings
|
39
41
|
end
|
40
|
-
|
41
42
|
end
|
42
|
-
|
43
|
-
end # module Cosmos
|
43
|
+
end
|
@@ -14,7 +14,7 @@ require 'cosmos/tools/tlm_viewer/widgets/value_widget'
|
|
14
14
|
require 'cosmos/tools/tlm_viewer/widgets/limitsbar_widget'
|
15
15
|
|
16
16
|
module Cosmos
|
17
|
-
|
17
|
+
# Displays a ValueWidget followed by a LimitsbarWidget
|
18
18
|
class ValuelimitsbarWidget < Qt::Widget
|
19
19
|
include Widget
|
20
20
|
include MultiWidget
|
@@ -33,5 +33,4 @@ module Cosmos
|
|
33
33
|
return true
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
37
|
-
end # module Cosmos
|
36
|
+
end
|
@@ -14,7 +14,7 @@ require 'cosmos/tools/tlm_viewer/widgets/value_widget'
|
|
14
14
|
require 'cosmos/tools/tlm_viewer/widgets/limitscolumn_widget'
|
15
15
|
|
16
16
|
module Cosmos
|
17
|
-
|
17
|
+
# Vertically stacks a LimitscolumnWidget on a ValueWidget
|
18
18
|
class ValuelimitscolumnWidget < Qt::Widget
|
19
19
|
include Widget
|
20
20
|
include MultiWidget
|
@@ -33,5 +33,4 @@ module Cosmos
|
|
33
33
|
return true
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
37
|
-
end # module Cosmos
|
36
|
+
end
|
@@ -14,12 +14,12 @@ require 'cosmos/tools/tlm_viewer/widgets/value_widget'
|
|
14
14
|
require 'cosmos/tools/tlm_viewer/widgets/rangebar_widget'
|
15
15
|
|
16
16
|
module Cosmos
|
17
|
-
|
17
|
+
# Displays a ValueWidget followed by a RangebarWidget
|
18
18
|
class ValuerangebarWidget < Qt::Widget
|
19
19
|
include Widget
|
20
20
|
include MultiWidget
|
21
21
|
|
22
|
-
def initialize
|
22
|
+
def initialize(parent_layout, target_name, packet_name, item_name, low_value, high_value, value_type = :WITH_UNITS, characters = 12, width = 160, height = 25)
|
23
23
|
super(target_name, packet_name, item_name, value_type)
|
24
24
|
setLayout(Qt::HBoxLayout.new())
|
25
25
|
layout.setSpacing(1)
|
@@ -33,5 +33,4 @@ module Cosmos
|
|
33
33
|
return true
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
37
|
-
end # module Cosmos
|
36
|
+
end
|
@@ -14,7 +14,7 @@ require 'cosmos/tools/tlm_viewer/widgets/value_widget'
|
|
14
14
|
require 'cosmos/tools/tlm_viewer/widgets/rangecolumn_widget'
|
15
15
|
|
16
16
|
module Cosmos
|
17
|
-
|
17
|
+
# Vertically stacks a Rangecolumnwidget over a ValueWidget
|
18
18
|
class ValuerangecolumnWidget < Qt::Widget
|
19
19
|
include Widget
|
20
20
|
include MultiWidget
|
@@ -33,5 +33,4 @@ module Cosmos
|
|
33
33
|
return true
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
37
|
-
end # module Cosmos
|
36
|
+
end
|
@@ -15,22 +15,23 @@ require 'cosmos/tools/tlm_viewer/widgets/widget'
|
|
15
15
|
require 'cosmos/tools/tlm_viewer/widgets/layout_widget'
|
16
16
|
|
17
17
|
module Cosmos
|
18
|
-
|
18
|
+
# Layout widget which layouts the enclosed widgets vertically.
|
19
|
+
# Default spacing is 3 pixels and widgets are packed by inserting
|
20
|
+
# a stretch at the end of the added widgets.
|
19
21
|
class VerticalWidget < Qt::VBoxLayout
|
20
22
|
include Widget
|
21
23
|
include LayoutWidget
|
22
24
|
|
23
|
-
def initialize(parent_layout = nil,
|
25
|
+
def initialize(parent_layout = nil, spacing = 3, pack = true)
|
24
26
|
super()
|
25
|
-
setSpacing(
|
27
|
+
setSpacing(spacing.to_i)
|
26
28
|
parent_layout.addLayout(self) if parent_layout
|
27
|
-
@
|
29
|
+
@pack = ConfigParser::handle_true_false(pack)
|
28
30
|
end
|
29
31
|
|
30
32
|
def process_settings
|
31
33
|
super()
|
32
|
-
addStretch(1) if @
|
34
|
+
addStretch(1) if @pack
|
33
35
|
end
|
34
36
|
end
|
35
|
-
|
36
|
-
end # module Cosmos
|
37
|
+
end
|
@@ -15,24 +15,26 @@ require 'cosmos/tools/tlm_viewer/widgets/widget'
|
|
15
15
|
require 'cosmos/tools/tlm_viewer/widgets/layout_widget'
|
16
16
|
|
17
17
|
module Cosmos
|
18
|
-
|
18
|
+
# Layout widget which layouts the enclosed widgets vertically
|
19
|
+
# in a visual box with header text.
|
20
|
+
# Default spacing is 3 pixels and widgets are packed by inserting
|
21
|
+
# a stretch at the end of the added widgets.
|
19
22
|
class VerticalboxWidget < Qt::VBoxLayout
|
20
23
|
include Widget
|
21
24
|
include LayoutWidget
|
22
25
|
|
23
|
-
def initialize(parent_layout = nil, title = "",
|
26
|
+
def initialize(parent_layout = nil, title = "", spacing = 3, pack = true)
|
24
27
|
super()
|
25
28
|
box = Qt::GroupBox.new(title.to_s)
|
26
|
-
setSpacing(
|
29
|
+
setSpacing(spacing.to_i)
|
27
30
|
box.setLayout(self)
|
28
31
|
parent_layout.addWidget(box) if parent_layout
|
29
|
-
@
|
32
|
+
@pack = ConfigParser::handle_true_false(pack)
|
30
33
|
end
|
31
34
|
|
32
35
|
def process_settings
|
33
36
|
super()
|
34
|
-
addStretch(1) if @
|
37
|
+
addStretch(1) if @pack
|
35
38
|
end
|
36
39
|
end
|
37
|
-
|
38
|
-
end # module Cosmos
|
40
|
+
end
|
@@ -154,53 +154,48 @@ module Cosmos
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def process_settings
|
157
|
-
errors = ""
|
158
157
|
sheet = []
|
159
158
|
@settings.each do |setting_name, setting_values|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
sheet << "border-color:rgb(#{setting_values[0].to_i}, #{setting_values[1].to_i}, #{setting_values[2].to_i})"
|
191
|
-
end
|
192
|
-
when 'WIDTH'
|
193
|
-
sheet << "min-width:#{setting_values[0].to_i}px"
|
194
|
-
sheet << "max-width:#{setting_values[0].to_i}px"
|
195
|
-
when 'HEIGHT'
|
196
|
-
sheet << "min-height:#{setting_values[0].to_i}px"
|
197
|
-
sheet << "max-height:#{setting_values[0].to_i}px"
|
198
|
-
when 'RAW'
|
199
|
-
next if setting_values[0] == '' # ignore the blank default
|
200
|
-
sheet << setting_values[0]
|
159
|
+
case setting_name
|
160
|
+
when 'TEXTALIGN'
|
161
|
+
sheet << "qproperty-alignment:Align#{setting_values[0].capitalize}"
|
162
|
+
when 'PADDING'
|
163
|
+
sheet << "padding:#{setting_values[0]}"
|
164
|
+
when 'MARGIN'
|
165
|
+
sheet << "margin:#{setting_values[0]}"
|
166
|
+
when 'BACKCOLOR'
|
167
|
+
case setting_values.size
|
168
|
+
when 1 # color name
|
169
|
+
sheet << "background-color:#{setting_values[0]}"
|
170
|
+
when 3 # RGB values
|
171
|
+
sheet << "background-color:rgb(#{setting_values[0].to_i},#{setting_values[1].to_i},#{setting_values[2].to_i})"
|
172
|
+
end
|
173
|
+
when 'TEXTCOLOR'
|
174
|
+
case setting_values.size
|
175
|
+
when 1 # color name
|
176
|
+
sheet << "color:#{setting_values[0]}"
|
177
|
+
when 3 # RGB values
|
178
|
+
sheet << "color:rgb(#{setting_values[0].to_i},#{setting_values[1].to_i},#{setting_values[2].to_i})"
|
179
|
+
end
|
180
|
+
when 'BORDERCOLOR'
|
181
|
+
# Setting the color requires a defined width and style
|
182
|
+
sheet << "border-width:1px"
|
183
|
+
sheet << "border-style:solid"
|
184
|
+
case setting_values.size
|
185
|
+
when 1 # color name
|
186
|
+
sheet << "border-color:#{setting_values[0]}"
|
187
|
+
when 3 # RGB values
|
188
|
+
sheet << "border-color:rgb(#{setting_values[0].to_i}, #{setting_values[1].to_i}, #{setting_values[2].to_i})"
|
201
189
|
end
|
202
|
-
|
203
|
-
|
190
|
+
when 'WIDTH'
|
191
|
+
sheet << "min-width:#{setting_values[0].to_i}px"
|
192
|
+
sheet << "max-width:#{setting_values[0].to_i}px"
|
193
|
+
when 'HEIGHT'
|
194
|
+
sheet << "min-height:#{setting_values[0].to_i}px"
|
195
|
+
sheet << "max-height:#{setting_values[0].to_i}px"
|
196
|
+
when 'RAW'
|
197
|
+
next if setting_values[0] == '' # ignore the blank default
|
198
|
+
sheet << setting_values[0]
|
204
199
|
end
|
205
200
|
end
|
206
201
|
# Only apply the stylesheet if we have settings to apply and this is a widget (not a layout)
|
@@ -215,7 +210,6 @@ module Cosmos
|
|
215
210
|
pw.setStyleSheet("QWidget##{pw.objectName} { #{sheet.join(';')} }")
|
216
211
|
end
|
217
212
|
end
|
218
|
-
errors
|
219
213
|
end
|
220
214
|
|
221
215
|
def context_menu
|
@@ -249,7 +243,7 @@ module Cosmos
|
|
249
243
|
|
250
244
|
graph = Qt::Action.new("Graph #{@target_name} #{@packet_name} #{@item_name}", menu)
|
251
245
|
graph.connect(SIGNAL('triggered()')) do
|
252
|
-
TlmGraphDialog.new(self, target_name, packet_name, item_name)
|
246
|
+
TlmGraphDialog.new(self, target_name, packet_name, item_name, @screen.replay_flag.visible)
|
253
247
|
end
|
254
248
|
menu.addAction(graph)
|
255
249
|
|
@@ -258,5 +252,19 @@ module Cosmos
|
|
258
252
|
point.dispose
|
259
253
|
menu.dispose
|
260
254
|
end
|
255
|
+
|
256
|
+
# Requires the @screen to be set so must not be called in initialize()
|
257
|
+
def get_image(image_name)
|
258
|
+
return nil unless @screen
|
259
|
+
target_screen_dir = File.join(::Cosmos::USERPATH, 'config', 'targets', @screen.original_target_name.upcase, 'screens')
|
260
|
+
|
261
|
+
if File.exist?(File.join(target_screen_dir, image_name))
|
262
|
+
return Qt::Image.new(File.join(target_screen_dir, image_name))
|
263
|
+
elsif Cosmos.data_path(image_name)
|
264
|
+
return Qt::Image.new(Cosmos.data_path(image_name))
|
265
|
+
else
|
266
|
+
raise "Can't find the file #{image_name} in #{target_screen_dir} or the cosmos data directory."
|
267
|
+
end
|
268
|
+
end
|
261
269
|
end
|
262
270
|
end
|