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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -103,6 +103,7 @@ private:
void setupQuadCopter(); void setupQuadCopter();
void setupHexaCopter(); void setupHexaCopter();
void setupOctoCopter(); void setupOctoCopter();
void setupVtail();
void setupElevon(); void setupElevon();
void setupAileron(); 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, 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_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, 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 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 }; enum INPUT_TYPE { INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSMX10, INPUT_DSMX11, INPUT_DSM2, INPUT_UNKNOWN };