/** Virtual function to refresh the UI widget values */ void ConfigGroundVehicleWidget::refreshWidgetsValues(QString frameType) { setupUI(frameType); initMixerCurves(frameType); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); Q_ASSERT(mixer); GUIConfigDataUnion config = getConfigData(); // THIS SECTION STILL NEEDS WORK. FOR THE MOMENT, USE THE FIXED-WING ONBOARD SETTING IN ORDER TO MINIMIZE CHANCES OF BOLLOXING REAL CODE // Retrieve channel setup values setComboCurrentIndex(m_aircraft->gvMotor1ChannelBox, config.ground.GroundVehicleThrottle1); setComboCurrentIndex(m_aircraft->gvMotor2ChannelBox, config.ground.GroundVehicleThrottle2); setComboCurrentIndex(m_aircraft->gvSteering1ChannelBox, config.ground.GroundVehicleSteering1); setComboCurrentIndex(m_aircraft->gvSteering2ChannelBox, config.ground.GroundVehicleSteering2); if (frameType == "GroundVehicleDifferential") { // Find the channel number for Motor1 int channel = m_aircraft->gvMotor1ChannelBox->currentIndex() - 1; if (channel > -1) { // If for some reason the actuators were incoherent, we might fail here, hence the check. m_aircraft->differentialSteeringSlider1->setValue( getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW) / 1.27); } channel = m_aircraft->gvMotor2ChannelBox->currentIndex() - 1; if (channel > -1) { m_aircraft->differentialSteeringSlider2->setValue( -getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW) / 1.27); } } }
/** Virtual function to refresh the UI widget values */ void ConfigGroundVehicleWidget::refreshAirframeWidgetsValues(SystemSettings::AirframeTypeOptions frameType) { MixerSettings *mixerSettings = MixerSettings::GetInstance(getObjectManager()); Q_ASSERT(mixerSettings); GUIConfigDataUnion config = GetConfigData(); //THIS SECTION STILL NEEDS WORK. FOR THE MOMENT, USE THE FIXED-WING ONBOARD SETTING IN ORDER TO MINIMIZE CHANCES OF BOLLOXING REAL CODE // Retrieve channel setup values setComboCurrentIndex(m_aircraft->gvMotor1ChannelBox, config.ground.GroundVehicleThrottle1); setComboCurrentIndex(m_aircraft->gvMotor2ChannelBox, config.ground.GroundVehicleThrottle2); setComboCurrentIndex(m_aircraft->gvSteering1ChannelBox, config.ground.GroundVehicleSteering1); setComboCurrentIndex(m_aircraft->gvSteering2ChannelBox, config.ground.GroundVehicleSteering2); if (frameType == SystemSettings::AIRFRAMETYPE_GROUNDVEHICLEDIFFERENTIAL) { //CURRENTLY BROKEN UNTIL WE DECIDE HOW DIFFERENTIAL SHOULD BEHAVE // If the vehicle type is "differential", restore the slider setting // Find the channel number for Motor1 int channel = m_aircraft->gvMotor1ChannelBox->currentIndex()-1; if (channel > -1) { // If for some reason the actuators were incoherent, we might fail here, hence the check. m_aircraft->differentialSteeringSlider1->setValue(getMixerVectorValue(mixerSettings,channel,MixerSettings::MIXER1VECTOR_ROLL)*100); m_aircraft->differentialSteeringSlider2->setValue(getMixerVectorValue(mixerSettings,channel,MixerSettings::MIXER1VECTOR_PITCH)*100); } } if (frameType == SystemSettings::AIRFRAMETYPE_GROUNDVEHICLEMOTORCYCLE) { //CURRENTLY BROKEN UNTIL WE DECIDE HOW MOTORCYCLE SHOULD BEHAVE // obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings"))); // Q_ASSERT(obj); // int chMixerNumber = m_aircraft->gvMotor1ChannelBox->currentIndex()-1; // if (chMixerNumber >=0) { // field = obj->getField(mixerVectors.at(chMixerNumber)); // int ti = field->getElementNames().indexOf("Yaw"); // m_aircraft->differentialSteeringSlider1->setValue(field->getDouble(ti)*100); // // ti = field->getElementNames().indexOf("Pitch"); // m_aircraft->differentialSteeringSlider2->setValue(field->getDouble(ti)*100); // } } }
/** Helper function to refresh the UI widget values */ void ConfigCustomWidget::refreshWidgetsValues(QString frameType) { Q_ASSERT(m_aircraft); setupUI(frameType); UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); Q_ASSERT(system); QPointer<UAVObjectField> field = system->getField(QString("AirframeType")); // Do not allow table edit until AirframeType == Custom // First save set AirframeType to 'Custom' and next modify. if (field->getValue().toString() != "Custom") { m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::NoEditTriggers); } else { m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::AllEditTriggers); } UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); Q_ASSERT(mixer); getChannelDescriptions(); QList<double> curveValues; getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, &curveValues); // is at least one of the curve values != 0? if (isValidThrottleCurve(&curveValues)) { // yes, use the curve we just read from mixersettings m_aircraft->customThrottle1Curve->initCurve(&curveValues); } else { // no, init a straight curve m_aircraft->customThrottle1Curve->initLinearCurve(curveValues.count(), 1.0); } double Throttle2CurveMin = m_aircraft->customThrottle2Curve->getMin(); if (MixerSettings * mxr = qobject_cast<MixerSettings *>(mixer)) { MixerSettings::DataFields mixerSettingsData = mxr->getData(); if (mixerSettingsData.Curve2Source == MixerSettings::CURVE2SOURCE_THROTTLE && Throttle2CurveMin >= 0) { m_aircraft->customThrottle2Curve->setMixerType(MixerCurve::MIXERCURVE_THROTTLE); } else { m_aircraft->customThrottle2Curve->setMixerType(MixerCurve::MIXERCURVE_PITCH); } } // Setup all Throttle2 curves for all types of airframes getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, &curveValues); if (isValidThrottleCurve(&curveValues)) { m_aircraft->customThrottle2Curve->initCurve(&curveValues); } else { m_aircraft->customThrottle2Curve->initLinearCurve(curveValues.count(), 1.0, m_aircraft->customThrottle2Curve->getMin()); } // Update the mixer table: for (int channel = 0; channel < m_aircraft->customMixerTable->columnCount(); channel++) { UAVObjectField *field = mixer->getField(mixerTypes.at(channel)); if (field) { QComboBox *q = (QComboBox *)m_aircraft->customMixerTable->cellWidget(0, channel); if (q) { QString s = field->getValue().toString(); setComboCurrentIndex(q, q->findText(s)); } m_aircraft->customMixerTable->item(1, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1))); m_aircraft->customMixerTable->item(2, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2))); m_aircraft->customMixerTable->item(3, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL))); m_aircraft->customMixerTable->item(4, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH))); m_aircraft->customMixerTable->item(5, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW))); } } }
/** Virtual function to refresh the UI widget values */ void ConfigGroundVehicleWidget::refreshWidgetsValues(QString frameType) { setupUI(frameType); UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); Q_ASSERT(mixer); QList<double> curveValues; getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, &curveValues); // is at least one of the curve values != 0? if (isValidThrottleCurve(&curveValues)) { // yes, use the curve we just read from mixersettings m_aircraft->groundVehicleThrottle1->initCurve(&curveValues); } else { // no, init a straight curve m_aircraft->groundVehicleThrottle1->initLinearCurve(curveValues.count(), 1.0); } // Setup all Throttle2 curves for all types of airframes getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, &curveValues); if (isValidThrottleCurve(&curveValues)) { m_aircraft->groundVehicleThrottle2->initCurve(&curveValues); } else { m_aircraft->groundVehicleThrottle2->initLinearCurve(curveValues.count(), 1.0); } GUIConfigDataUnion config = getConfigData(); // THIS SECTION STILL NEEDS WORK. FOR THE MOMENT, USE THE FIXED-WING ONBOARD SETTING IN ORDER TO MINIMIZE CHANCES OF BOLLOXING REAL CODE // Retrieve channel setup values setComboCurrentIndex(m_aircraft->gvMotor1ChannelBox, config.ground.GroundVehicleThrottle1); setComboCurrentIndex(m_aircraft->gvMotor2ChannelBox, config.ground.GroundVehicleThrottle2); setComboCurrentIndex(m_aircraft->gvSteering1ChannelBox, config.ground.GroundVehicleSteering1); setComboCurrentIndex(m_aircraft->gvSteering2ChannelBox, config.ground.GroundVehicleSteering2); if (frameType == "GroundVehicleDifferential") { // CURRENTLY BROKEN UNTIL WE DECIDE HOW DIFFERENTIAL SHOULD BEHAVE // If the vehicle type is "differential", restore the slider setting // Find the channel number for Motor1 // obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings"))); // Q_ASSERT(obj); int channel = m_aircraft->gvMotor1ChannelBox->currentIndex() - 1; if (channel > -1) { // If for some reason the actuators were incoherent, we might fail here, hence the check. m_aircraft->differentialSteeringSlider1->setValue( getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL) * 100); m_aircraft->differentialSteeringSlider2->setValue( getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH) * 100); } } else if (frameType == "GroundVehicleMotorcycle") { // CURRENTLY BROKEN UNTIL WE DECIDE HOW MOTORCYCLE SHOULD BEHAVE // obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings"))); // Q_ASSERT(obj); // int chMixerNumber = m_aircraft->gvMotor1ChannelBox->currentIndex()-1; // if (chMixerNumber >=0) { // field = obj->getField(mixerVectors.at(chMixerNumber)); // int ti = field->getElementNames().indexOf("Yaw"); // m_aircraft->differentialSteeringSlider1->setValue(field->getDouble(ti)*100); // // ti = field->getElementNames().indexOf("Pitch"); // m_aircraft->differentialSteeringSlider2->setValue(field->getDouble(ti)*100); // } } }
/** Helper function to refresh the UI widget values */ void ConfigMultiRotorWidget::refreshAirframeWidgetsValues(SystemSettings::AirframeTypeOptions frameType) { int channel; double value; GUIConfigDataUnion config = GetConfigData(); multiGUISettingsStruct multi = config.multi; MixerSettings *mixerSettings = MixerSettings::GetInstance(getObjectManager()); Q_ASSERT(mixerSettings); if (frameType == SystemSettings::AIRFRAMETYPE_QUADP) { // Motors 1/2/3/4 are: N / E / S / W setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorN); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorS); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorW); // Now, read the 1st mixer R/P/Y levels and initialize the mix sliders. // This assumes that all vectors are identical - if not, the user should use the // "custom" setting. channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1; value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( -qRound(value/1.27)); } } else if (frameType == SystemSettings::AIRFRAMETYPE_QUADX) { // Motors 1/2/3/4 are: NW / NE / SE / SW setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorNW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorNE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorSE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorSW); // Now, read the 1st mixer R/P/Y levels and initialize the mix sliders. // This assumes that all vectors are identical - if not, the user should use the // "custom" setting. channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( qRound(value/1.27)); } } else if (frameType == SystemSettings::AIRFRAMETYPE_HEXA) { // Motors 1/2/3 4/5/6 are: N / NE / SE / S / SW / NW setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorN); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorNE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorSE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorS); setComboCurrentIndex(m_aircraft->multiMotorChannelBox5,multi.VTOLMotorSW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorNW); // Now, read the 1st mixer R/P/Y levels and initialize the mix sliders. // This assumes that all vectors are identical - if not, the user should use the // "custom" setting. channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); //change channels channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1; value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( -qRound(value/1.27) ); } } else if (frameType == SystemSettings::AIRFRAMETYPE_HEXAX) { // Motors 1/2/3 4/5/6 are: NE / E / SE / SW / W / NW setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorNE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorSE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorSW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox5,multi.VTOLMotorW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorNW); // Now, read the 1st mixer R/P/Y levels and initialize the mix sliders. // This assumes that all vectors are identical - if not, the user should use the // "custom" setting. channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1; value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( -qRound(value/1.27) ); } } else if (frameType == SystemSettings::AIRFRAMETYPE_HEXACOAX) { // Motors 1/2/3 4/5/6 are: NW/W NE/E S/SE setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorNW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorNE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox5,multi.VTOLMotorS); setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorSE); // Now, read the 1st mixer R/P/Y levels and initialize the mix sliders. // This assumes that all vectors are identical - if not, the user should use the // "custom" setting. channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(2*value/1.27) ); channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1; value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( qRound(value/1.27) ); } } else if (frameType == SystemSettings::AIRFRAMETYPE_OCTO || frameType == SystemSettings::AIRFRAMETYPE_OCTOV || frameType == SystemSettings::AIRFRAMETYPE_OCTOCOAXP) { // Motors 1 to 8 are N / NE / E / etc setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorN); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorNE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorSE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox5,multi.VTOLMotorS); setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorSW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox7,multi.VTOLMotorW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox8,multi.VTOLMotorNW); // Now, read the 1st mixer R/P/Y levels and initialize the mix sliders. // This assumes that all vectors are identical - if not, the user should use the // "custom" setting. channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { if (frameType == SystemSettings::AIRFRAMETYPE_OCTO) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); //change channels channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1; value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( -qRound(value/1.27) ); } else if (frameType == SystemSettings::AIRFRAMETYPE_OCTOV) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); //change channels channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1; value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( -qRound(value/1.27) ); } else if (frameType == SystemSettings::AIRFRAMETYPE_OCTOCOAXP) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); //change channels channel = m_aircraft->multiMotorChannelBox3->currentIndex() - 1; value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( -qRound(value/1.27) ); } } } else if (frameType == SystemSettings::AIRFRAMETYPE_OCTOCOAXX) { // Motors 1 to 8 are N / NE / E / etc setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorNW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorN); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorNE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox5,multi.VTOLMotorSE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorS); setComboCurrentIndex(m_aircraft->multiMotorChannelBox7,multi.VTOLMotorSW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox8,multi.VTOLMotorW); // Now, read the 1st mixer R/P/Y levels and initialize the mix sliders. // This assumes that all vectors are identical - if not, the user should use the // "custom" setting. channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_YAW); setYawMixLevel( -qRound(value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( qRound(value/1.27) ); } } else if (frameType == SystemSettings::AIRFRAMETYPE_TRI) { // Motors 1 to 8 are N / NE / E / etc setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorNW); setComboCurrentIndex(m_aircraft->multiMotorChannelBox2,multi.VTOLMotorNE); setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorS); setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorS); setComboCurrentIndex(m_aircraft->triYawChannelBox,multi.TRIYaw); channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1; if (channel > -1) { value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_PITCH); m_aircraft->mrPitchMixLevel->setValue( qRound(2*value/1.27) ); value = getMixerVectorValue(mixerSettings, channel, MixerSettings::MIXER1VECTOR_ROLL); m_aircraft->mrRollMixLevel->setValue( qRound(value/1.27) ); } } drawAirframe(frameType); }