RadioComponentController.h 12.8 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

28
class RadioConfigest;
29 30

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


Don Gagne's avatar
Don Gagne committed
35
class RadioComponentController : public FactPanelController
36 37 38
{
    Q_OBJECT
    
39
    friend class RadioConfigTest; ///< This allows our unit test to access internal information needed.
40 41
    
public:
Don Gagne's avatar
Don Gagne committed
42 43 44 45 46 47
    RadioComponentController(void);
    ~RadioComponentController();
    
    Q_PROPERTY(int minChannelCount MEMBER _chanMinimum CONSTANT)
    Q_PROPERTY(int channelCount READ channelCount NOTIFY channelCountChanged)
    
48 49 50 51
    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
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    
    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)
    
    Q_ENUMS(BindModes)
    enum BindModes {
        DSM2,
        DSMX7,
        DSMX8
    };
    
    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
83
    Q_INVOKABLE void copyTrims(void);
Don Gagne's avatar
Don Gagne committed
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    
    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
104 105
    
signals:
106 107 108 109 110
    void statusTextChanged(void);
    void cancelButtonChanged(void);
    void nextButtonChanged(void);
    void skipButtonChanged(void);

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

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

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

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

144 145
private:
    /// @brief These identify the various controls functions. They are also used as indices into the _rgFunctioInfo
146
    /// array.
147 148 149 150 151 152 153 154 155
    enum rcCalFunctions {
        rcCalFunctionRoll,
        rcCalFunctionPitch,
        rcCalFunctionYaw,
        rcCalFunctionThrottle,
        rcCalFunctionModeSwitch,
        rcCalFunctionPosCtlSwitch,
        rcCalFunctionLoiterSwitch,
        rcCalFunctionReturnSwitch,
156
        rcCalFunctionAcroSwitch,
157 158 159 160 161 162
        rcCalFunctionMax,
        
        // Attitude functions are roll/pitch/yaw/throttle
        rcCalFunctionFirstAttitudeFunction = rcCalFunctionRoll,
        rcCalFunctionLastAttitudeFunction = rcCalFunctionThrottle,
        
nopeppermint's avatar
nopeppermint committed
163
        // Non-Attitude functions are everything else
164
        rcCalFunctionFirstNonAttitudeFunction = rcCalFunctionModeSwitch,
165
        rcCalFunctionLastNonAttitudeFunction = rcCalFunctionAcroSwitch,
166 167 168 169 170 171 172 173 174 175 176 177 178 179
    };
    
    /// @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
180 181
    typedef void (RadioComponentController::*inputFn)(enum rcCalFunctions function, int chan, int value);
    typedef void (RadioComponentController::*buttonFn)(void);
Don Gagne's avatar
Don Gagne committed
182 183 184 185 186 187 188 189 190
    struct stateMachineEntry {
        enum rcCalFunctions function;
        const char*         instructions;
        const char*         image;
        inputFn             rcInputFn;
        buttonFn            nextFn;
        buttonFn            skipFn;
    };
    
191 192 193 194 195 196 197 198 199
    /// @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
200 201 202 203 204 205 206
        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
207 208 209
    const struct stateMachineEntry* _getStateMachineEntry(int step) const;
    const struct FunctionInfo* _functionInfo(void) const;
    bool _px4Vehicle(void) const;
Don Gagne's avatar
Don Gagne committed
210
    
Don Gagne's avatar
Don Gagne committed
211
    void _advanceState(void);
Don Gagne's avatar
Don Gagne committed
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
    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
227
    void _validateCalibration(void);
Don Gagne's avatar
Don Gagne committed
228
    void _writeCalibration(void);
229
    void _resetInternalCalibrationValues(void);
Don Gagne's avatar
Don Gagne committed
230
    void _setInternalCalibrationValuesFromParameters(void);
231
    
Don Gagne's avatar
Don Gagne committed
232 233
    void _startCalibration(void);
    void _stopCalibration(void);
234 235
    void _rcCalSave(void);

Don Gagne's avatar
Don Gagne committed
236 237
    void _writeParameters(void);
    
238 239
    void _rcCalSaveCurrentValues(void);
    
240 241 242 243 244
    void _setHelpImage(const char* imageFile);
    
    void _loadSettings(void);
    void _storeSettings(void);
    
Don Gagne's avatar
Don Gagne committed
245
    void _signalAllAttiudeValueChanges(void);
Don Gagne's avatar
Don Gagne committed
246 247

    int _chanMax(void) const;
Don Gagne's avatar
Don Gagne committed
248
    
Don Gagne's avatar
Don Gagne committed
249 250
    // @brief Called by unit test code to set the mode to unit testing
    void _setUnitTestMode(void){ _unitTestMode = true; }
251 252
    
    // Member variables
Don Gagne's avatar
Don Gagne committed
253

254 255
    static const char* _imageFileMode1Dir;
    static const char* _imageFileMode2Dir;
Don Gagne's avatar
Don Gagne committed
256
    static const char* _imageFilePrefix;
257
    static const char* _imageCenter;
Don Gagne's avatar
Don Gagne committed
258 259 260 261 262 263 264 265 266 267
    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;
268
    
269 270 271 272 273
    static const char* _settingsGroup;
    static const char* _settingsKeyTransmitterMode;
    
    int _transmitterMode;   ///< 1: transmitter is mode 1, 2: transmitted is mode 2
    
274 275
    static const int _updateInterval;   ///< Interval for ui update timer
    
Don Gagne's avatar
Don Gagne committed
276 277 278
    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

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

    static const int _attitudeControls = 5;
282 283
    
    int _chanCount;                     ///< Number of actual rc channels available
Don Gagne's avatar
Don Gagne committed
284 285 286 287
    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
288
    
Don Gagne's avatar
Don Gagne committed
289
    struct ChannelInfo _rgChannelInfo[_chanMaxAny];    ///< Information associated with each rc channel
290 291

    QList<int> _apmPossibleMissingRCChannelParams;  ///< List of possible missing RC*_* params for APM stack
292 293 294 295 296 297 298
    
    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
299 300 301 302 303 304
    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
305 306 307
    static const int _rcCalMoveDelta;
    static const int _rcCalSettleDelta;
    static const int _rcCalMinDelta;
308
    
Don Gagne's avatar
Don Gagne committed
309
    int _rcValueSave[_chanMaxAny];        ///< Saved values prior to detecting channel movement
310
    
Don Gagne's avatar
Don Gagne committed
311
    int _rcRawValue[_chanMaxAny];         ///< Current set of raw channel values
312
    
Don Gagne's avatar
Don Gagne committed
313 314 315 316 317 318 319 320
    int     _stickDetectChannel;
    int     _stickDetectInitialValue;
    int     _stickDetectValue;
    bool    _stickDetectSettleStarted;
    QTime   _stickDetectSettleElapsed;
    static const int _stickDetectSettleMSecs;
    
    bool _unitTestMode;
Don Gagne's avatar
Don Gagne committed
321 322 323 324 325 326 327
    
    QQuickItem* _statusText;
    QQuickItem* _cancelButton;
    QQuickItem* _nextButton;
    QQuickItem* _skipButton;
    
    QString _imageHelp;
328 329 330 331 332
    
#ifdef UNITTEST_BUILD
    // Nasty hack to expose controller to unit test code
    static RadioComponentController*    _unitTestController;
#endif
333 334
};

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