1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +01:00

OP-138 : integration of Andrew's Heli mixer UI into the config widget. Not very well integrated, but the code is there, will improve over the next few days.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1936 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
edouard 2010-10-10 08:02:44 +00:00 committed by edouard
parent d11e9c56e5
commit 706e418990
5 changed files with 1667 additions and 60 deletions

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>730</width>
<height>508</height>
<height>527</height>
</rect>
</property>
<property name="windowTitle">
@ -69,7 +69,7 @@
<item>
<widget class="QStackedWidget" name="airframesWidget">
<property name="currentIndex">
<number>1</number>
<number>2</number>
</property>
<widget class="QWidget" name="fixedWing">
<property name="enabled">
@ -997,22 +997,11 @@
</layout>
</widget>
<widget class="QWidget" name="ccpmHeli">
<layout class="QVBoxLayout" name="verticalLayout_5" stretch="0,1">
<layout class="QVBoxLayout" name="verticalLayout_5" stretch="1">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>CCPM Heli</string>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>This is not implemented yet, sorry</string>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout_19">
<item>
<widget class="ConfigccpmWidget" name="widget_3" native="true"/>
</item>
</layout>
</item>
@ -1131,48 +1120,106 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="MixerCurveWidget" name="widget_2" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>150</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout_17">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_17">
<item>
<widget class="QLabel" name="label_39">
<property name="text">
<string>Throttle Curve 1</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Reset</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="MixerCurveWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>150</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="customThrottleCurve1Value">
<property name="text">
<string>Val: 0.00</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="MixerCurveWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>150</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout_18">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_18">
<item>
<widget class="QLabel" name="label_41">
<property name="text">
<string>Throttle Curve 2</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>Reset</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="MixerCurveWidget" name="widget_2" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>150</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="customThrottleCurve2Value">
<property name="text">
<string>Val: 0.00</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="formLayout_12">
@ -1210,6 +1257,29 @@
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_2"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_38">
<property name="text">
<string>MaxAccel</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSlider" name="horizontalSlider_2">
<property name="minimum">
<number>500</number>
</property>
<property name="maximum">
<number>2000</number>
</property>
<property name="value">
<number>1000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@ -1369,6 +1439,12 @@
<header>mixercurvewidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>ConfigccpmWidget</class>
<extends>QWidget</extends>
<header>configccpmwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>

View File

