APMAutoPilotPlugin.cc 7.39 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 23 24
#include "APMAirframeComponent.h"
#include "APMAirframeComponentAirframes.h"
#include "APMAirframeLoader.h"
#include "APMFlightModesComponent.h"
#include "APMRadioComponent.h"
#include "APMSafetyComponent.h"
#include "APMTuningComponent.h"
#include "APMSensorsComponent.h"
Don Gagne's avatar
Don Gagne committed
25
#include "APMPowerComponent.h"
26
#include "APMMotorComponent.h"
Don Gagne's avatar
Don Gagne committed
27
#include "APMCameraComponent.h"
28
#include "APMLightsComponent.h"
29
#include "APMSubFrameComponent.h"
30
#include "ESP8266Component.h"
DonLakeFlyer's avatar
DonLakeFlyer committed
31
#include "APMHeliComponent.h"
32 33

/// This is the AutoPilotPlugin implementatin for the MAV_AUTOPILOT_ARDUPILOT type.
34
APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent)
DonLakeFlyer's avatar
DonLakeFlyer committed
35
    : AutoPilotPlugin           (vehicle, parent)
36
    , _incorrectParameterVersion(false)
DonLakeFlyer's avatar
DonLakeFlyer committed
37 38 39 40 41 42 43 44 45 46 47 48 49 50
    , _airframeComponent        (NULL)
    , _cameraComponent          (NULL)
    , _lightsComponent          (NULL)
    , _subFrameComponent        (NULL)
    , _flightModesComponent     (NULL)
    , _powerComponent           (NULL)
    , _motorComponent           (NULL)
    , _radioComponent           (NULL)
    , _safetyComponent          (NULL)
    , _sensorsComponent         (NULL)
    , _tuningComponent          (NULL)
    , _airframeFacts            (new APMAirframeLoader(this, vehicle->uas(), this))
    , _esp8266Component         (NULL)
    , _heliComponent            (NULL)
51
{
52
    APMAirframeLoader::loadAirframeFactMetaData();
53 54 55 56 57 58 59 60 61
}

APMAutoPilotPlugin::~APMAutoPilotPlugin()
{

}

const QVariantList& APMAutoPilotPlugin::vehicleComponents(void)
{
62
    if (_components.count() == 0 && !_incorrectParameterVersion) {
63
        if (_vehicle->parameterManager()->parametersReady()) {
64
            _airframeComponent = new APMAirframeComponent(_vehicle, this);
65 66
            _airframeComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_airframeComponent));
Don Gagne's avatar
Don Gagne committed
67

68
            if ( _vehicle->supportsRadio() ) {
69 70 71 72
                _radioComponent = new APMRadioComponent(_vehicle, this);
                _radioComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_radioComponent));
            }
Don Gagne's avatar
Don Gagne committed
73

74 75 76 77 78 79
            // No flight modes component for Sub versions 3.5 and up
            if (!_vehicle->sub() || (_vehicle->firmwareMajorVersion() == 3 && _vehicle->firmwareMinorVersion() <= 4)) {
                _flightModesComponent = new APMFlightModesComponent(_vehicle, this);
                _flightModesComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_flightModesComponent));
            }
80

Don Gagne's avatar
Don Gagne committed
81
            _sensorsComponent = new APMSensorsComponent(_vehicle, this);
82 83
            _sensorsComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_sensorsComponent));
Don Gagne's avatar
Don Gagne committed
84

Don Gagne's avatar
Don Gagne committed
85 86 87 88
            _powerComponent = new APMPowerComponent(_vehicle, this);
            _powerComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_powerComponent));

89 90
            int versionInt = _vehicle->firmwareMajorVersion() * 100 + _vehicle->firmwareMinorVersion() * 10 + _vehicle->firmwarePatchVersion();
            if (_vehicle->sub() && versionInt >= 353) {
91
                _motorComponent = new APMMotorComponent(_vehicle, this);
Don Gagne's avatar
Don Gagne committed
92 93 94 95
                _motorComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_motorComponent));
            }

Don Gagne's avatar
Don Gagne committed
96
            _safetyComponent = new APMSafetyComponent(_vehicle, this);
97 98
            _safetyComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_safetyComponent));
Don Gagne's avatar
Don Gagne committed
99

DonLakeFlyer's avatar
DonLakeFlyer committed
100 101 102 103 104 105
            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
106
            _tuningComponent = new APMTuningComponent(_vehicle, this);
107 108
            _tuningComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_tuningComponent));
109

Don Gagne's avatar
Don Gagne committed
110 111 112 113
            _cameraComponent = new APMCameraComponent(_vehicle, this);
            _cameraComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_cameraComponent));

114 115 116 117
            if (_vehicle->sub()) {
                _lightsComponent = new APMLightsComponent(_vehicle, this);
                _lightsComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_lightsComponent));
118 119 120 121 122 123

                if(_vehicle->firmwareMajorVersion() > 3 || (_vehicle->firmwareMajorVersion() == 3 && _vehicle->firmwareMinorVersion() >= 5)) {
                    _subFrameComponent = new APMSubFrameComponent(_vehicle, this);
                    _subFrameComponent->setupTriggerSignals();
                    _components.append(QVariant::fromValue((VehicleComponent*)_subFrameComponent));
                }
124 125
            }

Don Gagne's avatar
Don Gagne committed
126
            //-- Is there an ESP8266 Connected?
127
            if(_vehicle->parameterManager()->parameterExists(MAV_COMP_ID_UDP_BRIDGE, "SW_VER")) {
Don Gagne's avatar
Don Gagne committed
128 129 130 131
                _esp8266Component = new ESP8266Component(_vehicle, this);
                _esp8266Component->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_esp8266Component));
            }
132 133 134 135 136 137
        } else {
            qWarning() << "Call to vehicleCompenents prior to parametersReady";
        }
    }

    return _components;
138
}
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173

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();
}