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
6869#define SERVO_MINOUTPUT_VALUE 1000
6970#define SERVO_NEUTRAL_VALUE 1500
7071
71- #define OUTPUT_WARNING_DISABLED -1
72-
7372ConfigOutputWidget::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+
618636void 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
646701void 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
700766QString ConfigOutputWidget::bankModeName (int index)
0 commit comments