APMAutoPilotPlugin.cc 9.38 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (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
9

10 11 12

#include "APMAutoPilotPlugin.h"
#include "UAS.h"
13
#include "FirmwarePlugin/APM/APMParameterMetaData.h"  // FIXME: Hack
14
#include "FirmwarePlugin/APM/APMFirmwarePlugin.h"  // FIXME: Hack
15
#include "FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h"
16
#include "VehicleComponent.h"
17 18 19 20 21 22
#include "APMAirframeComponent.h"
#include "APMFlightModesComponent.h"
#include "APMRadioComponent.h"
#include "APMSafetyComponent.h"
#include "APMTuningComponent.h"
#include "APMSensorsComponent.h"
Don Gagne's avatar
Don Gagne committed
23
#include "APMPowerComponent.h"
24
#include "APMMotorComponent.h"
Don Gagne's avatar
Don Gagne committed
25
#include "APMCameraComponent.h"
26
#include "APMLightsComponent.h"
27
#include "APMSubFrameComponent.h"
DonLakeFlyer's avatar
DonLakeFlyer committed
28
#include "APMFollowComponent.h"
29
#include "ESP8266Component.h"
DonLakeFlyer's avatar
DonLakeFlyer committed
30
#include "APMHeliComponent.h"
31
#include "QGCApplication.h"
32
#include "ParameterManager.h"
33

34
#if !defined(NO_SERIAL_LINK) && !defined(__android__)
35
#include <QSerialPortInfo>
36
#endif
37 38

/// This is the AutoPilotPlugin implementatin for the MAV_AUTOPILOT_ARDUPILOT type.
39
APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent)
DonLakeFlyer's avatar
DonLakeFlyer committed
40
    : AutoPilotPlugin           (vehicle, parent)
41
    , _incorrectParameterVersion(false)
42 43 44 45 46 47 48 49 50 51 52 53 54
    , _airframeComponent        (nullptr)
    , _cameraComponent          (nullptr)
    , _lightsComponent          (nullptr)
    , _subFrameComponent        (nullptr)
    , _flightModesComponent     (nullptr)
    , _powerComponent           (nullptr)
    , _motorComponent           (nullptr)
    , _radioComponent           (nullptr)
    , _safetyComponent          (nullptr)
    , _sensorsComponent         (nullptr)
    , _tuningComponent          (nullptr)
    , _esp8266Component         (nullptr)
    , _heliComponent            (nullptr)
DonLakeFlyer's avatar
DonLakeFlyer committed
55
    , _followComponent          (nullptr)
56
{
57
#if !defined(NO_SERIAL_LINK) && !defined(__android__)
58
    connect(vehicle->parameterManager(), &ParameterManager::parametersReadyChanged, this, &APMAutoPilotPlugin::_checkForBadCubeBlack);
59
#endif
60 61 62 63 64 65 66 67 68
}

APMAutoPilotPlugin::~APMAutoPilotPlugin()
{

}

const QVariantList& APMAutoPilotPlugin::vehicleComponents(void)
{
69
    if (_components.count() == 0 && !_incorrectParameterVersion) {
70
        if (_vehicle->parameterManager()->parametersReady()) {
71
            _airframeComponent = new APMAirframeComponent(_vehicle, this);
72 73
            _airframeComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_airframeComponent));
Don Gagne's avatar
Don Gagne committed
74

75
            if ( _vehicle->supportsRadio() ) {
76 77 78 79
                _radioComponent = new APMRadioComponent(_vehicle, this);
                _radioComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_radioComponent));
            }
Don Gagne's avatar
Don Gagne committed
80

81
            // No flight modes component for Sub versions 3.5 and up
82
            if (!_vehicle->sub() || (_vehicle->versionCompare(3, 5, 0) < 0)) {
83 84 85 86
                _flightModesComponent = new APMFlightModesComponent(_vehicle, this);
                _flightModesComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_flightModesComponent));
            }
87

Don Gagne's avatar
Don Gagne committed
88
            _sensorsComponent = new APMSensorsComponent(_vehicle, this);
89 90
            _sensorsComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_sensorsComponent));
Don Gagne's avatar
Don Gagne committed
91

Don Gagne's avatar
Don Gagne committed
92 93 94 95
            _powerComponent = new APMPowerComponent(_vehicle, this);
            _powerComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_powerComponent));

96
            if (!_vehicle->sub() || (_vehicle->sub() && _vehicle->versionCompare(3, 5, 3) >= 0)) {
97
                _motorComponent = new APMMotorComponent(_vehicle, this);
Don Gagne's avatar
Don Gagne committed
98 99 100 101
                _motorComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_motorComponent));
            }

Don Gagne's avatar
Don Gagne committed
102
            _safetyComponent = new APMSafetyComponent(_vehicle, this);
103 104
            _safetyComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_safetyComponent));
Don Gagne's avatar
Don Gagne committed
105

DonLakeFlyer's avatar
DonLakeFlyer committed
106 107 108 109 110 111 112
            if ((qobject_cast<ArduCopterFirmwarePlugin*>(_vehicle->firmwarePlugin()) || qobject_cast<ArduCopterFirmwarePlugin*>(_vehicle->firmwarePlugin())) &&
                    _vehicle->parameterManager()->parameterExists(-1, QStringLiteral("FOLL_ENABLE"))) {
                _followComponent = new APMFollowComponent(_vehicle, this);
                _followComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_followComponent));
            }

