Skip to content

Commit b68c130

Browse files
committed
LP-551 setLimits() only set limits - Added checkChannelConfig() and checkOutputConfig() functions.
1 parent e69a7ad commit b68c130

3 files changed

Lines changed: 223 additions & 81 deletions

File tree

ground/gcs/src/plugins/config/configoutputwidget.cpp

Lines changed: 137 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
#define DEFAULT_MINOUTPUT_VALUE 1000
6161
#define REVMOTOR_NEUTRAL_TARGET_VALUE 1500
6262
#define REVMOTOR_NEUTRAL_DIFF_VALUE 150
63+
#define MOTOR_NEUTRAL_DIFF_VALUE 200
6364

6465
// Servo settings
6566
#define SERVO_MAXOUTPUT_RANGE 2500
@@ -68,8 +69,6 @@
6869
#define SERVO_MINOUTPUT_VALUE 1000
6970
#define SERVO_NEUTRAL_VALUE 1500
7071

71-
#define OUTPUT_WARNING_DISABLED -1
72-
7372
ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(parent)
7473
{
7574
m_ui = new Ui_OutputWidget();
@@ -80,7 +79,8 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
8079

8180
addAutoBindings();
8281

83-
m_ui->gvFrame->setVisible(false);
82+
m_ui->boardWarningFrame->setVisible(false);
83+
m_ui->configWarningFrame->setVisible(false);
8484

8585
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
8686
UAVSettingsImportExportFactory *importexportplugin = pm->getObject<UAVSettingsImportExportFactory>();
@@ -144,7 +144,7 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
144144
}
145145

146146
SystemAlarms *systemAlarmsObj = SystemAlarms::GetInstance(getObjectManager());
147-
connect(systemAlarmsObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateWarnings(UAVObject *)));
147+
connect(systemAlarmsObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateBoardWarnings(UAVObject *)));
148148

149149
// TODO why do we do that ?
150150
disconnect(this, SLOT(refreshWidgetsValues(UAVObject *)));
@@ -154,7 +154,7 @@ ConfigOutputWidget::~ConfigOutputWidget()
154154
{
155155
SystemAlarms *systemAlarmsObj = SystemAlarms::GetInstance(getObjectManager());
156156

157-
disconnect(systemAlarmsObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateWarnings(UAVObject *)));
157+
disconnect(systemAlarmsObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateBoardWarnings(UAVObject *)));
158158
foreach(OutputBankControls controls, m_banks) {
159159
disconnect(controls.modeCombo(), SIGNAL(currentIndexChanged(int)), this, SLOT(onBankTypeChange()));
160160
}
@@ -446,6 +446,7 @@ void ConfigOutputWidget::refreshWidgetsValuesImpl(UAVObject *obj)
446446
}
447447

448448
updateSpinStabilizeCheckComboBoxes();
449+
checkOutputConfig();
449450
}
450451

