APMFlightModesComponentController.cc 2.53 KB
Newer Older
1 2 3 4 5 6 7 8 9
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

Don Gagne's avatar
Don Gagne committed
10 11 12 13 14 15 16 17 18

#include "APMFlightModesComponentController.h"
#include "QGCMAVLink.h"
#include "AutoPilotPluginManager.h"

#include <QVariant>
#include <QQmlProperty>

APMFlightModesComponentController::APMFlightModesComponentController(void)
Don Gagne's avatar
Don Gagne committed
19 20
    : _activeFlightMode(0)
    , _channelCount(Vehicle::cMaxRcChannels)
Don Gagne's avatar
Don Gagne committed
21 22
{
    QStringList usedParams;
23 24
    usedParams << QStringLiteral("FLTMODE1") << QStringLiteral("FLTMODE2") << QStringLiteral("FLTMODE3")
               << QStringLiteral("FLTMODE4") << QStringLiteral("FLTMODE5") << QStringLiteral("FLTMODE6");
Don Gagne's avatar
Don Gagne committed
25 26 27 28
    if (!_allParametersExists(FactSystem::defaultComponentId, usedParams)) {
        return;
    }

Don Gagne's avatar
Don Gagne committed
29
    _rgChannelOptionEnabled << QVariant(false) << QVariant(false) << QVariant(false) << QVariant(false) << QVariant(false) << QVariant(false);
Don Gagne's avatar
Don Gagne committed
30 31 32 33
    
    connect(_vehicle, &Vehicle::rcChannelsChanged, this, &APMFlightModesComponentController::_rcChannelsChanged);
}

Don Gagne's avatar
Don Gagne committed
34 35
/// Connected to Vehicle::rcChannelsChanged signal
void APMFlightModesComponentController::_rcChannelsChanged(int channelCount, int pwmValues[Vehicle::cMaxRcChannels])
Don Gagne's avatar
Don Gagne committed
36
{
37 38 39 40 41 42 43
    int flightModeChannel = 4;

    if (parameterExists(FactSystem::defaultComponentId, QStringLiteral("FLTMODE_CH"))) {
        flightModeChannel = getParameterFact(FactSystem::defaultComponentId, QStringLiteral("FLTMODE_CH"))->rawValue().toInt() - 1;
    }

    if (flightModeChannel >= channelCount) {
44 45
        return;
    }
Don Gagne's avatar
Don Gagne committed
46

Don Gagne's avatar
Don Gagne committed
47
    _activeFlightMode = 0;
48
    int channelValue = pwmValues[flightModeChannel];
Don Gagne's avatar
Don Gagne committed
49
    if (channelValue != -1) {
Don Gagne's avatar
Don Gagne committed
50
        bool found = false;
Don Gagne's avatar
Don Gagne committed
51 52 53 54
        int rgThreshold[] = { 1230, 1360, 1490, 1620, 1749 };
        for (int i=0; i<5; i++) {
            if (channelValue <= rgThreshold[i]) {
                _activeFlightMode = i + 1;
Don Gagne's avatar
Don Gagne committed
55
                found = true;
Don Gagne's avatar
Don Gagne committed
56
                break;
Don Gagne's avatar
Don Gagne committed
57 58
            }
        }
Don Gagne's avatar
Don Gagne committed
59 60 61
        if (!found) {
            _activeFlightMode = 6;
        }
Don Gagne's avatar
Don Gagne committed
62
    }
Don Gagne's avatar
Don Gagne committed
63
    emit activeFlightModeChanged(_activeFlightMode);
Don Gagne's avatar
Don Gagne committed
64

Don Gagne's avatar
Don Gagne committed
65 66
    for (int i=0; i<6; i++) {
        _rgChannelOptionEnabled[i] = QVariant(false);
Don Gagne's avatar
Don Gagne committed
67
        channelValue = pwmValues[i+6];
Don Gagne's avatar
Don Gagne committed
68 69 70
        if (channelValue != -1 && channelValue > 1800) {
            _rgChannelOptionEnabled[i] = QVariant(true);
        }
Don Gagne's avatar
Don Gagne committed
71
    }
Don Gagne's avatar
Don Gagne committed
72
    emit channelOptionEnabledChanged();
Don Gagne's avatar
Don Gagne committed
73
}