Added ground station mockup

This commit is contained in:
2017-11-29 13:11:44 -08:00
parent edec011e69
commit 62a2b268c2
18 changed files with 2473 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
[Dolphin]
Timestamp=2017,11,29,12,54,0
Version=3
ViewMode=1

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.6.1 (C:\Program Files\Python36\python.exe)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

View File

@@ -0,0 +1,21 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPep8Inspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="E402" />
</list>
</option>
</inspection_tool>
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="Framework.MiniBoardIOCore.*" />
<option value="PyQt5.QtCore.pyqtSignal.pyqtSignal.emit" />
<option value="PyQt5.QtCore.pyqtSignal.pyqtSignal.connect" />
</list>
</option>
</inspection_tool>
</profile>
</component>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6.1 (C:\Program Files\Python36\python.exe)" project-jdk-type="Python SDK" />
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/RoverBaseStationMockup.iml" filepath="$PROJECT_DIR$/.idea/RoverBaseStationMockup.iml" />
</modules>
</component>
</project>

View File

@@ -0,0 +1,720 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BookmarkManager">
<bookmark url="file://$PROJECT_DIR$/Framework/VideoCore.py" line="151" />
</component>
<component name="ChangeListManager">
<list default="true" id="5ad562ed-81e4-4f9a-aac3-f3b24e4dd981" name="Default" comment="" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CoverageDataManager">
<SUITE FILE_PATH="coverage/RoverBaseStationMockup$Local_Launch.coverage" NAME="Local Launch Coverage Results" MODIFIED="1508011114635" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="RoverBaseStation.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="901">
<caret line="62" column="112" lean-forward="false" selection-start-line="60" selection-start-column="10" selection-end-line="62" selection-end-column="112" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="FlasherTestCore.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="false" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="VideoCore.py" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="678">
<caret line="158" column="0" lean-forward="false" selection-start-line="158" selection-start-column="0" selection-end-line="161" selection-end-column="0" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="__init__.py" pinned="false" current-in-tab="false">
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54298">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>camera</find>
</findStrings>
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/Framework/FlasherTestCore.py" />
<option value="$PROJECT_DIR$/RoverBaseStation.py" />
<option value="$PROJECT_DIR$/Framework/VideoCore.py" />
</list>
</option>
</component>
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsGulpfileManager">
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="-7" />
<option name="width" value="974" />
<option name="height" value="1057" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
<manualOrder />
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="RoverBaseStationMockup" type="b2602c69:ProjectViewProjectNode" />
<item name="RoverBaseStationMockup" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="RoverBaseStationMockup" type="b2602c69:ProjectViewProjectNode" />
<item name="RoverBaseStationMockup" type="462c0819:PsiDirectoryNode" />
<item name="Framework" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="RoverBaseStationMockup" type="b2602c69:ProjectViewProjectNode" />
<item name="RoverBaseStationMockup" type="462c0819:PsiDirectoryNode" />
<item name="Resources" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="RoverBaseStationMockup" type="b2602c69:ProjectViewProjectNode" />
<item name="RoverBaseStationMockup" type="462c0819:PsiDirectoryNode" />
<item name="Resources" type="462c0819:PsiDirectoryNode" />
<item name="Images" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scratches" />
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="last_opened_file_path" value="$PROJECT_DIR$/RoverBaseStation.py" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="restartRequiresConfirmation" value="false" />
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\Corwin Perren\PycharmProjects\RoverBaseStationMockup" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Python.Local Launch">
<configuration name="Local Launch" type="PythonConfigurationType" factoryName="Python" singleton="true">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="C:\Program Files\Python36\python.exe" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="RoverBaseStationMockup" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/RoverBaseStation.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
</configuration>
</component>
<component name="ShelveChangesManager" show_recycled="false">
<option name="remove_strategy" value="false" />
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="5ad562ed-81e4-4f9a-aac3-f3b24e4dd981" name="Default" comment="" />
<created>1505485834792</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1505485834792</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1066" extended-state="6" />
<editor active="true" />
<layout>
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.14605543" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.20645161" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.21182796" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Data View" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32903227" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<option name="time" value="1" />
</breakpoint-manager>
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="901">
<caret line="62" column="112" lean-forward="false" selection-start-line="60" selection-start-column="10" selection-end-line="62" selection-end-column="112" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="false" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54451">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2584">
<caret line="157" column="8" lean-forward="false" selection-start-line="157" selection-start-column="8" selection-end-line="157" selection-end-column="8" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="901">
<caret line="62" column="112" lean-forward="false" selection-start-line="60" selection-start-column="10" selection-end-line="62" selection-end-column="112" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="false" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54451">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2584">
<caret line="157" column="8" lean-forward="false" selection-start-line="157" selection-start-column="8" selection-end-line="157" selection-end-column="8" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="867">
<caret line="60" column="122" lean-forward="false" selection-start-line="60" selection-start-column="122" selection-end-line="60" selection-end-column="122" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54451">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="false" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="867">
<caret line="60" column="122" lean-forward="false" selection-start-line="60" selection-start-column="122" selection-end-line="60" selection-end-column="122" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54451">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="false" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="867">
<caret line="60" column="122" lean-forward="false" selection-start-line="60" selection-start-column="122" selection-end-line="60" selection-end-column="122" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54451">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="false" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="867">
<caret line="60" column="122" lean-forward="false" selection-start-line="60" selection-start-column="122" selection-end-line="60" selection-end-column="122" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54451">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="true" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="867">
<caret line="60" column="122" lean-forward="false" selection-start-line="60" selection-start-column="122" selection-end-line="60" selection-end-column="122" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="11" column="0" lean-forward="true" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54451">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1445">
<caret line="86" column="43" lean-forward="true" selection-start-line="86" selection-start-column="43" selection-end-line="86" selection-end-column="43" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="867">
<caret line="60" column="0" lean-forward="false" selection-start-line="60" selection-start-column="0" selection-end-line="62" selection-end-column="112" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="3" column="0" lean-forward="false" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="578">
<caret line="37" column="20" lean-forward="true" selection-start-line="37" selection-start-column="20" selection-end-line="37" selection-end-column="20" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="867">
<caret line="60" column="0" lean-forward="false" selection-start-line="60" selection-start-column="0" selection-end-line="62" selection-end-column="112" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="3" column="0" lean-forward="true" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="816">
<caret line="51" column="42" lean-forward="false" selection-start-line="51" selection-start-column="42" selection-end-line="51" selection-end-column="42" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2057">
<caret line="126" column="0" lean-forward="false" selection-start-line="126" selection-start-column="0" selection-end-line="126" selection-end-column="41" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="uml://Python/RoverBaseStation.ApplicationWindow">
<provider selected="true" editor-type-id="UmlEditorProvider">
<state>
<ID>Python</ID>
<OriginalElement>RoverBaseStation.ApplicationWindow</OriginalElement>
<nodes>
<node x="" y="">RoverBaseStation.ApplicationWindow</node>
<node x="" y="">PyQt5.QtWidgets.QWidget.QWidget</node>
<node x="" y="">PyQt5.QtWidgets.QMainWindow.QMainWindow</node>
</nodes>
<notes />
<edges />
<settings layout="Hierarchic Group" zoom="1.0" x="145.0" y="94.0" />
<SelectedNodes />
<Categories />
<SCOPE>All</SCOPE>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Resources/Images/mountain_closeup.JPG">
<provider selected="true" editor-type-id="images">
<state />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Resources/Images/mountains_from_marys_peak.JPG">
<provider selected="true" editor-type-id="images">
<state />
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.1/system/python_stubs/-1120166012/cv2/videostab.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://C:/Program Files/Python36/Lib/urllib/request.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="100">
<caret line="1784" column="47" lean-forward="true" selection-start-line="1784" selection-start-column="47" selection-end-line="1784" selection-end-column="47" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.1/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="236">
<caret line="3443" column="4" lean-forward="false" selection-start-line="3443" selection-start-column="4" selection-end-line="3443" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2017.2/system/python_stubs/-1120166012/cv2/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54298">
<caret line="3203" column="4" lean-forward="false" selection-start-line="3203" selection-start-column="4" selection-end-line="3203" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
<entry file="file://C:/Program Files/Python36/Lib/site-packages/PIL/Image.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="177">
<caret line="1672" column="0" lean-forward="false" selection-start-line="1672" selection-start-column="0" selection-end-line="1672" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Resources/Images/compass.png">
<provider selected="true" editor-type-id="images">
<state />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/FlasherTestCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1734">
<caret line="103" column="0" lean-forward="false" selection-start-line="103" selection-start-column="0" selection-end-line="103" selection-end-column="0" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverBaseStation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="901">
<caret line="62" column="112" lean-forward="false" selection-start-line="60" selection-start-column="10" selection-end-line="62" selection-end-column="112" />
<folding>
<element signature="e#478#488#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoCore.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="678">
<caret line="158" column="0" lean-forward="false" selection-start-line="158" selection-start-column="0" selection-end-line="161" selection-end-column="0" />
<folding>
<element signature="e#0#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>