@ -0,0 +1,1026 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ccpmWidget</class>
<widget class="QWidget" name="ccpmWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>720</width>
<height>435</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QTabWidget" name="TabObject">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>691</width>
<height>381</height>
</rect>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Basic settings</string>
</attribute>
<widget class="QComboBox" name="ccpmType">
<property name="geometry">
<rect>
<x>110</x>
<y>10</y>
<width>551</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>Select aircraft type here</string>
</property>
<item>
<property name="text">
<string>3 servo 120º - single servo rear</string>
</property>
</item>
<item>
<property name="text">
<string>Custom - Advanced settings</string>
</property>
</item>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>91</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Swashplate config:</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Curve settings</string>
</attribute>
<widget class="QTableWidget" name="CurveSettings">
<property name="geometry">
<rect>
<x>20</x>
<y>190</y>
<width>261</width>
<height>141</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="autoScroll">
<bool>false</bool>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<row>
<property name="text">
<string>0%</string>
</property>
</row>
<row>
<property name="text">
<string>25%</string>
</property>
</row>
<row>
<property name="text">
<string>50%</string>
</property>
</row>
<row>
<property name="text">
<string>75%</string>
</property>
</row>
<row>
<property name="text">
<string>100%</string>
</property>
</row>
<row>
<property name="text">
<string>none</string>
</property>
</row>
<row>
<property name="text">
<string>none</string>
</property>
</row>
<row>
<property name="text">
<string>none</string>
</property>
</row>
<row>
<property name="text">
<string>none</string>
</property>
</row>
<row>
<property name="text">
<string>none</string>
</property>
</row>
<column>
<property name="text">
<string>Throttle Curve</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</column>
<column>
<property name="text">
<string>Blade Pitch Curve</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</column>
<item row="0" column="0">
<property name="text">
<string>0</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="0" column="1">
<property name="text">
<string>0</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="1" column="0">
<property name="text">
<string>.25</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="1" column="1">
<property name="text">
<string>.25</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="2" column="0">
<property name="text">
<string>.5</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="2" column="1">
<property name="text">
<string>.5</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="3" column="0">
<property name="text">
<string>.75</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="3" column="1">
<property name="text">
<string>.75</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="4" column="0">
<property name="text">
<string>1</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="4" column="1">
<property name="text">
<string>1</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="5" column="0">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="5" column="1">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="6" column="0">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="6" column="1">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="7" column="0">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="7" column="1">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="8" column="0">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="8" column="1">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="9" column="0">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="9" column="1">
<property name="text">
<string>-</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
</widget>
<widget class="QComboBox" name="CurveType">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>271</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>Select aircraft type here</string>
</property>
<item>
<property name="text">
<string>Linear</string>
</property>
</item>
<item>
<property name="text">
<string>Flat</string>
</property>
</item>
<item>
<property name="text">
<string>Step</string>
</property>
</item>
<item>
<property name="text">
<string>Custom</string>
</property>
</item>
</widget>
<widget class="QSpinBox" name="NumCurvePoints">
<property name="geometry">
<rect>
<x>180</x>
<y>50</y>
<width>51</width>
<height>22</height>
</rect>
</property>
<property name="minimum">
<number>2</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>5</number>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>80</x>
<y>50</y>
<width>91</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Number of points</string>
</property>
</widget>
<widget class="QPushButton" name="ccpmGenerateCurve">
<property name="geometry">
<rect>
<x>150</x>
<y>140</y>
<width>121</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Generate curves based on settings</string>
</property>
<property name="text">
<string>&lt;-- Generate Curve</string>
</property>
</widget>
<widget class="QDoubleSpinBox" name="CurveValue1">
<property name="geometry">
<rect>
<x>40</x>
<y>100</y>
<width>62</width>
<height>22</height>
</rect>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
<widget class="QDoubleSpinBox" name="CurveValue2">
<property name="geometry">
<rect>
<x>130</x>
<y>100</y>
<width>62</width>
<height>22</height>
</rect>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
<widget class="QDoubleSpinBox" name="CurveValue3">
<property name="geometry">
<rect>
<x>220</x>
<y>100</y>
<width>62</width>
<height>22</height>
</rect>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
<property name="value">
<double>50.000000000000000</double>
</property>
</widget>
<widget class="QLabel" name="CurveLabel1">
<property name="geometry">
<rect>
<x>40</x>
<y>80</y>
<width>61</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Min</string>
</property>
</widget>
<widget class="QLabel" name="CurveLabel2">
<property name="geometry">
<rect>
<x>130</x>
<y>80</y>
<width>61</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Max</string>
</property>
</widget>
<widget class="QLabel" name="CurveLabel3">
<property name="geometry">
<rect>
<x>220</x>
<y>80</y>
<width>61</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Step point</string>
</property>
</widget>
<widget class="QGraphicsView" name="CurveGraph">
<property name="geometry">
<rect>
<x>310</x>
<y>10</y>
<width>371</width>
<height>331</height>
</rect>
</property>
</widget>
<widget class="QComboBox" name="CurveToGenerate">
<property name="geometry">
<rect>
<x>30</x>
<y>140</y>
<width>111</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>Select aircraft type here</string>
</property>
<item>
<property name="text">
<string>Throttle</string>
</property>
</item>
<item>
<property name="text">
<string>Pitch</string>
</property>
</item>
</widget>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Advanced settings</string>
</attribute>
<widget class="QTableWidget" name="ServoSettings">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>251</width>
<height>141</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="midLineWidth">
<number>0</number>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="autoScroll">
<bool>false</bool>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<row>
<property name="text">
<string>ServoW</string>
</property>
</row>
<row>
<property name="text">
<string>ServoX</string>
</property>
</row>
<row>
<property name="text">
<string>ServoY</string>
</property>
</row>
<row>
<property name="text">
<string>ServoZ</string>
</property>
</row>
<column>
<property name="text">
<string>Angle</string>
</property>
</column>
<column>
<property name="text">
<string>Output</string>
</property>
</column>
<item row="0" column="0">
<property name="text">
<string>0</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="0" column="1">
<property name="text">
<string>8</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="1" column="0">
<property name="text">
<string>60</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="1" column="1">
<property name="text">
<string>5</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="2" column="0">
<property name="text">
<string>180</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="2" column="1">
<property name="text">
<string>1</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="3" column="0">
<property name="text">
<string>300</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
<item row="3" column="1">
<property name="text">
<string>0</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</item>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>91</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Servo config:</string>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>10</x>
<y>180</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>CollectiveConstant:</string>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>210</y>
<width>91</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>CorrectionAngle:</string>
</property>
</widget>
<widget class="QLabel" name="label_8">
<property name="geometry">
<rect>
<x>10</x>
<y>240</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Throttle Output</string>
</property>
</widget>
<widget class="QLabel" name="label_9">
<property name="geometry">
<rect>
<x>10</x>
<y>270</y>
<width>81</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Tail Rotor Servo</string>
</property>
</widget>
<widget class="QComboBox" name="ccpmThrottle">
<property name="geometry">
<rect>
<x>90</x>
<y>240</y>
<width>151</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>Select aircraft type here</string>
</property>
<property name="currentIndex">
<number>2</number>
</property>
<item>
<property name="text">
<string>0</string>
</property>
</item>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>3</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>5</string>
</property>
</item>
<item>
<property name="text">
<string>6</string>
</property>
</item>
<item>
<property name="text">
<string>7</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="ccpmTailRotor">
<property name="geometry">
<rect>
<x>90</x>
<y>270</y>
<width>151</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>Select aircraft type here</string>
</property>
<property name="currentIndex">
<number>3</number>
</property>
<item>
<property name="text">
<string>0</string>
</property>
</item>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>3</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>5</string>
</property>
</item>
<item>
<property name="text">
<string>6</string>
</property>
</item>
<item>
<property name="text">
<string>7</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
</widget>
<widget class="QDoubleSpinBox" name="CollectiveConstant">
<property name="geometry">
<rect>
<x>130</x>
<y>180</y>
<width>62</width>
<height>22</height>
</rect>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.050000000000000</double>
</property>
<property name="value">
<double>0.500000000000000</double>
</property>
</widget>
<widget class="QDoubleSpinBox" name="CorrectionAngle">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>130</x>
<y>210</y>
<width>62</width>
<height>22</height>
</rect>
</property>
<property name="decimals">
<number>0</number>
</property>
<property name="maximum">
<double>360.000000000000000</double>
</property>
<property name="singleStep">
<double>15.000000000000000</double>
</property>
</widget>
<widget class="QCheckBox" name="YawStabilizationInManualMode">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>310</y>
<width>181</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>YawStabilizationInManualMode:</string>
</property>
</widget>
<widget class="QCheckBox" name="Flybarless">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>10</x>
<y>330</y>
<width>70</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Flybarless</string>
</property>
</widget>
<widget class="QGraphicsView" name="SwashplateImage">
<property name="geometry">
<rect>
<x>300</x>
<y>10</y>
<width>371</width>
<height>331</height>
</rect>
</property>
</widget>
</widget>
</widget>
<widget class="QPushButton" name="getccpmCurrent">
<property name="geometry">
<rect>
<x>10</x>
<y>400</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Retrieve settings from OpenPilot</string>
</property>
<property name="text">
<string>Get Current</string>
</property>
</widget>
<widget class="QPushButton" name="saveccpmToRAM">
<property name="geometry">
<rect>
<x>370</x>
<y>400</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Send to OpenPilot but don't write in SD.</string>
</property>
<property name="text">
<string>Save to RAM</string>
</property>
</widget>
<widget class="QPushButton" name="saveccpmToSD">
<property name="geometry">
<rect>
<x>480</x>
<y>400</y>
<width>93</width>
<height>27</height>
</rect>
</property>
<property name="toolTip">
<string>Applies and Saves all settings to SD</string>
</property>
<property name="text">
<string>Save to SD</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -20,7 +20,8 @@ HEADERS += configplugin.h \
configahrswidget.h \
mixercurvewidget.h \
mixercurvepoint.h \
mixercurveline.h
mixercurveline.h \
configccpmwidget.h
SOURCES += configplugin.cpp \
configgadgetconfiguration.cpp \
configgadgetwidget.cpp \
@ -35,9 +36,11 @@ SOURCES += configplugin.cpp \
configahrswidget.cpp \
mixercurvewidget.cpp \
mixercurvepoint.cpp \
mixercurveline.cpp
mixercurveline.cpp \
configccpmwidget.cpp
FORMS += settingswidget.ui \
airframe.ui \
telemetry.ui \
ahrs.ui
ahrs.ui \
ccpm.ui
RESOURCES += configgadget.qrc

