Skip to content

Commit 8932642

Browse files
committed
LP-551 Add warning for neutral setting with reversable motors
1 parent b508e07 commit 8932642

4 files changed

Lines changed: 73 additions & 14 deletions

File tree

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

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,21 @@
5252
#include <QMessageBox>
5353

5454
// Motor settings
55-
#define DSHOT_MAXOUTPUT_RANGE 2000
56-
#define DSHOT_MINTOUTPUT_RANGE 0
57-
#define PWMSYNC_MAXOUTPUT_RANGE 1900
58-
#define DEFAULT_MAXOUTPUT_RANGE 2000
59-
#define DEFAULT_MINOUTPUT_RANGE 900
60-
61-
#define DEFAULT_MINOUTPUT_VALUE 1000
55+
#define DSHOT_MAXOUTPUT_RANGE 2000
56+
#define DSHOT_MINTOUTPUT_RANGE 0
57+
#define PWMSYNC_MAXOUTPUT_RANGE 1900
58+
#define DEFAULT_MAXOUTPUT_RANGE 2000
59+
#define DEFAULT_MINOUTPUT_RANGE 900
60+
#define DEFAULT_MINOUTPUT_VALUE 1000
61+
#define REVMOTOR_NEUTRAL_TARGET_VALUE 1500
62+
#define REVMOTOR_NEUTRAL_DIFF_VALUE 250
6263

6364
// Servo settings
64-
#define SERVO_MAXOUTPUT_RANGE 2500
65-
#define SERVO_MINOUTPUT_RANGE 500
66-
#define SERVO_MAXOUTPUT_VALUE 2000
67-
#define SERVO_MINOUTPUT_VALUE 1000
68-
#define SERVO_NEUTRAL_VALUE 1500
65+
#define SERVO_MAXOUTPUT_RANGE 2500
66+
#define SERVO_MINOUTPUT_RANGE 500
67+
#define SERVO_MAXOUTPUT_VALUE 2000
68+
#define SERVO_MINOUTPUT_VALUE 1000
69+
#define SERVO_NEUTRAL_VALUE 1500
6970