View File

@@ -0,0 +1,131 @@
from PyQt5 import QtWidgets, QtCore, QtGui
import time
class Flasher(QtCore.QThread):
THREAD_DELAY = 100
FLASH_PERIOD = 1 # Per Second
update_label_status__signal = QtCore.pyqtSignal()
def __init__(self, label_gui_element, subject_text, good_text, warning_text, bad_text):
super(Flasher, self).__init__()
self.subject_text = subject_text
self.label = label_gui_element # type: QtWidgets.QLabel
self.not_abort = True
self.statuses = {
"GOOD": {
"style": "background-color: green;",
"text": good_text
},
"WARNING": {
"style": "background-color: yellow;",
"text": warning_text
},
"BAD": {
"style": "background-color: red;",
"text": bad_text
},
"NEUTRAL": {
"style": ""
},
"UNKNOWN": {
"style": "background-color: black;",
"text": "STATUS UNKNOWN"
}
}
self.label_status = "BAD"
self.current_label_status = self.label_status
self.last_label_status = self.current_label_status
self.connect_signals_to_slots()
self.last_time = time.time()
def run(self):
while self.not_abort:
if (time.time() - self.last_time) >= self.FLASH_PERIOD:
if self.current_label_status in ["BAD", "WARNING", "UNKNOWN"]:
self.current_label_status = "NEUTRAL"
elif self.current_label_status == "NEUTRAL":
self.current_label_status = self.label_status
self.update_label_status__signal.emit()
self.last_time = time.time()
self.msleep(self.THREAD_DELAY)
def connect_signals_to_slots(self):
self.update_label_status__signal.connect(self.set_style__slot)
def set_label_status__slot(self, status):
text = self.subject_text
if status in self.statuses:
self.label_status = status
text += "\n" + self.statuses[self.label_status]["text"]
else:
self.label_status = "UNKNOWN"
self.label.setText(text)
def set_style__slot(self):
self.label.setStyleSheet(self.statuses[self.current_label_status]["style"])
class FlasherTest(QtCore.QThread):
set_style_sheets_signal = QtCore.pyqtSignal()
start_flashers__signal = QtCore.pyqtSignal()
def __init__(self, main_window):
super(FlasherTest, self).__init__()
self.main_window = main_window
self.not_abort = True
self.label = self.main_window.label # type: QtWidgets.QLabel
self.label_2 = self.main_window.label_3 # type: QtWidgets.QLabel
self.label_3 = self.main_window.label_4 # type: QtWidgets.QLabel
self.rover_connected_flasher = Flasher(self.label, "ROVER", "CONNECTED", "INTERMITTENT", "DISCONNECTED")
self.controller_connected_flasher = Flasher(self.label_2, "CONTROLLER", "CONNECTED", "INTERMITTENT", "DISCONNECTED")
self.frsky_controller_connected_flasher = Flasher(self.label_3, "FRSKY", "CONNECTED", "INTERMITTENT", "DISCONNECTED")
self.rover_connected_flasher.set_label_status__slot("GOOD")
self.controller_connected_flasher.set_label_status__slot("WARNING")
self.frsky_controller_connected_flasher.set_label_status__slot("BAD")
self.start_flashers__signal.connect(self.rover_connected_flasher.start)
self.start_flashers__signal.connect(self.controller_connected_flasher.start)
self.start_flashers__signal.connect(self.frsky_controller_connected_flasher.start)
self.start_flashers__signal.emit()
self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
def run(self):
start_time = time.time()
while self.not_abort:
if time.time() - start_time > 1:
self.set_style_sheets_signal.emit()
start_time = time.time()
self.msleep(100)
def set_style_sheets(self):
if not self.label_last_color:
self.label_2.setStyleSheet("background-color: yellow;")
self.label_last_color = "asdf"
else:
self.label_2.setStyleSheet("")
self.label_last_color = ""
def on_kill_threads__slot(self):
self.rover_connected_flasher.terminate()
self.not_abort = False

