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
7071ConfigOutputWidget::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
582612void 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
0 commit comments