mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-03-16 08:29:15 +01:00
add support for output channel assignment descriptions for helicp
This commit is contained in:
parent
c6526a07a4
commit
c066fdc5e6
@ -39,9 +39,11 @@
|
||||
#include <QMessageBox>
|
||||
#include <QDesktopServices>
|
||||
#include <QUrl>
|
||||
#include "mixersettings.h"
|
||||
#include "actuatorcommand.h"
|
||||
#include "actuatorsettings.h"
|
||||
#include "systemalarms.h"
|
||||
#include "systemsettings.h"
|
||||
#include "uavsettingsimportexport/uavsettingsimportexportfactory.h"
|
||||
|
||||
ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(parent),wasItMe(false)
|
||||
@ -56,9 +58,6 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
|
||||
UAVSettingsImportExportFactory * importexportplugin = pm->getObject<UAVSettingsImportExportFactory>();
|
||||
connect(importexportplugin,SIGNAL(importAboutToBegin()),this,SLOT(stopTests()));
|
||||
|
||||
addApplySaveButtons(m_config->saveRCOutputToRAM,m_config->saveRCOutputToSD);
|
||||
addUAVObject("ActuatorSettings");
|
||||
|
||||
// NOTE: we have channel indices from 0 to 9, but the convention for OP is Channel 1 to Channel 10.
|
||||
// Register for ActuatorSettings changes:
|
||||
for (unsigned int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++)
|
||||
@ -246,33 +245,50 @@ void ConfigOutputWidget::refreshWidgetsValues()
|
||||
{
|
||||
bool dirty=isDirty();
|
||||
|
||||
// Reset all channel assignements:
|
||||
QList<OutputChannelForm*> outputChannelForms = findChildren<OutputChannelForm*>();
|
||||
foreach(OutputChannelForm *outputChannelForm, outputChannelForms)
|
||||
{
|
||||
outputChannelForm->setAssignment("-");
|
||||
}
|
||||
|
||||
// FIXME: Use static accessor method for retrieving channel assignments
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
Q_ASSERT(pm);
|
||||
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
|
||||
Q_ASSERT(objManager);
|
||||
|
||||
// Get the channel assignements:
|
||||
UAVDataObject * obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("ActuatorSettings")));
|
||||
Q_ASSERT(obj);
|
||||
QList<UAVObjectField*> fieldList = obj->getFields();
|
||||
foreach (UAVObjectField* field, fieldList) {
|
||||
if (field->getUnits().contains("channel")) {
|
||||
assignOutputChannel(obj,field->getName());
|
||||
}
|
||||
}
|
||||
// Get System Settings
|
||||
SystemSettings * systemSettings = SystemSettings::GetInstance(getObjectManager());
|
||||
Q_ASSERT(systemSettings);
|
||||
SystemSettings::DataFields systemSettingsData = systemSettings->getData();
|
||||
|
||||
// Get Actuator Settings
|
||||
ActuatorSettings *actuatorSettings = ActuatorSettings::GetInstance(getObjectManager());
|
||||
Q_ASSERT(actuatorSettings);
|
||||
ActuatorSettings::DataFields actuatorSettingsData = actuatorSettings->getData();
|
||||
|
||||
// get helicp channel descriptions based on mixer settings
|
||||
QStringList heliChannelDesc = getChannelDescriptions();
|
||||
|
||||
// Initialize output forms
|
||||
QList<OutputChannelForm*> outputChannelForms = findChildren<OutputChannelForm*>();
|
||||
foreach(OutputChannelForm *outputChannelForm, outputChannelForms)
|
||||
{
|
||||
// init channel description
|
||||
if (systemSettingsData.AirframeType == SystemSettings::AIRFRAMETYPE_HELICP)
|
||||
outputChannelForm->setAssignment(heliChannelDesc[outputChannelForm->index()]);
|
||||
else
|
||||
outputChannelForm->setAssignment("-");
|
||||
|
||||
// init min,max,neutral
|
||||
int minValue = actuatorSettingsData.ChannelMin[outputChannelForm->index()];
|
||||
int maxValue = actuatorSettingsData.ChannelMax[outputChannelForm->index()];
|
||||
outputChannelForm->minmax(minValue, maxValue);
|
||||
|
||||
int neutral = actuatorSettingsData.ChannelNeutral[outputChannelForm->index()];
|
||||
outputChannelForm->neutral(neutral);
|
||||
}
|
||||
|
||||
// non-helicp channel descriptions
|
||||
if (systemSettingsData.AirframeType != SystemSettings::AIRFRAMETYPE_HELICP)
|
||||
{
|
||||
// get channel descriptions based on units=channel and fieldname
|
||||
QList<UAVObjectField*> fieldList = actuatorSettings->getFields();
|
||||
foreach (UAVObjectField* field, fieldList) {
|
||||
if (field->getUnits().contains("channel")) {
|
||||
assignOutputChannel(actuatorSettings,field->getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get the SpinWhileArmed setting
|
||||
m_config->spinningArmed->setChecked(actuatorSettingsData.MotorsSpinWhileArmed == ActuatorSettings::MOTORSSPINWHILEARMED_TRUE);
|
||||
|
||||
@ -288,6 +304,8 @@ void ConfigOutputWidget::refreshWidgetsValues()
|
||||
m_config->cb_outputRate1->setCurrentIndex(m_config->cb_outputRate1->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[0])));
|
||||
m_config->cb_outputRate2->setCurrentIndex(m_config->cb_outputRate2->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[1])));
|
||||
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
Q_ASSERT(pm);
|
||||
UAVObjectUtilManager* utilMngr = pm->getObject<UAVObjectUtilManager>();
|
||||
if (utilMngr) {
|
||||
int board = utilMngr->getBoardModel();
|
||||
@ -328,17 +346,6 @@ void ConfigOutputWidget::refreshWidgetsValues()
|
||||
}
|
||||
}
|
||||
|
||||
// Get Channel ranges:
|
||||
foreach(OutputChannelForm *outputChannelForm, outputChannelForms)
|
||||
{
|
||||
int minValue = actuatorSettingsData.ChannelMin[outputChannelForm->index()];
|
||||
int maxValue = actuatorSettingsData.ChannelMax[outputChannelForm->index()];
|
||||
outputChannelForm->minmax(minValue, maxValue);
|
||||
|
||||
int neutral = actuatorSettingsData.ChannelNeutral[outputChannelForm->index()];
|
||||
outputChannelForm->neutral(neutral);
|
||||
}
|
||||
|
||||
setDirty(dirty);
|
||||
}
|
||||
|
||||
@ -368,6 +375,92 @@ void ConfigOutputWidget::updateObjectsFromWidgets()
|
||||
// Apply settings
|
||||
actuatorSettings->setData(actuatorSettingsData);
|
||||
}
|
||||
QStringList ConfigOutputWidget::getChannelDescriptions()
|
||||
{
|
||||
QStringList channelDesc;
|
||||
int MixerDataFromHeli[8][5];
|
||||
quint8 MixerOutputType[8];
|
||||
int i;
|
||||
|
||||
// Get existing mixer settings
|
||||
MixerSettings * mixerSettings = MixerSettings::GetInstance(getObjectManager());
|
||||
Q_ASSERT(mixerSettings);
|
||||
MixerSettings::DataFields mixerSettingsData = mixerSettings->getData();
|
||||
|
||||
//go through the user data and update the mixer matrix
|
||||
for (i=0;i<5;i++)
|
||||
{
|
||||
MixerDataFromHeli[0][i] = mixerSettingsData.Mixer1Vector[i];
|
||||
MixerDataFromHeli[1][i] = mixerSettingsData.Mixer2Vector[i];
|
||||
MixerDataFromHeli[2][i] = mixerSettingsData.Mixer3Vector[i];
|
||||
MixerDataFromHeli[3][i] = mixerSettingsData.Mixer4Vector[i];
|
||||
MixerDataFromHeli[4][i] = mixerSettingsData.Mixer5Vector[i];
|
||||
MixerDataFromHeli[5][i] = mixerSettingsData.Mixer6Vector[i];
|
||||
MixerDataFromHeli[6][i] = mixerSettingsData.Mixer7Vector[i];
|
||||
MixerDataFromHeli[7][i] = mixerSettingsData.Mixer8Vector[i];
|
||||
}
|
||||
|
||||
MixerOutputType[0] = mixerSettingsData.Mixer1Type;
|
||||
MixerOutputType[1] = mixerSettingsData.Mixer2Type;
|
||||
MixerOutputType[2] = mixerSettingsData.Mixer3Type;
|
||||
MixerOutputType[3] = mixerSettingsData.Mixer4Type;
|
||||
MixerOutputType[4] = mixerSettingsData.Mixer5Type;
|
||||
MixerOutputType[5] = mixerSettingsData.Mixer6Type;
|
||||
MixerOutputType[6] = mixerSettingsData.Mixer7Type;
|
||||
MixerOutputType[7] = mixerSettingsData.Mixer8Type;
|
||||
|
||||
for (i=1; i <= (int)(ActuatorCommand::CHANNEL_NUMELEM); i++)
|
||||
{
|
||||
channelDesc.append(QString("-"));
|
||||
}
|
||||
|
||||
//process the data from the mixer and try to figure out the settings...
|
||||
for (i=0;i<8;i++)
|
||||
{
|
||||
//check if this is the engine... Throttle only
|
||||
if ((MixerOutputType[i] == MixerSettings::MIXER1TYPE_MOTOR)&&
|
||||
(MixerDataFromHeli[i][0]>0)&&//ThrottleCurve1
|
||||
(MixerDataFromHeli[i][1]==0)&&//ThrottleCurve2
|
||||
(MixerDataFromHeli[i][2]==0)&&//Roll
|
||||
(MixerDataFromHeli[i][3]==0)&&//Pitch
|
||||
(MixerDataFromHeli[i][4]==0))//Yaw
|
||||
{
|
||||
channelDesc[i] = "Throttle";
|
||||
}
|
||||
else if ((MixerDataFromHeli[i][0]>0)&& //ThrottleCurve1
|
||||
(MixerDataFromHeli[i][2]!=0)&&//Roll
|
||||
(MixerDataFromHeli[i][3]!=0)) //Pitch
|
||||
{
|
||||
channelDesc[i] = "Collective";
|
||||
}
|
||||
//check if this is the tail servo...
|
||||
else if ((MixerOutputType[i] == MixerSettings::MIXER1TYPE_SERVO)&&
|
||||
(MixerDataFromHeli[i][0]==0)&&//ThrottleCurve1
|
||||
(MixerDataFromHeli[i][1]==0)&&//ThrottleCurve2
|
||||
(MixerDataFromHeli[i][2]==0)&&//Roll
|
||||
(MixerDataFromHeli[i][3]==0)&&//Pitch
|
||||
(MixerDataFromHeli[i][4]>0))//Yaw
|
||||
{
|
||||
channelDesc[i] = "Tail";
|
||||
}
|
||||
//check if this is the elevator servo...
|
||||
else if ((MixerOutputType[i] == MixerSettings::MIXER1TYPE_SERVO)&&
|
||||
(MixerDataFromHeli[i][2]==0)&&//Roll
|
||||
(MixerDataFromHeli[i][3]!=0))//Pitch
|
||||
{
|
||||
channelDesc[i] = "Elevator";
|
||||
}
|
||||
//check if this is a swashplate servo...
|
||||
else if ((MixerOutputType[i] == MixerSettings::MIXER1TYPE_SERVO)&&
|
||||
(MixerDataFromHeli[i][2]!=0))//Roll
|
||||
{
|
||||
channelDesc[i] = QString("%1%2").arg("Roll").arg(i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return channelDesc;
|
||||
}
|
||||
|
||||
void ConfigOutputWidget::openHelp()
|
||||
{
|
||||
|
@ -57,8 +57,8 @@ private:
|
||||
|
||||
void assignChannel(UAVDataObject *obj, QString str);
|
||||
void assignOutputChannel(UAVDataObject *obj, QString str);
|
||||
OutputChannelForm* getOutputChannelForm(const int index) const;
|
||||
|
||||
OutputChannelForm* getOutputChannelForm(const int index) const;
|
||||
QStringList getChannelDescriptions();
|
||||
int mccDataRate;
|
||||
|
||||
UAVObject::Metadata accInitialData;
|
||||
|
Loading…
x
Reference in New Issue
Block a user