View File

@ -0,0 +1,433 @@
/**
******************************************************************************
*
* @file configccpmwidget.cpp
* @author E. Lafargue & The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup ConfigPlugin Config Plugin
* @{
* @brief ccpm configuration panel
*****************************************************************************/
/*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "configccpmwidget.h"
#include <QDebug>
#include <QStringList>
#include <QtGui/QWidget>
#include <QtGui/QTextEdit>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>
#include <math.h>
#define Pi 3.14159265358979323846
ConfigccpmWidget::ConfigccpmWidget(QWidget *parent) : ConfigTaskWidget(parent)
{
m_ccpm = new Ui_ccpmWidget();
m_ccpm->setupUi(this);
// Now connect the widget to the ManualControlCommand / Channel UAVObject
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
// Initialization of the swashplaye widget
m_ccpm->SwashplateImage->setScene(new QGraphicsScene(this));
QSvgRenderer *renderer = new QSvgRenderer();
renderer->load(QString(":/configgadget/images/ccpm_setup.svg"));
SwashplateImg = new QGraphicsSvgItem();
SwashplateImg->setSharedRenderer(renderer);
SwashplateImg->setElementId("Swashplate");
SwashplateImg->setObjectName("Swashplate");
m_ccpm->SwashplateImage->scene()->addItem(SwashplateImg);
m_ccpm->SwashplateImage->setSceneRect(SwashplateImg->boundingRect());
m_ccpm->SwashplateImage->scale(.75,.75);
ServoW = new QGraphicsSvgItem();
ServoW->setSharedRenderer(renderer);
ServoW->setElementId("ServoW");
m_ccpm->SwashplateImage->scene()->addItem(ServoW);
ServoX = new QGraphicsSvgItem();
ServoX->setSharedRenderer(renderer);
ServoX->setElementId("ServoX");
m_ccpm->SwashplateImage->scene()->addItem(ServoX);
ServoY = new QGraphicsSvgItem();
ServoY->setSharedRenderer(renderer);
ServoY->setElementId("ServoY");
m_ccpm->SwashplateImage->scene()->addItem(ServoY);
ServoZ = new QGraphicsSvgItem();
ServoZ->setSharedRenderer(renderer);
ServoZ->setElementId("ServoZ");
m_ccpm->SwashplateImage->scene()->addItem(ServoZ);
QStringList channels;
channels << "Channel0" << "Channel1" << "Channel2" <<
"Channel3" << "Channel4" << "Channel5" << "Channel6" << "Channel7" << "None" ;
m_ccpm->ccpmThrottle->addItems(channels);
m_ccpm->ccpmTailRotor->addItems(channels);
requestccpmUpdate();
UpdateCurveSettings();
ccpmSwashplateUpdate();
connect(m_ccpm->saveccpmToSD, SIGNAL(clicked()), this, SLOT(saveccpmUpdate()));
connect(m_ccpm->saveccpmToRAM, SIGNAL(clicked()), this, SLOT(sendccpmUpdate()));
connect(m_ccpm->getccpmCurrent, SIGNAL(clicked()), this, SLOT(requestccpmUpdate()));
connect(m_ccpm->ccpmGenerateCurve, SIGNAL(clicked()), this, SLOT(GenerateCurve()));
connect(m_ccpm->NumCurvePoints, SIGNAL(valueChanged(int)), this, SLOT(UpdateCurveSettings()));
connect(m_ccpm->CurveType, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCurveSettings()));
connect(m_ccpm->ServoSettings, SIGNAL(cellChanged(int,int)), this, SLOT(ccpmSwashplateUpdate()));
connect(parent, SIGNAL(autopilotConnected()),this, SLOT(requestccpmUpdate()));
}
ConfigccpmWidget::~ConfigccpmWidget()
{
// Do nothing
}
void ConfigccpmWidget::UpdateCurveSettings()
{
int NumCurvePoints,i;
double scale;
QString CurveType;
QStringList vertHeaders;
//get the user settings
NumCurvePoints=m_ccpm->NumCurvePoints->value();
CurveType=m_ccpm->CurveType->currentText();
vertHeaders << "-" << "-" << "-" << "-" << "-" << "-" << "-" << "-" << "-" << "-" ;
for (i=0;i<NumCurvePoints;i++)
{
scale =((double)i/(double)(NumCurvePoints-1));
vertHeaders[i] = tr( "%1%" ).arg(100.00*scale, 0, 'f', 1);
}
m_ccpm->CurveSettings->setVerticalHeaderLabels( vertHeaders );
if ( CurveType.compare("Flat")==0)
{
m_ccpm->CurveLabel1->setText("Value");
m_ccpm->CurveLabel1->setVisible(true);
m_ccpm->CurveValue1->setVisible(true);
m_ccpm->CurveLabel2->setVisible(false);
m_ccpm->CurveValue2->setVisible(false);
m_ccpm->CurveLabel3->setVisible(false);
m_ccpm->CurveValue3->setVisible(false);
m_ccpm->ccpmGenerateCurve->setVisible(true);
m_ccpm->CurveToGenerate->setVisible(true);
}
if ( CurveType.compare("Linear")==0)
{
m_ccpm->CurveLabel1->setText("Min");
m_ccpm->CurveLabel1->setVisible(true);
m_ccpm->CurveValue1->setVisible(true);
m_ccpm->CurveLabel2->setText("Max");
m_ccpm->CurveLabel2->setVisible(true);
m_ccpm->CurveValue2->setVisible(true);
m_ccpm->CurveLabel3->setVisible(false);
m_ccpm->CurveValue3->setVisible(false);
m_ccpm->ccpmGenerateCurve->setVisible(true);
m_ccpm->CurveToGenerate->setVisible(true);
}
if ( CurveType.compare("Step")==0)
{
m_ccpm->CurveLabel1->setText("Min");
m_ccpm->CurveLabel1->setVisible(true);
m_ccpm->CurveValue1->setVisible(true);
m_ccpm->CurveLabel2->setText("Max");
m_ccpm->CurveLabel2->setVisible(true);
m_ccpm->CurveValue2->setVisible(true);
m_ccpm->CurveLabel3->setText("Step at");
m_ccpm->CurveLabel3->setVisible(true);
m_ccpm->CurveValue3->setVisible(true);
m_ccpm->ccpmGenerateCurve->setVisible(true);
m_ccpm->CurveToGenerate->setVisible(true);
}
if ( CurveType.compare("Custom")==0)
{
m_ccpm->CurveLabel1->setVisible(false);
m_ccpm->CurveValue1->setVisible(false);
m_ccpm->CurveLabel2->setVisible(false);
m_ccpm->CurveValue2->setVisible(false);
m_ccpm->CurveLabel3->setVisible(false);
m_ccpm->CurveValue3->setVisible(false);
m_ccpm->ccpmGenerateCurve->setVisible(false);
m_ccpm->CurveToGenerate->setVisible(false);
}
}
void ConfigccpmWidget::GenerateCurve()
{
int NumCurvePoints,CurveToGenerate,i;
double value1, value2, value3, scale;
QString CurveType;
QTableWidgetItem *item;
//get the user settings
NumCurvePoints=m_ccpm->NumCurvePoints->value();
value1=m_ccpm->CurveValue1->value();
value2=m_ccpm->CurveValue2->value();
value3=m_ccpm->CurveValue3->value();
CurveToGenerate=m_ccpm->CurveToGenerate->currentIndex();
CurveType=m_ccpm->CurveType->currentText();
for (i=0;i<NumCurvePoints;i++)
{
scale =((double)i/(double)(NumCurvePoints-1));
item =m_ccpm->CurveSettings->item(i, CurveToGenerate );
if ( CurveType.compare("Flat")==0)
{
item->setText( tr( "%1" ).arg( value1 ) );
}
if ( CurveType.compare("Linear")==0)
{
item->setText( tr( "%1" ).arg(value1 +(scale*(value2-value1))) );
}
if ( CurveType.compare("Step")==0)
{
if (scale*100<value3)
{
item->setText( tr( "%1" ).arg(value1) );
}
else
{
item->setText( tr( "%1" ).arg(value2) );
}
}
}
for (i=NumCurvePoints;i<10;i++)
{
item =m_ccpm->CurveSettings->item(i, CurveToGenerate );
item->setText( tr( "" ) );
}
}
void ConfigccpmWidget::ccpmSwashplateUpdate()
{
double angle,x,y;
int used;
used=m_ccpm->ServoSettings->item(0,1)->text().compare("None");
ServoW->setVisible(used!=0);
angle=(180+m_ccpm->ServoSettings->item(0,0)->text().toDouble())*Pi/180.00;
x=200.00-(200.00*sin(angle))-10.00;
y=200.00+(200.00*cos(angle))-10.00;
ServoW->setPos(x, y);
used=m_ccpm->ServoSettings->item(1,1)->text().compare("None");
ServoX->setVisible(used!=0);
angle=(180+m_ccpm->ServoSettings->item(1,0)->text().toDouble())*Pi/180.00;
x=200.00-(200.00*sin(angle))-10.00;
y=200.00+(200.00*cos(angle))-10.00;
ServoX->setPos(x, y);
used=m_ccpm->ServoSettings->item(2,1)->text().compare("None");
ServoY->setVisible(used!=0);
angle=(180+m_ccpm->ServoSettings->item(2,0)->text().toDouble())*Pi/180.00;
x=200.00-(200.00*sin(angle))-10.00;
y=200.00+(200.00*cos(angle))-10.00;
ServoY->setPos(x, y);
used=m_ccpm->ServoSettings->item(3,1)->text().compare("None");
ServoZ->setVisible(used!=0);
angle=(180+m_ccpm->ServoSettings->item(3,0)->text().toDouble())*Pi/180.00;
x=200.00-(200.00*sin(angle))-10.00;
y=200.00+(200.00*cos(angle))-10.00;
ServoZ->setPos(x, y);
}
/**************************
* ccpm settings
**************************/
/**
Request the current value of the SystemSettings which holds the ccpm type
*/
void ConfigccpmWidget::requestccpmUpdate()
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
int i;
UAVObjectField *field;
QTableWidgetItem *newItem;// = new QTableWidgetItem();
//not doing anything yet
ccpmSwashplateUpdate();
}
/**
Sends the config to the board (ccpm type)
*/
void ConfigccpmWidget::sendccpmUpdate()
{
int i,ThisChannel[6];
float CollectiveConstant,ThisAngle[6];
UAVObjectField *field;
QTableWidgetItem *newItem;// = new QTableWidgetItem();
UAVDataObject* obj;
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("MixerSettings")));
Q_ASSERT(obj);
CollectiveConstant=m_ccpm->CollectiveConstant->value();
//get the channel data from the ui
ThisChannel[0] = m_ccpm->ccpmThrottle->currentText().toInt();
ThisChannel[1] = m_ccpm->ccpmTailRotor->currentText().toInt();
newItem =m_ccpm->ServoSettings->item(0, 1);
ThisChannel[2] = newItem->text().toInt();
newItem =m_ccpm->ServoSettings->item(1, 1);
ThisChannel[3] = newItem->text().toInt();
newItem =m_ccpm->ServoSettings->item(2, 1);
ThisChannel[4] = newItem->text().toInt();
newItem =m_ccpm->ServoSettings->item(3, 1);
ThisChannel[5] = newItem->text().toInt();
//get the angle data from the ui
newItem =m_ccpm->ServoSettings->item(0, 0);
ThisAngle[2] = newItem->text().toFloat();
newItem =m_ccpm->ServoSettings->item(1, 0);
ThisAngle[3] = newItem->text().toFloat();
newItem =m_ccpm->ServoSettings->item(2, 0);
ThisAngle[4] = newItem->text().toFloat();
newItem =m_ccpm->ServoSettings->item(3, 0);
ThisAngle[5] = newItem->text().toFloat();
//go through the user data and update the mixer matrix
for (i=0;i<6;i++)
{
/*
data.Mixer0Type = 0;//Disabled,Motor,Servo
data.Mixer0Vector[0] = 0;//ThrottleCurve1
data.Mixer0Vector[1] = 0;//ThrottleCurve2
data.Mixer0Vector[2] = 0;//Roll
data.Mixer0Vector[3] = 0;//Pitch
data.Mixer0Vector[4] = 0;//Yaw
*/
if (ThisChannel[i]<8)
{
//select the correct mixer for this config element
field = obj->getField(tr( "Mixer%1Type" ).arg( ThisChannel[i] ));
//set the mixer type
if (i==0)
{
field->setValue("Motor");
}
else
{
field->setValue("Servo");
}
//select the correct mixer for this config element
field = obj->getField(tr( "Mixer%1Vector" ).arg( ThisChannel[i] ));
//config the vector
if (i==0)
{//motor
field->setValue(127.0,0);//ThrottleCurve1
field->setValue(0,1);//ThrottleCurve2
field->setValue(0,2);//Roll
field->setValue(0,3);//Pitch
field->setValue(0,4);//Yaw
}
if (i==1)
{//tailrotor
field->setValue(0,0);//ThrottleCurve1
field->setValue(0,1);//ThrottleCurve2
field->setValue(0,2);//Roll
field->setValue(0,3);//Pitch
field->setValue(127.0,4);//Yaw
}
if (i>1)
{//Swashplate
field->setValue(0,0);//ThrottleCurve1
field->setValue(127.0*CollectiveConstant,1);//ThrottleCurve2
field->setValue(127.0*(1-CollectiveConstant)*sin(ThisAngle[i]*Pi/180.00),2);//Roll
field->setValue(127.0*(1-CollectiveConstant)*cos(ThisAngle[i]*Pi/180.00),3);//Pitch
field->setValue(0,4);//Yaw
}
}
}
//get the user data for the curve into the mixer settings
field = obj->getField(QString("ThrottleCurve1"));
for (i=0;i<5;i++)
{
newItem =m_ccpm->CurveSettings->item(i, 0);
field->setValue(newItem->text().toDouble(),i);
}
field = obj->getField(QString("ThrottleCurve2"));
for (i=0;i<5;i++)
{
newItem =m_ccpm->CurveSettings->item(i, 1);
field->setValue(newItem->text().toDouble(),i);
}
obj->updated();
}
/**
Send ccpm type to the board and request saving to SD card
*/
void ConfigccpmWidget::saveccpmUpdate()
{
// Send update so that the latest value is saved
sendccpmUpdate();
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("MixerSettings")));
Q_ASSERT(obj);
updateObjectPersistance(ObjectPersistence::OPERATION_SAVE, obj);
}