7071
ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(parent)
7172
{
@@ -527,16 +528,23 @@ void ConfigOutputWidget::setChannelLimits(OutputChannelForm *channelForm, Output
527528
bank_mode_servo_warning = "DShot";
528529
break;
529530
}
531+
if (channelForm->isReversableMotor()) {
532+
reversable_motor_warning = "DShot";
533+
}
530534
channelForm->setLimits(DSHOT_MINTOUTPUT_RANGE, DSHOT_MINTOUTPUT_RANGE, DSHOT_MINTOUTPUT_RANGE, DSHOT_MAXOUTPUT_RANGE);
531535
channelForm->setRange(DSHOT_MINTOUTPUT_RANGE, DSHOT_MAXOUTPUT_RANGE);
532536
channelForm->setNeutral(DSHOT_MINTOUTPUT_RANGE);
533537
break;
534538
case ActuatorSettings::BANKMODE_PWMSYNC:
535539
// 900 - 1900 UI limits
536540
// Default values 1000 - 1900
541+
currentNeutralValue = channelForm->getNeutralValue();
537542
channelForm->setLimits(DEFAULT_MINOUTPUT_RANGE, PWMSYNC_MAXOUTPUT_RANGE, DEFAULT_MINOUTPUT_RANGE, PWMSYNC_MAXOUTPUT_RANGE);
538543
channelForm->setRange(DEFAULT_MINOUTPUT_VALUE, PWMSYNC_MAXOUTPUT_RANGE);
539544
channelForm->setNeutral(DEFAULT_MINOUTPUT_VALUE);
545+
if (channelForm->isReversableMotor() && (reversable_motor_warning == "")) {
546+
reversable_motor_warning = "PWMSync";
547+
}
540548
if (channelForm->isServoOutput()) {
541549
// Servo: Some of them can handle PWMSync, 500 - 1900 UI limits
542550
// Default values 1000 - 1900 + neutral 1500
@@ -546,6 +554,9 @@ void ConfigOutputWidget::setChannelLimits(OutputChannelForm *channelForm, Output
546554
break;
547555
case ActuatorSettings::BANKMODE_PWM:
548556
// PWM motor outputs fall to default
557+
if (channelForm->isReversableMotor() && (reversable_motor_warning == "")) {
558+
reversable_motor_warning = "PWM";
559+
}
549560
if (channelForm->isServoOutput()) {
550561
// Servo: 500 - 2500 UI limits
551562
// Default values 1000 - 2000 + neutral 1500
@@ -559,31 +570,51 @@ void ConfigOutputWidget::setChannelLimits(OutputChannelForm *channelForm, Output
559570
bank_mode_servo_warning = "OneShot125";
560571
break;
561572
}
573+
if (channelForm->isReversableMotor() && (reversable_motor_warning == "")) {
574+
reversable_motor_warning = "OneShot125";
575+
}
562576
case ActuatorSettings::BANKMODE_ONESHOT42:
563577
if (channelForm->isServoOutput()) {
564578
bank_mode_servo_warning = "OneShot42";
565579
break;
566580
}
581+
if (channelForm->isReversableMotor() && (reversable_motor_warning == "")) {
582+
reversable_motor_warning = "OneShot42";
583+
}
567584
case ActuatorSettings::BANKMODE_MULTISHOT:
568585
if (channelForm->isServoOutput()) {
569586
bank_mode_servo_warning = "MultiShot";
570587
break;
571588
}
589+
if (channelForm->isReversableMotor() && (reversable_motor_warning == "")) {
590+
reversable_motor_warning = "MultiShot";
591+
}
572592
default:
573593
// Motors 900 - 2000 UI limits
574594
// Default values 1000 - 2000, neutral set to min
595+
currentNeutralValue = channelForm->getNeutralValue();
575596
channelForm->setLimits(DEFAULT_MINOUTPUT_RANGE, DEFAULT_MAXOUTPUT_RANGE, DEFAULT_MINOUTPUT_RANGE, DEFAULT_MAXOUTPUT_RANGE);
576597
channelForm->setRange(DEFAULT_MINOUTPUT_VALUE, DEFAULT_MAXOUTPUT_RANGE);
577598
channelForm->setNeutral(DEFAULT_MINOUTPUT_VALUE);
578599
break;
579600
}
601+
602+
// TODO: Implement bi-directional DShot
603+
if (channelForm->isReversableMotor() && (bankControls->modeCombo()->currentIndex() != ActuatorSettings::BANKMODE_DSHOT)) {
604+
int neutralDiff = qAbs(REVMOTOR_NEUTRAL_TARGET_VALUE - currentNeutralValue);
605+
if (neutralDiff < REVMOTOR_NEUTRAL_DIFF_VALUE) {
606+
// Reset warning
607+
reversable_motor_warning = "";
608+
}
609+
}
580610
}
581611

582612
void ConfigOutputWidget::onBankTypeChange()
583613
{
584614
QComboBox *bankModeCombo = qobject_cast<QComboBox *>(sender());
585615

586-
bank_mode_servo_warning = "";
616+
bank_mode_servo_warning = "";
617+
reversable_motor_warning = "";
587618

588619
if (bankModeCombo != NULL) {
589620
int bankNumber = 1;
@@ -626,12 +657,28 @@ void ConfigOutputWidget::updateWarnings(UAVObject *)
626657
return;
627658
}
628659
}
660+
661+
if (reversable_motor_warning != "") {
662+
QString revmotor_warning_str;
663+
if (reversable_motor_warning == "DShot") {
664+
// TODO: Implement bi-directional DShot
665+
revmotor_warning_str = "There is at least one reversable motor using <b>DShot</b> in your configuration."
666+
"<p>Bi-directional DShot is not currently supported, you should use PWM, OneShotXXX or MultiShot.</p>";
667+
} else {
668+
revmotor_warning_str = QString("There is at least one reversable motor using <b>%1</b> in your configuration.</b>"
669+
"<p>Be sure you set the appropriate neutral value before saving and applying power to the vehicule.</p>").arg(reversable_motor_warning);
670+
}
671+
setWarning(revmotor_warning_str);
672+
return;
673+
}
674+
629675
if (bank_mode_servo_warning != "") {
630676
QString servo_warning_str = QString("Bank using <b>%1</b> cannot drive a <b>servo output!</b>"
631-
"<p>You must use PWM for this Bank or move the servo output to another compatible Bank.</p>").arg(bank_mode_servo_warning);
677+
"<p>You must use PWM for this Bank or move the servo output to another compatible Bank.</p>").arg(bank_mode_servo_warning);
632678
setWarning(servo_warning_str);
633679
return;
634680
}
681+
635682
setWarning(NULL);
636683
}
637684

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ class ConfigOutputWidget : public ConfigTaskWidget {
9999
UAVObject::Metadata m_accInitialData;
100100
QList<OutputBankControls> m_banks;
101101
QString bank_mode_servo_warning;
102+
QString reversable_motor_warning;
103+
int currentNeutralValue;
102104

103105
OutputChannelForm *getOutputChannelForm(const int index) const;
104106
void updateChannelInSlider(QSlider *slider, QLabel *min, QLabel *max, QCheckBox *rev, int value);

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,15 @@ void OutputChannelForm::sendChannelTest(int value)
376376
emit channelChanged(index(), value);
377377
}
378378

379+
/**
380+
*
381+
* Returns current neutral value
382+
*/
383+
int OutputChannelForm::getNeutralValue()
384+
{
385+
return ui->actuatorNeutral->value();
386+
}
387+
379388
/**
380389
*
381390
* Returns MixerType

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public slots:
6363
void enableChannelTest(bool state);
6464
QString outputMixerType();
6565
void setLimits(int actuatorMinMinimum, int actuatorMinMaximum, int actuatorMaxMinimum, int actuatorMaxMaximum);
66+
int getNeutralValue();
6667
bool isServoOutput();
6768
bool isNormalMotor();
6869
bool isReversableMotor();

0 commit comments

Comments
 (0)