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

LP-65 Heli tab : Custom values refreshed - Check unused/duplicate output channels

This commit is contained in:
Laurent Lalanne 2015-07-28 12:24:46 +02:00
parent 9a886d6d72
commit 538e0925a8
4 changed files with 134 additions and 112 deletions

View File

@ -1050,7 +1050,7 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>200</width>
<width>220</width>
<height>0</height>
</size>
</property>
@ -1098,13 +1098,13 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>85</width>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<width>120</width>
<height>25</height>
</size>
</property>
@ -1120,13 +1120,13 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>85</width>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<width>120</width>
<height>25</height>
</size>
</property>
@ -1195,7 +1195,7 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>200</width>
<width>220</width>
<height>0</height>
</size>
</property>
@ -1265,13 +1265,13 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>85</width>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<width>120</width>
<height>25</height>
</size>
</property>
@ -1287,13 +1287,13 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>85</width>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<width>120</width>
<height>25</height>
</size>
</property>
@ -1312,13 +1312,13 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>85</width>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<width>120</width>
<height>25</height>
</size>
</property>
@ -1359,13 +1359,13 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>85</width>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<width>120</width>
<height>16777215</height>
</size>
</property>
@ -1426,13 +1426,13 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>85</width>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<width>120</width>
<height>25</height>
</size>
</property>
@ -1504,7 +1504,7 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>200</width>
<width>220</width>
<height>0</height>
</size>
</property>
@ -1844,7 +1844,7 @@ margin:1px;
</property>
<property name="minimumSize">
<size>
<width>200</width>
<width>220</width>
<height>0</height>
</size>
</property>

View File

