Library for communicating with a Wii classic controller using the I2C bus.
Dependents: WiiClassicControllerTest
Note that you will also need the CommonTypes library to use this.
Get it here:http://mbed.org/users/RichardE/code/CommonTypes/
WiiClassicControllerWithCalibration.h@4:79d04d737f02, 2013-06-30 (annotated)
- Committer:
- RichardE
- Date:
- Sun Jun 30 16:45:24 2013 +0000
- Revision:
- 4:79d04d737f02
- Parent:
- 3:ecae3d286a99
Slight documentation fix.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RichardE | 2:52c4a0b3a509 | 1 | /* |
RichardE | 2:52c4a0b3a509 | 2 | * SOURCE FILE : WiiClassicControllerWithCalibration.h |
RichardE | 2:52c4a0b3a509 | 3 | * |
RichardE | 2:52c4a0b3a509 | 4 | * Definition of class WiiClassicControllerWithCalibration. |
RichardE | 2:52c4a0b3a509 | 5 | * |
RichardE | 2:52c4a0b3a509 | 6 | */ |
RichardE | 2:52c4a0b3a509 | 7 | |
RichardE | 2:52c4a0b3a509 | 8 | #ifndef WiiClassicControllerWithCalibrationDefined |
RichardE | 2:52c4a0b3a509 | 9 | |
RichardE | 2:52c4a0b3a509 | 10 | #define WiiClassicControllerWithCalibrationDefined |
RichardE | 2:52c4a0b3a509 | 11 | |
RichardE | 2:52c4a0b3a509 | 12 | #include "WiiClassicController.h" |
RichardE | 2:52c4a0b3a509 | 13 | |
RichardE | 2:52c4a0b3a509 | 14 | /// Derived from WiiClassicController but with calibrated analogue inputs. |
RichardE | 2:52c4a0b3a509 | 15 | class WiiClassicControllerWithCalibration : public WiiClassicController { |
RichardE | 2:52c4a0b3a509 | 16 | |
RichardE | 2:52c4a0b3a509 | 17 | public : |
RichardE | 2:52c4a0b3a509 | 18 | |
RichardE | 2:52c4a0b3a509 | 19 | /// Enumeration of all the analogue inputs on the Wii classic controller. |
RichardE | 2:52c4a0b3a509 | 20 | enum AnaIn { |
RichardE | 2:52c4a0b3a509 | 21 | LeftJoyX, |
RichardE | 2:52c4a0b3a509 | 22 | LeftJoyY, |
RichardE | 2:52c4a0b3a509 | 23 | RightJoyX, |
RichardE | 2:52c4a0b3a509 | 24 | RightJoyY, |
RichardE | 2:52c4a0b3a509 | 25 | LeftTrigger, |
RichardE | 2:52c4a0b3a509 | 26 | RightTrigger, |
RichardE | 2:52c4a0b3a509 | 27 | AnaInCount // MUST COME LAST! |
RichardE | 2:52c4a0b3a509 | 28 | }; |
RichardE | 2:52c4a0b3a509 | 29 | |
RichardE | 2:52c4a0b3a509 | 30 | /** Constructor |
RichardE | 2:52c4a0b3a509 | 31 | * @param sda pin to use for SDA. |
RichardE | 2:52c4a0b3a509 | 32 | * @param scl pin to use for SCL. |
RichardE | 2:52c4a0b3a509 | 33 | */ |
RichardE | 2:52c4a0b3a509 | 34 | WiiClassicControllerWithCalibration( PinName sda, PinName scl ); |
RichardE | 2:52c4a0b3a509 | 35 | |
RichardE | 2:52c4a0b3a509 | 36 | /** Destructor |
RichardE | 2:52c4a0b3a509 | 37 | */ |
RichardE | 2:52c4a0b3a509 | 38 | virtual ~WiiClassicControllerWithCalibration(); |
RichardE | 2:52c4a0b3a509 | 39 | |
RichardE | 3:ecae3d286a99 | 40 | /** Read from the controller. |
RichardE | 3:ecae3d286a99 | 41 | * This override will also update calibration information |
RichardE | 3:ecae3d286a99 | 42 | * when calibration is in progress. |
RichardE | 3:ecae3d286a99 | 43 | * @returns true on success, false on failure. |
RichardE | 3:ecae3d286a99 | 44 | */ |
RichardE | 3:ecae3d286a99 | 45 | virtual bool Read( void ); |
RichardE | 3:ecae3d286a99 | 46 | |
RichardE | 2:52c4a0b3a509 | 47 | /** Set scaling for a particular analogue input. |
RichardE | 4:79d04d737f02 | 48 | * @param input channel to change. |
RichardE | 2:52c4a0b3a509 | 49 | * @param m scale (multiplier) for this analogue input. |
RichardE | 2:52c4a0b3a509 | 50 | * @param c offset for this analogue input. |
RichardE | 2:52c4a0b3a509 | 51 | */ |
RichardE | 2:52c4a0b3a509 | 52 | void SetScaling( AnaIn input, float m, float c ); |
RichardE | 2:52c4a0b3a509 | 53 | |
RichardE | 3:ecae3d286a99 | 54 | /** Get scaling for a particular analogue input. |
RichardE | 3:ecae3d286a99 | 55 | * @param input channel to read. |
RichardE | 3:ecae3d286a99 | 56 | * @param m scale (multiplier) for this analogue input return here. |
RichardE | 3:ecae3d286a99 | 57 | * @param c offset for this analogue input returned here. |
RichardE | 3:ecae3d286a99 | 58 | */ |
RichardE | 3:ecae3d286a99 | 59 | void GetScaling( AnaIn input, float *m, float *c ) const; |
RichardE | 3:ecae3d286a99 | 60 | |
RichardE | 2:52c4a0b3a509 | 61 | /** Get calibrated left joystick X reading. |
RichardE | 2:52c4a0b3a509 | 62 | * @returns a reading between -1 and +1. |
RichardE | 2:52c4a0b3a509 | 63 | */ |
RichardE | 2:52c4a0b3a509 | 64 | float GetCalLJoyX( void ) const; |
RichardE | 2:52c4a0b3a509 | 65 | |
RichardE | 2:52c4a0b3a509 | 66 | /** Get calibrated left joystick Y reading. |
RichardE | 2:52c4a0b3a509 | 67 | * @returns a reading between -1 and +1. |
RichardE | 2:52c4a0b3a509 | 68 | */ |
RichardE | 2:52c4a0b3a509 | 69 | float GetCalLJoyY( void ) const; |
RichardE | 2:52c4a0b3a509 | 70 | |
RichardE | 2:52c4a0b3a509 | 71 | /** Get calibrated right joystick X reading. |
RichardE | 2:52c4a0b3a509 | 72 | * @returns a reading between -1 and +1. |
RichardE | 2:52c4a0b3a509 | 73 | */ |
RichardE | 2:52c4a0b3a509 | 74 | float GetCalRJoyX( void ) const; |
RichardE | 2:52c4a0b3a509 | 75 | |
RichardE | 2:52c4a0b3a509 | 76 | /** Get calibrated right joystick Y reading. |
RichardE | 2:52c4a0b3a509 | 77 | * @returns a reading between -1 and +1. |
RichardE | 2:52c4a0b3a509 | 78 | */ |
RichardE | 2:52c4a0b3a509 | 79 | float GetCalRJoyY( void ) const; |
RichardE | 2:52c4a0b3a509 | 80 | |
RichardE | 2:52c4a0b3a509 | 81 | /** Get calibrated left trigger reading. |
RichardE | 2:52c4a0b3a509 | 82 | * @returns a reading between 0 and +1. |
RichardE | 2:52c4a0b3a509 | 83 | */ |
RichardE | 2:52c4a0b3a509 | 84 | float GetCalLeftTrigger( void ) const; |
RichardE | 2:52c4a0b3a509 | 85 | |
RichardE | 2:52c4a0b3a509 | 86 | /** Get calibrated right trigger reading. |
RichardE | 2:52c4a0b3a509 | 87 | * @returns a reading between 0 and +1. |
RichardE | 2:52c4a0b3a509 | 88 | */ |
RichardE | 2:52c4a0b3a509 | 89 | float GetCalRightTrigger( void ) const; |
RichardE | 2:52c4a0b3a509 | 90 | |
RichardE | 3:ecae3d286a99 | 91 | /** Get indication that calibration is in progress. |
RichardE | 3:ecae3d286a99 | 92 | * @returns true if calibration is in progress. |
RichardE | 3:ecae3d286a99 | 93 | */ |
RichardE | 3:ecae3d286a99 | 94 | bool IsCalibrating( void ) const { |
RichardE | 3:ecae3d286a99 | 95 | return calibrating; |
RichardE | 3:ecae3d286a99 | 96 | } |
RichardE | 3:ecae3d286a99 | 97 | |
RichardE | 3:ecae3d286a99 | 98 | /** Start calibrating. |
RichardE | 3:ecae3d286a99 | 99 | * Every call to Read method updates calibration until StopCalibrating is called. |
RichardE | 3:ecae3d286a99 | 100 | */ |
RichardE | 3:ecae3d286a99 | 101 | void StartCalibrating( void ); |
RichardE | 3:ecae3d286a99 | 102 | |
RichardE | 3:ecae3d286a99 | 103 | /** Stop calibrating. |
RichardE | 3:ecae3d286a99 | 104 | */ |
RichardE | 3:ecae3d286a99 | 105 | void StopCalibrating( void ); |
RichardE | 3:ecae3d286a99 | 106 | |
RichardE | 2:52c4a0b3a509 | 107 | private : |
RichardE | 2:52c4a0b3a509 | 108 | |
RichardE | 3:ecae3d286a99 | 109 | // Indicates calibration is in progress. |
RichardE | 3:ecae3d286a99 | 110 | bool calibrating; |
RichardE | 3:ecae3d286a99 | 111 | |
RichardE | 2:52c4a0b3a509 | 112 | // Record for each analogue input. |
RichardE | 2:52c4a0b3a509 | 113 | class AnaInRec { |
RichardE | 3:ecae3d286a99 | 114 | |
RichardE | 2:52c4a0b3a509 | 115 | public : |
RichardE | 3:ecae3d286a99 | 116 | |
RichardE | 2:52c4a0b3a509 | 117 | float Scale; |
RichardE | 2:52c4a0b3a509 | 118 | float Offset; |
RichardE | 3:ecae3d286a99 | 119 | UInt8 MaxCount; |
RichardE | 3:ecae3d286a99 | 120 | UInt8 MinCount; |
RichardE | 3:ecae3d286a99 | 121 | UInt8 ZeroCount; |
RichardE | 3:ecae3d286a99 | 122 | |
RichardE | 3:ecae3d286a99 | 123 | /** Calculate scale and offset for a bipolar reading. |
RichardE | 3:ecae3d286a99 | 124 | * @param minValue minimum value to read. |
RichardE | 3:ecae3d286a99 | 125 | * @param maxValue maximum value to read. |
RichardE | 3:ecae3d286a99 | 126 | */ |
RichardE | 3:ecae3d286a99 | 127 | void CalculateScaleAndOffsetBiPolar( float minValue, float maxValue ); |
RichardE | 3:ecae3d286a99 | 128 | |
RichardE | 3:ecae3d286a99 | 129 | /** Calculate scale and offset for a unipolar reading. |
RichardE | 3:ecae3d286a99 | 130 | * Minimum value is assumed to be zero. |
RichardE | 3:ecae3d286a99 | 131 | * @param maxValue maximum value to read. |
RichardE | 3:ecae3d286a99 | 132 | */ |
RichardE | 3:ecae3d286a99 | 133 | void CalculateScaleAndOffsetUniPolar( float maxValue ); |
RichardE | 3:ecae3d286a99 | 134 | |
RichardE | 2:52c4a0b3a509 | 135 | }; |
RichardE | 2:52c4a0b3a509 | 136 | |
RichardE | 2:52c4a0b3a509 | 137 | // Records for all analogue inputs. |
RichardE | 2:52c4a0b3a509 | 138 | AnaInRec records[ (int)AnaInCount ]; |
RichardE | 2:52c4a0b3a509 | 139 | |
RichardE | 2:52c4a0b3a509 | 140 | /** Get scaled reading. |
RichardE | 2:52c4a0b3a509 | 141 | * @param input analogue input to scale. |
RichardE | 2:52c4a0b3a509 | 142 | * @param raw raw readings in counts. |
RichardE | 3:ecae3d286a99 | 143 | * @param min minimum permitted value. |
RichardE | 3:ecae3d286a99 | 144 | * @param max maximum permited value. |
RichardE | 2:52c4a0b3a509 | 145 | * @returns scaled reading. |
RichardE | 2:52c4a0b3a509 | 146 | */ |
RichardE | 3:ecae3d286a99 | 147 | float GetScaled( AnaIn input, UInt8 raw, float min, float max ) const; |
RichardE | 3:ecae3d286a99 | 148 | |
RichardE | 3:ecae3d286a99 | 149 | /** Update calibration information. |
RichardE | 3:ecae3d286a99 | 150 | */ |
RichardE | 3:ecae3d286a99 | 151 | void UpdateCalibration( void ); |
RichardE | 2:52c4a0b3a509 | 152 | |
RichardE | 3:ecae3d286a99 | 153 | /** Get the raw counts for one of the analogue inputs. |
RichardE | 3:ecae3d286a99 | 154 | * @param input analogue input to read. |
RichardE | 3:ecae3d286a99 | 155 | * @returns raw counts for input. |
RichardE | 3:ecae3d286a99 | 156 | */ |
RichardE | 3:ecae3d286a99 | 157 | UInt8 GetAnaIn( AnaIn input ) const; |
RichardE | 3:ecae3d286a99 | 158 | |
RichardE | 2:52c4a0b3a509 | 159 | }; |
RichardE | 2:52c4a0b3a509 | 160 | |
RichardE | 2:52c4a0b3a509 | 161 | #endif |
RichardE | 2:52c4a0b3a509 | 162 | |
RichardE | 2:52c4a0b3a509 | 163 | /* END of WiiClassicControllerWithCalibration.h */ |
RichardE | 2:52c4a0b3a509 | 164 |