1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-03-15 07:29:15 +01:00

Attempt adding in the proper Mixer setting constructs for Elevon setup.

This commit is contained in:
Kevin Finisterre 2014-06-11 14:41:42 -04:00
parent b9733363b3
commit 1f74a78263
9 changed files with 71 additions and 48 deletions

View File

@ -94,7 +94,7 @@ ConfigFixedWingWidget::ConfigFixedWingWidget(QWidget *parent) :
// Set default model to "Elevator aileron rudder"
m_aircraft->fixedWingType->setCurrentIndex(m_aircraft->fixedWingType->findText("Elevator aileron rudder"));
// setupUI(m_aircraft->fixedWingType->currentText());
setupUI(m_aircraft->fixedWingType->currentText());
connect(m_aircraft->fixedWingType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString)));
updateEnableControls();
@ -138,6 +138,8 @@ void ConfigFixedWingWidget::setupUI(QString frameType)
m_aircraft->elevonSlider1->setEnabled(false);
m_aircraft->elevonSlider2->setEnabled(false);
} else if (frameType == "FixedWingVtail" || frameType == "Vtail") {
// do nothing for now
} else if (frameType == "FixedWingElevon" || frameType == "Elevon") {
plane->setElementId("elevon");
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Elevon"));
@ -152,7 +154,7 @@ void ConfigFixedWingWidget::setupUI(QString frameType)
m_aircraft->fwAileron1Label->setText("Aileron 1");
m_aircraft->fwAileron2Label->setText("Aileron 2");
m_aircraft->elevonLabel1->setText("Rudder");
m_aircraft->elevonLabel1->setText("Roll");
m_aircraft->elevonLabel2->setText("Pitch");
m_aircraft->elevonSlider1->setEnabled(true);
@ -182,7 +184,9 @@ void ConfigFixedWingWidget::setupEnabledControls(QString frameType)
}
}
if (frameType == "Elevon" || frameType == "elevon") {
if (frameType == "Vtail" || frameType == "vtail") {
// enableComboBoxes(this, CHANNELBOXNAME, 3, true);
} else if (frameType == "Elevon" || frameType == "Elevon") {
enableComboBoxes(this, CHANNELBOXNAME, 3, true);
} else if (frameType == "aileron" || frameType == "Elevator aileron rudder") {
enableComboBoxes(this, CHANNELBOXNAME, 4, true);
@ -250,8 +254,6 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
setComboCurrentIndex(m_aircraft->fwAileron2ChannelBox, fixed.FixedWingRoll2);
setComboCurrentIndex(m_aircraft->fwElevator1ChannelBox, fixed.FixedWingPitch1);
setComboCurrentIndex(m_aircraft->fwElevator2ChannelBox, fixed.FixedWingPitch2);
setComboCurrentIndex(m_aircraft->fwRudder1ChannelBox, fixed.FixedWingYaw1);
setComboCurrentIndex(m_aircraft->fwRudder2ChannelBox, fixed.FixedWingYaw2);
if (frameType == "FixedWingElevon") {
// If the airframe is elevon, restore the slider setting
@ -260,7 +262,7 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
if (channel > -1) {
// If for some reason the actuators were incoherent, we might fail here, hence the check.
m_aircraft->elevonSlider1->setValue(
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW) * 100);
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL) * 100);
m_aircraft->elevonSlider2->setValue(
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH) * 100);
}
@ -319,7 +321,7 @@ QString ConfigFixedWingWidget::updateConfigObjectsFromWidgets()
{ 0, 0, 0 },
{ 0, 0, 0 }
};
setupFixedWingMixer(mixerMatrix);
setupFixedWingElevonMixer(mixerMatrix);
m_aircraft->fwStatusLabel->setText(tr("Configuration OK"));
@ -483,74 +485,77 @@ bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType)
// 1. Assign the servo/motor/none for each channel
double value;
// motor
int channel = m_aircraft->fwEngineChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_MOTOR);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
// rudders
channel = m_aircraft->fwRudder1ChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
channel = m_aircraft->fwRudder2ChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, -127);
// ailerons
channel = m_aircraft->fwAileron1ChannelBox->currentIndex() - 1;
if (channel > -1) {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
value = (double)(m_aircraft->elevonSlider2->value() * 1.27);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, value);
value = (double)(m_aircraft->elevonSlider1->value() * 1.27);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, value);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 127);
channel = m_aircraft->fwAileron2ChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
value = (double)(m_aircraft->elevonSlider2->value() * 1.27);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, value);
value = (double)(m_aircraft->elevonSlider1->value() * 1.27);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, -value);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, -127);
}
// elevon
channel = m_aircraft->fwElevator1ChannelBox->currentIndex() - 1;
if (channel > -1) {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, 127);
channel = m_aircraft->fwElevator2ChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, -127);
}
m_aircraft->fwStatusLabel->setText("Mixer generated");
return true;
}
/**
This function sets up the elevon fixed wing mixer values.
Helper function: setupElevonServo
*/
bool ConfigFixedWingWidget::setupFixedWingMixer(double mixerFactors[8][3])
void ConfigFixedWingWidget::setupElevonServo(int channel, double pitch, double roll)
{
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer);
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, roll * 127);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, pitch * 127);
}
/**
This function sets up the elevon fixed wing mixer values.
*/
bool ConfigFixedWingWidget::setupFixedWingElevonMixer(double mixerFactors[8][3]){
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer);
resetMotorAndServoMixers(mixer);
// and enable only the relevant channels:
// double pFactor = (double)m_aircraft->fwPitchMixLevel->value() / 100.0;
// double rFactor = (double)m_aircraft->fwRollMixLevel->value() / 100.0;
//invertMotors = m_aircraft->MultirotorRevMixerCheckBox->isChecked();
// double yFactor = (double)m_aircraft->fwYawMixLevel->value() / 100.0;
double pFactor = (double)m_aircraft->elevonSlider1->value() / 100.0;
double rFactor = (double)m_aircraft->elevonSlider2->value() / 100.0;
QList<QComboBox *> mmList;
mmList << m_aircraft->fwEngineChannelBox << m_aircraft->fwAileron1ChannelBox
<< m_aircraft->fwAileron2ChannelBox << m_aircraft->fwElevator1ChannelBox
<< m_aircraft->fwElevator2ChannelBox << m_aircraft->fwRudder1ChannelBox
<< m_aircraft->fwRudder2ChannelBox;
<< m_aircraft->fwElevator2ChannelBox;
for (int i = 0; i < 8; i++) {
if (mmList.at(i)->isEnabled()) {
int channel = mmList.at(i)->currentIndex() - 1;
if (channel > -1) {
qDebug() << "code needs to be written here!";
// setupQuadMotor(channel, mixerFactors[i][0] * pFactor, rFactor * mixerFactors[i][1],
// yFactor * mixerFactors[i][2]);
setupElevonServo(channel, mixerFactors[i][0] * pFactor, rFactor * mixerFactors[i][1]);
}
}
}
@ -604,20 +609,21 @@ bool ConfigFixedWingWidget::throwConfigError(QString airframeType)
m_aircraft->fwEngineChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
}
if (m_aircraft->fwAileron1ChannelBox->currentText() == "None") {
m_aircraft->fwAileron1ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
if (m_aircraft->fwElevator1ChannelBox->currentText() == "None") {
m_aircraft->fwElevator1ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
error = true;
} else {
m_aircraft->fwAileron1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
m_aircraft->fwElevator1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
}
if (m_aircraft->fwAileron2ChannelBox->currentText() == "None") {
m_aircraft->fwAileron2ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
if (m_aircraft->fwElevator2ChannelBox->currentText() == "None") {
m_aircraft->fwElevator2ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
error = true;
} else {
m_aircraft->fwAileron2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
m_aircraft->fwElevator2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
}
}
if (error) {
m_aircraft->fwStatusLabel->setText(QString("<font color='red'>ERROR: Assign all necessary channels</font>"));
}

View File

@ -66,8 +66,10 @@ private:
virtual void resetActuators(GUIConfigDataUnion *configData);
bool setupFrameFixedWing(QString airframeType);
bool setupFrameVtail(QString airframeType);
bool setupFrameElevon(QString airframeType);
bool setupFixedWingMixer(double mixerFactors[8][3]);
bool setupFixedWingElevonMixer(double mixerFactors[8][3]);
void setupMotors(QList<QString> motorList);
void updateAirframe(QString multiRotorType);

View File

@ -71,10 +71,12 @@ QStringList ConfigVehicleTypeWidget::getChannelDescriptions()
channelDesc = ConfigFixedWingWidget::getChannelDescriptions();
break;
case SystemSettings::AIRFRAMETYPE_FIXEDWINGELEVON:
// do nothing for elevon support for the time being.
case SystemSettings::AIRFRAMETYPE_FIXEDWINGVTAIL:
channelDesc = ConfigFixedWingWidget::getChannelDescriptions();
break;
case SystemSettings::AIRFRAMETYPE_FIXEDWINGVTAIL:
// do nothing for vtail support for the time being.
// channelDesc = ConfigFixedWingWidget::getChannelDescriptions();
break;
case SystemSettings::AIRFRAMETYPE_HELICP:
// helicp
channelDesc = ConfigCcpmWidget::getChannelDescriptions();

View File

@ -125,6 +125,9 @@ void ConnectionDiagram::setupGraphicsScene()
case VehicleConfigurationSource::FIXED_WING_ELEVON:
elementsToShow << "elevon";
break;
case VehicleConfigurationSource::FIXED_WING_VTAIL:
elementsToShow << "vtail";
break;
default:
break;
}