451452
/**
@@ -527,29 +528,19 @@ void ConfigOutputWidget::setChannelLimits(OutputChannelForm *channelForm, Output
527528
case ActuatorSettings::BANKMODE_DSHOT:
528529
// 0 - 2000 UI limits, DShot min value is fixed to zero
529530
if (channelForm->isServoOutput()) {
530-
// Driving a servo using DShot do not make sense: break
531-
bank_mode_servo_warning = ActuatorSettings::BANKMODE_DSHOT;
531+
// Driving a servo using DShot doest not make sense so break
532532
break;
533533
}
534-
if (channelForm->isReversableMotor()) {
535-
// Bi-directional DShot not yet supported: apply normal settings
536-
reversable_motor_warning = ActuatorSettings::BANKMODE_DSHOT;
537-
538-
}
539534
channelForm->setLimits(DSHOT_MINTOUTPUT_RANGE, DSHOT_MINTOUTPUT_RANGE, DSHOT_MINTOUTPUT_RANGE, DSHOT_MAXOUTPUT_RANGE);
540535
channelForm->setRange(DSHOT_MINTOUTPUT_RANGE, DSHOT_MAXOUTPUT_RANGE);
541536
channelForm->setNeutral(DSHOT_MINTOUTPUT_RANGE);
542537
break;
543538
case ActuatorSettings::BANKMODE_PWMSYNC:
544539
// 900 - 1900 UI limits
545540
// Default values 1000 - 1900
546-
currentNeutralValue = channelForm->getNeutralValue();
547541
channelForm->setLimits(DEFAULT_MINOUTPUT_RANGE, PWMSYNC_MAXOUTPUT_RANGE, DEFAULT_MINOUTPUT_RANGE, PWMSYNC_MAXOUTPUT_RANGE);
548542
channelForm->setRange(DEFAULT_MINOUTPUT_VALUE, PWMSYNC_MAXOUTPUT_RANGE);
549543
channelForm->setNeutral(DEFAULT_MINOUTPUT_VALUE);
550-
if (channelForm->isReversableMotor() && (reversable_motor_warning == OUTPUT_WARNING_DISABLED)) {
551-
reversable_motor_warning = ActuatorSettings::BANKMODE_PWMSYNC;
552-
}
553544
if (channelForm->isServoOutput()) {
554545
// Servo: Some of them can handle PWMSync, 500 - 1900 UI limits
555546
// Default values 1000 - 1900 + neutral 1500
@@ -558,10 +549,6 @@ void ConfigOutputWidget::setChannelLimits(OutputChannelForm *channelForm, Output
558549
}
559550
break;
560551
case ActuatorSettings::BANKMODE_PWM:
561-
// PWM motor outputs fall to default
562-
if (channelForm->isReversableMotor() && (reversable_motor_warning == OUTPUT_WARNING_DISABLED)) {
563-
reversable_motor_warning = ActuatorSettings::BANKMODE_PWM;
564-
}
565552
if (channelForm->isServoOutput()) {
566553
// Servo: 500 - 2500 UI limits
567554
// Default values 1000 - 2000 + neutral 1500
@@ -570,57 +557,88 @@ void ConfigOutputWidget::setChannelLimits(OutputChannelForm *channelForm, Output
570557
channelForm->setNeutral(SERVO_NEUTRAL_VALUE);
571558
break;
572559
}
560+
// PWM motor outputs fall to default
573561
case ActuatorSettings::BANKMODE_ONESHOT125:
574-
if (channelForm->isServoOutput()) {
575-
bank_mode_servo_warning = ActuatorSettings::BANKMODE_ONESHOT125;
576-
break;
577-
}
578-
if (channelForm->isReversableMotor() && (reversable_motor_warning == OUTPUT_WARNING_DISABLED)) {
579-
reversable_motor_warning = ActuatorSettings::BANKMODE_ONESHOT125;
580-
}
581562
case ActuatorSettings::BANKMODE_ONESHOT42:
582-
if (channelForm->isServoOutput()) {
583-
bank_mode_servo_warning = ActuatorSettings::BANKMODE_ONESHOT42;
584-
break;
585-
}
586-
if (channelForm->isReversableMotor() && (reversable_motor_warning == OUTPUT_WARNING_DISABLED)) {
587-
reversable_motor_warning = ActuatorSettings::BANKMODE_ONESHOT42;
588-
}
589563
case ActuatorSettings::BANKMODE_MULTISHOT:
590564
if (channelForm->isServoOutput()) {
591-
bank_mode_servo_warning = ActuatorSettings::BANKMODE_MULTISHOT;
565+
// Driving a servo using this mode does not make sense so break
592566
break;
593567
}
594-
if (channelForm->isReversableMotor() && (reversable_motor_warning == OUTPUT_WARNING_DISABLED)) {
595-
reversable_motor_warning = ActuatorSettings::BANKMODE_MULTISHOT;
596-
}
597568
default:
598569
// Motors 900 - 2000 UI limits
599570
// Default values 1000 - 2000, neutral set to min
600571
// This settings are used for PWM, OneShot125, OneShot42 and MultiShot
601-
currentNeutralValue = channelForm->getNeutralValue();
602572
channelForm->setLimits(DEFAULT_MINOUTPUT_RANGE, DEFAULT_MAXOUTPUT_RANGE, DEFAULT_MINOUTPUT_RANGE, DEFAULT_MAXOUTPUT_RANGE);
603573
channelForm->setRange(DEFAULT_MINOUTPUT_VALUE, DEFAULT_MAXOUTPUT_RANGE);
604574
channelForm->setNeutral(DEFAULT_MINOUTPUT_VALUE);
605575
break;
606576
}
577+
}
607578

608-
// TODO: Implement bi-directional DShot
609-
if (channelForm->isReversableMotor() && (bankControls->modeCombo()->currentIndex() != ActuatorSettings::BANKMODE_DSHOT)) {
579+
ConfigOutputWidget::ChannelConfigWarning ConfigOutputWidget::checkChannelConfig(OutputChannelForm *channelForm, OutputBankControls *bankControls)
580+
{
581+
ChannelConfigWarning warning = None;
582+
int currentNeutralValue = channelForm->getNeutralValue();
583+
584+
// Check if RevMotor has neutral value around center
585+
if (channelForm->isReversableMotor()) {
586+
warning = IsReversibleMotorCheckNeutral;
610587
int neutralDiff = qAbs(REVMOTOR_NEUTRAL_TARGET_VALUE - currentNeutralValue);
611588
if (neutralDiff < REVMOTOR_NEUTRAL_DIFF_VALUE) {
612589
// Reset warning
613-
reversable_motor_warning = OUTPUT_WARNING_DISABLED;
590+
warning = None;
591+
}
592+
}
593+
594+
// Check if NormalMotor neutral is not too high
595+
if (channelForm->isNormalMotor()) {
596+
warning = IsNormalMotorCheckNeutral;
597+
int neutralDiff = currentNeutralValue - DEFAULT_MINOUTPUT_VALUE;
598+
if (neutralDiff < MOTOR_NEUTRAL_DIFF_VALUE) {
599+
// Reset warning
600+
warning = None;
614601
}
615602
}
603+
604+
switch (bankControls->modeCombo()->currentIndex()) {
605+
case ActuatorSettings::BANKMODE_DSHOT:
606+
if (channelForm->isServoOutput()) {
607+
warning = CannotDriveServo;
608+
// Driving a servo using DShot doest not make sense so break
609+
break;
610+
}
611+
if (channelForm->isReversableMotor()) {
612+
// Bi-directional DShot not yet supported
613+
warning = BiDirectionalDShotNotSupported;
614+
}
615+
break;
616+
case ActuatorSettings::BANKMODE_PWMSYNC:
617+
break;
618+
case ActuatorSettings::BANKMODE_PWM:
619+
break;
620+
case ActuatorSettings::BANKMODE_ONESHOT125:
621+
case ActuatorSettings::BANKMODE_ONESHOT42:
622+
case ActuatorSettings::BANKMODE_MULTISHOT:
623+
if (channelForm->isServoOutput()) {
624+
warning = CannotDriveServo;
625+
// Driving a servo using this mode does not make sense so break
626+
break;
627+
}
628+
default:
629+
break;
630+
}
631+
632+
return warning;
616633
}
617634

635+
618636
void ConfigOutputWidget::onBankTypeChange()
619637
{
620638
QComboBox *bankModeCombo = qobject_cast<QComboBox *>(sender());
621639

622-
bank_mode_servo_warning = OUTPUT_WARNING_DISABLED;
623-
reversable_motor_warning = OUTPUT_WARNING_DISABLED;
640+
ChannelConfigWarning current_warning = None;
641+
ChannelConfigWarning warning_found = None;
624642

625643
if (bankModeCombo != NULL) {
626644
int bankNumber = 1;
@@ -633,6 +651,10 @@ void ConfigOutputWidget::onBankTypeChange()
633651
foreach(OutputChannelForm * outputChannelForm, outputChannelForms) {
634652
if (outputChannelForm->bank().toInt() == bankNumber) {
635653
setChannelLimits(outputChannelForm, &controls);
654+
current_warning = checkChannelConfig(outputChannelForm, &controls);
655+
if (current_warning > None) {
656+
warning_found = current_warning;
657+
}
636658
}
637659
}
638660
break;
@@ -641,60 +663,104 @@ void ConfigOutputWidget::onBankTypeChange()
641663
bankNumber++;
642664
}
643665
}
666+
667+
updateChannelConfigWarning(warning_found);
668+
}
669+
670+
bool ConfigOutputWidget::checkOutputConfig()
671+
{
672+
ChannelConfigWarning current_warning = None;
673+
ChannelConfigWarning warning_found = None;
674+
675+
int bankNumber = 1;
676+
677+
QList<OutputChannelForm *> outputChannelForms = findChildren<OutputChannelForm *>();
678+
679+
foreach(OutputBankControls controls, m_banks) {
680+
foreach(OutputChannelForm * outputChannelForm, outputChannelForms) {
681+
if (!outputChannelForm->isDisabledOutput() && (outputChannelForm->bank().toInt() == bankNumber)) {
682+
current_warning = checkChannelConfig(outputChannelForm, &controls);
683+
if (current_warning > None) {
684+
warning_found = current_warning;
685+
}
686+
}
687+
}
688+
689+
bankNumber++;
690+
}
691+
692+
updateChannelConfigWarning(warning_found);
693+
694+
if (warning_found > None) {
695+
return false;
696+
}
697+
698+
return true;
644699
}
645700

646701
void ConfigOutputWidget::stopTests()
647702
{
648703
m_ui->channelOutTest->setChecked(false);
649704
}
650705

651-
void ConfigOutputWidget::updateWarnings(UAVObject *)
706+
void ConfigOutputWidget::updateBoardWarnings(UAVObject *)
652707
{
653708
SystemAlarms *systemAlarmsObj = SystemAlarms::GetInstance(getObjectManager());
654709
SystemAlarms::DataFields systemAlarms = systemAlarmsObj->getData();
655710

656711
if (systemAlarms.Alarm[SystemAlarms::ALARM_SYSTEMCONFIGURATION] > SystemAlarms::ALARM_WARNING) {
657712
switch (systemAlarms.ExtendedAlarmStatus[SystemAlarms::EXTENDEDALARMSTATUS_SYSTEMCONFIGURATION]) {
658713
case SystemAlarms::EXTENDEDALARMSTATUS_UNSUPPORTEDCONFIG_ONESHOT:
659-
setWarning(tr("OneShot and PWMSync output only works with Receiver Port settings marked with '+OneShot'<br>"
660-
"When using Receiver Port setting 'PPM_PIN8+OneShot' "
661-
"<b><font color='%1'>Bank %2</font></b> must be set to PWM")
662-
.arg(m_banks.at(3).color().name()).arg(m_banks.at(3).label()->text()));
714+
setBoardWarning(tr("OneShot and PWMSync output only works with Receiver Port settings marked with '+OneShot'<br>"
715+
"When using Receiver Port setting 'PPM_PIN8+OneShot' "
716+
"<b><font color='%1'>Bank %2</font></b> must be set to PWM")
717+
.arg(m_banks.at(3).color().name()).arg(m_banks.at(3).label()->text()));
663718
return;
664719
}
665720
}
721+
setBoardWarning(NULL);
722+
}
666723

667-
if (reversable_motor_warning > OUTPUT_WARNING_DISABLED) {
668-
QString revmotor_warning_str;
669-
if (reversable_motor_warning == ActuatorSettings::BANKMODE_DSHOT) {
670-
// TODO: Implement bi-directional DShot
671-
revmotor_warning_str = "There is at least one reversable motor using <b>DShot</b> in your configuration."
672-
"<p>Bi-directional DShot is not currently supported, you should use PWM, OneShotXXX or MultiShot.</p>";
673-
} else {
674-
revmotor_warning_str = QString("There is at least one reversable motor using <b>%1</b> in your configuration.</b>"
675-
"<p>Be sure you set the appropriate neutral value before saving and applying power to the vehicule.</p>").arg(bankModeName(reversable_motor_warning));
676-
}
677-
setWarning(revmotor_warning_str);
724+
void ConfigOutputWidget::updateChannelConfigWarning(ChannelConfigWarning warning)
725+
{
726+
QString warning_str;
678727

679-
return;
728+
if (warning == BiDirectionalDShotNotSupported) {
729+
// TODO: Implement bi-directional DShot
730+
warning_str = "There is at least <b>one reversable motor using DShot</b> in your configuration.<br>"
731+
"Bi-directional DShot is not currently supported, you should use PWM, OneShotXXX or MultiShot.";
680732
}
681733

682-
if (bank_mode_servo_warning > OUTPUT_WARNING_DISABLED) {
683-
QString servo_warning_str = QString("Bank using <b>%1</b> cannot drive a <b>servo output!</b>"
684-
"<p>You must use PWM for this bank or move the servo output to another compatible bank.</p>").arg(bankModeName(bank_mode_servo_warning));
685-
setWarning(servo_warning_str);
734+
if (warning == IsNormalMotorCheckNeutral) {
735+
warning_str = "Seems there is at least one pretty <b>high neutral value</b> set in your configuration.<br>"
736+
"Be sure all Esc are calibrated and no mechanical stress in all motors.";
737+
}
686738

687-
return;
739+
if (warning == IsReversibleMotorCheckNeutral) {
740+
warning_str = "There is at least one <b>reversable motor</b> in your configuration.<br>"
741+
"Be sure you set a appropriate neutral value before saving and applying power to the vehicule.";
688742
}
689743

690-
setWarning(NULL);
744+
if (warning == CannotDriveServo) {
745+
warning_str = "One Bank cannot drive a <b>servo output!</b><br>"
746+
"You must use PWM for this bank or move the servo output to another compatible bank.";
747+
}
748+
749+
setConfigWarning(warning_str);
750+
}
751+
752+
void ConfigOutputWidget::setBoardWarning(QString message)
753+
{
754+
m_ui->boardWarningFrame->setVisible(!message.isNull());
755+
m_ui->boardWarningPic->setPixmap(message.isNull() ? QPixmap() : QPixmap(":/configgadget/images/error.svg"));
756+
m_ui->boardWarningTxt->setText(message);
691757
}
692758

693-
void ConfigOutputWidget::setWarning(QString message)
759+
void ConfigOutputWidget::setConfigWarning(QString message)
694760
{
695-
m_ui->gvFrame->setVisible(!message.isNull());
696-
m_ui->picWarning->setPixmap(message.isNull() ? QPixmap() : QPixmap(":/configgadget/images/error.svg"));
697-
m_ui->txtWarning->setText(message);
761+
m_ui->configWarningFrame->setVisible(!message.isNull());
762+
m_ui->configWarningPic->setPixmap(message.isNull() ? QPixmap() : QPixmap(":/configgadget/images/error.svg"));
763+
m_ui->configWarningTxt->setText(message);
698764
}
699765

700766
QString ConfigOutputWidget::bankModeName(int index)

ground/gcs/src/plugins/config/configoutputwidget.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,12 @@ class ConfigOutputWidget : public ConfigTaskWidget {
8585
ConfigOutputWidget(QWidget *parent = 0);
8686
~ConfigOutputWidget();
8787

88+
bool checkOutputConfig();
89+
8890
protected:
8991
void enableControls(bool enable);
90-
void setWarning(QString message);
92+
void setBoardWarning(QString message);
93+
void setConfigWarning(QString message);
9194

9295
virtual void refreshWidgetsValuesImpl(UAVObject *obj);
9396
virtual void updateObjectsFromWidgetsImpl();
@@ -98,20 +101,20 @@ class ConfigOutputWidget : public ConfigTaskWidget {
98101
int m_mccDataRate;
99102
UAVObject::Metadata m_accInitialData;
100103
QList<OutputBankControls> m_banks;
101-
int bank_mode_servo_warning;
102-
int reversable_motor_warning;
103-
int currentNeutralValue;
104104

105105
OutputChannelForm *getOutputChannelForm(const int index) const;
106106
void updateChannelInSlider(QSlider *slider, QLabel *min, QLabel *max, QCheckBox *rev, int value);
107107
void assignOutputChannel(UAVDataObject *obj, QString &str);
108108
void setColor(QWidget *widget, const QColor color);
109109
void sendAllChannelTests();
110+
enum ChannelConfigWarning { None, CannotDriveServo, IsNormalMotorCheckNeutral, IsReversibleMotorCheckNeutral, BiDirectionalDShotNotSupported };
110111
void setChannelLimits(OutputChannelForm *channelForm, OutputBankControls *bankControls);
112+
ChannelConfigWarning checkChannelConfig(OutputChannelForm *channelForm, OutputBankControls *bankControls);
113+
void updateChannelConfigWarning(ChannelConfigWarning warning);
111114
QString bankModeName(int index);
112115

113116
private slots:
114-
void updateWarnings(UAVObject *);
117+
void updateBoardWarnings(UAVObject *);
115118
void updateSpinStabilizeCheckComboBoxes();
116119
void updateAlwaysStabilizeStatus();
117120
void stopTests();

0 commit comments

Comments
 (0)