APMAutoPilotPlugin.cc 7.42 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"
Don Gagne's avatar
Don Gagne committed
26
#include "MotorComponent.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
    , _airframeComponent        (NULL)
    , _cameraComponent          (NULL)
    , _lightsComponent          (NULL)
    , _subFrameComponent        (NULL)
    , _flightModesComponent     (NULL)
    , _powerComponent           (NULL)
Don Gagne's avatar
Don Gagne committed
43 44
#if 0
        // Temporarily removed, waiting for new command implementation
DonLakeFlyer's avatar
DonLakeFlyer committed
45
    , _motorComponent           (NULL)
Don Gagne's avatar
Don Gagne committed
46
#endif
DonLakeFlyer's avatar
DonLakeFlyer committed
47 48 49 50 51 52 53
    , _radioComponent           (NULL)
    , _safetyComponent          (NULL)
    , _sensorsComponent         (NULL)
    , _tuningComponent          (NULL)
    , _airframeFacts            (new APMAirframeLoader(this, vehicle->uas(), this))
    , _esp8266Component         (NULL)
    , _heliComponent            (NULL)
54
{
55
    APMAirframeLoader::loadAirframeFactMetaData();
56 57 58 59 60 61 62 63 64
}

APMAutoPilotPlugin::~APMAutoPilotPlugin()
{

}

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

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

77 78 79 80 81 82
            // 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));
            }
83

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

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

Don Gagne's avatar
Don Gagne committed
92 93 94
#if 0
    // Temporarily removed, waiting for new command implementation

Don Gagne's avatar
Don Gagne committed
95 96 97 98 99
            if (_vehicle->multiRotor() || _vehicle->vtol()) {
                _motorComponent = new MotorComponent(_vehicle, this);
                _motorComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_motorComponent));
            }
Don Gagne's avatar
Don Gagne committed
100
#endif
Don Gagne's avatar
Don Gagne committed
101

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
            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
112
            _tuningComponent = new APMTuningComponent(_vehicle, this);
113 114
            _tuningComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_tuningComponent));
115

Don Gagne's avatar
Don Gagne committed
116 117 118 119
            _cameraComponent = new APMCameraComponent(_vehicle, this);
            _cameraComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_cameraComponent));

120 121 122 123
            if (_vehicle->sub()) {
                _lightsComponent = new APMLightsComponent(_vehicle, this);
                _lightsComponent->setupTriggerSignals();
                _components.append(QVariant::fromValue((VehicleComponent*)_lightsComponent));
124 125 126 127 128 129

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

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

    return _components;
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 174 175 176 177 178 179

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