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/

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?

UserRevisionLine numberNew 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