APMAutoPilotPlugin.cc 6.98 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"
Don Gagne's avatar
Don Gagne committed
31
#include "MixersComponent.h"
32 33

/// This is the AutoPilotPlugin implementatin for the MAV_AUTOPILOT_ARDUPILOT type.
34 35 36 37
APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent)
    : AutoPilotPlugin(vehicle, parent)
    , _incorrectParameterVersion(false)
    , _airframeComponent(NULL)
Don Gagne's avatar
Don Gagne committed
38
    , _cameraComponent(NULL)
39
    , _lightsComponent(NULL)
40
    , _subFrameComponent(NULL)
Don Gagne's avatar
Don Gagne committed
41
    , _flightModesComponent(NULL)
Don Gagne's avatar
Don Gagne committed
42
    , _powerComponent(NULL)
Don Gagne's avatar
Don Gagne committed
43 44
#if 0
        // Temporarily removed, waiting for new command implementation
Don Gagne's avatar
Don Gagne committed
45
    , _motorComponent(NULL)
Don Gagne's avatar
Don Gagne committed
46
#endif
Don Gagne's avatar
Don Gagne committed
47
    , _radioComponent(NULL)
Don Gagne's avatar
Don Gagne committed
48 49
    , _safetyComponent(NULL)
    , _sensorsComponent(NULL)
Don Gagne's avatar
Don Gagne committed
50
    , _tuningComponent(NULL)
51
    , _airframeFacts(new APMAirframeLoader(this, vehicle->uas(), this))
52
    , _esp8266Component(NULL)
Don Gagne's avatar
Don Gagne committed
53
    , _mixersComponent(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

Don Gagne's avatar
Don Gagne committed
77 78 79
            _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));

Don Gagne's avatar
Don Gagne committed
89 90 91
#if 0
    // Temporarily removed, waiting for new command implementation

Don Gagne's avatar
Don Gagne committed
92 93 94 95 96
            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
97
#endif
Don Gagne's avatar
Don Gagne committed
98

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

            _tuningComponent = new APMTuningComponent(_vehicle, this);
104 105
            _tuningComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_tuningComponent));
106

Don Gagne's avatar
Don Gagne committed
107 108 109 110
            _mixersComponent = new MixersComponent(_vehicle, this);
            _mixersComponent->setupTriggerSignals();
            _components.append(QVariant::fromValue((VehicleComponent*)_mixersComponent));

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

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

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

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

    return _components;
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 174

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