View File

@@ -0,0 +1,164 @@
from PyQt5 import QtWidgets, QtCore, QtGui, QtMultimediaWidgets
import time
import cv2
import qimage2ndarray
import PIL.Image
from PIL.ImageQt import ImageQt
CV_CAP_PROP_FRAME_WIDTH = 3
CV_CAP_PROP_FRAME_HEIGHT = 4
CV_CAP_PROP_FPS = 5
class Compass(QtCore.QThread):
compass_ready__signal = QtCore.pyqtSignal()
def __init__(self, main_window):
super(Compass, self).__init__()
self.main_window = main_window
self.not_abort = True
self.image = PIL.Image.open("Resources/Images/compass.png").resize((300, 300)) # PIL.Image
self.compass_dir = 1
self.compass_label = self.main_window.compass_label # type: QtWidgets.QLabel
self.compass_frame = None
self.compass_current_degrees_rotation = 0
self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
self.compass_ready__signal.connect(self.on_compass_ready__slot)
self.start()
def run(self):
while self.not_abort:
new = self.image.rotate(int(self.compass_current_degrees_rotation))
if self.compass_current_degrees_rotation == 90:
self.compass_dir = 0
elif self.compass_current_degrees_rotation == -90:
self.compass_dir = 1
if self.compass_dir:
self.compass_current_degrees_rotation += 1
else:
self.compass_current_degrees_rotation -= 1
self.compass_frame = QtGui.QPixmap.fromImage(ImageQt(new))
self.compass_ready__signal.emit()
self.msleep(50)
def on_compass_ready__slot(self):
self.compass_label.setPixmap(self.compass_frame)
def on_kill_threads__slot(self):
self.not_abort = False
class VideoReader(QtCore.QThread):
video_frame_ready__signal = QtCore.pyqtSignal()
def __init__(self, main_window):
super(VideoReader, self).__init__()
self.main_window = main_window
self.not_abort = True
self.primary_display_label = self.main_window.primary_display_label # type: QtWidgets.QLabel
self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
self.video_frame_ready__signal.connect(self.on_compass_ready__slot)
# self.video = cv2.imread("Resources/Videos/ROSS1.MOV")
self.video_frame = None
self.start()
def run(self):
while self.not_abort:
frame = self.video_camera.read()[1]
# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# frame = cv2.resize(frame, (1280, 720))
# self.video_frame = QtGui.QPixmap.fromImage(qimage2ndarray.array2qimage(frame))
self.video_frame_ready__signal.emit()
self.msleep(50)
def on_compass_ready__slot(self):
self.primary_display_label.setPixmap(self.video_frame)
def on_kill_threads__slot(self):
self.not_abort = False
class Video(QtCore.QThread):
image_ready_signal = QtCore.pyqtSignal()
def __init__(self, main_window):
super(Video, self).__init__()
self.main_window = main_window
self.not_abort = True
self.primary_display_label = self.main_window.primary_display_label # type: QtWidgets.QLabel
self.secondary_display_label = self.main_window.secondary_display_label # type: QtWidgets.QLabel
self.tertiary_display_label = self.main_window.tertiary_display_label # type: QtWidgets.QLabel
self.video_camera = cv2.VideoCapture(0)
self.video_camera.set(CV_CAP_PROP_FRAME_WIDTH, 1280)
self.video_camera.set(CV_CAP_PROP_FRAME_HEIGHT, 720)
self.video_camera.set(CV_CAP_PROP_FPS, 15)
self.main_window.kill_threads_signal.connect(self.on_kill_threads__slot)
self.image_ready_signal.connect(self.on_image_ready__slot)
self.raw_frame = None
self.large_frame = None
self.small_frame = None
self.compass = Compass(self.main_window)
# self.video_reader = VideoReader(self.main_window)
self.start()
def run(self):
frame_count = 0
start_time = time.time()
while self.not_abort:
frame = self.video_camera.read()[1]
self.raw_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.large_frame = self.raw_frame
self.small_frame = cv2.resize(self.raw_frame, (640, 360))
self.large_frame = QtGui.QPixmap.fromImage(qimage2ndarray.array2qimage(self.large_frame))
self.small_frame = QtGui.QPixmap.fromImage(qimage2ndarray.array2qimage(self.small_frame))
self.image_ready_signal.emit()
frame_count += 1
fps = frame_count / (time.time() - start_time)
# print("FPS:", fps)
self.msleep(1)
self.compass.wait()
#self.video_reader.wait()
def on_image_ready__slot(self):
pass
self.primary_display_label.setPixmap(self.large_frame)
self.secondary_display_label.setPixmap(self.small_frame)
self.tertiary_display_label.setPixmap(self.small_frame)
def on_kill_threads__slot(self):
self.not_abort = False