View File

@ -0,0 +1,69 @@
/**
******************************************************************************
*
* @file configccpmtwidget.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup ConfigPlugin Config Plugin
* @{
* @brief ccpm configuration panel
*****************************************************************************/
/*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef CONFIGccpmWIDGET_H
#define CONFIGccpmWIDGET_H
#include "ui_ccpm.h"
#include "configtaskwidget.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjects/uavobjectmanager.h"
#include "uavobjects/uavobject.h"
#include <QtSvg/QSvgRenderer>
#include <QtSvg/QGraphicsSvgItem>
#include <QtGui/QWidget>
#include <QList>
class Ui_Widget;
class ConfigccpmWidget: public ConfigTaskWidget
{
Q_OBJECT
public:
ConfigccpmWidget(QWidget *parent = 0);
~ConfigccpmWidget();
private:
Ui_ccpmWidget *m_ccpm;
QGraphicsSvgItem *SwashplateImg;
QGraphicsSvgItem *CurveImg;
QGraphicsSvgItem *ServoW;
QGraphicsSvgItem *ServoX;
QGraphicsSvgItem *ServoY;
QGraphicsSvgItem *ServoZ;
private slots:
void requestccpmUpdate();
void sendccpmUpdate();
void saveccpmUpdate();
void ccpmSwashplateUpdate();
void UpdateCurveSettings();
void GenerateCurve();
};
#endif // CONFIGccpmWIDGET_H