1
0
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:
Mike LaBranche 2012-05-09 15:24:15 -07:00
parent c6526a07a4
commit c066fdc5e6
2 changed files with 131 additions and 38 deletions

View File

@ -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()
{

View File

@ -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;