View File

@@ -0,0 +1,220 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1920"
height="1080"
viewBox="0 0 1920 1080"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="Mockup.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35355339"
inkscape:cx="484.85899"
inkscape:cy="881.78948"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
borderlayer="true"
inkscape:window-width="958"
inkscape:window-height="1018"
inkscape:window-x="-7"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:snap-text-baseline="false"
showguides="false" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,27.63783)">
<rect
style="opacity:1;fill:#999999;fill-opacity:1;stroke:none"
id="rect4136"
width="1036.4165"
height="678.82251"
x="882.87329"
y="-26.480753" />
<rect
style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:none"
id="rect4138"
width="640"
height="360"
x="1280"
y="692.36218" />
<rect
y="-26.480753"
x="882.87329"
height="678.82251"
width="1036.4165"
id="rect4140"
style="opacity:1;fill:#999999;fill-opacity:1;stroke:none" />
<rect
style="opacity:1;fill:#999999;fill-opacity:1;stroke:none"
id="rect4142"
width="1280"
height="720"
x="640"
y="-27.637831" />
<rect
style="opacity:1;fill:#ffb380;fill-opacity:1;stroke:none"
id="rect4138-2"
width="640"
height="360"
x="640"
y="692.36218" />
<flowRoot
xml:space="preserve"
id="flowRoot4159"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(775.65625,481.14733)"><flowRegion
id="flowRegion4161"><rect
id="rect4163"
width="434.28571"
height="88.571426"
x="28.571428"
y="368.57144"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
id="flowPara4167">Secondary Display</flowPara><flowPara
id="flowPara4190" /></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot4169"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(0,-27.63783)"><flowRegion
id="flowRegion4171"><rect
id="rect4173"
width="191.42857"
height="95.714287"
x="42.857143"
y="512.85712" /></flowRegion><flowPara
id="flowPara4175">Secondary </flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot4177"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(1444.627,285.43444)"><flowRegion
id="flowRegion4179"><rect
id="rect4181"
width="585.71429"
height="165.71428"
x="21.428572"
y="564.28571"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
id="flowPara4196">Tertiary Display</flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot4189"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(1103.6821,-13.137841)"><flowRegion
id="flowRegion4191"><rect
id="rect4193"
width="490"
height="200"
x="41.42857"
y="322.85715"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
id="flowPara4197">Primary Display</flowPara></flowRoot> <rect
style="opacity:1;fill:#de8787;fill-opacity:1;stroke:none"
id="rect4201"
width="360"
height="360"
x="280"
y="692.36218" />
<flowRoot
xml:space="preserve"
id="flowRoot4203"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(317.23486,645.15612)"><flowRegion
id="flowRegion4205"><rect
id="rect4207"
width="400"
height="251.42857"
x="67.14286"
y="204.28572"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
id="flowPara4211">Compass</flowPara></flowRoot> <rect
style="opacity:1;fill:#ffe680;fill-opacity:1;stroke:none"
id="rect4215"
width="280"
height="360"
x="0"
y="692.36218" />
<flowRoot
xml:space="preserve"
id="flowRoot4217"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(-11.890625,699.71959)"><flowRegion
id="flowRegion4219"><rect
id="rect4221"
width="331.42856"
height="167.14285"
x="62.857143"
y="150"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
id="flowPara4223">Waypoints</flowPara></flowRoot> <rect
style="opacity:1;fill:#ddff55;fill-opacity:1;stroke:none"
id="rect4225"
width="640"
height="240"
x="0"
y="-27.637831" />
<flowRoot
xml:space="preserve"
id="flowRoot4227"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(114.0542,2.2171395)"><flowRegion
id="flowRegion4229"><rect
id="rect4231"
width="327.14285"
height="92.85714"
x="132.85715"
y="70"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
id="flowPara4235">Statuses</flowPara></flowRoot> <rect
style="opacity:1;fill:#80ffb3;fill-opacity:1;stroke:none"
id="rect4239"
width="640"
height="480"
x="0"
y="212.36217" />
<flowRoot
xml:space="preserve"
id="flowRoot4241"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(-97.104004,9.719579)"><flowRegion
id="flowRegion4243"><rect
id="rect4245"
width="292.85715"
height="82.85714"
x="321.42856"
y="420"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" /></flowRegion><flowPara
id="flowPara4247">Tab Groups</flowPara></flowRoot> </g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,2 @@
This was an example project using python, opencv, and pyqt to show a potential design for the rover gui.
There's lots of useful example code here, hence me keeping it.

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 MiB

