9 changed files with 0 additions and 2383 deletions
@ -1,262 +0,0 @@
@@ -1,262 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ui version="4.0"> |
||||
<class>uasControl</class> |
||||
<widget class="QWidget" name="uasControl"> |
||||
<property name="geometry"> |
||||
<rect> |
||||
<x>0</x> |
||||
<y>0</y> |
||||
<width>200</width> |
||||
<height>228</height> |
||||
</rect> |
||||
</property> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>200</width> |
||||
<height>150</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>267</width> |
||||
<height>16777215</height> |
||||
</size> |
||||
</property> |
||||
<property name="windowTitle"> |
||||
<string>Form</string> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Control widget to send basic control actions to the micro air vehicle</string> |
||||
</property> |
||||
<layout class="QGridLayout" name="gridLayout" rowstretch="5,1,40,1,40,40,40,1000" columnstretch="5,20,20,25,5"> |
||||
<property name="margin"> |
||||
<number>4</number> |
||||
</property> |
||||
<item row="0" column="0" rowspan="7"> |
||||
<spacer name="horizontalSpacer"> |
||||
<property name="orientation"> |
||||
<enum>Qt::Horizontal</enum> |
||||
</property> |
||||
<property name="sizeHint" stdset="0"> |
||||
<size> |
||||
<width>31</width> |
||||
<height>159</height> |
||||
</size> |
||||
</property> |
||||
</spacer> |
||||
</item> |
||||
<item row="0" column="1" rowspan="2" colspan="3"> |
||||
<widget class="QLabel" name="controlStatusLabel"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>0</width> |
||||
<height>10</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Currently controlled system</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Currently controlled system</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>UNCONNECTED</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignCenter</set> |
||||
</property> |
||||
<property name="margin"> |
||||
<number>0</number> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="3" column="1" colspan="3"> |
||||
<spacer name="verticalSpacer"> |
||||
<property name="orientation"> |
||||
<enum>Qt::Vertical</enum> |
||||
</property> |
||||
<property name="sizeHint" stdset="0"> |
||||
<size> |
||||
<width>216</width> |
||||
<height>17</height> |
||||
</size> |
||||
</property> |
||||
</spacer> |
||||
</item> |
||||
<item row="4" column="1" colspan="3"> |
||||
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||
<property name="spacing"> |
||||
<number>6</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QPushButton" name="liftoffButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>25</width> |
||||
<height>16</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Liftoff / Launch</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Liftoff / Launch</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>Start</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="landButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>25</width> |
||||
<height>16</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Fly straight to landing spot</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Fly straight to landing spot</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>Land</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="shutdownButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>25</width> |
||||
<height>16</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Only active on the ground: Poweroff system</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Only active on the ground: Poweroff system</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>Halt</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
<item row="5" column="1" colspan="2"> |
||||
<widget class="QComboBox" name="modeComboBox"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>25</width> |
||||
<height>16</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Select MAV operation mode</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Select MAV operation mode</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="5" column="3"> |
||||
<widget class="QPushButton" name="setModeButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>25</width> |
||||
<height>16</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Transmit and enable mode on MAV</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Transmit and enable mode on MAV</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>Set</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="6" column="1" colspan="3"> |
||||
<widget class="QLabel" name="lastActionLabel"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>0</width> |
||||
<height>10</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Status label</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Status label</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>No actions executed so far</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="1" column="4" rowspan="6"> |
||||
<spacer name="horizontalSpacer_2"> |
||||
<property name="orientation"> |
||||
<enum>Qt::Horizontal</enum> |
||||
</property> |
||||
<property name="sizeHint" stdset="0"> |
||||
<size> |
||||
<width>30</width> |
||||
<height>159</height> |
||||
</size> |
||||
</property> |
||||
</spacer> |
||||
</item> |
||||
<item row="2" column="1" colspan="3"> |
||||
<widget class="QPushButton" name="controlButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>0</width> |
||||
<height>30</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Main control button</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Main control button</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>Activate Engine</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="7" column="1" colspan="3"> |
||||
<spacer name="verticalSpacer_2"> |
||||
<property name="orientation"> |
||||
<enum>Qt::Vertical</enum> |
||||
</property> |
||||
<property name="sizeHint" stdset="0"> |
||||
<size> |
||||
<width>20</width> |
||||
<height>5</height> |
||||
</size> |
||||
</property> |
||||
</spacer> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<resources/> |
||||
<connections/> |
||||
</ui> |
@ -1,33 +0,0 @@
@@ -1,33 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ui version="4.0"> |
||||
<class>UASList</class> |
||||
<widget class="QWidget" name="UASList"> |
||||
<property name="geometry"> |
||||
<rect> |
||||
<x>0</x> |
||||
<y>0</y> |
||||
<width>500</width> |
||||
<height>300</height> |
||||
</rect> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>0</width> |
||||
<height>0</height> |
||||
</size> |
||||
</property> |
||||
<property name="windowTitle"> |
||||
<string>Form</string> |
||||
</property> |
||||
<layout class="QVBoxLayout" name="verticalLayout"> |
||||
<property name="spacing"> |
||||
<number>6</number> |
||||
</property> |
||||
<property name="margin"> |
||||
<number>3</number> |
||||
</property> |
||||
</layout> |
||||
</widget> |
||||
<resources/> |
||||
<connections/> |
||||
</ui> |
@ -1,626 +0,0 @@
@@ -1,626 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ui version="4.0"> |
||||
<class>UASView</class> |
||||
<widget class="QWidget" name="UASView"> |
||||
<property name="geometry"> |
||||
<rect> |
||||
<x>0</x> |
||||
<y>0</y> |
||||
<width>360</width> |
||||
<height>155</height> |
||||
</rect> |
||||
</property> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>260</width> |
||||
<height>0</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>360</width> |
||||
<height>16777215</height> |
||||
</size> |
||||
</property> |
||||
<property name="windowTitle"> |
||||
<string>Form</string> |
||||
</property> |
||||
<property name="styleSheet"> |
||||
<string notr="true"/> |
||||
</property> |
||||
<layout class="QVBoxLayout" name="verticalLayout"> |
||||
<property name="margin"> |
||||
<number>5</number> |
||||
</property> |
||||
<item> |
||||
<layout class="QGridLayout" name="gridLayout"> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item row="1" column="0" rowspan="2"> |
||||
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLabel" name="typeLabel"> |
||||
<property name="toolTip"> |
||||
<string>System type</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>System type</string> |
||||
</property> |
||||
<property name="whatsThis"> |
||||
<string>System type</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="pixmap"> |
||||
<pixmap resource="../../qgroundcontrol.qrc">:/res/mavs/Unknown</pixmap> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLabel" name="heartBeatLabel"> |
||||
<property name="toolTip"> |
||||
<string>Heartbeat</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QProgressBar" name="batteryBar"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>18</width> |
||||
<height>0</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>18</width> |
||||
<height>40</height> |
||||
</size> |
||||
</property> |
||||
<property name="font"> |
||||
<font/> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Battery Fuel</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Battery Fuel</string> |
||||
</property> |
||||
<property name="value"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="textVisible"> |
||||
<bool>false</bool> |
||||
</property> |
||||
<property name="orientation"> |
||||
<enum>Qt::Vertical</enum> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
<item row="2" column="1" colspan="2"> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLabel" name="waypointLabel"> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Current Waypoint</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Current Waypoint</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>---</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="liftoffButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>26</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>38</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Liftoff / Launch</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Liftoff / Launch</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="icon"> |
||||
<iconset resource="../../qgroundcontrol.qrc"> |
||||
<normaloff>:/res/Launch</normaloff>:/res/Launch</iconset> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="abortButton"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>26</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>38</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Emergency land system at closest possible site</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Emergency land system at closest possible site</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="icon"> |
||||
<iconset resource="../../qgroundcontrol.qrc"> |
||||
<normaloff>:/res/Stop</normaloff>:/res/Stop</iconset> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="haltButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>26</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>38</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Loiter / Wait at current position</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Loiter / Wait at current position</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="icon"> |
||||
<iconset resource="../../qgroundcontrol.qrc"> |
||||
<normaloff>:/res/Pause</normaloff>:/res/Pause</iconset> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="continueButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>26</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>38</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Continue flightplan</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Continue flightplan</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="icon"> |
||||
<iconset resource="../../qgroundcontrol.qrc"> |
||||
<normaloff>:/res/Play</normaloff>:/res/Play</iconset> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="landButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>26</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>38</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Fly straight to landing location</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Fly straight to landing location</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="icon"> |
||||
<iconset resource="../../qgroundcontrol.qrc"> |
||||
<normaloff>:/res/Land</normaloff>:/res/Land</iconset> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="killButton"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>26</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>38</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Kill immediately all onboard power</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Kill immediately all onboard power</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="icon"> |
||||
<iconset resource="../../qgroundcontrol.qrc"> |
||||
<normaloff>:/res/Kill</normaloff>:/res/Kill</iconset> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="shutdownButton"> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>38</width> |
||||
<height>22</height> |
||||
</size> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Only in standby mode: Power off system</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Only in standby mode: Power off system</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
<property name="icon"> |
||||
<iconset resource="../../qgroundcontrol.qrc"> |
||||
<normaloff>:/res/Shutdown</normaloff>:/res/Shutdown</iconset> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||
<property name="spacing"> |
||||
<number>4</number> |
||||
</property> |
||||
<property name="sizeConstraint"> |
||||
<enum>QLayout::SetMinimumSize</enum> |
||||
</property> |
||||
</layout> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
<item row="1" column="1"> |
||||
<layout class="QVBoxLayout" name="verticalLayout_3"> |
||||
<item> |
||||
<widget class="QLabel" name="nameLabel"> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>16777215</width> |
||||
<height>16</height> |
||||
</size> |
||||
</property> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>75</weight> |
||||
<italic>false</italic> |
||||
<bold>true</bold> |
||||
</font> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>System Name</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>System Name</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>UAS001</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
||||
<item> |
||||
<widget class="QLabel" name="timeRemainingLabel"> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Remaining flight time</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Remaining flight time</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>00:00:00</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QLabel" name="timeElapsedLabel"> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Uptime</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Uptime</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>00:00:00</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
<item> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_5"> |
||||
<item> |
||||
<widget class="QLabel" name="groundDistanceLabel"> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Altitude</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Altitude</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>00.00 m</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QLabel" name="speedLabel"> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Ground Speed</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Ground Speed</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>00.0 m/s</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
<item> |
||||
<widget class="QLabel" name="stateLabel"> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>16777215</width> |
||||
<height>12</height> |
||||
</size> |
||||
</property> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="text"> |
||||
<string>STATE</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
<item row="1" column="2"> |
||||
<layout class="QVBoxLayout" name="verticalLayout_4"> |
||||
<item> |
||||
<widget class="QLabel" name="modeLabel"> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>16777215</width> |
||||
<height>16</height> |
||||
</size> |
||||
</property> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="text"> |
||||
<string>MODE</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QLabel" name="positionLabel"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>0</width> |
||||
<height>12</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>16777215</width> |
||||
<height>12</height> |
||||
</size> |
||||
</property> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Current Position</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Current Position</string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>00.0 00.0 00.0 m</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QProgressBar" name="thrustBar"> |
||||
<property name="font"> |
||||
<font/> |
||||
</property> |
||||
<property name="toolTip"> |
||||
<string>Current throttle</string> |
||||
</property> |
||||
<property name="statusTip"> |
||||
<string>Current throttle</string> |
||||
</property> |
||||
<property name="value"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="format"> |
||||
<string>throttle %p%</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QLabel" name="navLabel"> |
||||
<property name="font"> |
||||
<font> |
||||
<weight>50</weight> |
||||
<italic>false</italic> |
||||
<bold>false</bold> |
||||
</font> |
||||
</property> |
||||
<property name="text"> |
||||
<string>NAV</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
<item> |
||||
<widget class="QLabel" name="statusTextLabel"> |
||||
<property name="text"> |
||||
<string>Waiting for first status update..</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<resources> |
||||
<include location="../../qgroundcontrol.qrc"/> |
||||
</resources> |
||||
<connections/> |
||||
</ui> |
@ -1,194 +0,0 @@
@@ -1,194 +0,0 @@
|
||||
/*=====================================================================
|
||||
|
||||
PIXHAWK Micro Air Vehicle Flying Robotics Toolkit |
||||
|
||||
(c) 2009, 2010 PIXHAWK PROJECT <http://pixhawk.ethz.ch>
|
||||
|
||||
This file is part of the PIXHAWK project |
||||
|
||||
PIXHAWK is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
PIXHAWK is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with PIXHAWK. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* @brief Definition of widget controlling one MAV |
||||
* |
||||
* @author Lorenz Meier <mavteam@student.ethz.ch> |
||||
* |
||||
*/ |
||||
|
||||
#include <QString> |
||||
#include <QTimer> |
||||
#include <QLabel> |
||||
#include <QProcess> |
||||
#include <QPalette> |
||||
|
||||
#include "UASControlWidget.h" |
||||
#include "MultiVehicleManager.h" |
||||
#include "UAS.h" |
||||
#include "QGC.h" |
||||
#include "AutoPilotPluginManager.h" |
||||
#include "FirmwarePluginManager.h" |
||||
|
||||
UASControlWidget::UASControlWidget(QWidget *parent) : QWidget(parent), |
||||
_uas(NULL), |
||||
armed(false) |
||||
{ |
||||
ui.setupUi(this); |
||||
|
||||
_activeVehicleChanged(MultiVehicleManager::instance()->activeVehicle()); |
||||
|
||||
connect(MultiVehicleManager::instance(), &MultiVehicleManager::activeVehicleChanged, this, &UASControlWidget::_activeVehicleChanged); |
||||
connect(ui.setModeButton, SIGNAL(clicked()), this, SLOT(transmitMode())); |
||||
|
||||
ui.liftoffButton->hide(); |
||||
ui.landButton->hide(); |
||||
ui.shutdownButton->hide(); |
||||
|
||||
ui.gridLayout->setAlignment(Qt::AlignTop); |
||||
} |
||||
|
||||
void UASControlWidget::updateModesList() |
||||
{ |
||||
if (!_uas) { |
||||
return; |
||||
} |
||||
_modeList = FirmwarePluginManager::instance()->firmwarePluginForAutopilot((MAV_AUTOPILOT)_uas->getAutopilotType())->flightModes(); |
||||
|
||||
// Set combobox items
|
||||
ui.modeComboBox->clear(); |
||||
foreach (QString flightMode, _modeList) { |
||||
ui.modeComboBox->addItem(flightMode); |
||||
} |
||||
|
||||
// Select first mode in list
|
||||
ui.modeComboBox->setCurrentIndex(0); |
||||
ui.modeComboBox->update(); |
||||
} |
||||
|
||||
void UASControlWidget::_activeVehicleChanged(Vehicle* vehicle) |
||||
{ |
||||
if (_uas) { |
||||
disconnect(ui.controlButton, SIGNAL(clicked()), _uas, SLOT(armSystem())); |
||||
disconnect(ui.liftoffButton, SIGNAL(clicked()), _uas, SLOT(launch())); |
||||
disconnect(ui.landButton, SIGNAL(clicked()), _uas, SLOT(home())); |
||||
disconnect(ui.shutdownButton, SIGNAL(clicked()), _uas, SLOT(shutdown())); |
||||
disconnect(_uas, SIGNAL(statusChanged(int)), this, SLOT(updateState(int))); |
||||
_uas = NULL; |
||||
} |
||||
|
||||
// Connect user interface controls
|
||||
if (vehicle) { |
||||
_uas = vehicle->uas(); |
||||
connect(ui.controlButton, SIGNAL(clicked()), this, SLOT(cycleContextButton())); |
||||
connect(ui.liftoffButton, SIGNAL(clicked()), _uas, SLOT(launch())); |
||||
connect(ui.landButton, SIGNAL(clicked()), _uas, SLOT(home())); |
||||
connect(ui.shutdownButton, SIGNAL(clicked()), _uas, SLOT(shutdown())); |
||||
connect(_uas, SIGNAL(statusChanged(int)), this, SLOT(updateState(int))); |
||||
|
||||
ui.controlStatusLabel->setText(tr("Connected to ") + _uas->getUASName()); |
||||
|
||||
setBackgroundColor(_uas->getColor()); |
||||
|
||||
this->updateModesList(); |
||||
this->updateArmText(); |
||||
} |
||||
} |
||||
|
||||
UASControlWidget::~UASControlWidget() |
||||
{ |
||||
|
||||
} |
||||
|
||||
void UASControlWidget::updateArmText() |
||||
{ |
||||
if (armed) { |
||||
ui.controlButton->setText(tr("DISARM SYSTEM")); |
||||
} else { |
||||
ui.controlButton->setText(tr("ARM SYSTEM")); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* Set the background color based on the MAV color. If the MAV is selected as the |
||||
* currently actively controlled system, the frame color is highlighted |
||||
*/ |
||||
void UASControlWidget::setBackgroundColor(QColor color) |
||||
{ |
||||
// UAS color
|
||||
QColor uasColor = color; |
||||
QString colorstyle; |
||||
QString borderColor = "#4A4A4F"; |
||||
borderColor = "#FA4A4F"; |
||||
uasColor = uasColor.darker(400); |
||||
colorstyle = colorstyle.sprintf("QLabel { border-radius: 3px; padding: 0px; margin: 0px; background-color: #%02X%02X%02X; border: 0px solid %s; }", |
||||
uasColor.red(), uasColor.green(), uasColor.blue(), borderColor.toStdString().c_str()); |
||||
setStyleSheet(colorstyle); |
||||
QPalette palette = this->palette(); |
||||
palette.setBrush(QPalette::Window, QBrush(uasColor)); |
||||
setPalette(palette); |
||||
setAutoFillBackground(true); |
||||
} |
||||
|
||||
|
||||
void UASControlWidget::updateState(int state) |
||||
{ |
||||
switch (state) { |
||||
case (int)MAV_STATE_ACTIVE: |
||||
armed = true; |
||||
break; |
||||
case (int)MAV_STATE_STANDBY: |
||||
armed = false; |
||||
break; |
||||
} |
||||
this->updateArmText(); |
||||
} |
||||
|
||||
void UASControlWidget::transmitMode() |
||||
{ |
||||
if (_uas) { |
||||
uint8_t base_mode; |
||||
uint32_t custom_mode; |
||||
QString flightMode = ui.modeComboBox->itemText(ui.modeComboBox->currentIndex()); |
||||
|
||||
if (FirmwarePluginManager::instance()->firmwarePluginForAutopilot((MAV_AUTOPILOT)_uas->getAutopilotType())->setFlightMode(flightMode, &base_mode, &custom_mode)) { |
||||
if (armed) { |
||||
base_mode |= MAV_MODE_FLAG_SAFETY_ARMED; |
||||
} |
||||
|
||||
if (_uas->isHilEnabled() || _uas->isHilActive()) { |
||||
base_mode |= MAV_MODE_FLAG_HIL_ENABLED; |
||||
} |
||||
|
||||
_uas->setMode(base_mode, custom_mode); |
||||
QString modeText = ui.modeComboBox->currentText(); |
||||
|
||||
ui.lastActionLabel->setText(QString("Sent new mode %1 to %2").arg(flightMode).arg(_uas->getUASName())); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void UASControlWidget::cycleContextButton() |
||||
{ |
||||
if (_uas) { |
||||
if (!armed) { |
||||
_uas->armSystem(); |
||||
ui.lastActionLabel->setText(QString("Arm %1").arg(_uas->getUASName())); |
||||
} else { |
||||
_uas->disarmSystem(); |
||||
ui.lastActionLabel->setText(QString("Disarm %1").arg(_uas->getUASName())); |
||||
} |
||||
} |
||||
} |
@ -1,84 +0,0 @@
@@ -1,84 +0,0 @@
|
||||
/*=====================================================================
|
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* @brief Definition of class UASControlWidget |
||||
* |
||||
* @author Lorenz Meier <mavteam@student.ethz.ch> |
||||
* |
||||
*/ |
||||
|
||||
#ifndef _UASCONTROLWIDGET_H_ |
||||
#define _UASCONTROLWIDGET_H_ |
||||
|
||||
#include <QWidget> |
||||
#include <QLineEdit> |
||||
#include <QString> |
||||
#include <QPushButton> |
||||
|
||||
#include "ui_UASControl.h" |
||||
#include "UASInterface.h" |
||||
#include "Vehicle.h" |
||||
|
||||
/**
|
||||
* @brief Widget controlling one MAV |
||||
*/ |
||||
class UASControlWidget : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
UASControlWidget(QWidget *parent = 0); |
||||
~UASControlWidget(); |
||||
|
||||
public slots: |
||||
/** @brief Update modes list for selected system */ |
||||
void updateModesList(); |
||||
/** @brief Trigger next context action */ |
||||
void cycleContextButton(); |
||||
/** @brief Transmit the operation mode */ |
||||
void transmitMode(); |
||||
/** @brief Update state */ |
||||
void updateState(int state); |
||||
/** @brief Update internal state machine */ |
||||
void updateArmText(); |
||||
|
||||
protected slots: |
||||
/** @brief Set the background color for the widget */ |
||||
void setBackgroundColor(QColor color); |
||||
|
||||
protected: |
||||
UAS* _uas; |
||||
QStringList _modeList; ///< Mode list for the current UAS
|
||||
bool armed; ///< Engine state
|
||||
|
||||
private slots: |
||||
void _activeVehicleChanged(Vehicle* vehicle); |
||||
|
||||
private: |
||||
Ui::uasControl ui; |
||||
|
||||
}; |
||||
|
||||
#endif // _UASCONTROLWIDGET_H_
|
@ -1,260 +0,0 @@
@@ -1,260 +0,0 @@
|
||||
/*=====================================================================
|
||||
|
||||
PIXHAWK Micro Air Vehicle Flying Robotics Toolkit |
||||
|
||||
(c) 2009, 2010 PIXHAWK PROJECT <http://pixhawk.ethz.ch>
|
||||
|
||||
This file is part of the PIXHAWK project |
||||
|
||||
PIXHAWK is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
PIXHAWK is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with PIXHAWK. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* @brief List of unmanned vehicles |
||||
* @author Lorenz Meier <mavteam@student.ethz.ch> |
||||
* |
||||
*/ |
||||
|
||||
#include <QString> |
||||
#include <QTimer> |
||||
#include <QLabel> |
||||
#include <QDebug> |
||||
#include <QApplication> |
||||
|
||||
#include "MG.h" |
||||
#include "UASListWidget.h" |
||||
#include "MultiVehicleManager.h" |
||||
#include "UAS.h" |
||||
#include "UASView.h" |
||||
#include "QGCUnconnectedInfoWidget.h" |
||||
#include "MainWindow.h" |
||||
#include "LinkManager.h" |
||||
|
||||
UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), |
||||
uWidget(NULL), |
||||
m_ui(new Ui::UASList) |
||||
{ |
||||
// Use a timer to update the link health display.
|
||||
updateTimer = new QTimer(this); |
||||
connect(updateTimer,SIGNAL(timeout()),this,SLOT(updateStatus())); |
||||
|
||||
m_ui->setupUi(this); |
||||
m_ui->verticalLayout->setAlignment(Qt::AlignTop); |
||||
|
||||
this->setMinimumWidth(262); |
||||
|
||||
linkToBoxMapping = QMap<LinkInterface*, QGroupBox*>(); |
||||
uasToBoxMapping = QMap<UASInterface*, QGroupBox*>(); |
||||
uasViews = QMap<UASInterface*, UASView*>(); |
||||
|
||||
this->setVisible(false); |
||||
|
||||
connect(LinkManager::instance(), SIGNAL(linkDeleted(LinkInterface*)), this, SLOT(removeLink(LinkInterface*))); |
||||
|
||||
connect(MultiVehicleManager::instance(), &MultiVehicleManager::vehicleAdded, this, &UASListWidget::_vehicleAdded); |
||||
connect(MultiVehicleManager::instance(), &MultiVehicleManager::vehicleRemoved, this, &UASListWidget::_vehicleRemoved); |
||||
|
||||
// Get a list of all existing UAS
|
||||
foreach (Vehicle* vehicle, MultiVehicleManager::instance()->vehicles()) |
||||
{ |
||||
_vehicleAdded(vehicle); |
||||
} |
||||
} |
||||
|
||||
UASListWidget::~UASListWidget() |
||||
{ |
||||
delete m_ui; |
||||
} |
||||
|
||||
void UASListWidget::changeEvent(QEvent *e) |
||||
{ |
||||
QWidget::changeEvent(e); |
||||
switch (e->type()) |
||||
{ |
||||
case QEvent::LanguageChange: |
||||
m_ui->retranslateUi(this); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
// XXX This is just to prevent
|
||||
// upfront crashes, will probably need further inspection
|
||||
void UASListWidget::removeLink(LinkInterface* link) |
||||
{ |
||||
QGroupBox* box = linkToBoxMapping.value(link, NULL); |
||||
|
||||
if (box) { |
||||
// Just stop updating the status for now - we should
|
||||
// remove the UAS probably
|
||||
linkToBoxMapping.remove(link); |
||||
} |
||||
} |
||||
|
||||
void UASListWidget::updateStatus() |
||||
{ |
||||
QMapIterator<LinkInterface*, QGroupBox*> i(linkToBoxMapping); |
||||
while (i.hasNext()) { |
||||
i.next(); |
||||
LinkInterface* link = i.key(); |
||||
|
||||
// Paranoid sanity check
|
||||
if (!LinkManager::instance()->containsLink(link)) |
||||
continue; |
||||
|
||||
if (!link) |
||||
continue; |
||||
|
||||
MAVLinkProtocol* mavlink = MAVLinkProtocol::instance(); |
||||
|
||||
// Build the tooltip out of the protocol parsing data: received, dropped, and parsing errors.
|
||||
QString displayString(""); |
||||
int c; |
||||
if ((c = mavlink->getReceivedPacketCount(link)) != -1) |
||||
{ |
||||
displayString += QString(tr("<br/>Received: %2")).arg(QString::number(c)); |
||||
} |
||||
if ((c = mavlink->getDroppedPacketCount(link)) != -1) |
||||
{ |
||||
displayString += QString(tr("<br/>Dropped: %2")).arg(QString::number(c)); |
||||
} |
||||
if ((c = mavlink->getParsingErrorCount(link)) != -1) |
||||
{ |
||||
displayString += QString(tr("<br/>Errors: %2")).arg(QString::number(c)); |
||||
} |
||||
if (!displayString.isEmpty()) |
||||
{ |
||||
displayString = QString("<b>%1</b>").arg(i.key()->getName()) + displayString; |
||||
} |
||||
// qDebug() << p << ": " + displayString;
|
||||
i.value()->setToolTip(displayString); |
||||
} |
||||
} |
||||
|
||||
void UASListWidget::_vehicleAdded(Vehicle* vehicle) |
||||
{ |
||||
UAS* uas = vehicle->uas(); |
||||
|
||||
// If the list was empty, remove the unconnected widget and start the update timer.
|
||||
if (uasViews.isEmpty()) |
||||
{ |
||||
updateTimer->start(5000); |
||||
|
||||
if (uWidget) |
||||
{ |
||||
m_ui->verticalLayout->removeWidget(uWidget); |
||||
delete uWidget; |
||||
uWidget = NULL; |
||||
} |
||||
} |
||||
|
||||
if (!uasViews.contains(uas)) |
||||
{ |
||||
// Only display the UAS in a single link.
|
||||
QList<LinkInterface*> x = vehicle->links(); |
||||
if (x.size()) |
||||
{ |
||||
LinkInterface* li = x.first(); |
||||
|
||||
// Find an existing QGroupBox for this LinkInterface or create a
|
||||
// new one.
|
||||
QGroupBox* newBox; |
||||
if (linkToBoxMapping.contains(li)) |
||||
{ |
||||
newBox = linkToBoxMapping[li]; |
||||
} |
||||
else |
||||
{ |
||||
newBox = new QGroupBox(li->getName(), this); |
||||
QVBoxLayout* boxLayout = new QVBoxLayout(newBox); |
||||
newBox->setLayout(boxLayout); |
||||
m_ui->verticalLayout->addWidget(newBox); |
||||
linkToBoxMapping[li] = newBox; |
||||
updateStatus(); // Update the link status for this GroupBox.
|
||||
} |
||||
|
||||
// And add the new UAS to the UASList
|
||||
UASView* newView = new UASView(vehicle, newBox); |
||||
uasViews.insert(uas, newView); |
||||
uasToBoxMapping[uas] = newBox; |
||||
newBox->layout()->addWidget(newView); |
||||
} |
||||
} |
||||
|
||||
UASView* view = uasViews.value(uas, NULL); |
||||
if (view) { |
||||
view->setUASasActive(true); |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* If the UAS was removed, check to see if it was the last one in the QGroupBox and delete |
||||
* the QGroupBox if so. |
||||
*/ |
||||
void UASListWidget::_vehicleRemoved(Vehicle* vehicle) |
||||
{ |
||||
UAS* uas = vehicle->uas(); |
||||
|
||||
// Remove the UASView and check if its parent GroupBox has any other children,
|
||||
// delete it if it doesn't.
|
||||
QGroupBox* box = uasToBoxMapping[uas]; |
||||
uasToBoxMapping.remove(uas); |
||||
uasViews.remove(uas); |
||||
int otherViews = 0; |
||||
foreach (UASView* view, box->findChildren<UASView*>()) |
||||
{ |
||||
if (view->uas == uas) |
||||
{ |
||||
view->deleteLater(); |
||||
} |
||||
else |
||||
{ |
||||
++otherViews; |
||||
} |
||||
} |
||||
if (otherViews == 0) |
||||
{ |
||||
// Delete the groupbox.
|
||||
QMap<LinkInterface*, QGroupBox*>::const_iterator i = linkToBoxMapping.constBegin(); |
||||
while (i != linkToBoxMapping.constEnd()) { |
||||
if (i.value() == box) |
||||
{ |
||||
linkToBoxMapping.remove(i.key()); |
||||
break; |
||||
} |
||||
++i; |
||||
} |
||||
box->deleteLater(); |
||||
|
||||
// And if no other QGroupBoxes are left, put the initial widget back.
|
||||
// We also stop the update timer as there's nothing to update at this point.
|
||||
int otherBoxes = 0; |
||||
foreach (const QGroupBox* otherBox, findChildren<QGroupBox*>()) |
||||
{ |
||||
if (otherBox != box) |
||||
{ |
||||
++otherBoxes; |
||||
} |
||||
} |
||||
if (otherBoxes == 0) |
||||
{ |
||||
uWidget = new QGCUnconnectedInfoWidget(this); |
||||
m_ui->verticalLayout->addWidget(uWidget); |
||||
updateTimer->stop(); |
||||
} |
||||
} |
||||
} |
@ -1,78 +0,0 @@
@@ -1,78 +0,0 @@
|
||||
/*=====================================================================
|
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* @brief List of unmanned vehicles |
||||
* @author Lorenz Meier <mavteam@student.ethz.ch> |
||||
* |
||||
*/ |
||||
|
||||
#ifndef _UASLISTWIDGET_H_ |
||||
#define _UASLISTWIDGET_H_ |
||||
|
||||
#include <QWidget> |
||||
#include <QMap> |
||||
#include <QList> |
||||
#include <QVBoxLayout> |
||||
#include <QGroupBox> |
||||
#include "UASInterface.h" |
||||
#include "UASView.h" |
||||
#include "QGCUnconnectedInfoWidget.h" |
||||
#include "ui_UASList.h" |
||||
#include "Vehicle.h" |
||||
|
||||
class UASListWidget : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
UASListWidget(QWidget *parent = 0); |
||||
~UASListWidget(); |
||||
|
||||
public slots: |
||||
void removeLink(LinkInterface* link); |
||||
|
||||
protected: |
||||
// Keep a mapping from UASes to their GroupBox. Useful for determining when groupboxes are empty.
|
||||
QMap<UASInterface*, QGroupBox*> uasToBoxMapping; |
||||
// Keep a mapping from Links to GroupBoxes for adding new links.
|
||||
QMap<LinkInterface*, QGroupBox*> linkToBoxMapping; |
||||
// Tie each view to their UAS object so they can be removed easily.
|
||||
QMap<UASInterface*, UASView*> uasViews; |
||||
QGCUnconnectedInfoWidget* uWidget; |
||||
QTimer* updateTimer; |
||||
void changeEvent(QEvent *e); |
||||
|
||||
private slots: |
||||
void _vehicleAdded(Vehicle* vehicle); |
||||
void _vehicleRemoved(Vehicle* vehicle); |
||||
|
||||
private: |
||||
Ui::UASList* m_ui; |
||||
|
||||
private slots: |
||||
void updateStatus(); |
||||
}; |
||||
|
||||
#endif // _UASLISTWIDGET_H_
|
@ -1,690 +0,0 @@
@@ -1,690 +0,0 @@
|
||||
/*=====================================================================
|
||||
PIXHAWK Micro Air Vehicle Flying Robotics Toolkit |
||||
|
||||
(c) 2009, 2010 PIXHAWK PROJECT <http://pixhawk.ethz.ch>
|
||||
|
||||
This file is part of the PIXHAWK project |
||||
|
||||
PIXHAWK is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
PIXHAWK is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with PIXHAWK. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* @brief Implementation of one airstrip |
||||
* |
||||
* @author Lorenz Meier <mavteam@student.ethz.ch> |
||||
* |
||||
*/ |
||||
|
||||
#include <cmath> |
||||
#include <QDateTime> |
||||
#include <QDebug> |
||||
#include <QMenu> |
||||
#include <QInputDialog> |
||||
|
||||
#include "QGC.h" |
||||
#include "MultiVehicleManager.h" |
||||
#include "UASView.h" |
||||
#include "UASWaypointManager.h" |
||||
#include "MainWindow.h" |
||||
#include "ui_UASView.h" |
||||
|
||||
#ifndef __mobile__ |
||||
#include <QGCHilFlightGearConfiguration.h> |
||||
#endif |
||||
|
||||
UASView::UASView(Vehicle* vehicle, QWidget *parent) : |
||||
QWidget(parent), |
||||
vehicle(vehicle), |
||||
uas(vehicle->uas()), |
||||
startTime(0), |
||||
timeout(false), |
||||
iconIsRed(true), |
||||
disconnected(false), |
||||
timeRemaining(0), |
||||
chargeLevel(0), |
||||
load(0), |
||||
state("UNKNOWN"), |
||||
stateDesc(tr("Unknown state")), |
||||
mode("MAV_MODE_UNKNOWN"), |
||||
thrust(0), |
||||
isActive(false), |
||||
x(0), |
||||
y(0), |
||||
z(0), |
||||
totalSpeed(0), |
||||
lat(0), |
||||
lon(0), |
||||
alt(0), |
||||
groundDistance(0), |
||||
localFrame(false), |
||||
globalFrameKnown(false), |
||||
removeAction(new QAction(tr("Delete this system"), this)), |
||||
renameAction(new QAction(tr("Rename.."), this)), |
||||
selectAction(new QAction(tr("Control this system"), this)), |
||||
hilAction(new QAction(tr("HIL - Hardware in the Loop"), this)), |
||||
selectAirframeAction(new QAction(tr("Choose Airframe"), this)), |
||||
setBatterySpecsAction(new QAction(tr("Set Battery Options"), this)), |
||||
lowPowerModeEnabled(true), |
||||
generalUpdateCount(0), |
||||
filterTime(0), |
||||
m_ui(new Ui::UASView) |
||||
{ |
||||
m_ui->setupUi(this); |
||||
setToolTip(""); // Make sure the QGroupBox's tooltip doesn't seep through.
|
||||
|
||||
// FIXME XXX
|
||||
lowPowerModeEnabled = MainWindow::instance()->lowPowerModeEnabled(); |
||||
|
||||
hilAction->setCheckable(true); |
||||
|
||||
// Setup communication
|
||||
//connect(uas, SIGNAL(valueChanged(int,QString,double,quint64)), this, SLOT(receiveValue(int,QString,double,quint64)));
|
||||
connect(uas, SIGNAL(batteryChanged(UASInterface*, double, double, double, int)), this, SLOT(updateBattery(UASInterface*, double, double, double, int))); |
||||
connect(uas, SIGNAL(heartbeat(UASInterface*)), this, SLOT(receiveHeartbeat(UASInterface*))); |
||||
connect(uas, SIGNAL(thrustChanged(UASInterface*, double)), this, SLOT(updateThrust(UASInterface*, double))); |
||||
connect(uas, SIGNAL(localPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateLocalPosition(UASInterface*,double,double,double,quint64))); |
||||
connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,double,quint64))); |
||||
connect(uas, SIGNAL(velocityChanged_NED(UASInterface*,double,double,double,quint64)), this, SLOT(updateSpeed(UASInterface*,double,double,double,quint64))); |
||||
connect(uas, SIGNAL(statusChanged(UASInterface*,QString,QString)), this, SLOT(updateState(UASInterface*,QString,QString))); |
||||
connect(uas, SIGNAL(modeChanged(int,QString,QString)), this, SLOT(updateMode(int,QString,QString))); |
||||
connect(uas, SIGNAL(loadChanged(UASInterface*, double)), this, SLOT(updateLoad(UASInterface*, double))); |
||||
connect(uas, SIGNAL(heartbeatTimeout(bool, unsigned int)), this, SLOT(heartbeatTimeout(bool, unsigned int))); |
||||
connect(uas, SIGNAL(waypointSelected(int,int)), this, SLOT(selectWaypoint(int,int))); |
||||
connect(uas->getWaypointManager(), SIGNAL(currentWaypointChanged(quint16)), this, SLOT(currentWaypointUpdated(quint16))); |
||||
connect(uas, SIGNAL(systemTypeSet(UASInterface*,uint)), this, SLOT(setSystemType(UASInterface*,uint))); |
||||
connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), this, SLOT(showStatusText(int, int, int, QString))); |
||||
connect(uas, SIGNAL(navModeChanged(int, int, QString)), this, SLOT(updateNavMode(int, int, QString))); |
||||
|
||||
connect(MultiVehicleManager::instance(), &MultiVehicleManager::activeVehicleChanged, this, &UASView::_activeVehicleChanged); |
||||
|
||||
// Setup user interaction
|
||||
connect(m_ui->liftoffButton, SIGNAL(clicked()), uas, SLOT(launch())); |
||||
connect(m_ui->haltButton, SIGNAL(clicked()), uas, SLOT(halt())); |
||||
connect(m_ui->continueButton, SIGNAL(clicked()), uas, SLOT(go())); |
||||
connect(m_ui->landButton, SIGNAL(clicked()), uas, SLOT(land())); |
||||
connect(m_ui->abortButton, SIGNAL(clicked()), uas, SLOT(emergencySTOP())); |
||||
connect(m_ui->killButton, SIGNAL(clicked()), uas, SLOT(emergencyKILL())); |
||||
connect(m_ui->shutdownButton, SIGNAL(clicked()), uas, SLOT(shutdown())); |
||||
|
||||
// Allow deleting this widget
|
||||
connect(renameAction, SIGNAL(triggered()), this, SLOT(rename())); |
||||
connect(selectAction, &QAction::triggered, this, &UASView::_activateVehicle); |
||||
connect(selectAirframeAction, SIGNAL(triggered()), this, SLOT(selectAirframe())); |
||||
connect(setBatterySpecsAction, SIGNAL(triggered()), this, SLOT(setBatterySpecs())); |
||||
|
||||
// Name changes
|
||||
connect(uas, SIGNAL(nameChanged(QString)), this, SLOT(updateName(QString))); |
||||
|
||||
// Set static values
|
||||
|
||||
// Name
|
||||
if (uas->getUASName() == "") |
||||
{ |
||||
m_ui->nameLabel->setText(tr("UAS") + QString::number(uas->getUASID())); |
||||
} |
||||
else |
||||
{ |
||||
m_ui->nameLabel->setText(uas->getUASName()); |
||||
} |
||||
|
||||
// Heartbeat fade
|
||||
refreshTimer = new QTimer(this); |
||||
connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); |
||||
if (lowPowerModeEnabled) |
||||
{ |
||||
refreshTimer->start(updateInterval*3); |
||||
} |
||||
else |
||||
{ |
||||
refreshTimer->start(updateInterval); |
||||
} |
||||
|
||||
// Style some elements by default to the UAS' color.
|
||||
heartbeatColor = uas->getColor(); |
||||
QString colorstyle("QLabel { background-color: %1; }"); |
||||
m_ui->typeLabel->setStyleSheet(colorstyle.arg(heartbeatColor.name())); |
||||
_activeVehicleChanged(vehicle); |
||||
|
||||
// Hide kill and shutdown buttons by default
|
||||
m_ui->killButton->hide(); |
||||
m_ui->shutdownButton->hide(); |
||||
|
||||
// Set state and mode
|
||||
updateMode(uas->getUASID(), uas->getShortMode(), ""); |
||||
updateState(uas, uas->getShortState(), ""); |
||||
setSystemType(uas, uas->getSystemType()); |
||||
} |
||||
|
||||
UASView::~UASView() |
||||
{ |
||||
delete m_ui; |
||||
} |
||||
|
||||
void UASView::_activateVehicle(void) |
||||
{ |
||||
MultiVehicleManager::instance()->setActiveVehicle(vehicle); |
||||
} |
||||
|
||||
void UASView::heartbeatTimeout(bool timeout, unsigned int ms) |
||||
{ |
||||
Q_UNUSED(ms); |
||||
this->timeout = timeout; |
||||
} |
||||
|
||||
void UASView::updateNavMode(int uasid, int mode, const QString& text) |
||||
{ |
||||
Q_UNUSED(uasid); |
||||
Q_UNUSED(mode); |
||||
m_ui->navLabel->setText(text); |
||||
} |
||||
|
||||
void UASView::showStatusText(int uasid, int componentid, int severity, QString text) |
||||
{ |
||||
Q_UNUSED(uasid); |
||||
Q_UNUSED(componentid); |
||||
Q_UNUSED(severity); |
||||
//m_ui->statusTextLabel->setText(text);
|
||||
stateDesc = text; |
||||
} |
||||
|
||||
void UASView::setUASasActive(bool active) |
||||
{ |
||||
if (active) |
||||
{ |
||||
MultiVehicleManager::instance()->setActiveVehicle(vehicle); |
||||
} |
||||
} |
||||
|
||||
void UASView::_activeVehicleChanged(Vehicle* vehicle) |
||||
{ |
||||
bool active = false; |
||||
|
||||
if (vehicle) { |
||||
active = vehicle->uas() == this->uas; |
||||
} |
||||
|
||||
this->isActive = active; |
||||
if (isActive) |
||||
{ |
||||
setStyleSheet("UASView { border-width: 3px}"); |
||||
} |
||||
else |
||||
{ |
||||
setStyleSheet(QString("UASView { border-color: %1}").arg(heartbeatColor.name())); |
||||
} |
||||
} |
||||
|
||||
void UASView::updateMode(int sysId, QString status, QString description) |
||||
{ |
||||
Q_UNUSED(description); |
||||
|
||||
//int aa=this->uas->getUASID();
|
||||
if (sysId == this->uas->getUASID()) m_ui->modeLabel->setText(status); |
||||
|
||||
m_ui->modeLabel->setText(status); |
||||
} |
||||
|
||||
void UASView::mouseDoubleClickEvent (QMouseEvent * event) |
||||
{ |
||||
Q_UNUSED(event); |
||||
MultiVehicleManager::instance()->setActiveVehicle(vehicle); |
||||
} |
||||
|
||||
void UASView::receiveHeartbeat(UASInterface* uas) |
||||
{ |
||||
heartbeatColor = uas->getColor(); |
||||
QString colorstyle("QLabel { background-color: %1; }"); |
||||
m_ui->heartBeatLabel->setStyleSheet(colorstyle.arg(heartbeatColor.name())); |
||||
|
||||
// If we're returning from a disconnection, recolor things properly.
|
||||
if (disconnected) |
||||
{ |
||||
_activeVehicleChanged(vehicle); |
||||
disconnected = false; |
||||
} |
||||
timeout = false; |
||||
} |
||||
|
||||
void UASView::updateName(const QString& name) |
||||
{ |
||||
if (uas) m_ui->nameLabel->setText(name); |
||||
} |
||||
|
||||
/**
|
||||
* The current system type is represented through the system icon. |
||||
* |
||||
* @param uas Source system, has to be the same as this->uas |
||||
* @param systemType type ID, following the MAVLink system type conventions |
||||
* @see http://pixhawk.ethz.ch/software/mavlink
|
||||
*/ |
||||
void UASView::setSystemType(UASInterface* uas, unsigned int systemType) |
||||
{ |
||||
if (uas == this->uas) |
||||
{ |
||||
// Set matching icon
|
||||
switch (systemType) |
||||
{ |
||||
case MAV_TYPE_GENERIC: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Generic")); |
||||
break; |
||||
case MAV_TYPE_FIXED_WING: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/FixedWing")); |
||||
break; |
||||
case MAV_TYPE_QUADROTOR: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/QuadRotor")); |
||||
break; |
||||
case MAV_TYPE_COAXIAL: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Coaxial")); |
||||
break; |
||||
case MAV_TYPE_HELICOPTER: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Helicopter")); |
||||
break; |
||||
case MAV_TYPE_ANTENNA_TRACKER: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Unknown")); |
||||
break; |
||||
case MAV_TYPE_GCS: { |
||||
// A groundstation is a special system type, update widget
|
||||
QString result; |
||||
m_ui->nameLabel->setText(tr("GCS ") + result.sprintf("%03d", uas->getUASID())); |
||||
m_ui->waypointLabel->setText(""); |
||||
m_ui->timeRemainingLabel->setText("Online:"); |
||||
m_ui->batteryBar->hide(); |
||||
m_ui->thrustBar->hide(); |
||||
m_ui->stateLabel->hide(); |
||||
m_ui->statusTextLabel->hide(); |
||||
m_ui->waypointLabel->hide(); |
||||
m_ui->liftoffButton->hide(); |
||||
m_ui->haltButton->hide(); |
||||
m_ui->landButton->hide(); |
||||
m_ui->shutdownButton->hide(); |
||||
m_ui->abortButton->hide(); |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Groundstation")); |
||||
} |
||||
break; |
||||
case MAV_TYPE_AIRSHIP: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Airship")); |
||||
break; |
||||
case MAV_TYPE_FREE_BALLOON: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/FreeBalloon")); |
||||
break; |
||||
case MAV_TYPE_ROCKET: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Rocket")); |
||||
break; |
||||
case MAV_TYPE_GROUND_ROVER: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/GroundRover")); |
||||
break; |
||||
case MAV_TYPE_SURFACE_BOAT: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/SurfaceBoat")); |
||||
break; |
||||
case MAV_TYPE_SUBMARINE: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Submarine")); |
||||
break; |
||||
case MAV_TYPE_HEXAROTOR: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/HexaRotor")); |
||||
break; |
||||
case MAV_TYPE_OCTOROTOR: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/OctoRotor")); |
||||
break; |
||||
case MAV_TYPE_TRICOPTER: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/TriCopter")); |
||||
break; |
||||
case MAV_TYPE_FLAPPING_WING: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/FlappingWing")); |
||||
break; |
||||
case MAV_TYPE_KITE: |
||||
m_ui->typeLabel->setPixmap(QPixmap(":/res/mavs/Kite")); |
||||
break; |
||||
default: |
||||
m_ui->typeLabel->setPixmap(QPixmap("://res/mavs/Unknown")); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void UASView::updateLocalPosition(UASInterface* uas, double x, double y, double z, quint64 usec) |
||||
{ |
||||
Q_UNUSED(usec); |
||||
Q_UNUSED(uas); |
||||
this->x = x; |
||||
this->y = y; |
||||
this->z = z; |
||||
localFrame = true; |
||||
} |
||||
|
||||
void UASView::updateGlobalPosition(UASInterface* uas, double lat, double lon, double altAMSL, double altWGS84, quint64 usec) |
||||
{ |
||||
Q_UNUSED(uas); |
||||
Q_UNUSED(usec); |
||||
Q_UNUSED(altAMSL); |
||||
this->lon = lon; |
||||
this->lat = lat; |
||||
this->alt = altWGS84; |
||||
globalFrameKnown = true; |
||||
} |
||||
|
||||
void UASView::updateSpeed(UASInterface*, double x, double y, double z, quint64 usec) |
||||
{ |
||||
Q_UNUSED(usec); |
||||
totalSpeed = sqrt(x*x + y*y + z*z); |
||||
} |
||||
|
||||
void UASView::currentWaypointUpdated(quint16 waypoint) |
||||
{ |
||||
m_ui->waypointLabel->setText(tr("WP") + QString::number(waypoint)); |
||||
} |
||||
|
||||
void UASView::setWaypoint(int uasId, int id, double x, double y, double z, double yaw, bool autocontinue, bool current) |
||||
{ |
||||
Q_UNUSED(x); |
||||
Q_UNUSED(y); |
||||
Q_UNUSED(z); |
||||
Q_UNUSED(yaw); |
||||
Q_UNUSED(autocontinue); |
||||
if (uasId == this->uas->getUASID()) |
||||
{ |
||||
if (current) |
||||
{ |
||||
m_ui->waypointLabel->setText(tr("WP") + QString::number(id)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void UASView::selectWaypoint(int uasId, int id) |
||||
{ |
||||
if (uasId == this->uas->getUASID()) |
||||
{ |
||||
m_ui->waypointLabel->setText(tr("WP") + QString::number(id)); |
||||
} |
||||
} |
||||
|
||||
void UASView::updateThrust(UASInterface* uas, double thrust) |
||||
{ |
||||
if (this->uas == uas) |
||||
{ |
||||
this->thrust = thrust; |
||||
} |
||||
} |
||||
|
||||
void UASView::updateBattery(UASInterface* uas, double voltage, double current, double percent, int seconds) |
||||
{ |
||||
Q_UNUSED(voltage); |
||||
Q_UNUSED(current); |
||||
if (this->uas == uas) |
||||
{ |
||||
timeRemaining = seconds; |
||||
chargeLevel = percent; |
||||
} |
||||
} |
||||
|
||||
void UASView::updateState(UASInterface* uas, QString uasState, QString stateDescription) |
||||
{ |
||||
if (this->uas == uas) |
||||
{ |
||||
state = uasState; |
||||
stateDesc = stateDescription; |
||||
} |
||||
} |
||||
|
||||
void UASView::updateLoad(UASInterface* uas, double load) |
||||
{ |
||||
if (this->uas == uas) |
||||
{ |
||||
this->load = load; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* Right-clicking on the view provides a custom menu for interacting |
||||
* with the UAS. |
||||
*/ |
||||
void UASView::contextMenuEvent (QContextMenuEvent* event) |
||||
{ |
||||
QMenu menu(this); |
||||
menu.addAction(selectAction); |
||||
menu.addSeparator(); |
||||
menu.addAction(renameAction); |
||||
/*
|
||||
FIXME: The code below is incorrect. removeAction should only be available when link is |
||||
disconnected. fSee Issue #1275 |
||||
if (timeout) |
||||
{ |
||||
menu.addAction(removeAction); |
||||
} |
||||
*/ |
||||
menu.addAction(hilAction); |
||||
menu.addAction(selectAirframeAction); |
||||
menu.addAction(setBatterySpecsAction); |
||||
menu.exec(event->globalPos()); |
||||
} |
||||
|
||||
void UASView::setBatterySpecs() |
||||
{ |
||||
if (uas) |
||||
{ |
||||
bool ok; |
||||
QString newName = QInputDialog::getText(this, tr("Set Battery Specifications for %1").arg(uas->getUASName()), |
||||
tr("Specs: (empty,warn,full), e.g. (9V,9.5V,12.6V) or just warn level in percent (e.g. 15%) to use estimate from MAV"), QLineEdit::Normal, |
||||
uas->getBatterySpecs(), &ok); |
||||
|
||||
if (ok && !newName.isEmpty()) uas->setBatterySpecs(newName); |
||||
} |
||||
} |
||||
|
||||
void UASView::rename() |
||||
{ |
||||
if (uas) |
||||
{ |
||||
bool ok; |
||||
QString newName = QInputDialog::getText(this, tr("Rename System %1").arg(uas->getUASName()), |
||||
tr("System Name:"), QLineEdit::Normal, |
||||
uas->getUASName(), &ok); |
||||
|
||||
if (ok && !newName.isEmpty()) uas->setUASName(newName); |
||||
} |
||||
} |
||||
|
||||
void UASView::selectAirframe() |
||||
{ |
||||
if (uas) |
||||
{ |
||||
// Get list of airframes from UAS
|
||||
QStringList airframes; |
||||
airframes << "Generic" |
||||
<< "Multiplex Easystar" |
||||
<< "Multiplex Twinstar" |
||||
<< "Multiplex Merlin" |
||||
<< "Pixhawk Cheetah" |
||||
<< "Mikrokopter" |
||||
<< "Reaper" |
||||
<< "Predator" |
||||
<< "Coaxial" |
||||
<< "Pteryx" |
||||
<< "Tricopter" |
||||
<< "Asctec Firefly" |
||||
<< "X8 Flying Wing" |
||||
<< "Viper 2.0 Flying Wing" |
||||
<< "Cam Flyer Q Flying Wing"; |
||||
|
||||
bool ok; |
||||
QString item = QInputDialog::getItem(this, tr("Select Airframe for %1").arg(uas->getUASName()), |
||||
tr("Airframe"), airframes, uas->getAirframe(), false, &ok); |
||||
if (ok && !item.isEmpty()) |
||||
{ |
||||
// Set this airframe as UAS airframe
|
||||
uas->setAirframe(airframes.indexOf(item)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void UASView::refresh() |
||||
{ |
||||
if (generalUpdateCount == 4) |
||||
{ |
||||
#if (QGC_EVENTLOOP_DEBUG) |
||||
// qDebug() << "EVENTLOOP:" << __FILE__ << __LINE__;
|
||||
#endif |
||||
generalUpdateCount = 0; |
||||
//// qDebug() << "UPDATING EVERYTHING";
|
||||
// State
|
||||
m_ui->stateLabel->setText(state); |
||||
m_ui->statusTextLabel->setText(stateDesc); |
||||
|
||||
// Battery
|
||||
m_ui->batteryBar->setValue(static_cast<int>(this->chargeLevel)); |
||||
//m_ui->loadBar->setValue(static_cast<int>(this->load));
|
||||
m_ui->thrustBar->setValue(this->thrust); |
||||
|
||||
// Position
|
||||
// If global position is known, prefer it over local coordinates
|
||||
|
||||
if (!globalFrameKnown && localFrame) |
||||
{ |
||||
QString position; |
||||
position = position.sprintf("%05.1f %05.1f %06.1f m", x, y, z); |
||||
m_ui->positionLabel->setText(position); |
||||
} |
||||
|
||||
if (globalFrameKnown) |
||||
{ |
||||
QString globalPosition; |
||||
QString latIndicator; |
||||
if (lat > 0) |
||||
{ |
||||
latIndicator = "N"; |
||||
} |
||||
else |
||||
{ |
||||
latIndicator = "S"; |
||||
} |
||||
QString lonIndicator; |
||||
if (lon > 0) |
||||
{ |
||||
lonIndicator = "E"; |
||||
} |
||||
else |
||||
{ |
||||
lonIndicator = "W"; |
||||
} |
||||
|
||||
globalPosition = globalPosition.sprintf("%6.2f%s %6.2f%s %6.1f m", fabs(lon), lonIndicator.toStdString().c_str(), fabs(lat), latIndicator.toStdString().c_str(), alt); |
||||
m_ui->positionLabel->setText(globalPosition); |
||||
} |
||||
|
||||
// Altitude
|
||||
if (groundDistance == 0 && alt != 0) |
||||
{ |
||||
m_ui->groundDistanceLabel->setText(QString("%1 m").arg(alt, 6, 'f', 1, '0')); |
||||
} |
||||
else |
||||
{ |
||||
m_ui->groundDistanceLabel->setText(QString("%1 m").arg(groundDistance, 6, 'f', 1, '0')); |
||||
} |
||||
|
||||
// Speed
|
||||
QString speed("%1 m/s"); |
||||
m_ui->speedLabel->setText(speed.arg(totalSpeed, 4, 'f', 1, '0')); |
||||
|
||||
// Thrust
|
||||
m_ui->thrustBar->setValue(thrust * 100); |
||||
|
||||
// Time Elapsed
|
||||
//QDateTime time = MG::TIME::msecToQDateTime(uas->getUptime());
|
||||
|
||||
quint64 filterTime = uas->getUptime() / 1000; |
||||
int hours = static_cast<int>(filterTime / 3600); |
||||
int min = static_cast<int>((filterTime - 3600 * hours) / 60); |
||||
int sec = static_cast<int>(filterTime - 60 * min - 3600 * hours); |
||||
QString timeText; |
||||
timeText = timeText.sprintf("%02d:%02d:%02d", hours, min, sec); |
||||
m_ui->timeElapsedLabel->setText(timeText); |
||||
|
||||
if(this->timeRemaining > 1 && this->timeRemaining < QGC::MAX_FLIGHT_TIME) |
||||
{ |
||||
// Filter output to get a higher stability
|
||||
filterTime = static_cast<int>(this->timeRemaining); |
||||
// filterTime = 0.8 * filterTime + 0.2 * static_cast<int>(this->timeRemaining);
|
||||
hours = static_cast<int>(filterTime / 3600); |
||||
min = static_cast<int>((filterTime - 3600 * hours) / 60); |
||||
sec = static_cast<int>(filterTime - 60 * min - 3600 * hours); |
||||
|
||||
timeText = timeText.sprintf("%02d:%02d:%02d", hours, min, sec); |
||||
m_ui->timeRemainingLabel->setText(timeText); |
||||
} |
||||
else |
||||
{ |
||||
m_ui->timeRemainingLabel->setText(tr("Calc..")); |
||||
} |
||||
|
||||
|
||||
} |
||||
generalUpdateCount++; |
||||
|
||||
if (timeout) |
||||
{ |
||||
// CRITICAL CONDITION, NO HEARTBEAT
|
||||
disconnected = true; |
||||
|
||||
QColor warnColor; |
||||
if (iconIsRed) |
||||
{ |
||||
warnColor = Qt::red; |
||||
} |
||||
else |
||||
{ |
||||
warnColor = Qt::darkRed; |
||||
refreshTimer->setInterval(errorUpdateInterval); |
||||
refreshTimer->start(); |
||||
} |
||||
QString style = QString("UASView {background-color: %1;}").arg(warnColor.name()); |
||||
this->setStyleSheet(style); |
||||
iconIsRed = !iconIsRed; |
||||
} |
||||
else |
||||
{ |
||||
// If we're not in low power mode, add the additional visual effect of
|
||||
// fading out the color of the heartbeat for this UAS.
|
||||
if (!lowPowerModeEnabled) |
||||
{ |
||||
heartbeatColor = heartbeatColor.darker(110); |
||||
QString colorstyle("QLabel {background-color: %1;}"); |
||||
m_ui->heartBeatLabel->setStyleSheet(colorstyle.arg(heartbeatColor.name())); |
||||
refreshTimer->setInterval(updateInterval); |
||||
refreshTimer->start(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void UASView::changeEvent(QEvent *e) |
||||
{ |
||||
QWidget::changeEvent(e); |
||||
switch (e->type()) |
||||
{ |
||||
case QEvent::LanguageChange: |
||||
m_ui->retranslateUi(this); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
void UASView::paintEvent(QPaintEvent *event) |
||||
{ |
||||
Q_UNUSED(event); |
||||
QStyleOption opt; |
||||
opt.init(this); |
||||
QPainter p(this); |
||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); |
||||
} |
@ -1,156 +0,0 @@
@@ -1,156 +0,0 @@
|
||||
/*=====================================================================
|
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* @brief Definition of class UASView |
||||
* |
||||
* @author Lorenz Meier <mavteam@student.ethz.ch> |
||||
* |
||||
*/ |
||||
|
||||
#ifndef UASVIEW_H |
||||
#define UASVIEW_H |
||||
|
||||
#include <QWidget> |
||||
#include <QString> |
||||
#include <QTimer> |
||||
#include <QMouseEvent> |
||||
|
||||
#include "Vehicle.h" |
||||
#include "UASInterface.h" |
||||
|
||||
namespace Ui |
||||
{ |
||||
class UASView; |
||||
} |
||||
|
||||
class UASView : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
UASView(Vehicle* vehicle, QWidget *parent = 0); |
||||
~UASView(); |
||||
Vehicle* vehicle; |
||||
UASInterface* uas; |
||||
|
||||
public slots: |
||||
/** @brief Update the name of the system */ |
||||
void updateName(const QString& name); |
||||
void receiveHeartbeat(UASInterface* uas); |
||||
void updateThrust(UASInterface* uas, double thrust); |
||||
void updateBattery(UASInterface* uas, double voltage, double current, double percent, int seconds); |
||||
void updateLocalPosition(UASInterface*, double x, double y, double z, quint64 usec); |
||||
void updateGlobalPosition(UASInterface*, double lat, double lon, double altAMSL, double altWGS84, quint64 usec); |
||||
void updateSpeed(UASInterface*, double x, double y, double z, quint64 usec); |
||||
void updateState(UASInterface*, QString uasState, QString stateDescription); |
||||
/** @brief Update the MAV mode */ |
||||
void updateMode(int sysId, QString status, QString description); |
||||
void updateLoad(UASInterface* uas, double load); |
||||
//void receiveValue(int uasid, QString id, double value, quint64 time);
|
||||
void refresh(); |
||||
/** @brief Receive new waypoint information */ |
||||
void setWaypoint(int uasId, int id, double x, double y, double z, double yaw, bool autocontinue, bool current); |
||||
/** @brief Update the current active waypoint */ |
||||
void currentWaypointUpdated(quint16 waypoint); |
||||
/** @brief Set waypoint as current target */ |
||||
void selectWaypoint(int uasId, int id); |
||||
/** @brief Set the current system type */ |
||||
void setSystemType(UASInterface* uas, unsigned int systemType); |
||||
/** @brief Set the current UAS as the globally active system */ |
||||
void setUASasActive(bool); |
||||
/** @brief Set the widget into critical mode */ |
||||
void heartbeatTimeout(bool timeout, unsigned int ms); |
||||
/** @brief Bring up the dialog to rename the system */ |
||||
void rename(); |
||||
/** @brief Select airframe for this vehicle */ |
||||
void selectAirframe(); |
||||
/** @brief Select the battery type */ |
||||
void setBatterySpecs(); |
||||
/** @brief Show a status text message */ |
||||
void showStatusText(int uasid, int componentid, int severity, QString text); |
||||
/** @brief Update the navigation mode state */ |
||||
void updateNavMode(int uasid, int mode, const QString& text); |
||||
|
||||
protected: |
||||
void changeEvent(QEvent *e); |
||||
QTimer* refreshTimer; |
||||
QColor heartbeatColor; |
||||
quint64 startTime; |
||||
bool timeout; |
||||
bool iconIsRed; |
||||
bool disconnected; |
||||
int timeRemaining; |
||||
float chargeLevel; |
||||
float load; |
||||
QString state; |
||||
QString stateDesc; |
||||
QString mode; |
||||
double thrust; ///< Current vehicle thrust: 0 - 1.0 for 100% thrust
|
||||
bool isActive; ///< Is this MAV selected by the user?
|
||||
float x; |
||||
float y; |
||||
float z; |
||||
float totalSpeed; |
||||
float lat; |
||||
float lon; |
||||
float alt; |
||||
float groundDistance; |
||||
bool localFrame; |
||||
bool globalFrameKnown; |
||||
QAction* removeAction; |
||||
QAction* renameAction; |
||||
QAction* selectAction; |
||||
QAction* hilAction; |
||||
QAction* hilXAction; |
||||
QAction* selectAirframeAction; |
||||
QAction* setBatterySpecsAction; |
||||
static const int updateInterval = 800; |
||||
static const int errorUpdateInterval = 200; |
||||
bool lowPowerModeEnabled; ///< Low power mode reduces update rates
|
||||
unsigned int generalUpdateCount; ///< Skip counter for updates
|
||||
double filterTime; ///< Filter time estimate of battery
|
||||
/**
|
||||
* If a user double-clicks on this view, set the active UAS to this one. |
||||
*/ |
||||
void mouseDoubleClickEvent(QMouseEvent *event); |
||||
/**
|
||||
* Right-clicking on the view provides a custom menu for interacting |
||||
* with the UAS. |
||||
*/ |
||||
void contextMenuEvent(QContextMenuEvent *event); |
||||
|
||||
private slots: |
||||
void _activeVehicleChanged(Vehicle* vehicle); |
||||
void _activateVehicle(void); |
||||
|
||||
private: |
||||
Ui::UASView *m_ui; |
||||
|
||||
/**
|
||||
* Implement paintEvent() so that stylesheets work for our custom widget. |
||||
*/ |
||||
virtual void paintEvent(QPaintEvent *event); |
||||
}; |
||||
|
||||
#endif // UASVIEW_H
|
Loading…
Reference in new issue