mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-03-15 07:29:15 +01:00
Bugfixes in configwidgets;
Refactor mixer type and vector set/get, named vector elements;
This commit is contained in:
parent
2db4f6b2b6
commit
7fb96f1acd
@ -889,7 +889,7 @@ void ConfigCcpmWidget::UpdateMixer()
|
||||
|
||||
throwConfigError(QString("HeliCP"));
|
||||
|
||||
updateConfigObjectsFromWidgets();
|
||||
//updateConfigObjectsFromWidgets();
|
||||
|
||||
GUIConfigDataUnion config = GetConfigData();
|
||||
|
||||
@ -1055,7 +1055,7 @@ QString ConfigCcpmWidget::updateConfigObjectsFromWidgets() //UpdateCCPMOptionsFr
|
||||
|
||||
SetConfigData(config);
|
||||
|
||||
//setMixer();
|
||||
setMixer();
|
||||
|
||||
updatingFromHardware = FALSE;
|
||||
return airframeType;
|
||||
@ -1102,7 +1102,7 @@ void ConfigCcpmWidget::refreshWidgetsValues(QString frameType) //UpdateCCPMUIFro
|
||||
//tail
|
||||
setComboCurrentIndex( m_ccpm->ccpmTailChannel, config.heli.Tail);
|
||||
|
||||
//getMixer();
|
||||
getMixer();
|
||||
}
|
||||
|
||||
|
||||
@ -1204,19 +1204,23 @@ void ConfigCcpmWidget::setMixer()
|
||||
&mixerSettingsData.Mixer8Type
|
||||
};
|
||||
|
||||
//reset all to Disabled
|
||||
for (i=0; i<8; i++)
|
||||
*mixerTypes[i] = 0;
|
||||
|
||||
//go through the user data and update the mixer matrix
|
||||
for (i=0;i<6;i++)
|
||||
{
|
||||
if (MixerChannelData[i]<8)
|
||||
if (MixerChannelData[i]>0)
|
||||
{
|
||||
//set the mixer type
|
||||
*(mixerTypes[MixerChannelData[i]]) = i==0 ?
|
||||
*(mixerTypes[MixerChannelData[i] - 1]) = i==0 ?
|
||||
MixerSettings::MIXER1TYPE_MOTOR :
|
||||
MixerSettings::MIXER1TYPE_SERVO;
|
||||
|
||||
//config the vector
|
||||
for (j=0;j<5;j++)
|
||||
mixers[MixerChannelData[i]][j] = m_ccpm->ccpmAdvancedSettingsTable->item(i,j+1)->text().toInt();
|
||||
mixers[MixerChannelData[i] - 1][j] = m_ccpm->ccpmAdvancedSettingsTable->item(i,j+1)->text().toInt();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -300,87 +300,123 @@ bool ConfigFixedWingWidget::setupFrameFixedWing(QString airframeType)
|
||||
|
||||
SetConfigData(config);
|
||||
|
||||
UAVDataObject* obj;
|
||||
UAVObjectField* field;
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
int channel;
|
||||
//disable all
|
||||
for (channel=0; channel<VehicleConfig::CHANNEL_NUMELEM; channel++)
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_DISABLED);
|
||||
|
||||
//motor
|
||||
channel = m_aircraft->fwEngineChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_MOTOR);
|
||||
setMixerVectorValue(mixer,channel,VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
|
||||
|
||||
//rudder
|
||||
channel = m_aircraft->fwRudder1ChannelBox->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);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 127);
|
||||
|
||||
channel = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 127);
|
||||
}
|
||||
|
||||
//elevators
|
||||
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);
|
||||
}
|
||||
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
// ... and compute the matrix:
|
||||
// In order to make code a bit nicer, we assume:
|
||||
// - Channel dropdowns start with 'None', then 0 to 7
|
||||
|
||||
// 1. Assign the servo/motor/none for each channel
|
||||
// Disable all
|
||||
foreach(QString mixer, mixerTypes) {
|
||||
field = obj->getField(mixer);
|
||||
Q_ASSERT(field);
|
||||
field->setValue("Disabled");
|
||||
}
|
||||
// and set only the relevant channels:
|
||||
// Engine
|
||||
int tmpVal = m_aircraft->fwEngineChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Motor");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// First of all reset the vector
|
||||
resetField(field);
|
||||
int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(127, ti);
|
||||
// foreach(QString mixer, mixerTypes) {
|
||||
// field = obj->getField(mixer);
|
||||
// Q_ASSERT(field);
|
||||
// field->setValue("Disabled");
|
||||
// }
|
||||
// // and set only the relevant channels:
|
||||
// // Engine
|
||||
// int tmpVal = m_aircraft->fwEngineChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Motor");
|
||||
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// // First of all reset the vector
|
||||
// resetField(field);
|
||||
// int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
// field->setValue(127, ti);
|
||||
|
||||
// Rudder
|
||||
tmpVal = m_aircraft->fwRudder1ChannelBox->currentIndex()-1;
|
||||
// tmpVal will be -1 if rudder is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(127, ti);
|
||||
} // Else: we have no rudder, only ailerons, we're fine with it.
|
||||
// // Rudder
|
||||
// tmpVal = m_aircraft->fwRudder1ChannelBox->currentIndex()-1;
|
||||
// // tmpVal will be -1 if rudder is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(127, ti);
|
||||
// } // Else: we have no rudder, only ailerons, we're fine with it.
|
||||
|
||||
// Ailerons
|
||||
tmpVal = m_aircraft->fwAileron1ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(127, ti);
|
||||
// Only set Aileron 2 if Aileron 1 is defined
|
||||
tmpVal = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(127, ti);
|
||||
}
|
||||
} // Else we have no ailerons. Our consistency check guarantees we have
|
||||
// rudder in this case, so we're fine with it too.
|
||||
// // Ailerons
|
||||
// tmpVal = m_aircraft->fwAileron1ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue(127, ti);
|
||||
// // Only set Aileron 2 if Aileron 1 is defined
|
||||
// tmpVal = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue(127, ti);
|
||||
// }
|
||||
// } // Else we have no ailerons. Our consistency check guarantees we have
|
||||
// // rudder in this case, so we're fine with it too.
|
||||
|
||||
// Elevator
|
||||
tmpVal = m_aircraft->fwElevator1ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue(127, ti);
|
||||
// Only set Elevator 2 if it is defined
|
||||
tmpVal = m_aircraft->fwElevator2ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue(127, ti);
|
||||
}
|
||||
// // Elevator
|
||||
// tmpVal = m_aircraft->fwElevator1ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue(127, ti);
|
||||
// // Only set Elevator 2 if it is defined
|
||||
// tmpVal = m_aircraft->fwElevator2ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue(127, ti);
|
||||
// }
|
||||
|
||||
obj->updated();
|
||||
// obj->updated();
|
||||
m_aircraft->fwStatusLabel->setText("Mixer generated");
|
||||
|
||||
return true;
|
||||
@ -417,83 +453,121 @@ bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType)
|
||||
|
||||
SetConfigData(config);
|
||||
|
||||
UAVDataObject* obj;
|
||||
UAVObjectField* field;
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
int channel;
|
||||
double value;
|
||||
//disable all
|
||||
for (channel=0; channel<VehicleConfig::CHANNEL_NUMELEM; channel++)
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_DISABLED);
|
||||
|
||||
//motor
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
// Save the curve:
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// Q_ASSERT(obj);
|
||||
// ... and compute the matrix:
|
||||
// In order to make code a bit nicer, we assume:
|
||||
// - Channel dropdowns start with 'None', then 0 to 7
|
||||
|
||||
// 1. Assign the servo/motor/none for each channel
|
||||
// Disable all
|
||||
foreach(QString mixer, mixerTypes) {
|
||||
field = obj->getField(mixer);
|
||||
Q_ASSERT(field);
|
||||
field->setValue("Disabled");
|
||||
}
|
||||
// and set only the relevant channels:
|
||||
// Engine
|
||||
int tmpVal = m_aircraft->fwEngineChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Motor");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// First of all reset the vector
|
||||
resetField(field);
|
||||
int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(127, ti);
|
||||
// foreach(QString mixer, mixerTypes) {
|
||||
// field = obj->getField(mixer);
|
||||
// Q_ASSERT(field);
|
||||
// field->setValue("Disabled");
|
||||
// }
|
||||
// // and set only the relevant channels:
|
||||
// // Engine
|
||||
// int tmpVal = m_aircraft->fwEngineChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Motor");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// // First of all reset the vector
|
||||
// resetField(field);
|
||||
// int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
// field->setValue(127, ti);
|
||||
|
||||
// Rudder 1
|
||||
tmpVal = m_aircraft->fwRudder1ChannelBox->currentIndex()-1;
|
||||
// tmpVal will be -1 if rudder 1 is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(127, ti);
|
||||
} // Else: we have no rudder, only elevons, we're fine with it.
|
||||
// // Rudder 1
|
||||
// tmpVal = m_aircraft->fwRudder1ChannelBox->currentIndex()-1;
|
||||
// // tmpVal will be -1 if rudder 1 is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(127, ti);
|
||||
// } // Else: we have no rudder, only elevons, we're fine with it.
|
||||
|
||||
// Rudder 2
|
||||
tmpVal = m_aircraft->fwRudder2ChannelBox->currentIndex()-1;
|
||||
// tmpVal will be -1 if rudder 2 is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(-127, ti);
|
||||
} // Else: we have no rudder, only elevons, we're fine with it.
|
||||
// // Rudder 2
|
||||
// tmpVal = m_aircraft->fwRudder2ChannelBox->currentIndex()-1;
|
||||
// // tmpVal will be -1 if rudder 2 is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(-127, ti);
|
||||
// } // Else: we have no rudder, only elevons, we're fine with it.
|
||||
|
||||
tmpVal = m_aircraft->fwAileron1ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue((double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
}
|
||||
// tmpVal = m_aircraft->fwAileron1ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue((double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
// }
|
||||
|
||||
tmpVal = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(-(double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
}
|
||||
// tmpVal = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue(-(double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
// }
|
||||
|
||||
obj->updated();
|
||||
// obj->updated();
|
||||
m_aircraft->fwStatusLabel->setText("Mixer generated");
|
||||
return true;
|
||||
}
|
||||
@ -529,75 +603,121 @@ bool ConfigFixedWingWidget::setupFrameVtail(QString airframeType)
|
||||
|
||||
SetConfigData(config);
|
||||
|
||||
UAVDataObject* obj;
|
||||
UAVObjectField* field;
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
int channel;
|
||||
double value;
|
||||
//disable all
|
||||
for (channel=0; channel<VehicleConfig::CHANNEL_NUMELEM; channel++)
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_DISABLED);
|
||||
|
||||
//motor
|
||||
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);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 127);
|
||||
|
||||
channel = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, -127);
|
||||
}
|
||||
|
||||
//vtail
|
||||
channel = m_aircraft->fwElevator1ChannelBox->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_YAW, value);
|
||||
|
||||
channel = m_aircraft->fwElevator2ChannelBox->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_YAW, -value);
|
||||
}
|
||||
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
// ... and compute the matrix:
|
||||
// In order to make code a bit nicer, we assume:
|
||||
// - Channel dropdowns start with 'None', then 0 to 7
|
||||
|
||||
// 1. Assign the servo/motor/none for each channel
|
||||
// Disable all
|
||||
foreach(QString mixer, mixerTypes) {
|
||||
field = obj->getField(mixer);
|
||||
Q_ASSERT(field);
|
||||
field->setValue("Disabled");
|
||||
}
|
||||
// and set only the relevant channels:
|
||||
// Engine
|
||||
int tmpVal = m_aircraft->fwEngineChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Motor");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// First of all reset the vector
|
||||
resetField(field);
|
||||
int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(127, ti);
|
||||
// foreach(QString mixer, mixerTypes) {
|
||||
// field = obj->getField(mixer);
|
||||
// Q_ASSERT(field);
|
||||
// field->setValue("Disabled");
|
||||
// }
|
||||
// // and set only the relevant channels:
|
||||
// // Engine
|
||||
// int tmpVal = m_aircraft->fwEngineChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Motor");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// // First of all reset the vector
|
||||
// resetField(field);
|
||||
// int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
// field->setValue(127, ti);
|
||||
|
||||
// tmpVal = m_aircraft->fwAileron1ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue(127,ti);
|
||||
// }
|
||||
|
||||
tmpVal = m_aircraft->fwAileron1ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(127,ti);
|
||||
}
|
||||
// tmpVal = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue(-127,ti);
|
||||
// }
|
||||
|
||||
tmpVal = m_aircraft->fwAileron2ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(-127,ti);
|
||||
}
|
||||
// // Now compute the VTail
|
||||
// tmpVal = m_aircraft->fwElevator1ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue((double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
|
||||
// Now compute the VTail
|
||||
tmpVal = m_aircraft->fwElevator1ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue((double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
// tmpVal = m_aircraft->fwElevator2ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(-(double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
|
||||
tmpVal = m_aircraft->fwElevator2ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue((double)m_aircraft->elevonSlider2->value()*1.27, ti);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(-(double)m_aircraft->elevonSlider1->value()*1.27,ti);
|
||||
|
||||
obj->updated();
|
||||
// obj->updated();
|
||||
m_aircraft->fwStatusLabel->setText("Mixer generated");
|
||||
return true;
|
||||
}
|
||||
|
@ -257,14 +257,16 @@ void ConfigGroundVehicleWidget::refreshWidgetsValues(QString frameType)
|
||||
// Find the channel number for Motor1
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
int chMixerNumber = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
if (chMixerNumber >= 0) { // If for some reason the actuators were incoherent, we might fail here, hence the check.
|
||||
field = obj->getField(mixerVectors.at(chMixerNumber));
|
||||
int ti = field->getElementNames().indexOf("Roll");
|
||||
m_aircraft->differentialSteeringSlider1->setValue(field->getDouble(ti)*100);
|
||||
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
m_aircraft->differentialSteeringSlider2->setValue(field->getDouble(ti)*100);
|
||||
int channel = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
if (channel >= 0) { // If for some reason the actuators were incoherent, we might fail here, hence the check.
|
||||
// field = obj->getField(mixerVectors.at(chMixerNumber));
|
||||
// int ti = field->getElementNames().indexOf("Roll");
|
||||
// m_aircraft->differentialSteeringSlider1->setValue(field->getDouble(ti)*100);
|
||||
|
||||
m_aircraft->differentialSteeringSlider1->setValue(getMixerVectorValue(obj,channel,VehicleConfig::MIXERVECTOR_ROLL)*100);
|
||||
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
m_aircraft->differentialSteeringSlider2->setValue(getMixerVectorValue(obj,channel,VehicleConfig::MIXERVECTOR_PITCH)*100);
|
||||
}
|
||||
}
|
||||
if (frameType == "GroundVehicleMotorcycle") {
|
||||
@ -312,81 +314,109 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleMotorcycle(QString airframeTyp
|
||||
|
||||
SetConfigData(config);
|
||||
|
||||
UAVObject* obj;
|
||||
UAVObjectField* field;
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
// ... and compute the matrix:
|
||||
// In order to make code a bit nicer, we assume:
|
||||
// - Channel dropdowns start with 'None', then 0 to 7
|
||||
int channel;
|
||||
//disable all
|
||||
for (channel=0; channel<VehicleConfig::CHANNEL_NUMELEM; channel++) {
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_DISABLED);
|
||||
resetMixerVector(mixer, channel);
|
||||
}
|
||||
|
||||
//motor
|
||||
channel = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
|
||||
|
||||
//steering
|
||||
channel = m_aircraft->gvSteering1ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, -127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, -127);
|
||||
|
||||
//balance
|
||||
channel = m_aircraft->gvSteering2ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 127);
|
||||
|
||||
// UAVObject* obj;
|
||||
// UAVObjectField* field;
|
||||
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// Q_ASSERT(obj);
|
||||
// // ... and compute the matrix:
|
||||
// // In order to make code a bit nicer, we assume:
|
||||
// // - Channel dropdowns start with 'None', then 0 to 7
|
||||
|
||||
// 1. Assign the servo/motor/none for each channel
|
||||
// // 1. Assign the servo/motor/none for each channel
|
||||
|
||||
int tmpVal, ti;
|
||||
// int tmpVal, ti;
|
||||
|
||||
// Disable all output channels
|
||||
foreach(QString mixer, mixerTypes) {
|
||||
field = obj->getField(mixer);
|
||||
Q_ASSERT(field);
|
||||
// // Disable all output channels
|
||||
// foreach(QString mixer, mixerTypes) {
|
||||
// field = obj->getField(mixer);
|
||||
// Q_ASSERT(field);
|
||||
|
||||
//Disable output channel
|
||||
field->setValue("Disabled");
|
||||
// //Disable output channel
|
||||
// field->setValue("Disabled");
|
||||
|
||||
}
|
||||
// }
|
||||
|
||||
// Set all mixer values to zero
|
||||
foreach(QString mixer, mixerVectors) {
|
||||
field = obj->getField(mixer);
|
||||
resetField(field);
|
||||
// // Set all mixer values to zero
|
||||
// foreach(QString mixer, mixerVectors) {
|
||||
// field = obj->getField(mixer);
|
||||
// resetField(field);
|
||||
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve2");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(0, ti);
|
||||
}
|
||||
// ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
// field->setValue(0, ti);
|
||||
// ti = field->getElementNames().indexOf("ThrottleCurve2");
|
||||
// field->setValue(0, ti);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(0, ti);
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue(0, ti);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue(0, ti);
|
||||
// }
|
||||
|
||||
// Motor
|
||||
// Setup motor
|
||||
tmpVal = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve1"); //Set motor to full forward
|
||||
field->setValue(127, ti);
|
||||
// tmpVal = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("ThrottleCurve1"); //Set motor to full forward
|
||||
// field->setValue(127, ti);
|
||||
|
||||
//Steering
|
||||
// Setup steering
|
||||
tmpVal = m_aircraft->gvSteering1ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Yaw"); //Set steering response to roll
|
||||
field->setValue(-127, ti);
|
||||
ti = field->getElementNames().indexOf("Roll"); //Set steering response to roll
|
||||
field->setValue(-127, ti);
|
||||
// //Steering
|
||||
// // Setup steering
|
||||
// tmpVal = m_aircraft->gvSteering1ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Yaw"); //Set steering response to roll
|
||||
// field->setValue(-127, ti);
|
||||
// ti = field->getElementNames().indexOf("Roll"); //Set steering response to roll
|
||||
// field->setValue(-127, ti);
|
||||
|
||||
//Balancing
|
||||
// Setup balancing servo
|
||||
tmpVal = m_aircraft->gvSteering2ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Yaw"); //Set balance response to yaw
|
||||
field->setValue(127, ti);
|
||||
ti = field->getElementNames().indexOf("Roll"); //Set balance response to roll
|
||||
field->setValue(127, ti);
|
||||
// //Balancing
|
||||
// // Setup balancing servo
|
||||
// tmpVal = m_aircraft->gvSteering2ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Yaw"); //Set balance response to yaw
|
||||
// field->setValue(127, ti);
|
||||
// ti = field->getElementNames().indexOf("Roll"); //Set balance response to roll
|
||||
// field->setValue(127, ti);
|
||||
|
||||
obj->updated();
|
||||
// obj->updated();
|
||||
|
||||
//Output success message
|
||||
m_aircraft->gvStatusLabel->setText("Mixer generated");
|
||||
@ -423,70 +453,61 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleDifferential(QString airframeT
|
||||
|
||||
SetConfigData((config));
|
||||
|
||||
UAVObject* obj;
|
||||
UAVObjectField* field;
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
int channel;
|
||||
//disable all
|
||||
for (channel=0; channel<VehicleConfig::CHANNEL_NUMELEM; channel++) {
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_DISABLED);
|
||||
resetMixerVector(mixer, channel);
|
||||
}
|
||||
|
||||
//left motor
|
||||
channel = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
|
||||
|
||||
//right motor
|
||||
channel = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, -127);
|
||||
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
// ... and compute the matrix:
|
||||
// In order to make code a bit nicer, we assume:
|
||||
// - Channel dropdowns start with 'None', then 0 to 7
|
||||
|
||||
// 1. Assign the servo/motor/none for each channel
|
||||
|
||||
int tmpVal, ti;
|
||||
|
||||
// Disable all output channels
|
||||
foreach(QString mixer, mixerTypes) {
|
||||
field = obj->getField(mixer);
|
||||
Q_ASSERT(field);
|
||||
|
||||
//Disable output channel
|
||||
field->setValue("Disabled");
|
||||
|
||||
}
|
||||
|
||||
// Set all mixer values to zero
|
||||
foreach(QString mixer, mixerVectors) {
|
||||
field = obj->getField(mixer);
|
||||
resetField(field);
|
||||
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve2");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(0, ti);
|
||||
}
|
||||
|
||||
// int tmpVal, ti;
|
||||
|
||||
|
||||
// Motor
|
||||
// Setup left motor
|
||||
tmpVal = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve1"); //Set motor to full forward
|
||||
field->setValue(127, ti);
|
||||
ti = field->getElementNames().indexOf("Yaw"); //Set motor to turn right with increasing throttle
|
||||
field->setValue(127, ti);
|
||||
// tmpVal = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("ThrottleCurve1"); //Set motor to full forward
|
||||
// field->setValue(127, ti);
|
||||
// ti = field->getElementNames().indexOf("Yaw"); //Set motor to turn right with increasing throttle
|
||||
// field->setValue(127, ti);
|
||||
|
||||
// Setup right motor
|
||||
tmpVal = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve2"); //Set motor to full forward
|
||||
field->setValue(127, ti);
|
||||
ti = field->getElementNames().indexOf("Yaw"); //Set motor to turn left with increasing throttle
|
||||
field->setValue(-127, ti);
|
||||
// // Setup right motor
|
||||
// tmpVal = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo"); //Set motor mixer type to Servo
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("ThrottleCurve2"); //Set motor to full forward
|
||||
// field->setValue(127, ti);
|
||||
// ti = field->getElementNames().indexOf("Yaw"); //Set motor to turn left with increasing throttle
|
||||
// field->setValue(-127, ti);
|
||||
|
||||
obj->updated();
|
||||
// obj->updated();
|
||||
|
||||
//Output success message
|
||||
m_aircraft->gvStatusLabel->setText("Mixer generated");
|
||||
@ -544,96 +565,88 @@ bool ConfigGroundVehicleWidget::setupGroundVehicleCar(QString airframeType)
|
||||
config.ground.GroundVehicleSteering2 = m_aircraft->gvSteering2ChannelBox->currentIndex();
|
||||
|
||||
SetConfigData(config);
|
||||
|
||||
UAVDataObject* obj;
|
||||
UAVObjectField* field;
|
||||
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
int channel;
|
||||
//disable all
|
||||
for (channel=0; channel<VehicleConfig::CHANNEL_NUMELEM; channel++) {
|
||||
setMixerType(mixer,channel,VehicleConfig::MIXERTYPE_DISABLED);
|
||||
resetMixerVector(mixer, channel);
|
||||
}
|
||||
|
||||
channel = m_aircraft->gvSteering1ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer,channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
|
||||
|
||||
channel = m_aircraft->gvSteering2ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer,channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, -127);
|
||||
|
||||
channel = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer,channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
|
||||
|
||||
channel = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
setMixerType(mixer,channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127);
|
||||
|
||||
// ... and compute the matrix:
|
||||
// In order to make code a bit nicer, we assume:
|
||||
// - Channel dropdowns start with 'None', then 0 to 7
|
||||
|
||||
// 1. Assign the servo/motor/none for each channel
|
||||
|
||||
int tmpVal, ti;
|
||||
|
||||
// Disable all output channels
|
||||
foreach(QString mixer, mixerTypes) {
|
||||
field = obj->getField(mixer);
|
||||
Q_ASSERT(field);
|
||||
|
||||
//Disable output channel
|
||||
field->setValue("Disabled");
|
||||
|
||||
}
|
||||
|
||||
// Set all mixer values to zero
|
||||
foreach(QString mixer, mixerVectors) {
|
||||
field = obj->getField(mixer);
|
||||
resetField(field);
|
||||
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve2");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue(0, ti);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(0, ti);
|
||||
}
|
||||
|
||||
// Steering
|
||||
// Only set front steering if it is defined
|
||||
tmpVal = m_aircraft->gvSteering1ChannelBox->currentIndex()-1;
|
||||
// tmpVal will be -1 if steering is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(127, ti);
|
||||
} // Else: we have no front steering. We're fine with it as long as we have rear steering
|
||||
// tmpVal = m_aircraft->gvSteering1ChannelBox->currentIndex()-1;
|
||||
// // tmpVal will be -1 if steering is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(127, ti);
|
||||
// } // Else: we have no front steering. We're fine with it as long as we have rear steering
|
||||
|
||||
// Only set rear steering if it is defined
|
||||
tmpVal = m_aircraft->gvSteering2ChannelBox->currentIndex()-1;
|
||||
// tmpVal will be -1 if steering is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(-127, ti);
|
||||
} // Else: we have no rear steering. We're fine with it as long as we have front steering
|
||||
// // Only set rear steering if it is defined
|
||||
// tmpVal = m_aircraft->gvSteering2ChannelBox->currentIndex()-1;
|
||||
// // tmpVal will be -1 if steering is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(-127, ti);
|
||||
// } // Else: we have no rear steering. We're fine with it as long as we have front steering
|
||||
|
||||
// Motor
|
||||
// Only set front motor if it is defined
|
||||
tmpVal = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(127, ti);
|
||||
}
|
||||
// // Motor
|
||||
// // Only set front motor if it is defined
|
||||
// tmpVal = m_aircraft->gvMotor1ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
// field->setValue(127, ti);
|
||||
// }
|
||||
|
||||
// Only set rear motor if it is defined
|
||||
tmpVal = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
ti = field->getElementNames().indexOf("ThrottleCurve2");
|
||||
field->setValue(127, ti);
|
||||
}
|
||||
// // Only set rear motor if it is defined
|
||||
// tmpVal = m_aircraft->gvMotor2ChannelBox->currentIndex()-1;
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// ti = field->getElementNames().indexOf("ThrottleCurve2");
|
||||
// field->setValue(127, ti);
|
||||
// }
|
||||
|
||||
obj->updated();
|
||||
// obj->updated();
|
||||
|
||||
//Output success message
|
||||
m_aircraft->gvStatusLabel->setText("Mixer generated");
|
||||
|
@ -52,9 +52,6 @@
|
||||
ConfigMultiRotorWidget::ConfigMultiRotorWidget(Ui_AircraftWidget *aircraft, QWidget *parent) : VehicleConfig(parent)
|
||||
{
|
||||
m_aircraft = aircraft;
|
||||
|
||||
//connect(m_aircraft->multirotorFrameType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString)));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -529,15 +526,25 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
|
||||
{ 0, 0, 0}
|
||||
};
|
||||
setupMultiRotorMixer(mixer);
|
||||
|
||||
int tmpVal = m_aircraft->triYawChannelBox->currentIndex()-1;
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
field = obj->getField(mixerTypes.at(tmpVal));
|
||||
field->setValue("Servo");
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
resetField(field);
|
||||
int ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(127,ti);
|
||||
|
||||
//tell the mixer about tricopter yaw channel
|
||||
UAVDataObject* mixerObj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixerObj);
|
||||
|
||||
int channel = m_aircraft->triYawChannelBox->currentIndex()-1;
|
||||
if (channel > -1){
|
||||
setMixerType(mixerObj, channel, VehicleConfig::MIXERTYPE_SERVO);
|
||||
setMixerVectorValue(mixerObj, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
|
||||
}
|
||||
|
||||
// int tmpVal = m_aircraft->triYawChannelBox->currentIndex()-1;
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// field = obj->getField(mixerTypes.at(tmpVal));
|
||||
// field->setValue("Servo");
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// resetField(field);
|
||||
// int ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(127,ti);
|
||||
|
||||
m_aircraft->mrStatusLabel->setText("SUCCESS: Mixer Saved OK");
|
||||
|
||||
@ -553,12 +560,15 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
|
||||
*/
|
||||
void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
{
|
||||
int channel;
|
||||
double value;
|
||||
|
||||
GUIConfigDataUnion config = GetConfigData();
|
||||
multiGUISettingsStruct multi = config.multi;
|
||||
|
||||
UAVDataObject* obj;
|
||||
UAVObjectField *field;
|
||||
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
if (frameType == "QuadP") {
|
||||
// Motors 1/2/3/4 are: N / E / S / W
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorN);
|
||||
@ -569,24 +579,41 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
// 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.
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = field->getDouble(i)/1.27;
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = (1-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = -field->getDouble(i)/1.27;
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
}
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( value/1.27 );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( 1-value/1.27 );
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1;
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( -value/1.27);
|
||||
|
||||
}
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = field->getDouble(i)/1.27;
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = (1-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
|
||||
// tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = -field->getDouble(i)/1.27;
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// }
|
||||
|
||||
} else if (frameType == "QuadX") {
|
||||
// Motors 1/2/3/4 are: NW / NE / SE / SW
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox1,multi.VTOLMotorNW);
|
||||
@ -594,25 +621,38 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox3,multi.VTOLMotorSE);
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorSW);
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( value/1.27 );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( 1-value/1.27 );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( value/1.27);
|
||||
|
||||
}
|
||||
// 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.
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = field->getDouble(i)/1.27;
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = 1-field->getDouble(i)/1.27;
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = field->getDouble(i)/1.27;
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
}
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// Q_ASSERT(obj);
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = field->getDouble(i)/1.27;
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = 1-field->getDouble(i)/1.27;
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = field->getDouble(i)/1.27;
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// }
|
||||
} else if (frameType == "Hexa") {
|
||||
// Motors 1/2/3 4/5/6 are: N / NE / SE / S / SW / NW
|
||||
|
||||
@ -623,29 +663,44 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox5,multi.VTOLMotorSW);
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorNW);
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( floor(value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( floor(-value/1.27) );
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1;
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( floor(1-value/1.27) );
|
||||
|
||||
}
|
||||
|
||||
// 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.
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
if(tmpVal>-1)
|
||||
{
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(1-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
}
|
||||
}
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
// tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
// if(tmpVal>-1)
|
||||
// {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(1-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// }
|
||||
// }
|
||||
} else if (frameType == "HexaX") {
|
||||
// Motors 1/2/3 4/5/6 are: NE / E / SE / SW / W / NW
|
||||
|
||||
@ -657,26 +712,41 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorNW);
|
||||
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( floor(value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( floor(-value/1.27) );
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1;
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( floor(1-value/1.27) );
|
||||
|
||||
}
|
||||
|
||||
// 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.
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(1-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
}
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
// tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(1-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// }
|
||||
} else if (frameType == "HexaCoax") {
|
||||
// Motors 1/2/3 4/5/6 are: NW/W NE/E S/SE
|
||||
|
||||
@ -688,24 +758,39 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox6,multi.VTOLMotorSE);
|
||||
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( value/1.27 );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( value/1.27 );
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1;
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( value/1.27);
|
||||
|
||||
}
|
||||
|
||||
// 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.
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = floor(2*field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
}
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = floor(2*field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// }
|
||||
} else if (frameType == "Octo" || frameType == "OctoV" ||
|
||||
frameType == "OctoCoaxP") {
|
||||
// Motors 1 to 8 are N / NE / E / etc
|
||||
@ -720,56 +805,102 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox8,multi.VTOLMotorNW);
|
||||
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
if (frameType == "Octo") {
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( floor(value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( floor(-value/1.27) );
|
||||
|
||||
//change channelboxes
|
||||
channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1;
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( floor(-value/1.27) );
|
||||
}
|
||||
else if (frameType == "OctoV") {
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( floor(value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( floor(-value/1.27) );
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox2->currentIndex() - 1;
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( floor(-value/1.27) );
|
||||
}
|
||||
else if (frameType == "OctoCoaxP") {
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( floor(value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( floor(-value/1.27) );
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox3->currentIndex() - 1;
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( floor(-value/1.27) );
|
||||
}
|
||||
|
||||
}
|
||||
// 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.
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
if (frameType == "Octo") {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
} else if (frameType == "OctoV") {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Yaw");
|
||||
double val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
i = field->getElementNames().indexOf("Pitch");
|
||||
val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// if (frameType == "Octo") {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
|
||||
// tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
|
||||
// } else if (frameType == "OctoV") {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Yaw");
|
||||
// double val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
|
||||
// tmpVal = m_aircraft->multiMotorChannelBox2->currentIndex()-1;
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// i = field->getElementNames().indexOf("Pitch");
|
||||
// val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
|
||||
} else if (frameType == "OctoCoaxP") {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
tmpVal = m_aircraft->multiMotorChannelBox3->currentIndex()-1;
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// } else if (frameType == "OctoCoaxP") {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
|
||||
// tmpVal = m_aircraft->multiMotorChannelBox3->currentIndex()-1;
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
|
||||
}
|
||||
}
|
||||
// }
|
||||
// }
|
||||
} else if (frameType == "OctoCoaxX") {
|
||||
// Motors 1 to 8 are N / NE / E / etc
|
||||
|
||||
@ -782,25 +913,38 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox7,multi.VTOLMotorSW);
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox8,multi.VTOLMotorW);
|
||||
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( floor(value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW);
|
||||
m_aircraft->mrYawMixLevel->setValue( floor(-value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( floor(value/1.27) );
|
||||
}
|
||||
|
||||
|
||||
// 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.
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Yaw");
|
||||
val = floor(-field->getDouble(i)/1.27);
|
||||
m_aircraft->mrYawMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
}
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Yaw");
|
||||
// val = floor(-field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrYawMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// }
|
||||
} else if (frameType == "Tri") {
|
||||
// Motors 1 to 8 are N / NE / E / etc
|
||||
|
||||
@ -810,18 +954,29 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
|
||||
setComboCurrentIndex(m_aircraft->multiMotorChannelBox4,multi.VTOLMotorS);
|
||||
setComboCurrentIndex(m_aircraft->triYawChannelBox,multi.TRIYaw);
|
||||
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// tmpVal will be -1 if value is set to "None"
|
||||
if (tmpVal > -1) {
|
||||
field = obj->getField(mixerVectors.at(tmpVal));
|
||||
int i = field->getElementNames().indexOf("Pitch");
|
||||
double val = floor(2*field->getDouble(i)/1.27);
|
||||
m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
i = field->getElementNames().indexOf("Roll");
|
||||
val = floor(field->getDouble(i)/1.27);
|
||||
m_aircraft->mrRollMixLevel->setValue(val);
|
||||
}
|
||||
channel = m_aircraft->multiMotorChannelBox1->currentIndex() - 1;
|
||||
if (channel > -1)
|
||||
{
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH);
|
||||
m_aircraft->mrPitchMixLevel->setValue( floor(2*value/1.27) );
|
||||
|
||||
value = getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL);
|
||||
m_aircraft->mrRollMixLevel->setValue( floor(value/1.27) );
|
||||
|
||||
}
|
||||
|
||||
// obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
// int tmpVal= m_aircraft->multiMotorChannelBox1->currentIndex()-1;
|
||||
// // tmpVal will be -1 if value is set to "None"
|
||||
// if (tmpVal > -1) {
|
||||
// field = obj->getField(mixerVectors.at(tmpVal));
|
||||
// int i = field->getElementNames().indexOf("Pitch");
|
||||
// double val = floor(2*field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrPitchMixLevel->setValue(val);
|
||||
// i = field->getElementNames().indexOf("Roll");
|
||||
// val = floor(field->getDouble(i)/1.27);
|
||||
// m_aircraft->mrRollMixLevel->setValue(val);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@ -834,24 +989,33 @@ void ConfigMultiRotorWidget::setupQuadMotor(int channel, double pitch, double ro
|
||||
{
|
||||
qDebug()<<QString("Setup quad motor channel=%0 pitch=%1 roll=%2 yaw=%3").arg(channel).arg(pitch).arg(roll).arg(yaw);
|
||||
|
||||
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(obj);
|
||||
UAVObjectField *field = obj->getField(mixerTypes.at(channel));
|
||||
field->setValue("Motor");
|
||||
field = obj->getField(mixerVectors.at(channel));
|
||||
// First of all reset the vector
|
||||
resetField(field);
|
||||
int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
field->setValue(127, ti);
|
||||
ti = field->getElementNames().indexOf("Roll");
|
||||
field->setValue(roll*127,ti);
|
||||
qDebug()<<"Set roll="<<roll*127;
|
||||
ti = field->getElementNames().indexOf("Pitch");
|
||||
field->setValue(pitch*127,ti);
|
||||
qDebug()<<"Set pitch="<<pitch*127;
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(yaw*127,ti);
|
||||
qDebug()<<"Set yaw="<<yaw*127;
|
||||
UAVDataObject* mixer = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_MOTOR);
|
||||
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 0);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, roll*127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, pitch*127);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, yaw*127);
|
||||
|
||||
// UAVObjectField *field = obj->getField(mixerTypes.at(channel));
|
||||
// field->setValue("Motor");
|
||||
// field = obj->getField(mixerVectors.at(channel));
|
||||
// // First of all reset the vector
|
||||
// resetField(field);
|
||||
// int ti = field->getElementNames().indexOf("ThrottleCurve1");
|
||||
// field->setValue(127, ti);
|
||||
// ti = field->getElementNames().indexOf("Roll");
|
||||
// field->setValue(roll*127,ti);
|
||||
// qDebug()<<"Set roll="<<roll*127;
|
||||
// ti = field->getElementNames().indexOf("Pitch");
|
||||
// field->setValue(pitch*127,ti);
|
||||
// qDebug()<<"Set pitch="<<pitch*127;
|
||||
// ti = field->getElementNames().indexOf("Yaw");
|
||||
// field->setValue(yaw*127,ti);
|
||||
// qDebug()<<"Set yaw="<<yaw*127;
|
||||
}
|
||||
|
||||
|
||||
|
@ -43,6 +43,15 @@ VehicleConfig::VehicleConfig(QWidget *parent) : ConfigTaskWidget(parent)
|
||||
mixerVectors << QString("Mixer%1Vector").arg(i+1);
|
||||
channelNames << QString("Channel%1").arg(i+1);
|
||||
}
|
||||
|
||||
// typedef enum { MIXERTYPE_DISABLED=0, MIXERTYPE_MOTOR=1, MIXERTYPE_SERVO=2,
|
||||
//MIXERTYPE_CAMERAROLL=3, MIXERTYPE_CAMERAPITCH=4, MIXERTYPE_CAMERAYAW=5,
|
||||
//MIXERTYPE_ACCESSORY0=6, MIXERTYPE_ACCESSORY1=7, MIXERTYPE_ACCESSORY2=8,
|
||||
//MIXERTYPE_ACCESSORY3=9, MIXERTYPE_ACCESSORY4=10, MIXERTYPE_ACCESSORY5=11 } MixerTypeElem;
|
||||
|
||||
mixerTypeDescriptions << "Disabled" << "Motor" << "Servo" << "CameraRoll" << "CameraPitch"
|
||||
<< "CameraYaw" << "Accessory0" << "Accessory1" << "Accessory2"
|
||||
<< "Accessory3" << "Accessory4" << "Accessory5";
|
||||
}
|
||||
|
||||
VehicleConfig::~VehicleConfig()
|
||||
@ -133,6 +142,89 @@ void VehicleConfig::enableComboBox(QWidget* owner, QString boxName, bool enable)
|
||||
box->setEnabled(enable);
|
||||
}
|
||||
|
||||
QString VehicleConfig::getMixerType(UAVDataObject* mixer, int channel)
|
||||
{
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
QString mixerType = mixerTypeDescriptions[0]; //default to disabled
|
||||
|
||||
if (channel >= 0 && channel < mixerTypes.count()) {
|
||||
UAVObjectField *field = mixer->getField(mixerTypes.at(channel));
|
||||
Q_ASSERT(field);
|
||||
|
||||
if (field)
|
||||
mixerType = field->getValue().toString();
|
||||
}
|
||||
|
||||
return mixerType;
|
||||
}
|
||||
|
||||
void VehicleConfig::setMixerType(UAVDataObject* mixer, int channel, MixerTypeElem mixerType)
|
||||
{
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
qDebug() << QString("setMixerType channel %0, type %1").arg(channel).arg(mixerType);
|
||||
|
||||
if (channel >= 0 && channel < mixerTypes.count()) {
|
||||
UAVObjectField *field = mixer->getField(mixerTypes.at(channel));
|
||||
Q_ASSERT(field);
|
||||
|
||||
if (field) {
|
||||
if (mixerType >= 0 && mixerType < mixerTypeDescriptions.count())
|
||||
{
|
||||
field->setValue(mixerTypeDescriptions[mixerType]);
|
||||
mixer->updated();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VehicleConfig::resetMixerVector(UAVDataObject* mixer, int channel)
|
||||
{
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
if (channel >= 0 && channel < mixerVectors.count()) {
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 0);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 0);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, 0);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 0);
|
||||
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 0);
|
||||
}
|
||||
}
|
||||
|
||||
double VehicleConfig::getMixerVectorValue(UAVDataObject* mixer, int channel, MixerVectorElem elementName)
|
||||
{
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
double value = 0;
|
||||
|
||||
if (channel >= 0 && channel < mixerVectors.count()) {
|
||||
UAVObjectField *field = mixer->getField(mixerVectors.at(channel));
|
||||
Q_ASSERT(field);
|
||||
|
||||
if (field) {
|
||||
value = field->getDouble(elementName);
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
void VehicleConfig::setMixerVectorValue(UAVDataObject* mixer, int channel, MixerVectorElem elementName, double value)
|
||||
{
|
||||
Q_ASSERT(mixer);
|
||||
|
||||
qDebug() << QString("setMixerVectorValue channel %0, name %1, value %2").arg(channel).arg(elementName).arg(value);
|
||||
|
||||
if (channel >= 0 && channel < mixerVectors.count()) {
|
||||
UAVObjectField *field = mixer->getField(mixerVectors.at(channel));
|
||||
Q_ASSERT(field);
|
||||
|
||||
if (field) {
|
||||
field->setDouble(value, elementName);
|
||||
mixer->updated();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Reset the contents of a field
|
||||
|
@ -111,18 +111,30 @@ class VehicleConfig: public ConfigTaskWidget
|
||||
VehicleConfig(QWidget *parent = 0);
|
||||
~VehicleConfig();
|
||||
|
||||
/* Enumeration options for field MixerType */
|
||||
typedef enum { MIXERTYPE_DISABLED=0, MIXERTYPE_MOTOR=1, MIXERTYPE_SERVO=2, MIXERTYPE_CAMERAROLL=3, MIXERTYPE_CAMERAPITCH=4, MIXERTYPE_CAMERAYAW=5, MIXERTYPE_ACCESSORY0=6, MIXERTYPE_ACCESSORY1=7, MIXERTYPE_ACCESSORY2=8, MIXERTYPE_ACCESSORY3=9, MIXERTYPE_ACCESSORY4=10, MIXERTYPE_ACCESSORY5=11 } MixerTypeElem;
|
||||
/* Array element names for field MixerVector */
|
||||
typedef enum { MIXERVECTOR_THROTTLECURVE1=0, MIXERVECTOR_THROTTLECURVE2=1, MIXERVECTOR_ROLL=2, MIXERVECTOR_PITCH=3, MIXERVECTOR_YAW=4 } MixerVectorElem;
|
||||
|
||||
static GUIConfigDataUnion GetConfigData();
|
||||
static void SetConfigData(GUIConfigDataUnion configData);
|
||||
static void resetField(UAVObjectField * field);
|
||||
static void setComboCurrentIndex(QComboBox* box, int index);
|
||||
static void enableComboBox(QWidget* owner, QString boxName, bool enable);
|
||||
|
||||
double getMixerVectorValue(UAVDataObject* mixer, int channel, MixerVectorElem elementName);
|
||||
void setMixerVectorValue(UAVDataObject* mixer, int channel, MixerVectorElem elementName, double value);
|
||||
void resetMixerVector(UAVDataObject* mixer, int channel);
|
||||
QString getMixerType(UAVDataObject* mixer, int channel);
|
||||
void setMixerType(UAVDataObject* mixer, int channel, MixerTypeElem mixerType);
|
||||
|
||||
virtual void ResetActuators(GUIConfigDataUnion* configData);
|
||||
virtual QStringList getChannelDescriptions();
|
||||
|
||||
QStringList channelNames;
|
||||
QStringList mixerTypes;
|
||||
QStringList mixerVectors;
|
||||
QStringList mixerTypeDescriptions;
|
||||
|
||||
static const quint32 CHANNEL_NUMELEM = 10;
|
||||
|
||||
|
@ -861,6 +861,9 @@ void ConfigVehicleTypeWidget::updateCustomAirframeUI()
|
||||
*/
|
||||
void ConfigVehicleTypeWidget::updateObjectsFromWidgets()
|
||||
{
|
||||
UAVDataObject* obj;
|
||||
UAVObjectField* field;
|
||||
|
||||
QString airframeType = "Custom"; //Sets airframe type default to "Custom"
|
||||
if (m_aircraft->aircraftType->currentText() == "Fixed Wing") {
|
||||
airframeType = m_fixedwing->updateConfigObjectsFromWidgets();
|
||||
@ -874,9 +877,9 @@ void ConfigVehicleTypeWidget::updateObjectsFromWidgets()
|
||||
else if (m_aircraft->aircraftType->currentText() == "Ground") {
|
||||
airframeType = m_groundvehicle->updateConfigObjectsFromWidgets();
|
||||
}
|
||||
|
||||
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
UAVObjectField* field = obj->getField(QString("FeedForward"));
|
||||
else {
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||
field = obj->getField(QString("FeedForward"));
|
||||
|
||||
// Curve is also common to all quads:
|
||||
field = obj->getField("ThrottleCurve1");
|
||||
@ -909,7 +912,7 @@ void ConfigVehicleTypeWidget::updateObjectsFromWidgets()
|
||||
ti = field->getElementNames().indexOf("Yaw");
|
||||
field->setValue(m_aircraft->customMixerTable->item(5,i)->text(),ti);
|
||||
}
|
||||
|
||||
}
|
||||
// set the airframe type
|
||||
obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("SystemSettings")));
|
||||
field = obj->getField(QString("AirframeType"));
|
||||
|
@ -1,25 +1,6 @@
|
||||
<xml>
|
||||
<object name="ActuatorSettings" singleinstance="true" settings="true">
|
||||
<description>Settings for the @ref ActuatorModule that controls the channel assignments for the mixer based on AircraftType</description>
|
||||
<field name="FixedWingRoll1" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="FixedWingRoll2" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="FixedWingPitch1" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="FixedWingPitch2" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="FixedWingYaw1" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="FixedWingYaw2" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="FixedWingThrottle" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorN" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorNE" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorE" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorSE" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorS" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorSW" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorW" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="VTOLMotorNW" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="GroundVehicleThrottle1" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="GroundVehicleThrottle2" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="GroundVehicleSteering1" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="GroundVehicleSteering2" units="channel" type="enum" elements="1" options="Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9,Channel10,None" defaultvalue="None"/>
|
||||
<field name="ChannelUpdateFreq" units="Hz" type="uint16" elements="4" defaultvalue="50"/>
|
||||
<field name="ChannelMax" units="us" type="int16" elements="10" defaultvalue="1000"/>
|
||||
<field name="ChannelNeutral" units="us" type="int16" elements="10" defaultvalue="1000"/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user