View File

@@ -0,0 +1,910 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1920</width>
<height>1080</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>1920</width>
<height>1080</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1920</width>
<height>1080</height>
</size>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="windowOpacity">
<double>1.000000000000000</double>
</property>
<property name="styleSheet">
<string notr="true">background-color: #201F1D;
color: #DCDCDC;</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>213</width>
<height>240</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>213</width>
<height>240</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">QLabel{
color: #868685;
}</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="text">
<string>Rover Connected</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>213</width>
<height>240</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>213</width>
<height>240</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">QLabel{
color: #868685;
}</string>
</property>
<property name="text">
<string>Controller Connected</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>213</width>
<height>240</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>213</width>
<height>240</height>
</size>
</property>
<property name="sizeIncrement">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">QLabel{
color: #868685;
}</string>
</property>
<property name="text">
<string>FrSky Connected</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTabWidget" name="tabs">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>640</width>
<height>480</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>640</width>
<height>480</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">QTabWidget::pane{
border: 2px solid rgb(55,55,55);
}
QTabBar::tab{
border: 2px solid rgb(55,55,55);
border-top-left-radius: 4px;
border-top-right-radius: 4px;
min-width: 8ex;
padding: 2px;
}
QTabBar::tab:selected{
border-bottom-color:rgb(55,55,55);
}
QTabBar::tab:!selected{
margin-top: 4px;
}
QSpinBox{
background-color:rgb(55,55,55);
}
QPushButton{
background-color:rgb(55,55,55);
}</string>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="Page1" native="true">
<attribute name="title">
<string>Video</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QFormLayout" name="primary_display_form_layout">
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Primary Display</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton">
<property name="text">
<string>Main</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="radioButton_2">
<property name="text">
<string>Undercarriage</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_3">
<property name="text">
<string>Elbow</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QRadioButton" name="radioButton_4">
<property name="text">
<string>Gripper / Nikon</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="radioButton_5">
<property name="text">
<string>Mapping</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="secondary_display_form_layout">
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Secondary Display</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_16">
<property name="text">
<string>Main</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="radioButton_17">
<property name="text">
<string>Undercarriage</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_18">
<property name="text">
<string>Elbow</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QRadioButton" name="radioButton_19">
<property name="text">
<string>Gripper / Nikon</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="radioButton_20">
<property name="text">
<string>Mapping</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="tertiary_display_form_layout">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Tertiary Display</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="radioButton_6">
<property name="text">
<string>Main</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="radioButton_7">
<property name="text">
<string>Undercarriage</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="radioButton_8">
<property name="text">
<string>Elbow</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButton_9">
<property name="text">
<string>Gripper / Nikon</string>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Autonomy</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Sensors</string>
</attribute>
</widget>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Settings</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>Logs</string>
</attribute>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="spacing">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Waypoints</string>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableWidget">
<property name="styleSheet">
<string notr="true">QTableView{
selection-background-color: #DE8D47;
}
QTableView QHeaderView{
background-color: #201F1D;
}
QTableView QHeaderView::section{
background-color: #201F1D;
}
QTableView QTableCornerButton::section{
background-color: #201F1D;
}</string>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="alternatingRowColors">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="cornerButtonEnabled">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderVisible">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>59</number>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>53</number>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderDefaultSectionSize">
<number>30</number>
</attribute>
<row>
<property name="text">
<string>1</string>
</property>
</row>
<row>
<property name="text">
<string>2</string>
</property>
</row>
<column>
<property name="text">
<string>LAT</string>
</property>
</column>
<column>
<property name="text">
<string>LON</string>
</property>
</column>
<column>
<property name="text">
<string>DIST</string>
</property>
</column>
<item row="0" column="0">
<property name="text">
<string>32.1665</string>
</property>
</item>
<item row="0" column="1">
<property name="text">
<string>-112.1115</string>
</property>
</item>
<item row="0" column="2">
<property name="text">
<string>2.4 KM</string>
</property>
</item>
<item row="1" column="0">
<property name="text">
<string>33.1124</string>
</property>
</item>
<item row="1" column="1">
<property name="text">
<string>-111.4334</string>
</property>
</item>
<item row="1" column="2">
<property name="text">
<string>5.7 KM</string>
</property>
</item>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<property name="spacing">
<number>2</number>
</property>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>65</width>
<height>35</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QPushButton{
color: #201F1D;
background-color: #868685;
}</string>
</property>
<property name="text">
<string>Set</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>65</width>
<height>35</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QPushButton{
color: #201F1D;
background-color: #868685;
}</string>
</property>
<property name="text">
<string>Add
Manual</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>65</width>
<height>35</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QPushButton{
color: #201F1D;
background-color: #868685;
}</string>
</property>
<property name="text">
<string>Add
GPS</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>65</width>
<height>35</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QPushButton{
color: #201F1D;
background-color: #868685;
}</string>
</property>
<property name="text">
<string>Delete</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="compass_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>360</width>
<height>360</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>360</width>
<height>360</height>
</size>
</property>
<property name="font">
<font>
<stylestrategy>PreferAntialias</stylestrategy>
</font>
</property>
<property name="contextMenuPolicy">
<enum>Qt::DefaultContextMenu</enum>
</property>
<property name="styleSheet">
<string notr="true">background-color: black;</string>
</property>
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="primary_display_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>1280</width>
<height>720</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1280</width>
<height>720</height>
</size>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color: grey;</string>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="secondary_display_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>640</width>
<height>360</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>640</width>
<height>360</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: darkgrey;</string>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="tertiary_display_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>640</width>
<height>360</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>640</width>
<height>360</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: lightgrey;</string>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -0,0 +1,128 @@
#!/usr/bin/env python
"""
Main file used to launch the Rover Base Station
No other files should be used for launching this application.
"""
__author__ = "Corwin Perren"
__credits__ = [""]
__license__ = "GPL (GNU General Public License) 3.0"
__version__ = "0.1"
__maintainer__ = "Corwin Perren"
__email__ = "caperren@caperren.com"
__status__ = "Development"
#####################################
# Imports
#####################################
# Python native imports
import sys
from PyQt5 import QtWidgets, QtCore, QtGui, uic
import signal
import ctypes
import logging
import time
# Custom Imports
from Framework.FlasherTestCore import FlasherTest
from Framework.VideoCore import Video
# from Framework.SettingsCore import Settings
# from Framework.LoggingCore import Logger
# from Interface.InterfaceCore import Interface
# from Framework.GameControllerCore import GameController
# from Framework.RoverControllerCore import RoverController
#####################################
# Global Variables
#####################################
UI_FILE_PATH = "Resources/UI/RoverGui.ui"
#####################################
# Application Class Definition
#####################################
class ApplicationWindow(QtWidgets.QMainWindow):
kill_threads_signal = QtCore.pyqtSignal()
def __init__(self, parent=None):
# noinspection PyArgumentList
super(ApplicationWindow, self).__init__(parent)
uic.loadUi(UI_FILE_PATH, self)
# ########## Class Variables ##########
self.num_threads_running = 0
self.threads = []
self.primary_display_label = self.primary_display_label # type: QtWidgets.QLabel
self.secondary_display_label = self.secondary_display_label # type: QtWidgets.QLabel
self.tertiary_display_label = self.tertiary_display_label # type: QtWidgets.QLabel
# self.primary_display_label.setPixmap(QtGui.QPixmap("Resources/Images/steller_at_terminus.png").scaledToHeight(1080))
# self.secondary_display_label.setPixmap(QtGui.QPixmap("Resources/Images/mountain_closeup.jpg"))
# self.tertiary_display_label.setPixmap(QtGui.QPixmap("Resources/Images/mountains_from_marys_peak.jpg"))
self.flasher = FlasherTest(self)
self.video = Video(self)
self.threads.append(self.flasher)
self.threads.append(self.video)
# self.gps_lock_button = self.gps_lock_button # type: QtWidgets.QPushButton
# self.gps_lock_button.setCheckable(True)
# ########## Instantiation of program classes ##########
# Settings class and version number set
# self.settings_class = Settings(self)
# self.settings = QtCore.QSettings()
# self.settings.setValue("miscellaneous/version", __version__)
# Uncomment these lines to completely reset settings and quit, then re-comment and rerun program
# self.settings.clear()
# self.close()
# Set up the global logger instance
# self.logger_class = Logger(console_output=True)
# self.logger = logging.getLogger("RoverBaseStation")
#
# # All interface elements
# self.controller_class = GameController(self)
# self.interface_class = Interface(self)
# self.rover_controller_class = RoverController(self)
#
# # ########## Add threads to list for easy access on program close ##########
# self.threads.append(self.interface_class.live_logs_class)
# self.threads.append(self.controller_class)
# self.threads.append(self.rover_controller_class)
# ########## Set up QT Application Window ##########
self.show()
def closeEvent(self, event):
# Tell all threads to die
self.kill_threads_signal.emit()
# Wait for all the threads to end properly
for thread in self.threads:
thread.wait()
# Print final log noting shutdown and shutdown the logger to flush to disk
# self.logger.debug("########## Application Stopping ##########")
logging.shutdown()
# Accept the close event to properly close the program
event.accept()
#####################################
# Main Definition
#####################################
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL) # This allows the keyboard interrupt kill to work properly
application = QtWidgets.QApplication(sys.argv) # Create the base qt gui application
app_window = ApplicationWindow() # Make a window in this application
app_window.setWindowTitle("Rover Base Station") # Sets the window title
# app_window.setFixedSize(1920, 1080)
app_window.showFullScreen()
app_window.show() # Show the window in the application
application.exec_() # Execute launching of the application

