1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-01 09:24:10 +01:00

OP-38 Output settings now done, to be validated on real HW and tested by more users. "Test" checkboxes not active yet.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1233 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
edouard 2010-08-07 22:32:57 +00:00 committed by edouard
parent 14a93b4e61
commit 732b65cdaa
4 changed files with 827 additions and 88 deletions

View File

@ -41,6 +41,6 @@ ConfigGadget::~ConfigGadget()
void ConfigGadget::loadConfiguration(IUAVGadgetConfiguration* config)
{
Q_UNUSED(config);
}

View File

@ -27,7 +27,7 @@
#include "configgadgetwidget.h"
#include "ui_settingswidget.h"
#include <QDebug>
#include <QStringList>
#include <QtGui/QWidget>
#include <QtGui/QTextEdit>
@ -99,12 +99,38 @@ ConfigGadgetWidget::ConfigGadgetWidget(QWidget *parent) : QWidget(parent)
}
}
connect(m_config->ch0OutMin, SIGNAL(editingFinished()), this, SLOT(setch0OutRange()));
connect(m_config->ch1OutMin, SIGNAL(editingFinished()), this, SLOT(setch1OutRange()));
connect(m_config->ch2OutMin, SIGNAL(editingFinished()), this, SLOT(setch2OutRange()));
connect(m_config->ch3OutMin, SIGNAL(editingFinished()), this, SLOT(setch3OutRange()));
connect(m_config->ch4OutMin, SIGNAL(editingFinished()), this, SLOT(setch4OutRange()));
connect(m_config->ch5OutMin, SIGNAL(editingFinished()), this, SLOT(setch5OutRange()));
connect(m_config->ch6OutMin, SIGNAL(editingFinished()), this, SLOT(setch6OutRange()));
connect(m_config->ch7OutMin, SIGNAL(editingFinished()), this, SLOT(setch7OutRange()));
connect(m_config->ch0OutMax, SIGNAL(editingFinished()), this, SLOT(setch0OutRange()));
connect(m_config->ch1OutMax, SIGNAL(editingFinished()), this, SLOT(setch1OutRange()));
connect(m_config->ch2OutMax, SIGNAL(editingFinished()), this, SLOT(setch2OutRange()));
connect(m_config->ch3OutMax, SIGNAL(editingFinished()), this, SLOT(setch3OutRange()));
connect(m_config->ch4OutMax, SIGNAL(editingFinished()), this, SLOT(setch4OutRange()));
connect(m_config->ch5OutMax, SIGNAL(editingFinished()), this, SLOT(setch5OutRange()));
connect(m_config->ch6OutMax, SIGNAL(editingFinished()), this, SLOT(setch6OutRange()));
connect(m_config->ch7OutMax, SIGNAL(editingFinished()), this, SLOT(setch7OutRange()));
requestRCInputUpdate();
requestRCOutputUpdate();
connect(m_config->saveRCInputToSD, SIGNAL(clicked()), this, SLOT(saveRCInputObject()));
connect(m_config->saveRCInputToRAM, SIGNAL(clicked()), this, SLOT(sendRCInputUpdate()));
connect(m_config->getRCInputCurrent, SIGNAL(clicked()), this, SLOT(requestRCInputUpdate()));
connect(m_config->saveRCOutputToSD, SIGNAL(clicked()), this, SLOT(saveRCOutputObject()));
connect(m_config->saveRCOutputToRAM, SIGNAL(clicked()), this, SLOT(sendRCOutputUpdate()));
connect(m_config->getRCOutputCurrent, SIGNAL(clicked()), this, SLOT(requestRCOutputUpdate()));
firstUpdate = true;
}
@ -120,10 +146,280 @@ void ConfigGadgetWidget::resizeEvent(QResizeEvent *event)
QWidget::resizeEvent(event);
}
/********************************
* Output settings
*******************************/
/**
Request the current config from the board (RC Output)
*/
void ConfigGadgetWidget::requestRCOutputUpdate()
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
// Get the Airframe type from the system settings:
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("SystemSettings")));
Q_ASSERT(obj);
obj->requestUpdate();
UAVObjectField *field = obj->getField(QString("AirframeType"));
m_config->aircraftType->setCurrentIndex(m_config->aircraftType->findText(field->getValue().toString()));
// Reset all channel assignements:
m_config->ch0Output->setCurrentIndex(0);
m_config->ch1Output->setCurrentIndex(0);
m_config->ch2Output->setCurrentIndex(0);
m_config->ch3Output->setCurrentIndex(0);
m_config->ch4Output->setCurrentIndex(0);
m_config->ch5Output->setCurrentIndex(0);
m_config->ch6Output->setCurrentIndex(0);
m_config->ch7Output->setCurrentIndex(0);
// Get the channel assignements:
obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("ActuatorSettings")));
Q_ASSERT(obj);
obj->requestUpdate();
QList<UAVObjectField*> fieldList = obj->getFields();
foreach (UAVObjectField* field, fieldList) {
if (!field->getName().contains("Channel")) {
assignOutputChannel(obj,field,field->getName());
}
}
// Get Output rates for both banks
field = obj->getField(QString("ChannelUpdateFreq"));
m_config->outputRate1->setValue(field->getValue(0).toInt());
m_config->outputRate2->setValue(field->getValue(1).toInt());
// Get Channel ranges:
field = obj->getField(QString("ChannelMin"));
m_config->ch0OutMin->setValue(field->getValue(0).toInt());
m_config->ch0OutSlider->setMinimum(field->getValue(0).toInt());
m_config->ch1OutMin->setValue(field->getValue(1).toInt());
m_config->ch1OutSlider->setMinimum(field->getValue(1).toInt());
m_config->ch2OutMin->setValue(field->getValue(2).toInt());
m_config->ch2OutSlider->setMinimum(field->getValue(2).toInt());
m_config->ch3OutMin->setValue(field->getValue(3).toInt());
m_config->ch3OutSlider->setMinimum(field->getValue(3).toInt());
m_config->ch4OutMin->setValue(field->getValue(4).toInt());
m_config->ch4OutSlider->setMinimum(field->getValue(4).toInt());
m_config->ch5OutMin->setValue(field->getValue(5).toInt());
m_config->ch5OutSlider->setMinimum(field->getValue(5).toInt());
m_config->ch6OutMin->setValue(field->getValue(6).toInt());
m_config->ch6OutSlider->setMinimum(field->getValue(6).toInt());
m_config->ch7OutMin->setValue(field->getValue(7).toInt());
m_config->ch7OutSlider->setMinimum(field->getValue(7).toInt());
field = obj->getField(QString("ChannelMax"));
m_config->ch0OutMax->setValue(field->getValue(0).toInt());
m_config->ch0OutSlider->setMaximum(field->getValue(0).toInt());
m_config->ch1OutMax->setValue(field->getValue(1).toInt());
m_config->ch1OutSlider->setMaximum(field->getValue(1).toInt());
m_config->ch2OutMax->setValue(field->getValue(2).toInt());
m_config->ch2OutSlider->setMaximum(field->getValue(2).toInt());
m_config->ch3OutMax->setValue(field->getValue(3).toInt());
m_config->ch3OutSlider->setMaximum(field->getValue(3).toInt());
m_config->ch4OutMax->setValue(field->getValue(4).toInt());
m_config->ch4OutSlider->setMaximum(field->getValue(4).toInt());
m_config->ch5OutMax->setValue(field->getValue(5).toInt());
m_config->ch5OutSlider->setMaximum(field->getValue(5).toInt());
m_config->ch6OutMax->setValue(field->getValue(6).toInt());
m_config->ch6OutSlider->setMaximum(field->getValue(6).toInt());
m_config->ch7OutMax->setValue(field->getValue(7).toInt());
m_config->ch7OutSlider->setMaximum(field->getValue(7).toInt());
field = obj->getField(QString("ChannelNeutral"));
m_config->ch0OutSlider->setValue(field->getValue(0).toInt());
m_config->ch1OutSlider->setValue(field->getValue(1).toInt());
m_config->ch2OutSlider->setValue(field->getValue(2).toInt());
m_config->ch3OutSlider->setValue(field->getValue(3).toInt());
m_config->ch4OutSlider->setValue(field->getValue(4).toInt());
m_config->ch5OutSlider->setValue(field->getValue(5).toInt());
m_config->ch6OutSlider->setValue(field->getValue(6).toInt());
m_config->ch7OutSlider->setValue(field->getValue(7).toInt());
}
/**
* Sends the config to the board, without saving to the SD card (RC Output)
*/
void ConfigGadgetWidget::sendRCOutputUpdate()
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("ActuatorSettings")));
Q_ASSERT(obj);
// Now send channel ranges:
UAVObjectField * field = obj->getField(QString("ChannelMax"));
field->setValue(m_config->ch0OutMax->value(),0);
field->setValue(m_config->ch1OutMax->value(),1);
field->setValue(m_config->ch2OutMax->value(),2);
field->setValue(m_config->ch3OutMax->value(),3);
field->setValue(m_config->ch4OutMax->value(),4);
field->setValue(m_config->ch5OutMax->value(),5);
field->setValue(m_config->ch6OutMax->value(),6);
field->setValue(m_config->ch7OutMax->value(),7);
field = obj->getField(QString("ChannelMin"));
field->setValue(m_config->ch0OutMin->value(),0);
field->setValue(m_config->ch1OutMin->value(),1);
field->setValue(m_config->ch2OutMin->value(),2);
field->setValue(m_config->ch3OutMin->value(),3);
field->setValue(m_config->ch4OutMin->value(),4);
field->setValue(m_config->ch5OutMin->value(),5);
field->setValue(m_config->ch6OutMin->value(),6);
field->setValue(m_config->ch7OutMin->value(),7);
field = obj->getField(QString("ChannelNeutral"));
field->setValue(m_config->ch0OutSlider->value(),0);
field->setValue(m_config->ch1OutSlider->value(),1);
field->setValue(m_config->ch2OutSlider->value(),2);
field->setValue(m_config->ch3OutSlider->value(),3);
field->setValue(m_config->ch4OutSlider->value(),4);
field->setValue(m_config->ch5OutSlider->value(),5);
field->setValue(m_config->ch6OutSlider->value(),6);
field->setValue(m_config->ch7OutSlider->value(),7);
field = obj->getField(QString("ChannelUpdateFreq"));
field->setValue(m_config->outputRate1->value(),0);
field->setValue(m_config->outputRate2->value(),1);
// Set Actuator assignement for each channel:
// Rule: if two channels have the same setting (which is wrong!) the higher channel
// will get the setting.
// First, reset all channel assignements:
QList<UAVObjectField*> fieldList = obj->getFields();
foreach (UAVObjectField* field, fieldList) {
// NOTE: we assume that all options in ActuatorSettings are a channel assignement
// except for the options called "ChannelXXX"
if (!field->getName().contains("Channel")) {
field->setValue(field->getOptions().last());
}
}
if (m_config->ch0Output->currentIndex() != 0) {
field = obj->getField(m_config->ch0Output->currentText());
field->setValue(field->getOptions().at(0)); // -> This way we don't depend on channel naming convention
}
if (m_config->ch1Output->currentIndex() != 0) {
field = obj->getField(m_config->ch1Output->currentText());
field->setValue(field->getOptions().at(1)); // -> This way we don't depend on channel naming convention
}
if (m_config->ch2Output->currentIndex() != 0) {
field = obj->getField(m_config->ch2Output->currentText());
field->setValue(field->getOptions().at(2)); // -> This way we don't depend on channel naming convention
}
if (m_config->ch3Output->currentIndex() != 0) {
field = obj->getField(m_config->ch3Output->currentText());
field->setValue(field->getOptions().at(3)); // -> This way we don't depend on channel naming convention
}
if (m_config->ch4Output->currentIndex() != 0) {
field = obj->getField(m_config->ch4Output->currentText());
field->setValue(field->getOptions().at(4)); // -> This way we don't depend on channel naming convention
}
if (m_config->ch5Output->currentIndex() != 0) {
field = obj->getField(m_config->ch5Output->currentText());
field->setValue(field->getOptions().at(5)); // -> This way we don't depend on channel naming convention
}
if (m_config->ch6Output->currentIndex() != 0) {
field = obj->getField(m_config->ch6Output->currentText());
field->setValue(field->getOptions().at(6)); // -> This way we don't depend on channel naming convention
}
if (m_config->ch7Output->currentIndex() != 0) {
field = obj->getField(m_config->ch7Output->currentText());
field->setValue(field->getOptions().at(7)); // -> This way we don't depend on channel naming convention
}
// ... and send to the OP Board
obj->updated();
obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("SystemSettings")));
Q_ASSERT(obj);
field = obj->getField(QString("AirframeType"));
field->setValue(m_config->aircraftType->currentText());
// ... and send to the OP Board
obj->updated();
}
/**
Sends the config to the board and request saving into the SD card (RC Output)
*/
void ConfigGadgetWidget::saveRCOutputObject()
{
// Send update so that the latest value is saved
sendRCOutputUpdate();
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("ActuatorSettings")));
Q_ASSERT(obj);
updateObjectPersistance(ObjectPersistence::OPERATION_SAVE, obj);
obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("SystemSettings")));
Q_ASSERT(obj);
updateObjectPersistance(ObjectPersistence::OPERATION_SAVE, obj);
}
/**
Sets the minimum/maximem value of the channel 0 output slider.
Have to do it here because setMinimum is not a slot
*/
void ConfigGadgetWidget::setch0OutRange()
{
m_config->ch0OutSlider->setRange(m_config->ch0OutMin->value(),
m_config->ch0OutMax->value());
}
void ConfigGadgetWidget::setch1OutRange()
{
m_config->ch1OutSlider->setRange(m_config->ch1OutMin->value(),
m_config->ch1OutMax->value());
}
void ConfigGadgetWidget::setch2OutRange()
{
m_config->ch2OutSlider->setRange(m_config->ch2OutMin->value(),
m_config->ch2OutMax->value());
}
void ConfigGadgetWidget::setch3OutRange()
{
m_config->ch3OutSlider->setRange(m_config->ch3OutMin->value(),
m_config->ch3OutMax->value());
}
void ConfigGadgetWidget::setch4OutRange()
{
m_config->ch4OutSlider->setRange(m_config->ch4OutMin->value(),
m_config->ch4OutMax->value());
}
void ConfigGadgetWidget::setch5OutRange()
{
m_config->ch5OutSlider->setRange(m_config->ch5OutMin->value(),
m_config->ch5OutMax->value());
}
void ConfigGadgetWidget::setch6OutRange()
{
m_config->ch6OutSlider->setRange(m_config->ch6OutMin->value(),
m_config->ch6OutMax->value());
}
void ConfigGadgetWidget::setch7OutRange()
{
m_config->ch7OutSlider->setRange(m_config->ch7OutMin->value(),
m_config->ch7OutMax->value());
}
/********************************
* Input settings
*******************************/
/**
@ -263,6 +559,16 @@ void ConfigGadgetWidget::sendRCInputUpdate()
// Set Roll/Pitch/Yaw/Etc assignement:
// Rule: if two channels have the same setting (which is wrong!) the higher channel
// will get the setting.
// First, reset all channel assignements:
QStringList channelsList;
channelsList << "Roll" << "Pitch" << "Yaw" << "Throttle" << "FlightMode";
foreach (QString channel, channelsList) {
field = obj->getField(channel);
field->setValue(field->getOptions().last());
}
// Then assign according to current GUI state:
if (m_config->ch0Assign->currentIndex() != 0) {
field = obj->getField(m_config->ch0Assign->currentText());
field->setValue(field->getOptions().at(0)); // -> This way we don't depend on channel naming convention
@ -336,7 +642,7 @@ void ConfigGadgetWidget::updateObjectPersistance(ObjectPersistence::OperationOpt
/**
* Set the dropdown option for a channel assignement
* Set the dropdown option for a channel Input assignement
*/
void ConfigGadgetWidget::assignChannel(UAVDataObject *obj, UAVObjectField *field, QString str)
{
@ -370,6 +676,42 @@ void ConfigGadgetWidget::assignChannel(UAVDataObject *obj, UAVObjectField *field
}
}
/**
* Set the dropdown option for a channel output assignement
*/
void ConfigGadgetWidget::assignOutputChannel(UAVDataObject *obj, UAVObjectField *field, QString str)
{
field = obj->getField(str);
QStringList options = field->getOptions();
switch (options.indexOf(field->getValue().toString())) {
case 0:
m_config->ch0Output->setCurrentIndex(m_config->ch0Output->findText(str));
break;
case 1:
m_config->ch1Output->setCurrentIndex(m_config->ch1Output->findText(str));
break;
case 2:
m_config->ch2Output->setCurrentIndex(m_config->ch2Output->findText(str));
break;
case 3:
m_config->ch3Output->setCurrentIndex(m_config->ch3Output->findText(str));
break;
case 4:
m_config->ch4Output->setCurrentIndex(m_config->ch4Output->findText(str));
break;
case 5:
m_config->ch5Output->setCurrentIndex(m_config->ch5Output->findText(str));
break;
case 6:
m_config->ch6Output->setCurrentIndex(m_config->ch6Output->findText(str));
break;
case 7:
m_config->ch7Output->setCurrentIndex(m_config->ch7Output->findText(str));
break;
}
}
/**
* Updates the slider positions and min/max values

View File

@ -54,6 +54,7 @@ private:
void updateChannelSlider(QSlider* slider, QLabel* min, QLabel* Max, QCheckBox* rev, int value);
void updateObjectPersistance(ObjectPersistence::OperationOptions op, UAVObject *obj);
void assignChannel(UAVDataObject *obj, UAVObjectField *field, QString str);
void assignOutputChannel(UAVDataObject *obj, UAVObjectField *field, QString str);
bool firstUpdate;
@ -62,7 +63,18 @@ private:
void requestRCInputUpdate();
void sendRCInputUpdate();
void saveRCInputObject();
void requestRCOutputUpdate();
void sendRCOutputUpdate();
void saveRCOutputObject();
void setch0OutRange();
void setch1OutRange();
void setch2OutRange();
void setch3OutRange();
void setch4OutRange();
void setch5OutRange();
void setch6OutRange();
void setch7OutRange();
};

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>617</width>
<height>349</height>
<width>664</width>
<height>409</height>
</rect>
</property>
<property name="windowTitle">
@ -18,12 +18,12 @@
<rect>
<x>10</x>
<y>10</y>
<width>601</width>
<height>331</height>
<width>641</width>
<height>381</height>
</rect>
</property>
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
@ -250,8 +250,8 @@ p, li { white-space: pre-wrap; }
<widget class="QPushButton" name="getRCInputCurrent">
<property name="geometry">
<rect>
<x>270</x>
<y>240</y>
<x>310</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
@ -413,8 +413,8 @@ p, li { white-space: pre-wrap; }
<widget class="QPushButton" name="saveRCInputToSD">
<property name="geometry">
<rect>
<x>490</x>
<y>240</y>
<x>530</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
@ -487,8 +487,8 @@ Applies and Saves all settings to SD</string>
<widget class="QPushButton" name="saveRCInputToRAM">
<property name="geometry">
<rect>
<x>380</x>
<y>240</y>
<x>420</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
@ -1124,7 +1124,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>10</y>
<y>20</y>
<width>121</width>
<height>21</height>
</rect>
@ -1142,7 +1142,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<y>20</y>
<width>91</width>
<height>17</height>
</rect>
@ -1155,7 +1155,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<y>70</y>
<width>71</width>
<height>17</height>
</rect>
@ -1168,7 +1168,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<y>100</y>
<width>71</width>
<height>17</height>
</rect>
@ -1181,7 +1181,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<y>130</y>
<width>71</width>
<height>17</height>
</rect>
@ -1194,7 +1194,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>140</y>
<y>160</y>
<width>71</width>
<height>17</height>
</rect>
@ -1207,20 +1207,20 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>170</y>
<y>190</y>
<width>71</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Channe l4</string>
<string>Channel 4</string>
</property>
</widget>
<widget class="QLabel" name="actuator5Label">
<property name="geometry">
<rect>
<x>10</x>
<y>200</y>
<y>220</y>
<width>71</width>
<height>17</height>
</rect>
@ -1236,11 +1236,14 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>300</x>
<y>50</y>
<y>70</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1252,7 +1255,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>50</y>
<y>70</y>
<width>121</width>
<height>21</height>
</rect>
@ -1270,7 +1273,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>240</x>
<y>50</y>
<y>70</y>
<width>55</width>
<height>21</height>
</rect>
@ -1280,6 +1283,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch0OutMax">
<property name="enabled">
@ -1288,7 +1294,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>50</y>
<y>70</y>
<width>55</width>
<height>21</height>
</rect>
@ -1298,6 +1304,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QCheckBox" name="ch0OutTest">
<property name="enabled">
@ -1305,8 +1314,8 @@ Uncheck/Check to restart calibration.</string>
</property>
<property name="geometry">
<rect>
<x>530</x>
<y>50</y>
<x>580</x>
<y>70</y>
<width>61</width>
<height>22</height>
</rect>
@ -1319,7 +1328,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>230</y>
<y>250</y>
<width>71</width>
<height>17</height>
</rect>
@ -1332,7 +1341,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>10</x>
<y>260</y>
<y>280</y>
<width>71</width>
<height>17</height>
</rect>
@ -1348,7 +1357,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>80</y>
<y>100</y>
<width>121</width>
<height>21</height>
</rect>
@ -1366,7 +1375,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>80</y>
<y>100</y>
<width>55</width>
<height>21</height>
</rect>
@ -1376,6 +1385,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch1OutMin">
<property name="enabled">
@ -1384,7 +1396,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>240</x>
<y>80</y>
<y>100</y>
<width>55</width>
<height>21</height>
</rect>
@ -1394,6 +1406,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSlider" name="ch1OutSlider">
<property name="enabled">
@ -1402,11 +1417,14 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>300</x>
<y>80</y>
<y>100</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1417,8 +1435,8 @@ Uncheck/Check to restart calibration.</string>
</property>
<property name="geometry">
<rect>
<x>530</x>
<y>80</y>
<x>580</x>
<y>100</y>
<width>61</width>
<height>22</height>
</rect>
@ -1434,7 +1452,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>110</y>
<y>130</y>
<width>121</width>
<height>21</height>
</rect>
@ -1452,7 +1470,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>110</y>
<y>130</y>
<width>55</width>
<height>21</height>
</rect>
@ -1462,6 +1480,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch2OutMin">
<property name="enabled">
@ -1470,7 +1491,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>240</x>
<y>110</y>
<y>130</y>
<width>55</width>
<height>21</height>
</rect>
@ -1480,6 +1501,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSlider" name="ch2OutSlider">
<property name="enabled">
@ -1488,11 +1512,14 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>300</x>
<y>110</y>
<y>130</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1503,8 +1530,8 @@ Uncheck/Check to restart calibration.</string>
</property>
<property name="geometry">
<rect>
<x>530</x>
<y>110</y>
<x>580</x>
<y>130</y>
<width>61</width>
<height>22</height>
</rect>
@ -1520,7 +1547,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>140</y>
<y>160</y>
<width>121</width>
<height>21</height>
</rect>
@ -1538,7 +1565,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>140</y>
<y>160</y>
<width>55</width>
<height>21</height>
</rect>
@ -1548,6 +1575,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch3OutMin">
<property name="enabled">
@ -1556,7 +1586,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>240</x>
<y>140</y>
<y>160</y>
<width>55</width>
<height>21</height>
</rect>
@ -1566,6 +1596,9 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSlider" name="ch3OutSlider">
<property name="enabled">
@ -1574,11 +1607,14 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>300</x>
<y>140</y>
<y>160</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1589,8 +1625,8 @@ Uncheck/Check to restart calibration.</string>
</property>
<property name="geometry">
<rect>
<x>530</x>
<y>140</y>
<x>580</x>
<y>160</y>
<width>61</width>
<height>22</height>
</rect>
@ -1603,7 +1639,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>170</y>
<y>190</y>
<width>121</width>
<height>21</height>
</rect>
@ -1618,7 +1654,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>170</y>
<y>190</y>
<width>55</width>
<height>21</height>
</rect>
@ -1628,12 +1664,15 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch4OutMin">
<property name="geometry">
<rect>
<x>240</x>
<y>170</y>
<y>190</y>
<width>55</width>
<height>21</height>
</rect>
@ -1643,16 +1682,22 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSlider" name="ch4OutSlider">
<property name="geometry">
<rect>
<x>300</x>
<y>170</y>
<y>190</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1660,8 +1705,8 @@ Uncheck/Check to restart calibration.</string>
<widget class="QCheckBox" name="ch4OutTest">
<property name="geometry">
<rect>
<x>530</x>
<y>170</y>
<x>580</x>
<y>190</y>
<width>61</width>
<height>22</height>
</rect>
@ -1674,7 +1719,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>200</y>
<y>220</y>
<width>121</width>
<height>21</height>
</rect>
@ -1689,7 +1734,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>200</y>
<y>220</y>
<width>55</width>
<height>21</height>
</rect>
@ -1699,12 +1744,15 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch5OutMin">
<property name="geometry">
<rect>
<x>240</x>
<y>200</y>
<y>220</y>
<width>55</width>
<height>21</height>
</rect>
@ -1714,16 +1762,22 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSlider" name="ch5OutSlider">
<property name="geometry">
<rect>
<x>300</x>
<y>200</y>
<y>220</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1731,8 +1785,8 @@ Uncheck/Check to restart calibration.</string>
<widget class="QCheckBox" name="ch5OutTest">
<property name="geometry">
<rect>
<x>530</x>
<y>200</y>
<x>580</x>
<y>220</y>
<width>61</width>
<height>22</height>
</rect>
@ -1745,7 +1799,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>230</y>
<y>250</y>
<width>121</width>
<height>21</height>
</rect>
@ -1760,7 +1814,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>230</y>
<y>250</y>
<width>55</width>
<height>21</height>
</rect>
@ -1770,12 +1824,15 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch6OutMin">
<property name="geometry">
<rect>
<x>240</x>
<y>230</y>
<y>250</y>
<width>55</width>
<height>21</height>
</rect>
@ -1785,16 +1842,22 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSlider" name="ch6OutSlider">
<property name="geometry">
<rect>
<x>300</x>
<y>230</y>
<y>250</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1802,8 +1865,8 @@ Uncheck/Check to restart calibration.</string>
<widget class="QCheckBox" name="ch6OutTest">
<property name="geometry">
<rect>
<x>530</x>
<y>230</y>
<x>580</x>
<y>250</y>
<width>61</width>
<height>22</height>
</rect>
@ -1816,7 +1879,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>100</x>
<y>260</y>
<y>280</y>
<width>121</width>
<height>21</height>
</rect>
@ -1831,7 +1894,7 @@ Uncheck/Check to restart calibration.</string>
<property name="geometry">
<rect>
<x>460</x>
<y>260</y>
<y>280</y>
<width>55</width>
<height>21</height>
</rect>
@ -1841,12 +1904,15 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSpinBox" name="ch7OutMin">
<property name="geometry">
<rect>
<x>240</x>
<y>260</y>
<y>280</y>
<width>55</width>
<height>21</height>
</rect>
@ -1856,16 +1922,22 @@ Uncheck/Check to restart calibration.</string>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QSlider" name="ch7OutSLider">
<widget class="QSlider" name="ch7OutSlider">
<property name="geometry">
<rect>
<x>300</x>
<y>260</y>
<y>280</y>
<width>160</width>
<height>18</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -1873,8 +1945,8 @@ Uncheck/Check to restart calibration.</string>
<widget class="QCheckBox" name="ch7OutTest">
<property name="geometry">
<rect>
<x>530</x>
<y>260</y>
<x>580</x>
<y>280</y>
<width>61</width>
<height>22</height>
</rect>
@ -1886,8 +1958,8 @@ Uncheck/Check to restart calibration.</string>
<widget class="QPushButton" name="saveRCOutputToSD">
<property name="geometry">
<rect>
<x>490</x>
<y>10</y>
<x>530</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
@ -1903,8 +1975,8 @@ Applies and Saves all settings to SD</string>
<widget class="QPushButton" name="getRCOutputCurrent">
<property name="geometry">
<rect>
<x>270</x>
<y>10</y>
<x>310</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
@ -1919,8 +1991,8 @@ Applies and Saves all settings to SD</string>
<widget class="QPushButton" name="saveRCOutputToRAM">
<property name="geometry">
<rect>
<x>380</x>
<y>10</y>
<x>420</x>
<y>310</y>
<width>93</width>
<height>27</height>
</rect>
@ -1933,6 +2005,191 @@ Be sure to set the Neutral position on all sliders before sending!</string>
<string>Save to RAM</string>
</property>
</widget>
<widget class="QFrame" name="frame">
<property name="geometry">
<rect>
<x>240</x>
<y>10</y>
<width>291</width>
<height>51</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<widget class="QSpinBox" name="outputRate2">
<property name="geometry">
<rect>
<x>220</x>
<y>20</y>
<width>55</width>
<height>27</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>81</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Update rate:</string>
</property>
</widget>
<widget class="QSpinBox" name="outputRate1">
<property name="geometry">
<rect>
<x>120</x>
<y>20</y>
<width>55</width>
<height>27</height>
</rect>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>110</x>
<y>0</y>
<width>81</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Channel 0-3</string>
</property>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
<x>210</x>
<y>0</y>
<width>81</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Channel 4-7</string>
</property>
</widget>
</widget>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>520</x>
<y>70</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>520</x>
<y>100</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
<widget class="QLabel" name="label_8">
<property name="geometry">
<rect>
<x>520</x>
<y>130</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
<widget class="QLabel" name="label_9">
<property name="geometry">
<rect>
<x>520</x>
<y>160</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
<widget class="QLabel" name="label_10">
<property name="geometry">
<rect>
<x>520</x>
<y>190</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
<widget class="QLabel" name="label_11">
<property name="geometry">
<rect>
<x>520</x>
<y>220</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
<widget class="QLabel" name="label_12">
<property name="geometry">
<rect>
<x>520</x>
<y>250</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
<widget class="QLabel" name="label_13">
<property name="geometry">
<rect>
<x>520</x>
<y>280</y>
<width>41</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>0000</string>
</property>
</widget>
</widget>
</widget>
</widget>
@ -2041,8 +2298,8 @@ Be sure to set the Neutral position on all sliders before sending!</string>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>472</x>
<y>154</y>
<x>469</x>
<y>171</y>
</hint>
<hint type="destinationlabel">
<x>462</x>
@ -2057,8 +2314,8 @@ Be sure to set the Neutral position on all sliders before sending!</string>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>552</x>
<y>137</y>
<x>539</x>
<y>168</y>
</hint>
<hint type="destinationlabel">
<x>532</x>
@ -2173,8 +2430,8 @@ Be sure to set the Neutral position on all sliders before sending!</string>
<y>291</y>
</hint>
<hint type="destinationlabel">
<x>472</x>
<y>111</y>
<x>469</x>
<y>142</y>
</hint>
</hints>
</connection>
@ -2189,8 +2446,136 @@ Be sure to set the Neutral position on all sliders before sending!</string>
<y>296</y>
</hint>
<hint type="destinationlabel">
<x>552</x>
<y>162</y>
<x>539</x>
<y>171</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch0OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_6</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>419</x>
<y>121</y>
</hint>
<hint type="destinationlabel">
<x>546</x>
<y>120</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch1OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_7</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>377</x>
<y>151</y>
</hint>
<hint type="destinationlabel">
<x>535</x>
<y>148</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch2OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_8</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>347</x>
<y>175</y>
</hint>
<hint type="destinationlabel">
<x>554</x>
<y>179</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch3OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_9</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>348</x>
<y>207</y>
</hint>
<hint type="destinationlabel">
<x>543</x>
<y>208</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch4OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_10</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>356</x>
<y>242</y>
</hint>
<hint type="destinationlabel">
<x>535</x>
<y>242</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch5OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_11</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>318</x>
<y>275</y>
</hint>
<hint type="destinationlabel">
<x>546</x>
<y>271</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch6OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_12</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>358</x>
<y>303</y>
</hint>
<hint type="destinationlabel">
<x>560</x>
<y>302</y>
</hint>
</hints>
</connection>
<connection>
<sender>ch7OutSlider</sender>
<signal>valueChanged(int)</signal>
<receiver>label_13</receiver>
<slot>setNum(int)</slot>
<hints>
<hint type="sourcelabel">
<x>368</x>
<y>325</y>
</hint>
<hint type="destinationlabel">
<x>560</x>
<y>327</y>
</hint>
</hints>
</connection>