cosmos 3.0.1 → 3.1.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/.coveralls.yml +1 -0
- data/.gitignore +48 -48
- data/.travis.yml +7 -7
- data/CONTRIBUTING.txt +50 -50
- data/Gemfile +6 -6
- data/Guardfile +27 -27
- data/LICENSE.txt +879 -879
- data/Manifest.txt +1116 -1114
- data/README.md +109 -107
- data/Rakefile +214 -214
- data/autohotkey/config/data/diamond.STL +57 -57
- data/autohotkey/config/system/system.txt +34 -34
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/autohotkey/config/targets/COSMOS/target.txt +5 -5
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
- data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
- data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
- data/autohotkey/config/targets/INST/screens/array.txt +7 -7
- data/autohotkey/config/targets/INST/screens/block.txt +8 -8
- data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
- data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
- data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
- data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
- data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
- data/autohotkey/config/targets/INST/screens/image.txt +21 -21
- data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
- data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
- data/autohotkey/config/targets/INST/screens/other.txt +25 -25
- data/autohotkey/config/targets/INST/screens/params.txt +25 -25
- data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
- data/autohotkey/config/targets/INST/target.txt +26 -26
- data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
- data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
- data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
- data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/autohotkey/config/tools/launcher/launcher.txt +38 -38
- data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
- data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
- data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
- data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
- data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
- data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
- data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
- data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
- data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
- data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
- data/autohotkey/lib/example_background_task.rb +42 -42
- data/autohotkey/lib/user_version.rb +3 -3
- data/autohotkey/procedures/clear_util.rb +7 -7
- data/autohotkey/procedures/collect.rb +18 -18
- data/autohotkey/procedures/collect_util.rb +14 -14
- data/autohotkey/procedures/example_test.rb +67 -67
- data/autohotkey/procedures/example_test2.rb +74 -74
- data/autohotkey/procedures/script_test.rb +17 -17
- data/autohotkey/procedures/syntax_error.rb +18 -18
- data/autohotkey/tools/CmdExtractorAHK +16 -16
- data/autohotkey/tools/CmdSender +14 -14
- data/autohotkey/tools/CmdSenderAHK +18 -18
- data/autohotkey/tools/CmdTlmServer +14 -14
- data/autohotkey/tools/CmdTlmServerAHK +28 -28
- data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
- data/autohotkey/tools/DataViewer +14 -14
- data/autohotkey/tools/DataViewerAHK +17 -17
- data/autohotkey/tools/HandbookCreatorAHK +20 -20
- data/autohotkey/tools/LauncherAHK +17 -17
- data/autohotkey/tools/LimitsMonitorAHK +20 -20
- data/autohotkey/tools/OpenGLBuilderAHK +20 -20
- data/autohotkey/tools/PacketViewer +14 -14
- data/autohotkey/tools/PacketViewerAHK +18 -18
- data/autohotkey/tools/PacketViewerAHK2 +17 -17
- data/autohotkey/tools/Replay +14 -14
- data/autohotkey/tools/Replay.bat +59 -59
- data/autohotkey/tools/ReplayAHK +17 -17
- data/autohotkey/tools/ScriptRunner +14 -14
- data/autohotkey/tools/ScriptRunnerAHK +20 -20
- data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
- data/autohotkey/tools/TableManager +14 -14
- data/autohotkey/tools/TableManagerAHK +30 -30
- data/autohotkey/tools/TestRunner +15 -15
- data/autohotkey/tools/TestRunnerAHK +17 -17
- data/autohotkey/tools/TestRunnerAHK2 +17 -17
- data/autohotkey/tools/TestRunnerAHK3 +17 -17
- data/autohotkey/tools/TestRunnerAHK4 +17 -17
- data/autohotkey/tools/TlmExtractor +15 -15
- data/autohotkey/tools/TlmExtractorAHK +19 -19
- data/autohotkey/tools/TlmExtractorAHK2 +16 -16
- data/autohotkey/tools/TlmExtractorAHK3 +16 -16
- data/autohotkey/tools/TlmGrapher +14 -14
- data/autohotkey/tools/TlmGrapherAHK +19 -19
- data/autohotkey/tools/TlmGrapherAHK2 +23 -23
- data/autohotkey/tools/TlmGrapherAHK3 +17 -17
- data/autohotkey/tools/TlmGrapherAHK4 +17 -17
- data/autohotkey/tools/TlmViewer +14 -14
- data/autohotkey/tools/TlmViewerAHK +28 -28
- data/autohotkey/tools/TlmViewerAHK2 +18 -18
- data/autohotkey/tools/TlmViewerAHK3 +18 -18
- data/autohotkey/tools/TlmViewerAHK4 +18 -18
- data/autohotkey/tools/TlmViewerAHK5 +18 -18
- data/autohotkey/tools/autohotkey.rb +37 -37
- data/autohotkey/tools/cmd_extractor.ahk +27 -27
- data/autohotkey/tools/cmd_sender.ahk +182 -162
- data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
- data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
- data/autohotkey/tools/data_viewer.ahk +135 -135
- data/autohotkey/tools/handbook_creator.ahk +23 -23
- data/autohotkey/tools/launcher.ahk +41 -41
- data/autohotkey/tools/limits_monitor.ahk +70 -70
- data/autohotkey/tools/open_gl_builder.ahk +134 -134
- data/autohotkey/tools/packet_viewer.ahk +143 -143
- data/autohotkey/tools/packet_viewer2.ahk +9 -9
- data/autohotkey/tools/replay.ahk +98 -98
- data/autohotkey/tools/script_runner.ahk +589 -589
- data/autohotkey/tools/script_runner2.ahk +34 -31
- data/autohotkey/tools/table_manager.ahk +220 -220
- data/autohotkey/tools/test_runner.ahk +262 -259
- data/autohotkey/tools/test_runner2.ahk +52 -52
- data/autohotkey/tools/test_runner3.ahk +13 -13
- data/autohotkey/tools/tlm_extractor.ahk +272 -272
- data/autohotkey/tools/tlm_grapher.ahk +642 -642
- data/autohotkey/tools/tlm_grapher2.ahk +115 -115
- data/autohotkey/tools/tlm_grapher3.ahk +24 -24
- data/autohotkey/tools/tlm_viewer.ahk +133 -133
- data/autohotkey/tools/tlm_viewer2.ahk +50 -49
- data/autohotkey/tools/tlm_viewer4.ahk +4 -4
- data/autohotkey/tools/tlm_viewer5.ahk +20 -20
- data/bin/cosmos +96 -96
- data/bin/cstol_converter +1166 -1166
- data/bin/rubysloc +85 -85
- data/cosmos.gemspec +98 -97
- data/data/about.txt +4 -4
- data/data/crc.txt +306 -305
- data/data/diamond.STL +57 -57
- data/data/legal.txt +9 -9
- data/demo/Gemfile +6 -6
- data/demo/Launcher +15 -15
- data/demo/Launcher.bat +59 -59
- data/demo/Rakefile +61 -61
- data/demo/config/data/crc.txt +222 -206
- data/demo/config/data/diamond.STL +57 -57
- data/demo/config/data/meta_init.txt +4 -4
- data/demo/config/system/system.txt +34 -34
- data/demo/config/system/system2.txt +33 -33
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/demo/config/targets/COSMOS/screens/version.txt +19 -19
- data/demo/config/targets/COSMOS/target.txt +11 -11
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
- data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
- data/demo/config/targets/EXAMPLE/target.txt +6 -6
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
- data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
- data/demo/config/targets/INST/screens/adcs.txt +46 -46
- data/demo/config/targets/INST/screens/array.txt +15 -15
- data/demo/config/targets/INST/screens/block.txt +8 -8
- data/demo/config/targets/INST/screens/commanding.txt +30 -30
- data/demo/config/targets/INST/screens/graphs.txt +14 -14
- data/demo/config/targets/INST/screens/ground.txt +25 -25
- data/demo/config/targets/INST/screens/hs.txt +44 -44
- data/demo/config/targets/INST/screens/latest.txt +23 -23
- data/demo/config/targets/INST/screens/other.txt +29 -29
- data/demo/config/targets/INST/screens/tabs.txt +70 -70
- data/demo/config/targets/INST/target.txt +33 -33
- data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
- data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
- data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
- data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
- data/demo/config/targets/TEMPLATED/target.txt +6 -6
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
- data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
- data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
- data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/demo/config/tools/launcher/launcher.txt +45 -45
- data/demo/config/tools/launcher/launcher2.txt +45 -45
- data/demo/config/tools/script_runner/script_runner.txt +3 -3
- data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
- data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
- data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
- data/demo/config/tools/test_runner/test_runner.txt +17 -17
- data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
- data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
- data/demo/lib/example_background_task.rb +57 -52
- data/demo/lib/example_target.rb +113 -108
- data/demo/lib/scpi_target.rb +74 -74
- data/demo/lib/user_version.rb +3 -3
- data/demo/procedures/checks.rb +11 -11
- data/demo/procedures/clear_util.rb +7 -7
- data/demo/procedures/collect.rb +18 -18
- data/demo/procedures/collect_util.rb +14 -14
- data/demo/procedures/cosmos_api_test.rb +293 -293
- data/demo/procedures/disconnect.rb +29 -29
- data/demo/procedures/example_test.rb +182 -182
- data/demo/procedures/plot_test.rb +8 -8
- data/demo/procedures/run_example_test.rb +3 -3
- data/demo/procedures/test.rb +51 -51
- data/demo/tools/CmdExtractor +15 -15
- data/demo/tools/CmdExtractor.bat +59 -59
- data/demo/tools/CmdSender +15 -15
- data/demo/tools/CmdSender.bat +59 -59
- data/demo/tools/CmdTlmServer +15 -15
- data/demo/tools/CmdTlmServer.bat +59 -59
- data/demo/tools/DataViewer +15 -15
- data/demo/tools/DataViewer.bat +59 -59
- data/demo/tools/ExampleTarget +15 -15
- data/demo/tools/ExampleTarget.bat +59 -59
- data/demo/tools/HandbookCreator +15 -15
- data/demo/tools/HandbookCreator.bat +61 -61
- data/demo/tools/Launcher +15 -15
- data/demo/tools/Launcher.bat +59 -59
- data/demo/tools/LimitsMonitor +15 -15
- data/demo/tools/LimitsMonitor.bat +59 -59
- data/demo/tools/OpenGLBuilder +15 -15
- data/demo/tools/OpenGLBuilder.bat +59 -59
- data/demo/tools/PacketViewer +15 -15
- data/demo/tools/PacketViewer.bat +59 -59
- data/demo/tools/Replay +15 -15
- data/demo/tools/Replay.bat +59 -59
- data/demo/tools/ScpiTarget +15 -15
- data/demo/tools/ScpiTarget.bat +59 -59
- data/demo/tools/ScriptRunner +15 -15
- data/demo/tools/ScriptRunner.bat +59 -59
- data/demo/tools/TableManager +15 -15
- data/demo/tools/TableManager.bat +59 -59
- data/demo/tools/TestRunner +15 -15
- data/demo/tools/TestRunner.bat +59 -59
- data/demo/tools/TlmExtractor +15 -15
- data/demo/tools/TlmExtractor.bat +59 -59
- data/demo/tools/TlmGrapher +15 -15
- data/demo/tools/TlmGrapher.bat +59 -59
- data/demo/tools/TlmViewer +15 -15
- data/demo/tools/TlmViewer.bat +59 -59
- data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- data/ext/cosmos/ext/array/array.c +111 -111
- data/ext/cosmos/ext/array/extconf.rb +13 -13
- data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
- data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
- data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
- data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
- data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
- data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
- data/ext/cosmos/ext/crc/crc.c +341 -341
- data/ext/cosmos/ext/crc/extconf.rb +12 -12
- data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
- data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
- data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
- data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
- data/ext/cosmos/ext/packet/extconf.rb +13 -13
- data/ext/cosmos/ext/packet/packet.c +339 -339
- data/ext/cosmos/ext/platform/extconf.rb +13 -13
- data/ext/cosmos/ext/platform/platform.c +81 -81
- data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
- data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
- data/ext/cosmos/ext/string/extconf.rb +13 -13
- data/ext/cosmos/ext/string/string.c +49 -49
- data/ext/cosmos/ext/structure/structure.c +894 -894
- data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
- data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
- data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
- data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
- data/ext/mkrf_conf.rb +40 -40
- data/install/Gemfile +6 -6
- data/install/Launcher +14 -14
- data/install/Launcher.bat +59 -59
- data/install/Rakefile +61 -61
- data/install/config/data/crc.txt +134 -133
- data/install/config/system/system.txt +29 -29
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/install/config/targets/COSMOS/target.txt +8 -8
- data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
- data/install/config/tools/data_viewer/data_viewer.txt +3 -3
- data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/install/config/tools/launcher/launcher.txt +39 -39
- data/install/config/tools/script_runner/script_runner.txt +3 -3
- data/install/config/tools/test_runner/test_runner.txt +8 -8
- data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
- data/install/lib/user_version.rb +3 -3
- data/install/tools/CmdExtractor +15 -15
- data/install/tools/CmdExtractor.bat +59 -59
- data/install/tools/CmdSender +15 -15
- data/install/tools/CmdSender.bat +59 -59
- data/install/tools/CmdTlmServer +15 -15
- data/install/tools/CmdTlmServer.bat +59 -59
- data/install/tools/DataViewer +15 -15
- data/install/tools/DataViewer.bat +59 -59
- data/install/tools/HandbookCreator +15 -15
- data/install/tools/HandbookCreator.bat +61 -61
- data/install/tools/Launcher +15 -15
- data/install/tools/Launcher.bat +59 -59
- data/install/tools/LimitsMonitor +15 -15
- data/install/tools/LimitsMonitor.bat +59 -59
- data/install/tools/OpenGLBuilder +15 -15
- data/install/tools/OpenGLBuilder.bat +59 -59
- data/install/tools/PacketViewer +15 -15
- data/install/tools/PacketViewer.bat +59 -59
- data/install/tools/Replay +15 -15
- data/install/tools/Replay.bat +59 -59
- data/install/tools/ScriptRunner +15 -15
- data/install/tools/ScriptRunner.bat +59 -59
- data/install/tools/TableManager +15 -15
- data/install/tools/TableManager.bat +59 -59
- data/install/tools/TestRunner +15 -15
- data/install/tools/TestRunner.bat +59 -59
- data/install/tools/TlmExtractor +15 -15
- data/install/tools/TlmExtractor.bat +59 -59
- data/install/tools/TlmGrapher +15 -15
- data/install/tools/TlmGrapher.bat +59 -59
- data/install/tools/TlmViewer +15 -15
- data/install/tools/TlmViewer.bat +59 -59
- data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- data/lib/cosmos.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
- data/lib/cosmos/config/config_parser.rb +324 -324
- data/lib/cosmos/conversions.rb +13 -13
- data/lib/cosmos/conversions/conversion.rb +47 -47
- data/lib/cosmos/conversions/generic_conversion.rb +55 -55
- data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
- data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
- data/lib/cosmos/conversions/processor_conversion.rb +46 -46
- data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
- data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
- data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
- data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
- data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
- data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
- data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
- data/lib/cosmos/core_ext.rb +18 -18
- data/lib/cosmos/core_ext/array.rb +354 -354
- data/lib/cosmos/core_ext/class.rb +51 -51
- data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
- data/lib/cosmos/core_ext/exception.rb +52 -52
- data/lib/cosmos/core_ext/file.rb +75 -75
- data/lib/cosmos/core_ext/hash.rb +28 -28
- data/lib/cosmos/core_ext/io.rb +75 -75
- data/lib/cosmos/core_ext/kernel.rb +38 -38
- data/lib/cosmos/core_ext/math.rb +119 -119
- data/lib/cosmos/core_ext/matrix.rb +146 -146
- data/lib/cosmos/core_ext/objectspace.rb +29 -29
- data/lib/cosmos/core_ext/range.rb +22 -22
- data/lib/cosmos/core_ext/socket.rb +32 -32
- data/lib/cosmos/core_ext/string.rb +310 -310
- data/lib/cosmos/core_ext/stringio.rb +24 -24
- data/lib/cosmos/core_ext/time.rb +446 -446
- data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
- data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
- data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
- data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
- data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
- data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
- data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
- data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
- data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
- data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
- data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
- data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
- data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
- data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
- data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
- data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
- data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
- data/lib/cosmos/gui/dialogs/splash.rb +113 -113
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
- data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
- data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
- data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
- data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
- data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
- data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
- data/lib/cosmos/gui/line_graph/lines.rb +290 -290
- data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
- data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
- data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
- data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
- data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
- data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
- data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
- data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
- data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
- data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
- data/lib/cosmos/gui/opengl/opengl.rb +8 -8
- data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
- data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
- data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
- data/lib/cosmos/gui/qt.rb +813 -786
- data/lib/cosmos/gui/qt_tool.rb +378 -373
- data/lib/cosmos/gui/text/completion.rb +381 -381
- data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
- data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
- data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
- data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
- data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
- data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
- data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
- data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
- data/lib/cosmos/interfaces.rb +11 -11
- data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
- data/lib/cosmos/interfaces/interface.rb +213 -213
- data/lib/cosmos/interfaces/linc_interface.rb +360 -360
- data/lib/cosmos/interfaces/serial_interface.rb +76 -76
- data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
- data/lib/cosmos/interfaces/stream_interface.rb +156 -156
- data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
- data/lib/cosmos/interfaces/udp_interface.rb +173 -173
- data/lib/cosmos/io/buffered_file.rb +11 -11
- data/lib/cosmos/io/cosmos_snmp.rb +50 -50
- data/lib/cosmos/io/io_multiplexer.rb +89 -89
- data/lib/cosmos/io/json_drb.rb +344 -320
- data/lib/cosmos/io/json_drb_object.rb +137 -137
- data/lib/cosmos/io/json_rpc.rb +365 -365
- data/lib/cosmos/io/posix_serial_driver.rb +145 -145
- data/lib/cosmos/io/raw_logger.rb +174 -174
- data/lib/cosmos/io/raw_logger_pair.rb +71 -71
- data/lib/cosmos/io/serial_driver.rb +85 -85
- data/lib/cosmos/io/stderr.rb +36 -36
- data/lib/cosmos/io/stdout.rb +36 -36
- data/lib/cosmos/io/tcpip_server.rb +583 -532
- data/lib/cosmos/io/udp_sockets.rb +152 -152
- data/lib/cosmos/io/win32_serial_driver.rb +147 -147
- data/lib/cosmos/packet_logs.rb +6 -6
- data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
- data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
- data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
- data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
- data/lib/cosmos/packets/binary_accessor.rb +921 -921
- data/lib/cosmos/packets/commands.rb +291 -291
- data/lib/cosmos/packets/limits.rb +263 -263
- data/lib/cosmos/packets/limits_response.rb +38 -38
- data/lib/cosmos/packets/packet.rb +714 -699
- data/lib/cosmos/packets/packet_config.rb +1034 -1034
- data/lib/cosmos/packets/packet_item.rb +317 -317
- data/lib/cosmos/packets/packet_item_limits.rb +128 -128
- data/lib/cosmos/packets/structure.rb +421 -386
- data/lib/cosmos/packets/structure_item.rb +233 -233
- data/lib/cosmos/packets/telemetry.rb +317 -317
- data/lib/cosmos/processors.rb +6 -6
- data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
- data/lib/cosmos/processors/processor.rb +71 -71
- data/lib/cosmos/processors/statistics_processor.rb +65 -65
- data/lib/cosmos/processors/watermark_processor.rb +44 -44
- data/lib/cosmos/script.rb +9 -9
- data/lib/cosmos/script/extract.rb +115 -115
- data/lib/cosmos/script/script.rb +1513 -1493
- data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
- data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
- data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
- data/lib/cosmos/streams/serial_stream.rb +152 -143
- data/lib/cosmos/streams/stream.rb +57 -57
- data/lib/cosmos/streams/stream_protocol.rb +369 -369
- data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
- data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
- data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
- data/lib/cosmos/system.rb +4 -4
- data/lib/cosmos/system/system.rb +558 -558
- data/lib/cosmos/system/target.rb +178 -178
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
- data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
- data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
- data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
- data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
- data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
- data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
- data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
- data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
- data/lib/cosmos/tools/launcher/launcher.rb +184 -184
- data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
- data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
- data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
- data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
- data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
- data/lib/cosmos/tools/replay/replay.rb +495 -488
- data/lib/cosmos/tools/replay/replay_server.rb +91 -91
- data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
- data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
- data/lib/cosmos/tools/table_manager/table.rb +70 -70
- data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
- data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
- data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
- data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
- data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
- data/lib/cosmos/tools/test_runner/test.rb +480 -480
- data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
- data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
- data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
- data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
- data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
- data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
- data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
- data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
- data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
- data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
- data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
- data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
- data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
- data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
- data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
- data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
- data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
- data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
- data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
- data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
- data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
- data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
- data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
- data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
- data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
- data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
- data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
- data/lib/cosmos/top_level.rb +647 -596
- data/lib/cosmos/utilities.rb +11 -10
- data/lib/cosmos/utilities/crc.rb +166 -166
- data/lib/cosmos/utilities/csv.rb +83 -83
- data/lib/cosmos/utilities/logger.rb +137 -137
- data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
- data/lib/cosmos/utilities/message_log.rb +74 -74
- data/lib/cosmos/utilities/quaternion.rb +258 -258
- data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
- data/lib/cosmos/utilities/simulated_target.rb +99 -99
- data/lib/cosmos/utilities/sleeper.rb +44 -0
- data/lib/cosmos/version.rb +12 -12
- data/lib/cosmos/win32/excel.rb +66 -66
- data/lib/cosmos/win32/win32.rb +387 -387
- data/lib/cosmos/win32/win32_main.rb +311 -311
- data/roodi.yml +24 -24
- data/run_gui_tests.bat +32 -32
- data/spec/ccsds/ccsds_packet_spec.rb +67 -67
- data/spec/ccsds/ccsds_parser_spec.rb +148 -148
- data/spec/config/config_parser_spec.rb +322 -322
- data/spec/conversions/conversion_spec.rb +31 -31
- data/spec/conversions/generic_conversion_spec.rb +45 -45
- data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
- data/spec/conversions/polynomial_conversion_spec.rb +40 -40
- data/spec/conversions/processor_conversion_spec.rb +45 -45
- data/spec/conversions/received_count_conversion_spec.rb +43 -43
- data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
- data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
- data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
- data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
- data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
- data/spec/core_ext/array_spec.rb +186 -186
- data/spec/core_ext/class_spec.rb +36 -36
- data/spec/core_ext/cosmos_io_spec.rb +77 -77
- data/spec/core_ext/exception_spec.rb +91 -91
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +24 -24
- data/spec/core_ext/io_spec.rb +46 -46
- data/spec/core_ext/kernel_spec.rb +54 -54
- data/spec/core_ext/math_spec.rb +116 -116
- data/spec/core_ext/matrix_spec.rb +66 -66
- data/spec/core_ext/objectspace_spec.rb +29 -29
- data/spec/core_ext/range_spec.rb +21 -21
- data/spec/core_ext/socket_spec.rb +32 -32
- data/spec/core_ext/string_spec.rb +223 -223
- data/spec/core_ext/stringio_spec.rb +21 -21
- data/spec/core_ext/time_spec.rb +151 -151
- data/spec/gui/line_graph/line_clip_spec.rb +322 -322
- data/spec/install/config/system/system.txt +33 -33
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/spec/install/config/targets/COSMOS/target.txt +5 -5
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
- data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
- data/spec/install/config/targets/INST/target.txt +10 -10
- data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
- data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
- data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
- data/spec/interfaces/interface_spec.rb +130 -131
- data/spec/interfaces/linc_interface_spec.rb +199 -199
- data/spec/interfaces/serial_interface_spec.rb +56 -56
- data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
- data/spec/interfaces/stream_interface_spec.rb +157 -157
- data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
- data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
- data/spec/interfaces/udp_interface_spec.rb +175 -177
- data/spec/io/buffered_file_spec.rb +113 -113
- data/spec/io/io_multiplexer_spec.rb +94 -94
- data/spec/io/json_drb_object_spec.rb +99 -99
- data/spec/io/json_drb_spec.rb +311 -311
- data/spec/io/json_rpc_spec.rb +264 -264
- data/spec/io/raw_logger_pair_spec.rb +76 -76
- data/spec/io/raw_logger_spec.rb +133 -133
- data/spec/io/serial_driver_spec.rb +61 -61
- data/spec/io/stderr_spec.rb +32 -32
- data/spec/io/stdout_spec.rb +32 -32
- data/spec/io/tcpip_server_spec.rb +338 -338
- data/spec/io/udp_sockets_spec.rb +94 -94
- data/spec/io/win32_serial_driver_spec.rb +88 -88
- data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
- data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
- data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
- data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
- data/spec/packets/binary_accessor_spec.rb +2073 -2073
- data/spec/packets/commands_spec.rb +369 -369
- data/spec/packets/limits_response_spec.rb +25 -25
- data/spec/packets/limits_spec.rb +326 -326
- data/spec/packets/packet_config_spec.rb +1620 -1620
- data/spec/packets/packet_item_limits_spec.rb +161 -161
- data/spec/packets/packet_item_spec.rb +386 -386
- data/spec/packets/packet_spec.rb +1057 -949
- data/spec/packets/structure_item_spec.rb +195 -195
- data/spec/packets/structure_spec.rb +419 -419
- data/spec/packets/telemetry_spec.rb +535 -535
- data/spec/processors/new_packet_log_processor_spec.rb +39 -39
- data/spec/processors/processor_spec.rb +55 -55
- data/spec/processors/statistics_processor_spec.rb +60 -60
- data/spec/processors/watermark_processor_spec.rb +51 -51
- data/spec/script/script_spec.rb +654 -654
- data/spec/spec_helper.rb +154 -148
- data/spec/streams/burst_stream_protocol_spec.rb +32 -32
- data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
- data/spec/streams/length_stream_protocol_spec.rb +297 -297
- data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
- data/spec/streams/serial_stream_spec.rb +105 -105
- data/spec/streams/stream_protocol_spec.rb +332 -332
- data/spec/streams/stream_spec.rb +29 -29
- data/spec/streams/tcpip_client_stream_spec.rb +54 -54
- data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
- data/spec/streams/template_stream_protocol_spec.rb +151 -151
- data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
- data/spec/system/system_spec.rb +645 -645
- data/spec/system/target_spec.rb +248 -248
- data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
- data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
- data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
- data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
- data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
- data/spec/top_level/top_level_spec.rb +334 -321
- data/spec/utilities/crc_spec.rb +45 -45
- data/spec/utilities/csv_spec.rb +97 -97
- data/spec/utilities/logger_spec.rb +102 -102
- data/spec/utilities/message_log_spec.rb +89 -89
- data/spec/utilities/quaternion_spec.rb +107 -107
- data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
- data/tasks/manifest.rake +22 -22
- data/tasks/spec.rake +23 -23
- metadata +18 -2
|
@@ -1,116 +1,116 @@
|
|
|
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
|
-
module Cosmos
|
|
12
|
-
|
|
13
|
-
# LineGraph class continued
|
|
14
|
-
class LineGraph < Qt::Widget
|
|
15
|
-
|
|
16
|
-
# Builds popups associated with an x value
|
|
17
|
-
def build_popups_from_x_value(x_value)
|
|
18
|
-
# Clear any existing popups
|
|
19
|
-
@popups = []
|
|
20
|
-
|
|
21
|
-
if x_value <= @x_max and x_value >= @x_min
|
|
22
|
-
# Determine how near in x value that the cursor must be to a point
|
|
23
|
-
value_delta = ((@x_max - @x_min).to_f / (@graph_right_x - @graph_left_x)) * 3.0 # within 3 pixels
|
|
24
|
-
|
|
25
|
-
# Add the popups
|
|
26
|
-
add_popups_for_lines(x_value, value_delta)
|
|
27
|
-
|
|
28
|
-
# Make sure popups don't overlap
|
|
29
|
-
adjust_popup_positions()
|
|
30
|
-
end
|
|
31
|
-
end # def build_popups_from_x_value
|
|
32
|
-
|
|
33
|
-
# Add popups for the lines on one axis
|
|
34
|
-
def add_popups_for_lines(x_value, value_delta)
|
|
35
|
-
popup_values = @lines.get_left_popup_data(x_value, value_delta, @ordered_x_values, @left_y_min, @left_y_max)
|
|
36
|
-
popup_values.concat(@lines.get_right_popup_data(x_value, value_delta, @ordered_x_values, @right_y_min, @right_y_max))
|
|
37
|
-
popup_values.each do |x, y, x_text, y_text, item, color, axis|
|
|
38
|
-
# The get_xxx_popup_data routine can return an empty array if there are
|
|
39
|
-
# no values for the axis so skip any empty arrays (x is nil)
|
|
40
|
-
next unless x
|
|
41
|
-
|
|
42
|
-
# Determine position in graph coordinates
|
|
43
|
-
graph_x = scale_value_to_graph_x(x)
|
|
44
|
-
graph_y = scale_value_to_graph_y(y, axis)
|
|
45
|
-
|
|
46
|
-
x_text = convert_x_value_to_text(x_text.to_f, @max_x_characters)
|
|
47
|
-
if @left_button_pressed
|
|
48
|
-
popup_text = "(#{item}) #{x_text}, #{y_text}"
|
|
49
|
-
else
|
|
50
|
-
popup_text = "#{x_text}, #{y_text}"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Determine popup's width and height based on width/height of text
|
|
54
|
-
metrics = Qt::FontMetrics.new(@font)
|
|
55
|
-
popup_width = metrics.width(popup_text) + 10
|
|
56
|
-
popup_height = metrics.height + 10
|
|
57
|
-
|
|
58
|
-
# Make sure that the popup stays in the graph window on the x axis.
|
|
59
|
-
graph_x_adjusted = popup_width + graph_x
|
|
60
|
-
if graph_x_adjusted > self.width
|
|
61
|
-
graph_x -= popup_width
|
|
62
|
-
graph_x = 0 if graph_x < 0
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Make sure that the popup stays in the graph window on the y axis.
|
|
66
|
-
graph_y_adjusted = popup_height + graph_y
|
|
67
|
-
if graph_y_adjusted > (self.height - 1)
|
|
68
|
-
graph_y = self.height - 1 - popup_height
|
|
69
|
-
else
|
|
70
|
-
graph_y -= popup_height
|
|
71
|
-
end
|
|
72
|
-
graph_y = 1 if graph_y < 1
|
|
73
|
-
|
|
74
|
-
# Add popup
|
|
75
|
-
@popups << [popup_text, graph_x, graph_y, popup_width, popup_height, color]
|
|
76
|
-
end
|
|
77
|
-
end # def add_popups_for_line
|
|
78
|
-
|
|
79
|
-
# Algorithm to not overlap popups
|
|
80
|
-
def adjust_popup_positions
|
|
81
|
-
# Sort popups by graph_y
|
|
82
|
-
@popups.sort! {|a,b| a[2] <=> b[2]}
|
|
83
|
-
|
|
84
|
-
# Determine if any popups overlap vertically
|
|
85
|
-
overlap = false
|
|
86
|
-
index = 0
|
|
87
|
-
max_index = @popups.length - 1
|
|
88
|
-
@popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
|
|
89
|
-
break if index == max_index
|
|
90
|
-
if (graph_y + popup_height) > @popups[index + 1][2] # graph_y of next popup
|
|
91
|
-
overlap = true
|
|
92
|
-
break
|
|
93
|
-
end
|
|
94
|
-
index += 1
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
# Handle overlap case
|
|
98
|
-
if overlap
|
|
99
|
-
# Determine needed statistics
|
|
100
|
-
combined_height = 0
|
|
101
|
-
@popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
|
|
102
|
-
combined_height += popup_height + 1
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Stack popups around center of canvas
|
|
106
|
-
next_graph_y = ((self.height / 2) - (combined_height / 2)).to_i
|
|
107
|
-
@popups.length.times do |popup_index|
|
|
108
|
-
@popups[popup_index][2] = next_graph_y
|
|
109
|
-
next_graph_y += @popups[popup_index][4] + 2
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end # def adjust_popup_positions
|
|
113
|
-
|
|
114
|
-
end # class LineGraph
|
|
115
|
-
end # module Cosmos
|
|
116
|
-
|
|
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
|
+
module Cosmos
|
|
12
|
+
|
|
13
|
+
# LineGraph class continued
|
|
14
|
+
class LineGraph < Qt::Widget
|
|
15
|
+
|
|
16
|
+
# Builds popups associated with an x value
|
|
17
|
+
def build_popups_from_x_value(x_value)
|
|
18
|
+
# Clear any existing popups
|
|
19
|
+
@popups = []
|
|
20
|
+
|
|
21
|
+
if x_value <= @x_max and x_value >= @x_min
|
|
22
|
+
# Determine how near in x value that the cursor must be to a point
|
|
23
|
+
value_delta = ((@x_max - @x_min).to_f / (@graph_right_x - @graph_left_x)) * 3.0 # within 3 pixels
|
|
24
|
+
|
|
25
|
+
# Add the popups
|
|
26
|
+
add_popups_for_lines(x_value, value_delta)
|
|
27
|
+
|
|
28
|
+
# Make sure popups don't overlap
|
|
29
|
+
adjust_popup_positions()
|
|
30
|
+
end
|
|
31
|
+
end # def build_popups_from_x_value
|
|
32
|
+
|
|
33
|
+
# Add popups for the lines on one axis
|
|
34
|
+
def add_popups_for_lines(x_value, value_delta)
|
|
35
|
+
popup_values = @lines.get_left_popup_data(x_value, value_delta, @ordered_x_values, @left_y_min, @left_y_max)
|
|
36
|
+
popup_values.concat(@lines.get_right_popup_data(x_value, value_delta, @ordered_x_values, @right_y_min, @right_y_max))
|
|
37
|
+
popup_values.each do |x, y, x_text, y_text, item, color, axis|
|
|
38
|
+
# The get_xxx_popup_data routine can return an empty array if there are
|
|
39
|
+
# no values for the axis so skip any empty arrays (x is nil)
|
|
40
|
+
next unless x
|
|
41
|
+
|
|
42
|
+
# Determine position in graph coordinates
|
|
43
|
+
graph_x = scale_value_to_graph_x(x)
|
|
44
|
+
graph_y = scale_value_to_graph_y(y, axis)
|
|
45
|
+
|
|
46
|
+
x_text = convert_x_value_to_text(x_text.to_f, @max_x_characters)
|
|
47
|
+
if @left_button_pressed
|
|
48
|
+
popup_text = "(#{item}) #{x_text}, #{y_text}"
|
|
49
|
+
else
|
|
50
|
+
popup_text = "#{x_text}, #{y_text}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Determine popup's width and height based on width/height of text
|
|
54
|
+
metrics = Qt::FontMetrics.new(@font)
|
|
55
|
+
popup_width = metrics.width(popup_text) + 10
|
|
56
|
+
popup_height = metrics.height + 10
|
|
57
|
+
|
|
58
|
+
# Make sure that the popup stays in the graph window on the x axis.
|
|
59
|
+
graph_x_adjusted = popup_width + graph_x
|
|
60
|
+
if graph_x_adjusted > self.width
|
|
61
|
+
graph_x -= popup_width
|
|
62
|
+
graph_x = 0 if graph_x < 0
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Make sure that the popup stays in the graph window on the y axis.
|
|
66
|
+
graph_y_adjusted = popup_height + graph_y
|
|
67
|
+
if graph_y_adjusted > (self.height - 1)
|
|
68
|
+
graph_y = self.height - 1 - popup_height
|
|
69
|
+
else
|
|
70
|
+
graph_y -= popup_height
|
|
71
|
+
end
|
|
72
|
+
graph_y = 1 if graph_y < 1
|
|
73
|
+
|
|
74
|
+
# Add popup
|
|
75
|
+
@popups << [popup_text, graph_x, graph_y, popup_width, popup_height, color]
|
|
76
|
+
end
|
|
77
|
+
end # def add_popups_for_line
|
|
78
|
+
|
|
79
|
+
# Algorithm to not overlap popups
|
|
80
|
+
def adjust_popup_positions
|
|
81
|
+
# Sort popups by graph_y
|
|
82
|
+
@popups.sort! {|a,b| a[2] <=> b[2]}
|
|
83
|
+
|
|
84
|
+
# Determine if any popups overlap vertically
|
|
85
|
+
overlap = false
|
|
86
|
+
index = 0
|
|
87
|
+
max_index = @popups.length - 1
|
|
88
|
+
@popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
|
|
89
|
+
break if index == max_index
|
|
90
|
+
if (graph_y + popup_height) > @popups[index + 1][2] # graph_y of next popup
|
|
91
|
+
overlap = true
|
|
92
|
+
break
|
|
93
|
+
end
|
|
94
|
+
index += 1
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Handle overlap case
|
|
98
|
+
if overlap
|
|
99
|
+
# Determine needed statistics
|
|
100
|
+
combined_height = 0
|
|
101
|
+
@popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
|
|
102
|
+
combined_height += popup_height + 1
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Stack popups around center of canvas
|
|
106
|
+
next_graph_y = ((self.height / 2) - (combined_height / 2)).to_i
|
|
107
|
+
@popups.length.times do |popup_index|
|
|
108
|
+
@popups[popup_index][2] = next_graph_y
|
|
109
|
+
next_graph_y += @popups[popup_index][4] + 2
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end # def adjust_popup_positions
|
|
113
|
+
|
|
114
|
+
end # class LineGraph
|
|
115
|
+
end # module Cosmos
|
|
116
|
+
|
|
@@ -1,460 +1,460 @@
|
|
|
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
|
-
module Cosmos
|
|
12
|
-
|
|
13
|
-
# LineGraph class continued
|
|
14
|
-
class LineGraph < Qt::Widget
|
|
15
|
-
|
|
16
|
-
# Spacer between items
|
|
17
|
-
GRAPH_SPACER = 5
|
|
18
|
-
|
|
19
|
-
# Determine the size of the actual graph area
|
|
20
|
-
def determine_graph_size
|
|
21
|
-
metrics = Cosmos.getFontMetrics(@font)
|
|
22
|
-
|
|
23
|
-
@graph_left_x = 4 * GRAPH_SPACER
|
|
24
|
-
if @left_y_axis_title
|
|
25
|
-
@graph_left_x += metrics.width('W') + GRAPH_SPACER
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Determine number of pixels to the right side of graph
|
|
29
|
-
@graph_right_x = self.width - 6 * GRAPH_SPACER
|
|
30
|
-
if @right_y_axis_title
|
|
31
|
-
@graph_right_x -= (metrics.width('W') + GRAPH_SPACER)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Determine number of pixels above top of graph
|
|
35
|
-
if @title
|
|
36
|
-
title_metrics = Cosmos.getFontMetrics(@title_font)
|
|
37
|
-
title_height = title_metrics.height
|
|
38
|
-
else
|
|
39
|
-
title_height = 0
|
|
40
|
-
end
|
|
41
|
-
half_y_max_label_height = (metrics.height / 2)
|
|
42
|
-
@graph_top_y = title_height + half_y_max_label_height + GRAPH_SPACER
|
|
43
|
-
|
|
44
|
-
# Determine number of pixels below bottom of graph
|
|
45
|
-
if @x_axis_title
|
|
46
|
-
x_axis_title_height = metrics.height + GRAPH_SPACER / 2
|
|
47
|
-
else
|
|
48
|
-
x_axis_title_height = 0
|
|
49
|
-
end
|
|
50
|
-
x_axis_label_height = metrics.height + GRAPH_SPACER
|
|
51
|
-
legend_height = 0
|
|
52
|
-
if @show_legend && !@lines.empty?
|
|
53
|
-
text_y = self.height - 1 - (GRAPH_SPACER * 2)
|
|
54
|
-
text_height = metrics.height
|
|
55
|
-
if @lines.axes == :BOTH
|
|
56
|
-
left_text_y = text_y
|
|
57
|
-
right_text_y = text_y
|
|
58
|
-
@lines.legend.each do |text, color, axis|
|
|
59
|
-
if axis == :LEFT
|
|
60
|
-
left_text_y -= text_height
|
|
61
|
-
else
|
|
62
|
-
right_text_y -= text_height
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
if left_text_y < right_text_y
|
|
66
|
-
text_y = left_text_y
|
|
67
|
-
else
|
|
68
|
-
text_y = right_text_y
|
|
69
|
-
end
|
|
70
|
-
else
|
|
71
|
-
@lines.legend.each do |text, color, axis|
|
|
72
|
-
text_y -= text_height
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
legend_height = self.height - text_y - GRAPH_SPACER
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
@graph_bottom_y = self.height - 1 - (x_axis_title_height + x_axis_label_height + legend_height) - GRAPH_SPACER - GRAPH_SPACER
|
|
79
|
-
end # def determine_graph_size
|
|
80
|
-
|
|
81
|
-
# Calculate scaling factors between value and graph coordinates
|
|
82
|
-
def calculate_scaling_factors
|
|
83
|
-
# Determine the x conversion factor between value coordinates and graph coordinates
|
|
84
|
-
if @x_max != @x_min
|
|
85
|
-
@x_scale = (@graph_right_x - @graph_left_x).to_f / (@x_max - @x_min).to_f
|
|
86
|
-
else
|
|
87
|
-
@x_scale = 0.0
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# Determine the y conversion factor between value coordinates and graph coordinates
|
|
91
|
-
if @left_y_max != @left_y_min
|
|
92
|
-
@left_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@left_y_max - @left_y_min).to_f
|
|
93
|
-
else
|
|
94
|
-
@left_y_scale = 0.0
|
|
95
|
-
end
|
|
96
|
-
if @right_y_max != @right_y_min
|
|
97
|
-
@right_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@right_y_max - @right_y_min).to_f
|
|
98
|
-
else
|
|
99
|
-
@right_y_scale = 0.0
|
|
100
|
-
end
|
|
101
|
-
end # def calculate_scaling_factors
|
|
102
|
-
|
|
103
|
-
# Determine the scale of the graph, either manually or automatically
|
|
104
|
-
def scale_graph
|
|
105
|
-
if @x_auto_scale
|
|
106
|
-
@x_min, @x_max, @x_min_label, @x_max_label = @lines.x_min_max_labels
|
|
107
|
-
end
|
|
108
|
-
scale = @manual_y_grid_line_scale
|
|
109
|
-
if @left_y_auto_scale
|
|
110
|
-
@left_y_min, @left_y_max = auto_scale_y_axis(@lines.left_y_value_range, scale)
|
|
111
|
-
end
|
|
112
|
-
if @right_y_auto_scale
|
|
113
|
-
# scale is nil if there are no left lines to allow for autoscalling
|
|
114
|
-
scale = nil unless @lines.left_y_axis?
|
|
115
|
-
@right_y_min, @right_y_max = auto_scale_y_axis(@lines.right_y_value_range, scale)
|
|
116
|
-
end # def scale_graph
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Determine the y minimum and maximum values for the given lines and given
|
|
120
|
-
# grid line scale
|
|
121
|
-
#
|
|
122
|
-
# @param lines [Array] Array of lines containing the x and y values
|
|
123
|
-
# @param manual_y_grid_line_scale [Float] Whether there is a manual grid
|
|
124
|
-
# line scale. The return values will be multiples of this scale if given.
|
|
125
|
-
# @return [Float, Float] The minimum and maximum values
|
|
126
|
-
def auto_scale_y_axis(value_range, manual_y_grid_line_scale)
|
|
127
|
-
y_max = 1
|
|
128
|
-
y_min = -1
|
|
129
|
-
|
|
130
|
-
# Ensure we have a valid range of values
|
|
131
|
-
if value_range.size
|
|
132
|
-
y_min = value_range.first
|
|
133
|
-
y_max = value_range.last
|
|
134
|
-
|
|
135
|
-
# Add space between values and edges of graph
|
|
136
|
-
diff = y_max - y_min
|
|
137
|
-
if diff == 0.0 and y_min == 0.0
|
|
138
|
-
# Values are all zero so simply add/subtract 1
|
|
139
|
-
y_max = 1
|
|
140
|
-
y_min = -1
|
|
141
|
-
elsif diff == 0.0
|
|
142
|
-
# Values are the same but not zero, so separate them by a multiple of their value
|
|
143
|
-
y_max = y_max + y_max.abs
|
|
144
|
-
y_min = y_min - y_min.abs
|
|
145
|
-
else
|
|
146
|
-
# Give a 5% margin
|
|
147
|
-
y_max += (diff * 0.05)
|
|
148
|
-
y_min -= (diff * 0.05)
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Determine rough grid line scale
|
|
152
|
-
if manual_y_grid_line_scale
|
|
153
|
-
y_grid_line_scale = manual_y_grid_line_scale
|
|
154
|
-
else
|
|
155
|
-
diff = y_max - y_min
|
|
156
|
-
y_grid_line_scale = calculate_base(diff)
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
# Enforce non-zero scale
|
|
160
|
-
y_grid_line_scale = 0.1 if y_grid_line_scale == 0
|
|
161
|
-
|
|
162
|
-
# Now move the max and min values so they are multiples of the scale.
|
|
163
|
-
y_min = y_min - (y_min % y_grid_line_scale)
|
|
164
|
-
y_min -= y_grid_line_scale if y_min == 0
|
|
165
|
-
y_max = y_max - (y_max % y_grid_line_scale) + y_grid_line_scale
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
return y_min, y_max
|
|
169
|
-
end # def auto_scale_y_axis
|
|
170
|
-
|
|
171
|
-
# Builds y gridlines for an axis
|
|
172
|
-
def build_y_grid_lines(axis)
|
|
173
|
-
@y_grid_lines = []
|
|
174
|
-
|
|
175
|
-
case axis
|
|
176
|
-
when :NONE
|
|
177
|
-
return # Nothing to do if there are no lines
|
|
178
|
-
when :LEFT, :BOTH
|
|
179
|
-
y_max = @left_y_max
|
|
180
|
-
y_min = @left_y_min
|
|
181
|
-
y_auto_scale = @left_y_auto_scale
|
|
182
|
-
axis = :LEFT
|
|
183
|
-
when :RIGHT
|
|
184
|
-
y_max = @right_y_max
|
|
185
|
-
y_min = @right_y_min
|
|
186
|
-
y_auto_scale = @right_y_auto_scale
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
@y_grid_line_scale = determine_grid_line_scale(@manual_y_grid_line_scale, y_min, y_max)
|
|
190
|
-
if @show_y_grid_lines
|
|
191
|
-
states = @lines.unique_y_states(axis)
|
|
192
|
-
if states
|
|
193
|
-
states.each do |state_name, state_value|
|
|
194
|
-
state_value_float = state_value.to_f
|
|
195
|
-
max_length = 0
|
|
196
|
-
if state_value_float <= y_max and state_value_float >= y_min
|
|
197
|
-
# Add gridline for state
|
|
198
|
-
@y_grid_lines << state_value
|
|
199
|
-
max_length = state_name.length if state_name.length > max_length
|
|
200
|
-
end
|
|
201
|
-
if (max_length + 1) > @max_y_characters
|
|
202
|
-
@max_y_characters = max_length + 1
|
|
203
|
-
determine_graph_size()
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
else
|
|
207
|
-
calculate_y_grid_lines(y_min, y_max)
|
|
208
|
-
end
|
|
209
|
-
else
|
|
210
|
-
# Just show max and min
|
|
211
|
-
@y_grid_lines << y_max
|
|
212
|
-
@y_grid_lines << y_min
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
def calculate_y_grid_lines(y_min, y_max)
|
|
217
|
-
if @manual_y_grid_line_scale
|
|
218
|
-
# With manual grid lines, draw them all regardless of whether it will look nice
|
|
219
|
-
@y_grid_lines << y_min
|
|
220
|
-
grid_value = y_min + @y_grid_line_scale
|
|
221
|
-
if grid_value != y_min
|
|
222
|
-
while grid_value < (y_max - (@y_grid_line_scale / 2.0))
|
|
223
|
-
@y_grid_lines << grid_value
|
|
224
|
-
grid_value += @y_grid_line_scale
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
@y_grid_lines << y_max
|
|
228
|
-
else
|
|
229
|
-
# Determine a nice number of gridlines to show not including edges
|
|
230
|
-
metrics = Cosmos.getFontMetrics(@font)
|
|
231
|
-
label_size = metrics.height
|
|
232
|
-
# Calculate the maximum nubmer of grid lines based on the number of
|
|
233
|
-
# labels that can fit. Then add one because the top line can choose
|
|
234
|
-
# not to display its label.
|
|
235
|
-
max_grid_lines = (@graph_bottom_y - @graph_top_y) / label_size + 1
|
|
236
|
-
max_grid_lines = 2 if max_grid_lines < 2
|
|
237
|
-
|
|
238
|
-
# Calculate all the possible values between the y minimum and y
|
|
239
|
-
# maximum based on the y scale. These are all possible grid lines.
|
|
240
|
-
possible_grid_lines = []
|
|
241
|
-
possible_grid_lines << y_min
|
|
242
|
-
grid_value = y_min + @y_grid_line_scale
|
|
243
|
-
if grid_value != y_min
|
|
244
|
-
while grid_value < (y_max - (@y_grid_line_scale / 2.0))
|
|
245
|
-
possible_grid_lines << grid_value
|
|
246
|
-
grid_value += @y_grid_line_scale
|
|
247
|
-
end
|
|
248
|
-
end
|
|
249
|
-
possible_grid_lines << y_max
|
|
250
|
-
|
|
251
|
-
# Calculate the index through the possible grid lines by dividing
|
|
252
|
-
# the total possible by the maximum that will fit on the graph.
|
|
253
|
-
# Round up the integer math by adding 1.
|
|
254
|
-
num_possible = possible_grid_lines.length
|
|
255
|
-
increment = (num_possible / max_grid_lines) + 1
|
|
256
|
-
|
|
257
|
-
@y_grid_lines << y_min
|
|
258
|
-
if increment > 0
|
|
259
|
-
index = increment
|
|
260
|
-
while index < (num_possible - increment)
|
|
261
|
-
@y_grid_lines << possible_grid_lines[index]
|
|
262
|
-
index += increment
|
|
263
|
-
end
|
|
264
|
-
# Add the final increment as long as it doesn't reach the max
|
|
265
|
-
if possible_grid_lines[index] != y_max
|
|
266
|
-
@y_grid_lines << possible_grid_lines[index]
|
|
267
|
-
end
|
|
268
|
-
end
|
|
269
|
-
@y_grid_lines << y_max
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
# Builds x gridlines
|
|
274
|
-
def build_x_grid_lines
|
|
275
|
-
@x_grid_lines = []
|
|
276
|
-
|
|
277
|
-
@x_grid_line_scale = determine_grid_line_scale(@manual_x_grid_line_scale, @x_min, @x_max)
|
|
278
|
-
if @manual_x_grid_line_scale
|
|
279
|
-
@x_grid_line_scale = @manual_x_grid_line_scale
|
|
280
|
-
else
|
|
281
|
-
diff = @x_max - @x_min
|
|
282
|
-
@x_grid_line_scale = calculate_base(diff)
|
|
283
|
-
end
|
|
284
|
-
@x_grid_line_scale = 1.0 if @x_grid_line_scale < 1
|
|
285
|
-
|
|
286
|
-
if @show_x_grid_lines
|
|
287
|
-
states = @lines.single_line_with_x_states
|
|
288
|
-
if states
|
|
289
|
-
states.each do |state_name, state_value|
|
|
290
|
-
state_value_float = state_value.to_f
|
|
291
|
-
max_length = 0
|
|
292
|
-
if state_value_float <= @x_max and state_value_float >= @x_min
|
|
293
|
-
# Add gridline for state
|
|
294
|
-
@x_grid_lines << [state_value, state_name]
|
|
295
|
-
max_length = state_name.length if state_name.length > max_length
|
|
296
|
-
end
|
|
297
|
-
if (max_length + 1) > @max_x_characters
|
|
298
|
-
@max_x_characters = max_length + 1
|
|
299
|
-
determine_graph_size()
|
|
300
|
-
end
|
|
301
|
-
end
|
|
302
|
-
else
|
|
303
|
-
calculate_x_grid_lines()
|
|
304
|
-
end
|
|
305
|
-
else
|
|
306
|
-
if @x_max_label or @x_min_label
|
|
307
|
-
x_max_length = @x_max_label.to_s.length
|
|
308
|
-
x_min_length = @x_min_label.to_s.length
|
|
309
|
-
if x_max_length > x_min_length
|
|
310
|
-
max_length = x_max_length
|
|
311
|
-
else
|
|
312
|
-
max_length = x_min_length
|
|
313
|
-
end
|
|
314
|
-
if (max_length + 1) > @max_x_characters
|
|
315
|
-
@max_x_characters = max_length + 1
|
|
316
|
-
determine_graph_size()
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
# Just show max and min
|
|
321
|
-
@x_grid_lines << [@x_max, @x_max_label]
|
|
322
|
-
@x_grid_lines << [@x_min, @x_min_label]
|
|
323
|
-
end
|
|
324
|
-
end # def build_x_grid_lines
|
|
325
|
-
|
|
326
|
-
# Calculate the x gride lines for the graph
|
|
327
|
-
def calculate_x_grid_lines
|
|
328
|
-
if @manual_x_grid_line_scale
|
|
329
|
-
# With manual grid lines, draw them all regardless of whether it will look nice
|
|
330
|
-
@x_grid_lines << [@x_min, nil]
|
|
331
|
-
grid_value = @x_min + @x_grid_line_scale
|
|
332
|
-
if grid_value != @x_min
|
|
333
|
-
while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
|
|
334
|
-
@x_grid_lines << [grid_value, nil]
|
|
335
|
-
grid_value += @x_grid_line_scale
|
|
336
|
-
end
|
|
337
|
-
end
|
|
338
|
-
@x_grid_lines << [@x_max, nil]
|
|
339
|
-
else
|
|
340
|
-
# Determine a nice number of gridlines to show not including edges
|
|
341
|
-
metrics = Cosmos.getFontMetrics(@font)
|
|
342
|
-
label_size = metrics.width("HH:MM:SS:XXX")
|
|
343
|
-
# Calculate the maximum number of grid lines based on the number
|
|
344
|
-
# of labels that can fit. Then add one because the far right line
|
|
345
|
-
# can choose not to display its label.
|
|
346
|
-
max_grid_lines = (@graph_right_x - @graph_left_x) / label_size + 1
|
|
347
|
-
max_grid_lines = 2 if max_grid_lines < 2
|
|
348
|
-
|
|
349
|
-
# Calculate all the possible values between the x minimum and x
|
|
350
|
-
# maximum based on the x scale. These are all possible grid lines.
|
|
351
|
-
possible_grid_lines = []
|
|
352
|
-
possible_grid_lines << @x_min
|
|
353
|
-
grid_value = @x_min + @x_grid_line_scale
|
|
354
|
-
if grid_value != @x_min
|
|
355
|
-
while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
|
|
356
|
-
possible_grid_lines << grid_value
|
|
357
|
-
grid_value += @x_grid_line_scale
|
|
358
|
-
end
|
|
359
|
-
end
|
|
360
|
-
possible_grid_lines << @x_max
|
|
361
|
-
|
|
362
|
-
# Calculate the index through the possible grid lines by dividing
|
|
363
|
-
# the total possible by the maximum that will fit on the graph.
|
|
364
|
-
# Round up the integer math by adding 1.
|
|
365
|
-
num_possible = possible_grid_lines.length
|
|
366
|
-
increment = (num_possible / max_grid_lines) + 1
|
|
367
|
-
|
|
368
|
-
# Store off all the grid lines that will be displayed
|
|
369
|
-
@x_grid_lines << [@x_min, nil] # far left line
|
|
370
|
-
if increment > 0
|
|
371
|
-
index = increment
|
|
372
|
-
while index < (num_possible - increment)
|
|
373
|
-
@x_grid_lines << [possible_grid_lines[index], nil]
|
|
374
|
-
index += increment
|
|
375
|
-
end
|
|
376
|
-
# Add the final increment as long as it doesn't reach the max
|
|
377
|
-
if possible_grid_lines[index] != @x_max
|
|
378
|
-
@x_grid_lines << [possible_grid_lines[index], nil]
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
@x_grid_lines << [@x_max, nil] # far right line
|
|
382
|
-
end
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
# This function is used to calculate the "base" for a value. In this case,
|
|
386
|
-
# the base is defined to be the largest power of 10 that can be used to
|
|
387
|
-
# create a scale from 0 to the value with at least 10 values.
|
|
388
|
-
# Ex: calculate_base(100) = 10
|
|
389
|
-
# calculate_base(99) = 1
|
|
390
|
-
# calculate_base(10) = 1
|
|
391
|
-
# calculate_base(9) = 0.1
|
|
392
|
-
# calculate_base(1) = 0.1
|
|
393
|
-
# calculate_base(0.9) = 0.01
|
|
394
|
-
# calculate_base(0.1) = 0.01
|
|
395
|
-
# calculate_base(0) = 1 # this one is arbitrary but we don't want to return 0
|
|
396
|
-
def calculate_base(value)
|
|
397
|
-
base = value.abs
|
|
398
|
-
operations = 0
|
|
399
|
-
if base >= 1
|
|
400
|
-
while (true)
|
|
401
|
-
base = base / 10
|
|
402
|
-
if base < 1
|
|
403
|
-
break
|
|
404
|
-
end
|
|
405
|
-
operations += 1
|
|
406
|
-
end
|
|
407
|
-
elsif base != 0
|
|
408
|
-
operations = -1
|
|
409
|
-
while (true)
|
|
410
|
-
base = base * 10
|
|
411
|
-
if base >= 1
|
|
412
|
-
break
|
|
413
|
-
end
|
|
414
|
-
operations -= 1
|
|
415
|
-
end
|
|
416
|
-
else
|
|
417
|
-
operations = 1
|
|
418
|
-
end
|
|
419
|
-
return (10**(operations - 1)).to_f
|
|
420
|
-
end # def calculate_base
|
|
421
|
-
|
|
422
|
-
# This function converts an x coordinate on the graph to an x value
|
|
423
|
-
def scale_graph_to_value_x(x)
|
|
424
|
-
if (@x_min - @x_max) != 0
|
|
425
|
-
x_scaled = ((x - @graph_left_x).to_f / @x_scale) + @x_min
|
|
426
|
-
else
|
|
427
|
-
x_scaled = 0
|
|
428
|
-
end
|
|
429
|
-
return x_scaled
|
|
430
|
-
end # def scale_graph_to_value_x
|
|
431
|
-
|
|
432
|
-
# This function converts an x value to an x coordinate on the graph
|
|
433
|
-
# def scale_value_to_graph_x(x)
|
|
434
|
-
|
|
435
|
-
# This function converts a y value to a y coordinate on the graph
|
|
436
|
-
# def scale_value_to_graph_y(y, axis = :LEFT)
|
|
437
|
-
|
|
438
|
-
# This function converts a left axis y value to a right axis y value
|
|
439
|
-
def scale_left_to_right_y(left_y)
|
|
440
|
-
slope = (@right_y_max - @right_y_min) / (@left_y_max - @left_y_min)
|
|
441
|
-
offset = @right_y_max - (@left_y_max * slope)
|
|
442
|
-
return ((left_y * slope) + offset)
|
|
443
|
-
end
|
|
444
|
-
|
|
445
|
-
protected
|
|
446
|
-
|
|
447
|
-
def determine_grid_line_scale(manual_grid_line_scale, min, max)
|
|
448
|
-
if manual_grid_line_scale
|
|
449
|
-
scale = manual_grid_line_scale
|
|
450
|
-
else
|
|
451
|
-
diff = max - min
|
|
452
|
-
scale = calculate_base(diff)
|
|
453
|
-
end
|
|
454
|
-
scale = 1.0 if scale < 1
|
|
455
|
-
return scale
|
|
456
|
-
end
|
|
457
|
-
|
|
458
|
-
end # class LineGraph
|
|
459
|
-
|
|
460
|
-
end # module Cosmos
|
|
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
|
+
module Cosmos
|
|
12
|
+
|
|
13
|
+
# LineGraph class continued
|
|
14
|
+
class LineGraph < Qt::Widget
|
|
15
|
+
|
|
16
|
+
# Spacer between items
|
|
17
|
+
GRAPH_SPACER = 5
|
|
18
|
+
|
|
19
|
+
# Determine the size of the actual graph area
|
|
20
|
+
def determine_graph_size
|
|
21
|
+
metrics = Cosmos.getFontMetrics(@font)
|
|
22
|
+
|
|
23
|
+
@graph_left_x = 4 * GRAPH_SPACER
|
|
24
|
+
if @left_y_axis_title
|
|
25
|
+
@graph_left_x += metrics.width('W') + GRAPH_SPACER
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Determine number of pixels to the right side of graph
|
|
29
|
+
@graph_right_x = self.width - 6 * GRAPH_SPACER
|
|
30
|
+
if @right_y_axis_title
|
|
31
|
+
@graph_right_x -= (metrics.width('W') + GRAPH_SPACER)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Determine number of pixels above top of graph
|
|
35
|
+
if @title
|
|
36
|
+
title_metrics = Cosmos.getFontMetrics(@title_font)
|
|
37
|
+
title_height = title_metrics.height
|
|
38
|
+
else
|
|
39
|
+
title_height = 0
|
|
40
|
+
end
|
|
41
|
+
half_y_max_label_height = (metrics.height / 2)
|
|
42
|
+
@graph_top_y = title_height + half_y_max_label_height + GRAPH_SPACER
|
|
43
|
+
|
|
44
|
+
# Determine number of pixels below bottom of graph
|
|
45
|
+
if @x_axis_title
|
|
46
|
+
x_axis_title_height = metrics.height + GRAPH_SPACER / 2
|
|
47
|
+
else
|
|
48
|
+
x_axis_title_height = 0
|
|
49
|
+
end
|
|
50
|
+
x_axis_label_height = metrics.height + GRAPH_SPACER
|
|
51
|
+
legend_height = 0
|
|
52
|
+
if @show_legend && !@lines.empty?
|
|
53
|
+
text_y = self.height - 1 - (GRAPH_SPACER * 2)
|
|
54
|
+
text_height = metrics.height
|
|
55
|
+
if @lines.axes == :BOTH
|
|
56
|
+
left_text_y = text_y
|
|
57
|
+
right_text_y = text_y
|
|
58
|
+
@lines.legend.each do |text, color, axis|
|
|
59
|
+
if axis == :LEFT
|
|
60
|
+
left_text_y -= text_height
|
|
61
|
+
else
|
|
62
|
+
right_text_y -= text_height
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
if left_text_y < right_text_y
|
|
66
|
+
text_y = left_text_y
|
|
67
|
+
else
|
|
68
|
+
text_y = right_text_y
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
@lines.legend.each do |text, color, axis|
|
|
72
|
+
text_y -= text_height
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
legend_height = self.height - text_y - GRAPH_SPACER
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
@graph_bottom_y = self.height - 1 - (x_axis_title_height + x_axis_label_height + legend_height) - GRAPH_SPACER - GRAPH_SPACER
|
|
79
|
+
end # def determine_graph_size
|
|
80
|
+
|
|
81
|
+
# Calculate scaling factors between value and graph coordinates
|
|
82
|
+
def calculate_scaling_factors
|
|
83
|
+
# Determine the x conversion factor between value coordinates and graph coordinates
|
|
84
|
+
if @x_max != @x_min
|
|
85
|
+
@x_scale = (@graph_right_x - @graph_left_x).to_f / (@x_max - @x_min).to_f
|
|
86
|
+
else
|
|
87
|
+
@x_scale = 0.0
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Determine the y conversion factor between value coordinates and graph coordinates
|
|
91
|
+
if @left_y_max != @left_y_min
|
|
92
|
+
@left_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@left_y_max - @left_y_min).to_f
|
|
93
|
+
else
|
|
94
|
+
@left_y_scale = 0.0
|
|
95
|
+
end
|
|
96
|
+
if @right_y_max != @right_y_min
|
|
97
|
+
@right_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@right_y_max - @right_y_min).to_f
|
|
98
|
+
else
|
|
99
|
+
@right_y_scale = 0.0
|
|
100
|
+
end
|
|
101
|
+
end # def calculate_scaling_factors
|
|
102
|
+
|
|
103
|
+
# Determine the scale of the graph, either manually or automatically
|
|
104
|
+
def scale_graph
|
|
105
|
+
if @x_auto_scale
|
|
106
|
+
@x_min, @x_max, @x_min_label, @x_max_label = @lines.x_min_max_labels
|
|
107
|
+
end
|
|
108
|
+
scale = @manual_y_grid_line_scale
|
|
109
|
+
if @left_y_auto_scale
|
|
110
|
+
@left_y_min, @left_y_max = auto_scale_y_axis(@lines.left_y_value_range, scale)
|
|
111
|
+
end
|
|
112
|
+
if @right_y_auto_scale
|
|
113
|
+
# scale is nil if there are no left lines to allow for autoscalling
|
|
114
|
+
scale = nil unless @lines.left_y_axis?
|
|
115
|
+
@right_y_min, @right_y_max = auto_scale_y_axis(@lines.right_y_value_range, scale)
|
|
116
|
+
end # def scale_graph
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Determine the y minimum and maximum values for the given lines and given
|
|
120
|
+
# grid line scale
|
|
121
|
+
#
|
|
122
|
+
# @param lines [Array] Array of lines containing the x and y values
|
|
123
|
+
# @param manual_y_grid_line_scale [Float] Whether there is a manual grid
|
|
124
|
+
# line scale. The return values will be multiples of this scale if given.
|
|
125
|
+
# @return [Float, Float] The minimum and maximum values
|
|
126
|
+
def auto_scale_y_axis(value_range, manual_y_grid_line_scale)
|
|
127
|
+
y_max = 1
|
|
128
|
+
y_min = -1
|
|
129
|
+
|
|
130
|
+
# Ensure we have a valid range of values
|
|
131
|
+
if value_range.size
|
|
132
|
+
y_min = value_range.first
|
|
133
|
+
y_max = value_range.last
|
|
134
|
+
|
|
135
|
+
# Add space between values and edges of graph
|
|
136
|
+
diff = y_max - y_min
|
|
137
|
+
if diff == 0.0 and y_min == 0.0
|
|
138
|
+
# Values are all zero so simply add/subtract 1
|
|
139
|
+
y_max = 1
|
|
140
|
+
y_min = -1
|
|
141
|
+
elsif diff == 0.0
|
|
142
|
+
# Values are the same but not zero, so separate them by a multiple of their value
|
|
143
|
+
y_max = y_max + y_max.abs
|
|
144
|
+
y_min = y_min - y_min.abs
|
|
145
|
+
else
|
|
146
|
+
# Give a 5% margin
|
|
147
|
+
y_max += (diff * 0.05)
|
|
148
|
+
y_min -= (diff * 0.05)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Determine rough grid line scale
|
|
152
|
+
if manual_y_grid_line_scale
|
|
153
|
+
y_grid_line_scale = manual_y_grid_line_scale
|
|
154
|
+
else
|
|
155
|
+
diff = y_max - y_min
|
|
156
|
+
y_grid_line_scale = calculate_base(diff)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Enforce non-zero scale
|
|
160
|
+
y_grid_line_scale = 0.1 if y_grid_line_scale == 0
|
|
161
|
+
|
|
162
|
+
# Now move the max and min values so they are multiples of the scale.
|
|
163
|
+
y_min = y_min - (y_min % y_grid_line_scale)
|
|
164
|
+
y_min -= y_grid_line_scale if y_min == 0
|
|
165
|
+
y_max = y_max - (y_max % y_grid_line_scale) + y_grid_line_scale
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
return y_min, y_max
|
|
169
|
+
end # def auto_scale_y_axis
|
|
170
|
+
|
|
171
|
+
# Builds y gridlines for an axis
|
|
172
|
+
def build_y_grid_lines(axis)
|
|
173
|
+
@y_grid_lines = []
|
|
174
|
+
|
|
175
|
+
case axis
|
|
176
|
+
when :NONE
|
|
177
|
+
return # Nothing to do if there are no lines
|
|
178
|
+
when :LEFT, :BOTH
|
|
179
|
+
y_max = @left_y_max
|
|
180
|
+
y_min = @left_y_min
|
|
181
|
+
y_auto_scale = @left_y_auto_scale
|
|
182
|
+
axis = :LEFT
|
|
183
|
+
when :RIGHT
|
|
184
|
+
y_max = @right_y_max
|
|
185
|
+
y_min = @right_y_min
|
|
186
|
+
y_auto_scale = @right_y_auto_scale
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
@y_grid_line_scale = determine_grid_line_scale(@manual_y_grid_line_scale, y_min, y_max)
|
|
190
|
+
if @show_y_grid_lines
|
|
191
|
+
states = @lines.unique_y_states(axis)
|
|
192
|
+
if states
|
|
193
|
+
states.each do |state_name, state_value|
|
|
194
|
+
state_value_float = state_value.to_f
|
|
195
|
+
max_length = 0
|
|
196
|
+
if state_value_float <= y_max and state_value_float >= y_min
|
|
197
|
+
# Add gridline for state
|
|
198
|
+
@y_grid_lines << state_value
|
|
199
|
+
max_length = state_name.length if state_name.length > max_length
|
|
200
|
+
end
|
|
201
|
+
if (max_length + 1) > @max_y_characters
|
|
202
|
+
@max_y_characters = max_length + 1
|
|
203
|
+
determine_graph_size()
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
else
|
|
207
|
+
calculate_y_grid_lines(y_min, y_max)
|
|
208
|
+
end
|
|
209
|
+
else
|
|
210
|
+
# Just show max and min
|
|
211
|
+
@y_grid_lines << y_max
|
|
212
|
+
@y_grid_lines << y_min
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def calculate_y_grid_lines(y_min, y_max)
|
|
217
|
+
if @manual_y_grid_line_scale
|
|
218
|
+
# With manual grid lines, draw them all regardless of whether it will look nice
|
|
219
|
+
@y_grid_lines << y_min
|
|
220
|
+
grid_value = y_min + @y_grid_line_scale
|
|
221
|
+
if grid_value != y_min
|
|
222
|
+
while grid_value < (y_max - (@y_grid_line_scale / 2.0))
|
|
223
|
+
@y_grid_lines << grid_value
|
|
224
|
+
grid_value += @y_grid_line_scale
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
@y_grid_lines << y_max
|
|
228
|
+
else
|
|
229
|
+
# Determine a nice number of gridlines to show not including edges
|
|
230
|
+
metrics = Cosmos.getFontMetrics(@font)
|
|
231
|
+
label_size = metrics.height
|
|
232
|
+
# Calculate the maximum nubmer of grid lines based on the number of
|
|
233
|
+
# labels that can fit. Then add one because the top line can choose
|
|
234
|
+
# not to display its label.
|
|
235
|
+
max_grid_lines = (@graph_bottom_y - @graph_top_y) / label_size + 1
|
|
236
|
+
max_grid_lines = 2 if max_grid_lines < 2
|
|
237
|
+
|
|
238
|
+
# Calculate all the possible values between the y minimum and y
|
|
239
|
+
# maximum based on the y scale. These are all possible grid lines.
|
|
240
|
+
possible_grid_lines = []
|
|
241
|
+
possible_grid_lines << y_min
|
|
242
|
+
grid_value = y_min + @y_grid_line_scale
|
|
243
|
+
if grid_value != y_min
|
|
244
|
+
while grid_value < (y_max - (@y_grid_line_scale / 2.0))
|
|
245
|
+
possible_grid_lines << grid_value
|
|
246
|
+
grid_value += @y_grid_line_scale
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
possible_grid_lines << y_max
|
|
250
|
+
|
|
251
|
+
# Calculate the index through the possible grid lines by dividing
|
|
252
|
+
# the total possible by the maximum that will fit on the graph.
|
|
253
|
+
# Round up the integer math by adding 1.
|
|
254
|
+
num_possible = possible_grid_lines.length
|
|
255
|
+
increment = (num_possible / max_grid_lines) + 1
|
|
256
|
+
|
|
257
|
+
@y_grid_lines << y_min
|
|
258
|
+
if increment > 0
|
|
259
|
+
index = increment
|
|
260
|
+
while index < (num_possible - increment)
|
|
261
|
+
@y_grid_lines << possible_grid_lines[index]
|
|
262
|
+
index += increment
|
|
263
|
+
end
|
|
264
|
+
# Add the final increment as long as it doesn't reach the max
|
|
265
|
+
if possible_grid_lines[index] != y_max
|
|
266
|
+
@y_grid_lines << possible_grid_lines[index]
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
@y_grid_lines << y_max
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# Builds x gridlines
|
|
274
|
+
def build_x_grid_lines
|
|
275
|
+
@x_grid_lines = []
|
|
276
|
+
|
|
277
|
+
@x_grid_line_scale = determine_grid_line_scale(@manual_x_grid_line_scale, @x_min, @x_max)
|
|
278
|
+
if @manual_x_grid_line_scale
|
|
279
|
+
@x_grid_line_scale = @manual_x_grid_line_scale
|
|
280
|
+
else
|
|
281
|
+
diff = @x_max - @x_min
|
|
282
|
+
@x_grid_line_scale = calculate_base(diff)
|
|
283
|
+
end
|
|
284
|
+
@x_grid_line_scale = 1.0 if @x_grid_line_scale < 1
|
|
285
|
+
|
|
286
|
+
if @show_x_grid_lines
|
|
287
|
+
states = @lines.single_line_with_x_states
|
|
288
|
+
if states
|
|
289
|
+
states.each do |state_name, state_value|
|
|
290
|
+
state_value_float = state_value.to_f
|
|
291
|
+
max_length = 0
|
|
292
|
+
if state_value_float <= @x_max and state_value_float >= @x_min
|
|
293
|
+
# Add gridline for state
|
|
294
|
+
@x_grid_lines << [state_value, state_name]
|
|
295
|
+
max_length = state_name.length if state_name.length > max_length
|
|
296
|
+
end
|
|
297
|
+
if (max_length + 1) > @max_x_characters
|
|
298
|
+
@max_x_characters = max_length + 1
|
|
299
|
+
determine_graph_size()
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
else
|
|
303
|
+
calculate_x_grid_lines()
|
|
304
|
+
end
|
|
305
|
+
else
|
|
306
|
+
if @x_max_label or @x_min_label
|
|
307
|
+
x_max_length = @x_max_label.to_s.length
|
|
308
|
+
x_min_length = @x_min_label.to_s.length
|
|
309
|
+
if x_max_length > x_min_length
|
|
310
|
+
max_length = x_max_length
|
|
311
|
+
else
|
|
312
|
+
max_length = x_min_length
|
|
313
|
+
end
|
|
314
|
+
if (max_length + 1) > @max_x_characters
|
|
315
|
+
@max_x_characters = max_length + 1
|
|
316
|
+
determine_graph_size()
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# Just show max and min
|
|
321
|
+
@x_grid_lines << [@x_max, @x_max_label]
|
|
322
|
+
@x_grid_lines << [@x_min, @x_min_label]
|
|
323
|
+
end
|
|
324
|
+
end # def build_x_grid_lines
|
|
325
|
+
|
|
326
|
+
# Calculate the x gride lines for the graph
|
|
327
|
+
def calculate_x_grid_lines
|
|
328
|
+
if @manual_x_grid_line_scale
|
|
329
|
+
# With manual grid lines, draw them all regardless of whether it will look nice
|
|
330
|
+
@x_grid_lines << [@x_min, nil]
|
|
331
|
+
grid_value = @x_min + @x_grid_line_scale
|
|
332
|
+
if grid_value != @x_min
|
|
333
|
+
while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
|
|
334
|
+
@x_grid_lines << [grid_value, nil]
|
|
335
|
+
grid_value += @x_grid_line_scale
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
@x_grid_lines << [@x_max, nil]
|
|
339
|
+
else
|
|
340
|
+
# Determine a nice number of gridlines to show not including edges
|
|
341
|
+
metrics = Cosmos.getFontMetrics(@font)
|
|
342
|
+
label_size = metrics.width("HH:MM:SS:XXX")
|
|
343
|
+
# Calculate the maximum number of grid lines based on the number
|
|
344
|
+
# of labels that can fit. Then add one because the far right line
|
|
345
|
+
# can choose not to display its label.
|
|
346
|
+
max_grid_lines = (@graph_right_x - @graph_left_x) / label_size + 1
|
|
347
|
+
max_grid_lines = 2 if max_grid_lines < 2
|
|
348
|
+
|
|
349
|
+
# Calculate all the possible values between the x minimum and x
|
|
350
|
+
# maximum based on the x scale. These are all possible grid lines.
|
|
351
|
+
possible_grid_lines = []
|
|
352
|
+
possible_grid_lines << @x_min
|
|
353
|
+
grid_value = @x_min + @x_grid_line_scale
|
|
354
|
+
if grid_value != @x_min
|
|
355
|
+
while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
|
|
356
|
+
possible_grid_lines << grid_value
|
|
357
|
+
grid_value += @x_grid_line_scale
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
possible_grid_lines << @x_max
|
|
361
|
+
|
|
362
|
+
# Calculate the index through the possible grid lines by dividing
|
|
363
|
+
# the total possible by the maximum that will fit on the graph.
|
|
364
|
+
# Round up the integer math by adding 1.
|
|
365
|
+
num_possible = possible_grid_lines.length
|
|
366
|
+
increment = (num_possible / max_grid_lines) + 1
|
|
367
|
+
|
|
368
|
+
# Store off all the grid lines that will be displayed
|
|
369
|
+
@x_grid_lines << [@x_min, nil] # far left line
|
|
370
|
+
if increment > 0
|
|
371
|
+
index = increment
|
|
372
|
+
while index < (num_possible - increment)
|
|
373
|
+
@x_grid_lines << [possible_grid_lines[index], nil]
|
|
374
|
+
index += increment
|
|
375
|
+
end
|
|
376
|
+
# Add the final increment as long as it doesn't reach the max
|
|
377
|
+
if possible_grid_lines[index] != @x_max
|
|
378
|
+
@x_grid_lines << [possible_grid_lines[index], nil]
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
@x_grid_lines << [@x_max, nil] # far right line
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
# This function is used to calculate the "base" for a value. In this case,
|
|
386
|
+
# the base is defined to be the largest power of 10 that can be used to
|
|
387
|
+
# create a scale from 0 to the value with at least 10 values.
|
|
388
|
+
# Ex: calculate_base(100) = 10
|
|
389
|
+
# calculate_base(99) = 1
|
|
390
|
+
# calculate_base(10) = 1
|
|
391
|
+
# calculate_base(9) = 0.1
|
|
392
|
+
# calculate_base(1) = 0.1
|
|
393
|
+
# calculate_base(0.9) = 0.01
|
|
394
|
+
# calculate_base(0.1) = 0.01
|
|
395
|
+
# calculate_base(0) = 1 # this one is arbitrary but we don't want to return 0
|
|
396
|
+
def calculate_base(value)
|
|
397
|
+
base = value.abs
|
|
398
|
+
operations = 0
|
|
399
|
+
if base >= 1
|
|
400
|
+
while (true)
|
|
401
|
+
base = base / 10
|
|
402
|
+
if base < 1
|
|
403
|
+
break
|
|
404
|
+
end
|
|
405
|
+
operations += 1
|
|
406
|
+
end
|
|
407
|
+
elsif base != 0
|
|
408
|
+
operations = -1
|
|
409
|
+
while (true)
|
|
410
|
+
base = base * 10
|
|
411
|
+
if base >= 1
|
|
412
|
+
break
|
|
413
|
+
end
|
|
414
|
+
operations -= 1
|
|
415
|
+
end
|
|
416
|
+
else
|
|
417
|
+
operations = 1
|
|
418
|
+
end
|
|
419
|
+
return (10**(operations - 1)).to_f
|
|
420
|
+
end # def calculate_base
|
|
421
|
+
|
|
422
|
+
# This function converts an x coordinate on the graph to an x value
|
|
423
|
+
def scale_graph_to_value_x(x)
|
|
424
|
+
if (@x_min - @x_max) != 0
|
|
425
|
+
x_scaled = ((x - @graph_left_x).to_f / @x_scale) + @x_min
|
|
426
|
+
else
|
|
427
|
+
x_scaled = 0
|
|
428
|
+
end
|
|
429
|
+
return x_scaled
|
|
430
|
+
end # def scale_graph_to_value_x
|
|
431
|
+
|
|
432
|
+
# This function converts an x value to an x coordinate on the graph
|
|
433
|
+
# def scale_value_to_graph_x(x)
|
|
434
|
+
|
|
435
|
+
# This function converts a y value to a y coordinate on the graph
|
|
436
|
+
# def scale_value_to_graph_y(y, axis = :LEFT)
|
|
437
|
+
|
|
438
|
+
# This function converts a left axis y value to a right axis y value
|
|
439
|
+
def scale_left_to_right_y(left_y)
|
|
440
|
+
slope = (@right_y_max - @right_y_min) / (@left_y_max - @left_y_min)
|
|
441
|
+
offset = @right_y_max - (@left_y_max * slope)
|
|
442
|
+
return ((left_y * slope) + offset)
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
protected
|
|
446
|
+
|
|
447
|
+
def determine_grid_line_scale(manual_grid_line_scale, min, max)
|
|
448
|
+
if manual_grid_line_scale
|
|
449
|
+
scale = manual_grid_line_scale
|
|
450
|
+
else
|
|
451
|
+
diff = max - min
|
|
452
|
+
scale = calculate_base(diff)
|
|
453
|
+
end
|
|
454
|
+
scale = 1.0 if scale < 1
|
|
455
|
+
return scale
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
end # class LineGraph
|
|
459
|
+
|
|
460
|
+
end # module Cosmos
|