View File

@@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 744.09448819 1052.3622047"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
inkscape:export-filename="C:\Users\Corwin Perren\PycharmProjects\RoverBaseStationMockup\Resources\Images\compass.png"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750"
sodipodi:docname="compass.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="367.83722"
inkscape:cy="536.84511"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none"
id="path4136"
cx="376.42859"
cy="511.64792"
r="207.85715"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750" />
<path
style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.82261443px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 376.42859,338.32234 0,344.63086"
id="path4140"
inkscape:connector-curvature="0"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750" />
<path
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.76764578px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 206.46343,511.64792 338.41509,0"
id="path4142"
inkscape:connector-curvature="0"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750" />
<path
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.73459327px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 229.90347,365.1228 522.9537,658.17303"
id="path4144"
inkscape:connector-curvature="0"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750" />
<path
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.70106518px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 523.39974,364.67677 228.95236,659.12415"
id="path4146"
inkscape:connector-curvature="0"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="361.42859"
y="334.8728"
id="text4148"
sodipodi:linespacing="125%"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750"><tspan
sodipodi:role="line"
id="tspan4150"
x="361.42859"
y="334.8728">N</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="-390.25671"
y="-687.89569"
id="text4152"
sodipodi:linespacing="125%"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750"
transform="scale(-1,-1)"><tspan
sodipodi:role="line"
id="tspan4154"
x="-390.25671"
y="-687.89569">S</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="-531.42334"
y="199.65347"
id="text4156"
sodipodi:linespacing="125%"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750"
transform="matrix(0,-1,1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan4158"
x="-531.42334"
y="199.65347">W</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="498.16159"
y="-553.20374"
id="text4160"
sodipodi:linespacing="125%"
inkscape:export-xdpi="750"
inkscape:export-ydpi="750"
transform="matrix(0,1,-1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan4162"
x="498.16159"
y="-553.20374">E</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB