Skip to content
Snippets Groups Projects
Joystick.h 7.71 KiB
Newer Older
  • Learn to ignore specific revisions
  • /****************************************************************************
     *
     *   (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.
     *
     ****************************************************************************/
    
    
    
    #ifndef Joystick_H
    #define Joystick_H
    
    #include <QObject>
    #include <QThread>
    
    #include "QGCLoggingCategory.h"
    #include "Vehicle.h"
    
    #include "MultiVehicleManager.h"
    
    
    Q_DECLARE_LOGGING_CATEGORY(JoystickLog)
    
    Q_DECLARE_LOGGING_CATEGORY(JoystickValuesLog)
    
    
    class Joystick : public QThread
    {
        Q_OBJECT
    
        Joystick(const QString& name, int axisCount, int buttonCount, int hatCount, MultiVehicleManager* multiVehicleManager);
    
    
        typedef struct Calibration_t {
    
            int     min;
            int     max;
            int     center;
    
            Calibration_t()
                : min(-32767)
                , max(32767)
                , center(0)
                , deadband(0)
                , reversed(false) {}
    
        typedef enum {
            rollFunction,
            pitchFunction,
            yawFunction,
            throttleFunction,
            maxFunction
        } AxisFunction_t;
    
        typedef enum {
            ThrottleModeCenterZero,
            ThrottleModeDownZero,
            ThrottleModeMax
        } ThrottleMode_t;
    
        Q_PROPERTY(QString name READ name CONSTANT)
    
    Don Gagne's avatar
    Don Gagne committed
        Q_PROPERTY(bool calibrated MEMBER _calibrated NOTIFY calibratedChanged)
    
        Q_PROPERTY(int totalButtonCount  READ totalButtonCount    CONSTANT)
    
        Q_PROPERTY(int axisCount    READ axisCount      CONSTANT)
    
        Q_PROPERTY(QStringList actions READ actions CONSTANT)
    
        Q_PROPERTY(QVariantList buttonActions READ buttonActions NOTIFY buttonActionsChanged)
    
    Don Gagne's avatar
    Don Gagne committed
        Q_INVOKABLE void setButtonAction(int button, const QString& action);
        Q_INVOKABLE QString getButtonAction(int button);
    
        Q_PROPERTY(int throttleMode READ throttleMode WRITE setThrottleMode NOTIFY throttleModeChanged)
    
        Q_PROPERTY(bool negativeThrust READ negativeThrust WRITE setNegativeThrust NOTIFY negativeThrustChanged)
    
        Q_PROPERTY(float exponential READ exponential WRITE setExponential NOTIFY exponentialChanged)
    
        Q_PROPERTY(bool accumulator READ accumulator WRITE setAccumulator NOTIFY accumulatorChanged)
    
    	Q_PROPERTY(bool requiresCalibration READ requiresCalibration CONSTANT)
        
    
        // Property accessors
    
        int axisCount(void) { return _axisCount; }
    
        int totalButtonCount(void) { return _totalButtonCount; }
    
        /// Start the polling thread which will in turn emit joystick signals
    
        void startPolling(Vehicle* vehicle);
    
        void stopPolling(void);
    
        void setCalibration(int axis, Calibration_t& calibration);
        Calibration_t getCalibration(int axis);
    
        void setFunctionAxis(AxisFunction_t function, int axis);
        int getFunctionAxis(AxisFunction_t function);
    
        QStringList actions(void);
        QVariantList buttonActions(void);
    
        QString name(void) { return _name; }
    
    Jacob Walser's avatar
    Jacob Walser committed
        // Joystick index used by sdl library
    
    Patrick José Pereira's avatar
    Patrick José Pereira committed
        // Settable because sdl library remaps indices after certain events
    
    Jacob Walser's avatar
    Jacob Walser committed
        virtual int index(void) = 0;
        virtual void setIndex(int index) = 0;
    
    	virtual bool requiresCalibration(void) { return true; }
    
    
        int throttleMode(void);
        void setThrottleMode(int mode);
    
        bool negativeThrust(void);
        void setNegativeThrust(bool allowNegative);
    
    
        float exponential(void);
        void setExponential(float expo);
    
        bool accumulator(void);
        void setAccumulator(bool accu);
    
    
    Gregory Dymarek's avatar
    Gregory Dymarek committed
        bool deadband(void);
        void setDeadband(bool accu);
    
    
        void setTXMode(int mode);
        int getTXMode(void) { return _transmitterMode; }
    
    
    Don Gagne's avatar
    Don Gagne committed
        typedef enum {
            CalibrationModeOff,         // Not calibrating
            CalibrationModeMonitor,     // Monitors are active, continue to send to vehicle if already polling
            CalibrationModeCalibrating, // Calibrating, stop sending joystick to vehicle
        } CalibrationMode_t;
    
    Don Gagne's avatar
    Don Gagne committed
        /// Set the current calibration mode
        void startCalibrationMode(CalibrationMode_t mode);
    
    Don Gagne's avatar
    Don Gagne committed
        /// Clear the current calibration mode
        void stopCalibrationMode(CalibrationMode_t mode);
    
    signals:
        void calibratedChanged(bool calibrated);
    
        // The raw signals are only meant for use by calibration
        void rawAxisValueChanged(int index, int value);
        void rawButtonPressedChanged(int index, int pressed);
    
        void buttonActionsChanged(QVariantList actions);
    
        void throttleModeChanged(int mode);
    
        void negativeThrustChanged(bool allowNegative);
    
    
        void exponentialChanged(float exponential);
    
        void accumulatorChanged(bool accumulator);
    
    
        void enabledChanged(bool enabled);
    
        /// Signal containing new joystick information
        ///     @param roll     Range is -1:1, negative meaning roll left, positive meaning roll right
        ///     @param pitch    Range i -1:1, negative meaning pitch down, positive meaning pitch up
        ///     @param yaw      Range is -1:1, negative meaning yaw left, positive meaning yaw right
        ///     @param throttle Range is 0:1, 0 meaning no throttle, 1 meaning full throttle
        ///     @param mode     See Vehicle::JoystickMode_t enum
        void manualControl(float roll, float pitch, float yaw, float throttle, quint16 buttons, int joystickMmode);
    
        void buttonActionTriggered(int action);
    
    protected:
    
        void    _setDefaultCalibration(void);
        void    _saveSettings(void);
        void    _loadSettings(void);
        float   _adjustRange(int value, Calibration_t calibration, bool withDeadbands);
        void    _buttonAction(const QString& action);
        bool    _validAxis(int axis);
        bool    _validButton(int button);
    
    private:
    
    Gregory Dymarek's avatar
    Gregory Dymarek committed
        virtual bool _open() = 0;
        virtual void _close() = 0;
        virtual bool _update() = 0;
    
    Gregory Dymarek's avatar
    Gregory Dymarek committed
        virtual bool _getButton(int i) = 0;
        virtual int _getAxis(int i) = 0;
    
        virtual uint8_t _getHat(int hat,int i) = 0;
    
        void _updateTXModeSettingsKey(Vehicle* activeVehicle);
    
        int _mapFunctionMode(int mode, int function);
        void _remapAxes(int currentMode, int newMode, int (&newMapping)[maxFunction]);
    
    
        // Override from QThread
        virtual void run(void);
    
    
    protected:
    
        bool    _exitThread;    ///< true: signal thread to exit
    
        QString _name;
        bool    _calibrated;
        int     _axisCount;
        int     _buttonCount;
    
        int     _hatCount;
        int     _hatButtonCount;
        int     _totalButtonCount;
    
        static int          _transmitterMode;
    
    Don Gagne's avatar
    Don Gagne committed
        CalibrationMode_t   _calibrationMode;
    
        int*                _rgAxisValues;
        Calibration_t*      _rgCalibration;
    
        int                 _rgFunctionAxis[maxFunction];
    
        bool*               _rgButtonValues;
    
        QStringList         _rgButtonActions;
    
        quint16             _lastButtonBits;
    
        ThrottleMode_t      _throttleMode;
    
    Gregory Dymarek's avatar
    Gregory Dymarek committed
        bool                _deadband;
    
        Vehicle*            _activeVehicle;
        bool                _pollingStartedForCalibration;
    
    
        MultiVehicleManager*    _multiVehicleManager;
    
    private:
        static const char*  _rgFunctionSettingsKey[maxFunction];
    
    
        static const char* _settingsGroup;
        static const char* _calibratedSettingsKey;
        static const char* _buttonActionSettingsKey;
        static const char* _throttleModeSettingsKey;
    
        static const char* _exponentialSettingsKey;
    
        static const char* _accumulatorSettingsKey;
    
    Gregory Dymarek's avatar
    Gregory Dymarek committed
        static const char* _deadbandSettingsKey;
    
        static const char* _txModeSettingsKey;
    
        static const char* _fixedWingTXModeSettingsKey;
        static const char* _multiRotorTXModeSettingsKey;
        static const char* _roverTXModeSettingsKey;
        static const char* _vtolTXModeSettingsKey;
        static const char* _submarineTXModeSettingsKey;
    
    private slots:
        void _activeVehicleChanged(Vehicle* activeVehicle);