DonLakeFlyer's avatar
DonLakeFlyer committed
113 114 115 116 117 118
            if (_vehicle->vehicleType() == MAV_TYPE_HELICOPTER) {
                _heliComponent = new APMHeliComponent(_vehicle, this);
                _heliComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_heliComponent));
            }

Don Gagne's avatar
Don Gagne committed
119
            _tuningComponent = new APMTuningComponent(_vehicle, this);
120 121
            _tuningComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_tuningComponent));
122

Don Gagne's avatar
Don Gagne committed
123 124 125 126
            _cameraComponent = new APMCameraComponent(_vehicle, this);
            _cameraComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_cameraComponent));

127 128 129 130
            if (_vehicle->sub()) {
                _lightsComponent = new APMLightsComponent(_vehicle, this);
                _lightsComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_lightsComponent));
131

132
                if(_vehicle->versionCompare(3, 5, 0) >= 0) {
133 134 135 136
                    _subFrameComponent = new APMSubFrameComponent(_vehicle, this);
                    _subFrameComponent->setupTriggerSignals();
                    _components.append(QVariant::fromValue((VehicleComponent*)_subFrameComponent));
                }
137 138
            }

Don Gagne's avatar
Don Gagne committed
139
            //-- Is there an ESP8266 Connected?
140
            if(_vehicle->parameterManager()->parameterExists(MAV_COMP_ID_UDP_BRIDGE, "SW_VER")) {
Don Gagne's avatar
Don Gagne committed
141 142 143 144
                _esp8266Component = new ESP8266Component(_vehicle, this);
                _esp8266Component->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_esp8266Component));
            }
145 146 147 148 149 150
        } else {
            qWarning() << "Call to vehicleCompenents prior to parametersReady";
        }
    }

    return _components;
151
}
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

QString APMAutoPilotPlugin::prerequisiteSetup(VehicleComponent* component) const
{
    bool requiresAirframeCheck = false;

    if (qobject_cast<const APMFlightModesComponent*>(component)) {
        if (_airframeComponent && !_airframeComponent->setupComplete()) {
            return _airframeComponent->name();
        }
        if (_radioComponent && !_radioComponent->setupComplete()) {
            return _radioComponent->name();
        }
        requiresAirframeCheck = true;
    } else if (qobject_cast<const APMRadioComponent*>(component)) {
        requiresAirframeCheck = true;
    } else if (qobject_cast<const APMCameraComponent*>(component)) {
        requiresAirframeCheck = true;
    } else if (qobject_cast<const APMPowerComponent*>(component)) {
        requiresAirframeCheck = true;
    } else if (qobject_cast<const APMSafetyComponent*>(component)) {
        requiresAirframeCheck = true;
    } else if (qobject_cast<const APMTuningComponent*>(component)) {
        requiresAirframeCheck = true;
    } else if (qobject_cast<const APMSensorsComponent*>(component)) {
        requiresAirframeCheck = true;
    }

    if (requiresAirframeCheck) {
        if (_airframeComponent && !_airframeComponent->setupComplete()) {
            return _airframeComponent->name();
        }
    }

    return QString();
}
187

188
#if !defined(NO_SERIAL_LINK) && !defined(__android__)
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
/// The following code is executed when the Vehicle is parameter ready. It checks for the service bulletin against Cube Blacks.
void APMAutoPilotPlugin::_checkForBadCubeBlack(void)
{
    bool cubeBlackFound = false;
    for (const QVariant& varLink: _vehicle->links()) {
        SerialLink* serialLink = varLink.value<SerialLink*>();
        if (serialLink && QSerialPortInfo(*serialLink->_hackAccessToPort()).description().contains(QStringLiteral("CubeBlack"))) {
            cubeBlackFound = true;
        }

    }
    if (!cubeBlackFound) {
        return;
    }

    ParameterManager* paramMgr = _vehicle->parameterManager();

    QString paramAcc3("INS_ACC3_ID");
    QString paramGyr3("INS_GYR3_ID");
    QString paramEnableMask("INS_ENABLE_MASK");

    if (paramMgr->parameterExists(-1, paramAcc3) && paramMgr->getParameter(-1, paramAcc3)->rawValue().toInt() == 0 &&
            paramMgr->parameterExists(-1, paramGyr3) && paramMgr->getParameter(-1, paramGyr3)->rawValue().toInt() == 0 &&
            paramMgr->parameterExists(-1, paramEnableMask) && paramMgr->getParameter(-1, paramEnableMask)->rawValue().toInt() >= 7) {
Don Gagne's avatar
Don Gagne committed
213
        qgcApp()->showMessage(tr("WARNING: The flight board you are using has a critical service bulletin against it which advises against flying. For details see: https://discuss.cubepilot.org/t/sb-0000002-critical-service-bulletin-for-cubes-purchased-between-january-2019-to-present-do-not-fly/406"));
214 215 216

    }
}
217
#endif