@ -254,7 +254,7 @@ ConfigCcpmWidget::ConfigCcpmWidget(QWidget *parent) :
connect(m_aircraft->ccpmCollectivespinBox, SIGNAL(valueChanged(int)), this, SLOT(UpdateMixer()));
connect(m_aircraft->ccpmType, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateType()));
connect(m_aircraft->ccpmSingleServo, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateType()));
connect(m_aircraft->TabObject, SIGNAL(currentChanged(QWidget *)), this, SLOT(UpdateType()));
connect(m_aircraft->TabObject, SIGNAL(currentChanged(int)), this, SLOT(UpdateType()));
connect(m_aircraft->SwashLvlStartButton, SIGNAL(clicked()), this, SLOT(SwashLvlStartButtonPressed()));
connect(m_aircraft->SwashLvlNextButton, SIGNAL(clicked()), this, SLOT(SwashLvlNextButtonPressed()));
@ -384,43 +384,15 @@ QString ConfigCcpmWidget::updateConfigObjectsFromWidgets()
void ConfigCcpmWidget::UpdateType()
{
int TypeInt, SingleServoIndex, NumServosDefined;
int SingleServoIndex, NumServosDefined;
double AdjustmentAngle = 0;
SetUIComponentVisibilities();
TypeInt = m_aircraft->ccpmType->count() - m_aircraft->ccpmType->currentIndex() - 1;
TypeText = m_aircraft->ccpmType->currentText();
SingleServoIndex = m_aircraft->ccpmSingleServo->currentIndex();
// set visibility of user settings (When Custom)
m_aircraft->ccpmAdvancedSettingsTable->setEnabled(TypeInt == 0);
// Clear advanced settings table if not Custom selected (Keep previous settings)
if (TypeText.compare(QString::fromUtf8("Custom - Advanced Settings"), Qt::CaseInsensitive) != 0) {
m_aircraft->ccpmAdvancedSettingsTable->clearFocus();
}
m_aircraft->ccpmAngleW->setEnabled(TypeInt == 1);
m_aircraft->ccpmAngleX->setEnabled(TypeInt == 1);
m_aircraft->ccpmAngleY->setEnabled(TypeInt == 1);
m_aircraft->ccpmAngleZ->setEnabled(TypeInt == 1);
m_aircraft->ccpmCorrectionAngle->setEnabled(TypeInt != 0);
m_aircraft->ccpmServoWChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmServoXChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmServoYChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmServoZChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmSingleServo->setEnabled(TypeInt > 1);
m_aircraft->ccpmEngineChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmTailChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmCollectiveSlider->setEnabled(TypeInt > 0);
m_aircraft->ccpmCollectivespinBox->setEnabled(TypeInt > 0);
m_aircraft->ccpmRevoSlider->setEnabled(TypeInt > 0);
m_aircraft->ccpmREVOspinBox->setEnabled(TypeInt > 0);
AdjustmentAngle = SingleServoIndex * 90;
AdjustmentAngle = SingleServoIndex * 90;
m_aircraft->PitchCurve->setVisible(1);
@ -671,7 +643,11 @@ void ConfigCcpmWidget::UpdateMixer()
float ThisAngle[6];
QString Channel;
if (throwConfigError(QString("HeliCP"))) {
int TypeInt = m_aircraft->ccpmType->count() - m_aircraft->ccpmType->currentIndex() - 1;
// Don't check config if Custom, exit if currently updatingToHardware
// Avoid updating custom table if saving data to board
if ((throwConfigError(TypeInt) && TypeInt != 0) || updatingToHardware) {
return;
}
GUIConfigDataUnion config = getConfigData();
@ -694,16 +670,18 @@ void ConfigCcpmWidget::UpdateMixer()
;
}
}
int TypeInt = m_aircraft->ccpmType->count() - m_aircraft->ccpmType->currentIndex() - 1;
if (TypeInt != 0) { // not advanced settings
// get the channel data from the ui
MixerChannelData[0] = m_aircraft->ccpmEngineChannel->currentIndex();
MixerChannelData[1] = m_aircraft->ccpmTailChannel->currentIndex();
MixerChannelData[2] = m_aircraft->ccpmServoWChannel->currentIndex();
MixerChannelData[3] = m_aircraft->ccpmServoXChannel->currentIndex();
MixerChannelData[4] = m_aircraft->ccpmServoYChannel->currentIndex();
MixerChannelData[5] = m_aircraft->ccpmServoZChannel->currentIndex();
// get the channel data from the ui
MixerChannelData[0] = m_aircraft->ccpmEngineChannel->currentIndex();
MixerChannelData[1] = m_aircraft->ccpmTailChannel->currentIndex();
MixerChannelData[2] = m_aircraft->ccpmServoWChannel->currentIndex();
MixerChannelData[3] = m_aircraft->ccpmServoXChannel->currentIndex();
MixerChannelData[4] = m_aircraft->ccpmServoYChannel->currentIndex();
MixerChannelData[5] = m_aircraft->ccpmServoZChannel->currentIndex();
QTableWidget *table = m_aircraft->ccpmAdvancedSettingsTable;
if (TypeInt != 0) { // not advanced settings
// get the angle data from the ui
ThisAngle[2] = m_aircraft->ccpmAngleW->value();
ThisAngle[3] = m_aircraft->ccpmAngleX->value();
@ -722,11 +700,9 @@ void ConfigCcpmWidget::UpdateMixer()
ServosText[3]->setPlainText(QString("%1").arg(MixerChannelData[5]));
// go through the user data and update the mixer matrix
QTableWidget *table = m_aircraft->ccpmAdvancedSettingsTable;
for (int i = 0; i < 6; i++) {
if ((MixerChannelData[i] > 0) && ((ThisEnable[i]) || (i < 2))) {
if (((MixerChannelData[i] > 0) && ThisEnable[i]) || (i < 2)) {
table->item(i, 0)->setText(QString("%1").arg(MixerChannelData[i]));
// Generate the mixer vector
if (i == 0) { // main motor-engine
table->item(i, 1)->setText(QString("%1").arg(127)); // ThrottleCurve1
@ -787,14 +763,34 @@ void ConfigCcpmWidget::UpdateMixer()
}
} else {
// advanced settings
QTableWidget *table = m_aircraft->ccpmAdvancedSettingsTable;
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer);
// Populate custom mixer table from board values
for (int i = 0; i < 6; i++) {
Channel = table->item(i, 0)->text();
if (Channel == "-") {
Channel = QString((int)ConfigCcpmWidget::CHANNEL_NUMELEM + 1);
if (MixerChannelData[i] > 0) {
// Channel number
table->item(i, 0)->setText(QString("%1").arg(MixerChannelData[i]));
// Throttle1
table->item(i, 1)->setText(QString("%1").arg(getMixerVectorValue(mixer, MixerChannelData[i] - 1,
VehicleConfig::MIXERVECTOR_THROTTLECURVE1)));
// Throttle2
table->item(i, 2)->setText(QString("%1").arg(getMixerVectorValue(mixer, MixerChannelData[i] - 1,
VehicleConfig::MIXERVECTOR_THROTTLECURVE2)));
// Roll
table->item(i, 3)->setText(QString("%1").arg(getMixerVectorValue(mixer, MixerChannelData[i] - 1,
VehicleConfig::MIXERVECTOR_ROLL)));
// Pitch
table->item(i, 4)->setText(QString("%1").arg(getMixerVectorValue(mixer, MixerChannelData[i] - 1,
VehicleConfig::MIXERVECTOR_PITCH)));
// Yaw
table->item(i, 5)->setText(QString("%1").arg(getMixerVectorValue(mixer, MixerChannelData[i] - 1,
VehicleConfig::MIXERVECTOR_YAW)));
} else {
for (int j = 0; j < 6; j++) {
table->item(i, j)->setText(QString("-"));
}
}
MixerChannelData[i] = Channel.toInt();
}
}
}
@ -893,6 +889,31 @@ void ConfigCcpmWidget::SetUIComponentVisibilities()
m_aircraft->SwashLvlStepList->item(1)->setBackground(Qt::transparent);
m_aircraft->SwashLvlStepList->item(2)->setBackground(Qt::transparent);
m_aircraft->SwashLvlStepList->item(3)->setBackground(Qt::transparent);
// Enable / disable by TypeInt : 0 is custom
int TypeInt = m_aircraft->ccpmType->count() - m_aircraft->ccpmType->currentIndex() - 1;
// set visibility of user settings (When Custom)
m_aircraft->ccpmAdvancedSettingsTable->setEnabled(TypeInt == 0);
m_aircraft->ccpmAngleW->setEnabled(TypeInt == 1);
m_aircraft->ccpmAngleX->setEnabled(TypeInt == 1);
m_aircraft->ccpmAngleY->setEnabled(TypeInt == 1);
m_aircraft->ccpmAngleZ->setEnabled(TypeInt == 1);
m_aircraft->ccpmCorrectionAngle->setEnabled(TypeInt != 0);
m_aircraft->ccpmServoWChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmServoXChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmServoYChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmServoZChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmSingleServo->setEnabled(TypeInt > 1);
m_aircraft->ccpmEngineChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmTailChannel->setEnabled(TypeInt > 0);
m_aircraft->ccpmCollectiveSlider->setEnabled(TypeInt > 0);
m_aircraft->ccpmCollectivespinBox->setEnabled(TypeInt > 0);
m_aircraft->ccpmRevoSlider->setEnabled(TypeInt > 0);
m_aircraft->ccpmREVOspinBox->setEnabled(TypeInt > 0);
}
/**
@ -942,6 +963,14 @@ void ConfigCcpmWidget::setMixer()
{
int i, j;
int TypeInt = m_aircraft->ccpmType->count() - m_aircraft->ccpmType->currentIndex() - 1;
// Don't check config if Custom, exit if currently updatingToHardware
// Avoid mixer changes if something wrong in config
if ((throwConfigError(TypeInt) && TypeInt != 0) || updatingToHardware) {
return;
}
if (SwashLvlConfigurationInProgress) {
return;
}
@ -986,10 +1015,11 @@ void ConfigCcpmWidget::setMixer()
&mixerSettingsData.Mixer12Type
};
// reset all to Disabled
for (i = 0; i < 8; i++) {
// reset all outputs to Disabled
for (i = 0; i < (int)ConfigCcpmWidget::CHANNEL_NUMELEM; i++) {
*mixerTypes[i] = 0;
}
// go through the user data and update the mixer matrix
for (i = 0; i < 6; i++) {
if ((MixerChannelData[i] > 0) && (MixerChannelData[i] < (int)ConfigCcpmWidget::CHANNEL_NUMELEM + 1)) {
@ -1560,52 +1590,44 @@ void ConfigCcpmWidget::SwashLvlSpinBoxChanged(int value)
/**
This function displays text and color formatting in order to help the user understand what channels have not yet been configured.
*/
bool ConfigCcpmWidget::throwConfigError(QString airframeType)
bool ConfigCcpmWidget::throwConfigError(int TypeInt)
{
Q_UNUSED(airframeType);
bool error = false;
if ((m_aircraft->ccpmServoWChannel->currentIndex() == 0) && (m_aircraft->ccpmServoWChannel->isVisible())) {
m_aircraft->ccpmServoWLabel->setText("<font color=red>" + m_aircraft->ccpmServoWLabel->text() + "</font>");
error = true;
} else {
m_aircraft->ccpmServoWLabel->setText(QTextEdit(m_aircraft->ccpmServoWLabel->text()).toPlainText());
// Custom no need check
if (TypeInt == 0) {
return error;
}
if ((m_aircraft->ccpmServoXChannel->currentIndex() == 0) && (m_aircraft->ccpmServoXChannel->isVisible())) {
m_aircraft->ccpmServoXLabel->setText("<font color=red>" + m_aircraft->ccpmServoXLabel->text() + "</font>");
error = true;
} else {
m_aircraft->ccpmServoXLabel->setText(QTextEdit(m_aircraft->ccpmServoXLabel->text()).toPlainText());
}
QList<QComboBox *> comboChannelsName;
comboChannelsName << m_aircraft->ccpmEngineChannel << m_aircraft->ccpmTailChannel << m_aircraft->ccpmServoWChannel
<< m_aircraft->ccpmServoXChannel << m_aircraft->ccpmServoYChannel << m_aircraft->ccpmServoZChannel;
QString channelNames = "";
if ((m_aircraft->ccpmServoYChannel->currentIndex() == 0) && (m_aircraft->ccpmServoYChannel->isVisible())) {
m_aircraft->ccpmServoYLabel->setText("<font color=red>" + m_aircraft->ccpmServoYLabel->text() + "</font>");
error = true;
} else {
m_aircraft->ccpmServoYLabel->setText(QTextEdit(m_aircraft->ccpmServoYLabel->text()).toPlainText());
for (int i = 0; i < 6; i++) {
QComboBox *combobox = comboChannelsName[i];
if (combobox && (combobox->isVisible())) {
if (combobox->currentText() == "None") {
int size = combobox->style()->pixelMetric(QStyle::PM_SmallIconSize);
QPixmap pixmap(size, size);
pixmap.fill(QColor("red"));
combobox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
error = true;
} else if (channelNames.contains(combobox->currentText(), Qt::CaseInsensitive)) {
int size = combobox->style()->pixelMetric(QStyle::PM_SmallIconSize);
QPixmap pixmap(size, size);
pixmap.fill(QColor("orange"));
combobox->setItemData(combobox->currentIndex(), pixmap, Qt::DecorationRole); // Set color palettes
combobox->setToolTip(tr("Channel already used"));
error = true;
} else {
for (int index = 0; index < (int)ConfigCcpmWidget::CHANNEL_NUMELEM; index++) {
combobox->setItemData(index, 0, Qt::DecorationRole); // Reset all color palettes
combobox->setToolTip("");
}
}
channelNames += (combobox->currentText() == "None") ? "" : combobox->currentText();
}
}
if ((m_aircraft->ccpmServoZChannel->currentIndex() == 0) && (m_aircraft->ccpmServoZChannel->isVisible())) {
m_aircraft->ccpmServoZLabel->setText("<font color=red>" + m_aircraft->ccpmServoZLabel->text() + "</font>");
error = true;
} else {
m_aircraft->ccpmServoZLabel->setText(QTextEdit(m_aircraft->ccpmServoZLabel->text()).toPlainText());
}
if ((m_aircraft->ccpmEngineChannel->currentIndex() == 0) && (m_aircraft->ccpmEngineChannel->isEnabled())) {
m_aircraft->ccpmEngineLabel->setText("<font color=red>" + m_aircraft->ccpmEngineLabel->text() + "</font>");
} else {
m_aircraft->ccpmEngineLabel->setText(QTextEdit(m_aircraft->ccpmEngineLabel->text()).toPlainText());
}
if ((m_aircraft->ccpmTailChannel->currentIndex() == 0) && (m_aircraft->ccpmTailChannel->isEnabled())) {
m_aircraft->ccpmTailLabel->setText("<font color=red>" + m_aircraft->ccpmTailLabel->text() + "</font>");
error = true;
} else {
m_aircraft->ccpmTailLabel->setText(QTextEdit(m_aircraft->ccpmTailLabel->text()).toPlainText());
}
return error;
}

View File

@ -112,7 +112,7 @@ private:
private slots:
virtual void setupUI(QString airframeType);
virtual bool throwConfigError(QString airframeType);
virtual bool throwConfigError(int TypeInt);
void ccpmSwashplateUpdate();
void ccpmSwashplateRedraw();

View File

@ -60,7 +60,7 @@ typedef struct {
} __attribute__((packed)) multiGUISettingsStruct;
typedef struct {
uint SwashplateType : 3;
uint SwashplateType : 4;
uint FirstServoIndex : 2;
uint CorrectionAngle : 9;
uint ccpmCollectivePassthroughState : 1;
@ -75,7 +75,7 @@ typedef struct {
uint ServoIndexZ : 4; // 57 bits
uint Throttle : 4;
uint Tail : 4; // 65bits
quint32 padding : 31; // 96 bits
quint32 padding : 30; // 96 bits
quint32 padding1; // 128 bits
} __attribute__((packed)) heliGUISettingsStruct;