diff --git a/flight/modules/Receiver/receiver.c b/flight/modules/Receiver/receiver.c index 5fc301eb4..5be8e7060 100644 --- a/flight/modules/Receiver/receiver.c +++ b/flight/modules/Receiver/receiver.c @@ -10,7 +10,7 @@ * pass it to ManualControl * * @file receiver.c - * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015. + * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015-2017. * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2014. * @brief Receiver module. Handles safety R/C link and flight mode. * @@ -68,7 +68,7 @@ // safe band to allow a bit of calibration error or trim offset (in microseconds) #define CONNECTION_OFFSET 250 -#define ASSISTEDCONTROL_DEADBAND_MINIMUM 2 // minimum value for a well bahaved Tx, in percent. +#define ASSISTEDCONTROL_DEADBAND_MINIMUM 2 // minimum value for a well behaved Tx, in percent. // Private types @@ -198,24 +198,21 @@ static void receiverTask(__attribute__((unused)) void *parameters) { ManualControlSettingsData settings; ManualControlCommandData cmd; - FlightStatusData flightStatus; + uint8_t armed; uint8_t disconnected_count = 0; uint8_t connected_count = 0; // For now manual instantiate extra instances of Accessory Desired. In future should be done dynamically // this includes not even registering it if not used - AccessoryDesiredCreateInstance(); - AccessoryDesiredCreateInstance(); - AccessoryDesiredCreateInstance(); + AccessoryDesiredCreateInstance(); // Accessory1 + AccessoryDesiredCreateInstance(); // Accessory2 + AccessoryDesiredCreateInstance(); // Accessory3 // Rssi input AccessoryDesiredCreateInstance(); - // Whenever the configuration changes, make sure it is safe to fly - ManualControlCommandGet(&cmd); - FlightStatusGet(&flightStatus); /* Initialize the RcvrActivty FSM */ portTickType lastActivityTime = xTaskGetTickCount(); @@ -241,17 +238,20 @@ static void receiverTask(__attribute__((unused)) void *parameters) ManualControlSettingsGet(&settings); SystemSettingsThrustControlGet(&thrustType); + FlightStatusArmedGet(&armed); /* Update channel activity monitor */ - if (flightStatus.Armed == FLIGHTSTATUS_ARMED_DISARMED) { + if (armed == FLIGHTSTATUS_ARMED_DISARMED) { if (updateRcvrActivity(&activity_fsm)) { /* Reset the aging timer because activity was detected */ lastActivityTime = lastSysTime; } - /* Read signal quality from the group used for the throttle */ - (void)updateRcvrStatus(&activity_fsm, - settings.ChannelGroups.Throttle, - rssiValue); } + + /* Read signal quality from the group used for the throttle */ + (void)updateRcvrStatus(&activity_fsm, + settings.ChannelGroups.Throttle, + rssiValue); + if (timeDifferenceMs(lastActivityTime, lastSysTime) > 5000) { resetRcvrActivity(&activity_fsm); resetRcvrStatus(&activity_fsm); @@ -794,7 +794,9 @@ group_completed: return activity_updated; } -/* Read signal quality from the specified group or use Rssi input value if any */ +/** + * Read signal quality from the specified group or use Rssi input value if any + */ static bool updateRcvrStatus( struct rcvr_activity_fsm *fsm, ManualControlSettingsChannelGroupsOptions group, int8_t rssiValue) diff --git a/ground/gcs/src/plugins/config/configinputwidget.cpp b/ground/gcs/src/plugins/config/configinputwidget.cpp index 9df7c0906..c0a7f3d8f 100644 --- a/ground/gcs/src/plugins/config/configinputwidget.cpp +++ b/ground/gcs/src/plugins/config/configinputwidget.cpp @@ -58,7 +58,7 @@ #define MAX_INPUT_US 2500 #define CHANNEL_NUMBER_NONE 0 -#define DEFAULT_FLIGHT_MODE_NUMBER 0 +#define DEFAULT_FLIGHT_MODE_NUMBER 1 ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent), @@ -200,6 +200,8 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : connect(ui->runCalibration, SIGNAL(toggled(bool)), this, SLOT(simpleCalibration(bool))); connect(ReceiverActivity::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateReceiverActivityStatus())); + connect(FlightStatus::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateReceiverActivityStatus())); + ui->receiverActivityStatus->setStyleSheet("QLabel { background-color: darkGreen; color: rgb(255, 255, 255); \ border: 1px solid grey; border-radius: 5; margin:1px; font:bold;}"); @@ -440,6 +442,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : groundChannelOrder << ManualControlSettings::CHANNELGROUPS_THROTTLE << ManualControlSettings::CHANNELGROUPS_YAW << + ManualControlSettings::CHANNELGROUPS_FLIGHTMODE << ManualControlSettings::CHANNELGROUPS_ACCESSORY0; } @@ -662,12 +665,8 @@ void ConfigInputWidget::wzNext() throttleError = false; checkThrottleRange(); - // Force flight mode number to be 1 if 2 CH ground vehicle was selected - if (transmitterType == ground) { - forceOneFlightMode(); - } - manualSettingsObj->setData(manualSettingsData); + // move to Arming Settings tab ui->stackedWidget->setCurrentIndex(0); ui->tabWidget->setCurrentIndex(3); @@ -843,12 +842,12 @@ void ConfigInputWidget::wizardSetUpStep(enum wizardSteps step) extraWidgets.clear(); for (int index = 0; index < manualSettingsObj->getField("ChannelMax")->getElementNames().length(); index++) { QString name = manualSettingsObj->getField("ChannelMax")->getElementNames().at(index); - if (!name.contains("Access") && !name.contains("Flight") && + if (!name.contains("Access") && !name.contains("Flight") && !name.contains("Rssi") && (!name.contains("Collective") || transmitterType == heli)) { QCheckBox *cb = new QCheckBox(name, this); // Make sure checked status matches current one cb->setChecked(manualSettingsData.ChannelMax[index] < manualSettingsData.ChannelMin[index]); - wizardUi->checkBoxesLayout->addWidget(cb, extraWidgets.size() / 4, extraWidgets.size() % 4); + wizardUi->checkBoxesLayout->addWidget(cb, extraWidgets.size() / 5, extraWidgets.size() % 5); extraWidgets.append(cb); connect(cb, SIGNAL(toggled(bool)), this, SLOT(invertControls())); } @@ -917,12 +916,6 @@ void ConfigInputWidget::wizardTearDownStep(enum wizardSteps step) disconnect(receiverActivityObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(identifyControls())); wizardUi->wzNext->setEnabled(true); setTxMovement(nothing); - /* If flight mode stick isn't identified, force flight mode number to be 1 */ - manualSettingsData = manualSettingsObj->getData(); - if (manualSettingsData.ChannelGroups[ManualControlSettings::CHANNELNUMBER_FLIGHTMODE] == - ManualControlSettings::CHANNELGROUPS_NONE) { - forceOneFlightMode(); - } break; case wizardIdentifyCenter: manualCommandData = manualCommandObj->getData(); @@ -1182,6 +1175,7 @@ void ConfigInputWidget::identifyControls() void ConfigInputWidget::identifyLimits() { uint16_t inputValue; + static uint16_t previousInputFMValue; bool newLimitValue = false; bool newFlightModeValue = false; @@ -1214,32 +1208,37 @@ void ConfigInputWidget::identifyLimits() } // Flightmode channel if (i == ManualControlSettings::CHANNELGROUPS_FLIGHTMODE) { - // Avoid duplicate values too close and error due to RcTx drift - int minSpacing = 100; // 100µs - for (int pos = 0; pos < manualSettingsData.FlightModeNumber + 1; ++pos) { - if (flightModeSignalValue[pos] == 0) { - newFlightModeValue = true; - // A new flightmode value can be set now - for (int checkpos = 0; checkpos < manualSettingsData.FlightModeNumber + 1; ++checkpos) { - // Check if value is already used, MinSpacing needed between values. - if ((flightModeSignalValue[checkpos] < inputValue + minSpacing) && - (flightModeSignalValue[checkpos] > inputValue - minSpacing)) { - newFlightModeValue = false; + int deltaInput = abs(previousInputFMValue - inputValue); + previousInputFMValue = inputValue; + // Expecting two consecutive readings within a close value + if (deltaInput < 5) { + // Avoid duplicate values too close and error due to RcTx drift + int minSpacing = 100; // 100µs + for (int pos = 0; pos < manualSettingsData.FlightModeNumber + 1; ++pos) { + if (flightModeSignalValue[pos] == 0) { + newFlightModeValue = true; + // A new flightmode value can be set now + for (int checkpos = 0; checkpos < manualSettingsData.FlightModeNumber + 1; ++checkpos) { + // Check if value is already used, MinSpacing needed between values. + if ((flightModeSignalValue[checkpos] < inputValue + minSpacing) && + (flightModeSignalValue[checkpos] > inputValue - minSpacing)) { + newFlightModeValue = false; + } } - } - // Be sure FlightModeNumber is < FlightModeSettings::FLIGHTMODEPOSITION_NUMELEM (6) - if ((manualSettingsData.FlightModeNumber < FlightModeSettings::FLIGHTMODEPOSITION_NUMELEM) && newFlightModeValue) { - // Start from 0, erase previous count - if (pos == 0) { - manualSettingsData.FlightModeNumber = 0; + // Be sure FlightModeNumber is < FlightModeSettings::FLIGHTMODEPOSITION_NUMELEM (6) + if ((manualSettingsData.FlightModeNumber < FlightModeSettings::FLIGHTMODEPOSITION_NUMELEM) && newFlightModeValue) { + // Start from 0, erase previous count + if (pos == 0) { + manualSettingsData.FlightModeNumber = 0; + } + // Store new value and increase FlightModeNumber + flightModeSignalValue[pos] = inputValue; + manualSettingsData.FlightModeNumber++; + // Show flight mode number + m_txFlightModeCountText->setText(QString().number(manualSettingsData.FlightModeNumber)); + m_txFlightModeCountText->setVisible(true); + m_txFlightModeCountBG->setVisible(true); } - // Store new value and increase FlightModeNumber - flightModeSignalValue[pos] = inputValue; - manualSettingsData.FlightModeNumber++; - // Show flight mode number - m_txFlightModeCountText->setText(QString().number(manualSettingsData.FlightModeNumber)); - m_txFlightModeCountText->setVisible(true); - m_txFlightModeCountBG->setVisible(true); } } } @@ -2013,11 +2012,6 @@ void ConfigInputWidget::simpleCalibration(bool enable) restoreMdataSingle(manualCommandObj, &manualControlMdata); - // Force flight mode number to be 1 if 2 channel ground vehicle was confirmed - if (transmitterType == ground) { - forceOneFlightMode(); - } - for (unsigned int i = 0; i < ManualControlSettings::CHANNELNUMBER_RSSI; i++) { if ((i == ManualControlSettings::CHANNELNUMBER_FLIGHTMODE) || (i == ManualControlSettings::CHANNELNUMBER_THROTTLE)) { adjustSpecialNeutrals(); @@ -2148,19 +2142,16 @@ void ConfigInputWidget::resetActuatorSettings() } } -void ConfigInputWidget::forceOneFlightMode() -{ - manualSettingsData = manualSettingsObj->getData(); - manualSettingsData.FlightModeNumber = 1; - manualSettingsObj->setData(manualSettingsData); -} - void ConfigInputWidget::updateReceiverActivityStatus() { ReceiverActivity *receiverActivity = ReceiverActivity::GetInstance(getObjectManager()); Q_ASSERT(receiverActivity); + FlightStatus *flightStatus = FlightStatus::GetInstance(getObjectManager()); + + Q_ASSERT(flightStatus); + UAVObjectField *activeGroup = receiverActivity->getField(QString("ActiveGroup")); Q_ASSERT(activeGroup); @@ -2170,12 +2161,15 @@ void ConfigInputWidget::updateReceiverActivityStatus() QString activeGroupText = activeGroup->getValue().toString(); QString activeChannelText = activeChannel->getValue().toString(); + if (activeGroupText != "None") { ui->receiverActivityStatus->setText(tr("%1 input - Channel %2").arg(activeGroupText).arg(activeChannelText)); ui->receiverActivityStatus->setStyleSheet("QLabel { background-color: green; color: rgb(255, 255, 255); \ border: 1px solid grey; border-radius: 5; margin:1px; font:bold;}"); } else { - ui->receiverActivityStatus->setText(tr("No activity")); + bool armed = (flightStatus->getArmed() == FlightStatus::ARMED_ARMED); + QString receiverActivityText = armed ? tr("Disabled (Armed)") : tr("No activity"); + ui->receiverActivityStatus->setText(receiverActivityText); ui->receiverActivityStatus->setStyleSheet("QLabel { background-color: darkGreen; color: rgb(255, 255, 255); \ border: 1px solid grey; border-radius: 5; margin:1px; font:bold;}"); } diff --git a/ground/gcs/src/plugins/config/configinputwidget.h b/ground/gcs/src/plugins/config/configinputwidget.h index ddbc65c93..458744024 100644 --- a/ground/gcs/src/plugins/config/configinputwidget.h +++ b/ground/gcs/src/plugins/config/configinputwidget.h @@ -228,7 +228,6 @@ private slots: void resetChannelSettings(); void resetFlightModeSettings(); void resetActuatorSettings(); - void forceOneFlightMode(); void updateReceiverActivityStatus(); void failsafeFlightModeChanged(int index);