RadioComponentController.h 12.6 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.
 *
 ****************************************************************************/

10 11 12


/// @file
Don Gagne's avatar
Don Gagne committed
13
///     @brief Radio Config Qml Controller
14 15
///     @author Don Gagne <don@thegagnes.com

Don Gagne's avatar
Don Gagne committed
16 17
#ifndef RadioComponentController_H
#define RadioComponentController_H
18 19 20

#include <QTimer>

Don Gagne's avatar
Don Gagne committed
21
#include "FactPanelController.h"
22
#include "UASInterface.h"
23
#include "QGCLoggingCategory.h"
24
#include "AutoPilotPlugin.h"
25

Don Gagne's avatar
Don Gagne committed
26
Q_DECLARE_LOGGING_CATEGORY(RadioComponentControllerLog)
27
Q_DECLARE_LOGGING_CATEGORY(RadioComponentControllerVerboseLog)
28

29
class RadioConfigest;
30 31

namespace Ui {
Don Gagne's avatar
Don Gagne committed
32
    class RadioComponentController;
33 34 35
}


Don Gagne's avatar
Don Gagne committed
36
class RadioComponentController : public FactPanelController
37 38 39
{
    Q_OBJECT
    
40
    friend class RadioConfigTest; ///< This allows our unit test to access internal information needed.
41 42
    
public:
Don Gagne's avatar
Don Gagne committed
43 44 45 46 47 48
    RadioComponentController(void);
    ~RadioComponentController();
    
    Q_PROPERTY(int minChannelCount MEMBER _chanMinimum CONSTANT)
    Q_PROPERTY(int channelCount READ channelCount NOTIFY channelCountChanged)
    
49 50 51 52
    Q_PROPERTY(QQuickItem* statusText   MEMBER _statusText      NOTIFY statusTextChanged)
    Q_PROPERTY(QQuickItem* cancelButton MEMBER _cancelButton    NOTIFY cancelButtonChanged)
    Q_PROPERTY(QQuickItem* nextButton   MEMBER _nextButton      NOTIFY nextButtonChanged)
    Q_PROPERTY(QQuickItem* skipButton   MEMBER _skipButton      NOTIFY skipButtonChanged)
Don Gagne's avatar
Don Gagne committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    
    Q_PROPERTY(bool rollChannelMapped READ rollChannelMapped NOTIFY rollChannelMappedChanged)
    Q_PROPERTY(bool pitchChannelMapped READ pitchChannelMapped NOTIFY pitchChannelMappedChanged)
    Q_PROPERTY(bool yawChannelMapped READ yawChannelMapped NOTIFY yawChannelMappedChanged)
    Q_PROPERTY(bool throttleChannelMapped READ throttleChannelMapped NOTIFY throttleChannelMappedChanged)
    
    Q_PROPERTY(int rollChannelRCValue READ rollChannelRCValue NOTIFY rollChannelRCValueChanged)
    Q_PROPERTY(int pitchChannelRCValue READ pitchChannelRCValue NOTIFY pitchChannelRCValueChanged)
    Q_PROPERTY(int yawChannelRCValue READ yawChannelRCValue NOTIFY yawChannelRCValueChanged)
    Q_PROPERTY(int throttleChannelRCValue READ throttleChannelRCValue NOTIFY throttleChannelRCValueChanged)
    
    Q_PROPERTY(int rollChannelReversed READ rollChannelReversed NOTIFY rollChannelReversedChanged)
    Q_PROPERTY(int pitchChannelReversed READ pitchChannelReversed NOTIFY pitchChannelReversedChanged)
    Q_PROPERTY(int yawChannelReversed READ yawChannelReversed NOTIFY yawChannelReversedChanged)
    Q_PROPERTY(int throttleChannelReversed READ throttleChannelReversed NOTIFY throttleChannelReversedChanged)
    
    Q_PROPERTY(int transmitterMode READ transmitterMode WRITE setTransmitterMode NOTIFY transmitterModeChanged)
    Q_PROPERTY(QString imageHelp MEMBER _imageHelp NOTIFY imageHelpChanged)
71

Don Gagne's avatar
Don Gagne committed
72 73 74 75 76
    enum BindModes {
        DSM2,
        DSMX7,
        DSMX8
    };
77 78
    Q_ENUM(BindModes)

Don Gagne's avatar
Don Gagne committed
79 80 81 82 83
    Q_INVOKABLE void spektrumBindMode(int mode);
    Q_INVOKABLE void cancelButtonClicked(void);
    Q_INVOKABLE void skipButtonClicked(void);
    Q_INVOKABLE void nextButtonClicked(void);
    Q_INVOKABLE void start(void);
Don Gagne's avatar
Don Gagne committed
84
    Q_INVOKABLE void copyTrims(void);
Don Gagne's avatar
Don Gagne committed
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    
    int rollChannelRCValue(void);
    int pitchChannelRCValue(void);
    int yawChannelRCValue(void);
    int throttleChannelRCValue(void);
    
    bool rollChannelMapped(void);
    bool pitchChannelMapped(void);
    bool yawChannelMapped(void);
    bool throttleChannelMapped(void);
    
    bool rollChannelReversed(void);
    bool pitchChannelReversed(void);
    bool yawChannelReversed(void);
    bool throttleChannelReversed(void);
    
    int channelCount(void);
    
    int transmitterMode(void) { return _transmitterMode; }
    void setTransmitterMode(int mode);
Don Gagne's avatar
Don Gagne committed
105 106
    
signals:
107 108 109 110 111
    void statusTextChanged(void);
    void cancelButtonChanged(void);
    void nextButtonChanged(void);
    void skipButtonChanged(void);

Don Gagne's avatar
Don Gagne committed
112 113
    void channelCountChanged(int channelCount);
    void channelRCValueChanged(int channel, int rcValue);
Don Gagne's avatar
Don Gagne committed
114
    
Don Gagne's avatar
Don Gagne committed
115 116 117 118
    void rollChannelMappedChanged(bool mapped);
    void pitchChannelMappedChanged(bool mapped);
    void yawChannelMappedChanged(bool mapped);
    void throttleChannelMappedChanged(bool mapped);
119
    
Don Gagne's avatar
Don Gagne committed
120 121 122 123
    void rollChannelRCValueChanged(int rcValue);
    void pitchChannelRCValueChanged(int rcValue);
    void yawChannelRCValueChanged(int rcValue);
    void throttleChannelRCValueChanged(int rcValue);
124
    
Don Gagne's avatar
Don Gagne committed
125 126 127 128
    void rollChannelReversedChanged(bool reversed);
    void pitchChannelReversedChanged(bool reversed);
    void yawChannelReversedChanged(bool reversed);
    void throttleChannelReversedChanged(bool reversed);
129
    
Don Gagne's avatar
Don Gagne committed
130 131 132
    void imageHelpChanged(QString source);
    void transmitterModeChanged(int mode);
    
133
    /// Signalled when in unit test mode and a message box should be displayed by the next button
Don Gagne's avatar
Don Gagne committed
134 135
    void nextButtonMessageBoxDisplayed(void);

136
    /// Signalled to QML to indicate reboot is required
Don Gagne's avatar
Don Gagne committed
137 138
    void functionMappingChangedAPMReboot(void);

139 140 141
    /// Signalled to Qml to indicate cal failure due to reversed throttle
    void throttleReversedCalFailure(void);

Don Gagne's avatar
Don Gagne committed
142
private slots:
Don Gagne's avatar
Don Gagne committed
143 144
    void _rcChannelsChanged(int channelCount, int pwmValues[Vehicle::cMaxRcChannels]);

145 146
private:
    /// @brief These identify the various controls functions. They are also used as indices into the _rgFunctioInfo
147
    /// array.
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
    enum rcCalFunctions {
        rcCalFunctionRoll,
        rcCalFunctionPitch,
        rcCalFunctionYaw,
        rcCalFunctionThrottle,
        rcCalFunctionMax,
    };
    
    /// @brief The states of the calibration state machine.
    enum rcCalStates {
        rcCalStateChannelWait,
        rcCalStateBegin,
        rcCalStateIdentify,
        rcCalStateMinMax,
        rcCalStateCenterThrottle,
        rcCalStateDetectInversion,
        rcCalStateTrims,
        rcCalStateSave
    };
    
Don Gagne's avatar
Don Gagne committed
168 169
    typedef void (RadioComponentController::*inputFn)(enum rcCalFunctions function, int chan, int value);
    typedef void (RadioComponentController::*buttonFn)(void);
Don Gagne's avatar
Don Gagne committed
170 171 172 173 174 175 176 177 178
    struct stateMachineEntry {
        enum rcCalFunctions function;
        const char*         instructions;
        const char*         image;
        inputFn             rcInputFn;
        buttonFn            nextFn;
        buttonFn            skipFn;
    };
    
179 180 181 182 183 184 185 186 187
    /// @brief A set of information associated with a function.
    struct FunctionInfo {
        const char* parameterName;  ///< Parameter name for function mapping
    };
    
    /// @brief A set of information associated with a radio channel.
    struct ChannelInfo {
        enum rcCalFunctions function;   ///< Function mapped to this channel, rcCalFunctionMax for none
        bool                reversed;   ///< true: channel is reverse, false: not reversed
Don Gagne's avatar
Don Gagne committed
188 189 190 191 192 193 194
        int                 rcMin;      ///< Minimum RC value
        int                 rcMax;      ///< Maximum RC value
        int                 rcTrim;     ///< Trim position
    };
    
    int _currentStep;  ///< Current step of state machine
    
Don Gagne's avatar
Don Gagne committed
195 196 197
    const struct stateMachineEntry* _getStateMachineEntry(int step) const;
    const struct FunctionInfo* _functionInfo(void) const;
    bool _px4Vehicle(void) const;
Don Gagne's avatar
Don Gagne committed
198
    
Don Gagne's avatar
Don Gagne committed
199
    void _advanceState(void);
Don Gagne's avatar
Don Gagne committed
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
    void _setupCurrentState(void);
    
    void _inputCenterWaitBegin(enum rcCalFunctions function, int channel, int value);
    void _inputStickDetect(enum rcCalFunctions function, int channel, int value);
    void _inputStickMin(enum rcCalFunctions function, int channel, int value);
    void _inputCenterWait(enum rcCalFunctions function, int channel, int value);
    void _inputSwitchMinMax(enum rcCalFunctions function, int channel, int value);
    void _inputSwitchDetect(enum rcCalFunctions function, int channel, int value);
    
    void _switchDetect(enum rcCalFunctions function, int channel, int value, bool moveToNextStep);
    
    void _saveAllTrims(void);
    
    bool _stickSettleComplete(int value);
    
Don Gagne's avatar
Don Gagne committed
215
    void _validateCalibration(void);
Don Gagne's avatar
Don Gagne committed
216
    void _writeCalibration(void);
217
    void _resetInternalCalibrationValues(void);
Don Gagne's avatar
Don Gagne committed
218
    void _setInternalCalibrationValuesFromParameters(void);
219
    
Don Gagne's avatar
Don Gagne committed
220 221
    void _startCalibration(void);
    void _stopCalibration(void);
222 223
    void _rcCalSave(void);

Don Gagne's avatar
Don Gagne committed
224 225
    void _writeParameters(void);
    
226 227
    void _rcCalSaveCurrentValues(void);
    
228 229 230 231 232
    void _setHelpImage(const char* imageFile);
    
    void _loadSettings(void);
    void _storeSettings(void);
    
nanthony21's avatar
nanthony21 committed
233
    void _signalAllAttitudeValueChanges(void);
Don Gagne's avatar
Don Gagne committed
234 235

    int _chanMax(void) const;
236 237 238 239

    bool _channelReversedParamValue(int channel);
    void _setChannelReversedParamValue(int channel, bool reversed);

Don Gagne's avatar
Don Gagne committed
240 241
    // @brief Called by unit test code to set the mode to unit testing
    void _setUnitTestMode(void){ _unitTestMode = true; }
242 243
    
    // Member variables
Don Gagne's avatar
Don Gagne committed
244

245 246
    static const char* _imageFileMode1Dir;
    static const char* _imageFileMode2Dir;
Don Gagne's avatar
Don Gagne committed
247
    static const char* _imageFilePrefix;
248
    static const char* _imageCenter;
Don Gagne's avatar
Don Gagne committed
249 250 251 252 253 254 255 256 257 258
    static const char* _imageHome;
    static const char* _imageThrottleUp;
    static const char* _imageThrottleDown;
    static const char* _imageYawLeft;
    static const char* _imageYawRight;
    static const char* _imageRollLeft;
    static const char* _imageRollRight;
    static const char* _imagePitchUp;
    static const char* _imagePitchDown;
    static const char* _imageSwitchMinMax;
259
    
260 261 262 263 264
    static const char* _settingsGroup;
    static const char* _settingsKeyTransmitterMode;
    
    int _transmitterMode;   ///< 1: transmitter is mode 1, 2: transmitted is mode 2
    
265
    static const int _updateInterval;   ///< Interval for ui update timer
266

Don Gagne's avatar
Don Gagne committed
267 268 269
    static const struct FunctionInfo _rgFunctionInfoAPM[rcCalFunctionMax]; ///< Information associated with each function, PX4 firmware
    static const struct FunctionInfo _rgFunctionInfoPX4[rcCalFunctionMax]; ///< Information associated with each function, APM firmware

270
    int _rgFunctionChannelMapping[rcCalFunctionMax];                    ///< Maps from rcCalFunctions to channel index. _chanMax indicates channel not set for this function.
Don Gagne's avatar
Don Gagne committed
271 272

    static const int _attitudeControls = 5;
273

274
    int _chanCount;                     ///< Number of actual rc channels available
Don Gagne's avatar
Don Gagne committed
275 276 277 278
    static const int _chanMaxPX4 = 18;  ///< Maximum number of supported rc channels, PX4 Firmware
    static const int _chanMaxAPM = 14;  ///< Maximum number of supported rc channels, APM firmware
    static const int _chanMaxAny = 18;  ///< Maximum number of support rc channels by this implementation
    static const int _chanMinimum = 5;  ///< Minimum numner of channels required to run
279

Don Gagne's avatar
Don Gagne committed
280
    struct ChannelInfo _rgChannelInfo[_chanMaxAny];    ///< Information associated with each rc channel
281 282

    QList<int> _apmPossibleMissingRCChannelParams;  ///< List of possible missing RC*_* params for APM stack
283 284 285 286 287 288 289
    
    enum rcCalStates _rcCalState;       ///< Current calibration state
    int _rcCalStateCurrentChannel;      ///< Current channel being worked on in rcCalStateIdentify and rcCalStateDetectInversion
    bool _rcCalStateChannelComplete;    ///< Work associated with current channel is complete
    int _rcCalStateIdentifyOldMapping;  ///< Previous mapping for channel being currently identified
    int _rcCalStateReverseOldMapping;   ///< Previous mapping for channel being currently used to detect inversion
    
Don Gagne's avatar
Don Gagne committed
290 291 292 293 294 295
    static const int _rcCalPWMCenterPoint;
    static const int _rcCalPWMValidMinValue;
    static const int _rcCalPWMValidMaxValue;
    static const int _rcCalPWMDefaultMinValue;
    static const int _rcCalPWMDefaultMaxValue;
    static const int _rcCalRoughCenterDelta;
Don Gagne's avatar
Don Gagne committed
296 297 298
    static const int _rcCalMoveDelta;
    static const int _rcCalSettleDelta;
    static const int _rcCalMinDelta;
299 300 301 302 303 304

    static const char*  _px4RevParamFormat;
    static const char*  _apmNewRevParamFormat;
    QString             _revParamFormat;
    bool                _revParamIsBool;

Don Gagne's avatar
Don Gagne committed
305
    int _rcValueSave[_chanMaxAny];        ///< Saved values prior to detecting channel movement
306
    
Don Gagne's avatar
Don Gagne committed
307
    int _rcRawValue[_chanMaxAny];         ///< Current set of raw channel values
308
    
Don Gagne's avatar
Don Gagne committed
309 310 311 312 313 314 315 316
    int     _stickDetectChannel;
    int     _stickDetectInitialValue;
    int     _stickDetectValue;
    bool    _stickDetectSettleStarted;
    QTime   _stickDetectSettleElapsed;
    static const int _stickDetectSettleMSecs;
    
    bool _unitTestMode;
Don Gagne's avatar
Don Gagne committed
317 318 319 320 321 322 323
    
    QQuickItem* _statusText;
    QQuickItem* _cancelButton;
    QQuickItem* _nextButton;
    QQuickItem* _skipButton;
    
    QString _imageHelp;
324 325 326 327 328
    
#ifdef UNITTEST_BUILD
    // Nasty hack to expose controller to unit test code
    static RadioComponentController*    _unitTestController;
#endif
329 330
};

Don Gagne's avatar
Don Gagne committed
331
#endif // RadioComponentController_H