View File

@ -108,6 +108,9 @@ void FixedWingPage::updateImageAndDescription()
case SetupWizard::FIXED_WING_ELEVON:
elementId = "elevon";
break;
// case SetupWizard::FIXED_WING_VTAIL:
// elementId = "vtail";
// break;
default:
elementId = "";
break;

View File

@ -239,6 +239,9 @@ QString SetupWizard::getSummaryText()
case SetupWizard::FIXED_WING_ELEVON:
summary.append(tr("Elevon"));
break;
// case SetupWizard::FIXED_WING_VTAIL:
// summary.append(tr("Vtail"));
// break;
default:
summary.append(tr("Unknown"));
break;

View File

@ -224,6 +224,9 @@ void VehicleConfigurationHelper::applyVehicleConfiguration()
case VehicleConfigurationSource::FIXED_WING_ELEVON:
setupElevon();
break;
case VehicleConfigurationSource::FIXED_WING_VTAIL:
// setupVtail();
break;
default:
break;
}
@ -1378,7 +1381,7 @@ void VehicleConfigurationHelper::setupElevon()
guiSettings.fixedwing.FixedWingRoll2 = 3;
applyMixerConfiguration(channels);
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_FIXEDWINGVTAIL, guiSettings);
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_FIXEDWINGELEVON, guiSettings);
}
void VehicleConfigurationHelper::setupAileron()

View File

@ -103,6 +103,7 @@ private:
void setupQuadCopter();
void setupHexaCopter();
void setupOctoCopter();
void setupVtail();
void setupElevon();
void setupAileron();

View File

@ -60,7 +60,7 @@ public:
enum VEHICLE_SUB_TYPE { MULTI_ROTOR_UNKNOWN, MULTI_ROTOR_TRI_Y, MULTI_ROTOR_QUAD_X, MULTI_ROTOR_QUAD_PLUS,
MULTI_ROTOR_HEXA, MULTI_ROTOR_HEXA_H, MULTI_ROTOR_HEXA_COAX_Y, MULTI_ROTOR_OCTO,
MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS, FIXED_WING_AILERON,
FIXED_WING_ELEVON, HELI_CCPM };
FIXED_WING_VTAIL, FIXED_WING_ELEVON, HELI_CCPM };
enum ESC_TYPE { ESC_RAPID, ESC_LEGACY, ESC_UNKNOWN };
enum INPUT_TYPE { INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSMX10, INPUT_DSMX11, INPUT_DSM2, INPUT_UNKNOWN };