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:37:49 2013 +0000
Revision:
3:ecae3d286a99
Parent:
2:52c4a0b3a509
Child:
4:79d04d737f02
Calibration now works.

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 2:52c4a0b3a509 48 * @param m scale (multiplier) for this analogue input.
RichardE 2:52c4a0b3a509 49 * @param c offset for this analogue input.
RichardE 2:52c4a0b3a509 50 */
RichardE 2:52c4a0b3a509 51 void SetScaling( AnaIn input, float m, float c );
RichardE 2:52c4a0b3a509 52
RichardE 3:ecae3d286a99 53 /** Get scaling for a particular analogue input.
RichardE 3:ecae3d286a99 54 * @param input channel to read.
RichardE 3:ecae3d286a99 55 * @param m scale (multiplier) for this analogue input return here.
RichardE 3:ecae3d286a99 56 * @param c offset for this analogue input returned here.
RichardE 3:ecae3d286a99 57 */
RichardE 3:ecae3d286a99 58 void GetScaling( AnaIn input, float *m, float *c ) const;
RichardE 3:ecae3d286a99 59
RichardE 2:52c4a0b3a509 60 /** Get calibrated left joystick X reading.
RichardE 2:52c4a0b3a509 61 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 62 */
RichardE 2:52c4a0b3a509 63 float GetCalLJoyX( void ) const;
RichardE 2:52c4a0b3a509 64
RichardE 2:52c4a0b3a509 65 /** Get calibrated left joystick Y reading.
RichardE 2:52c4a0b3a509 66 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 67 */
RichardE 2:52c4a0b3a509 68 float GetCalLJoyY( void ) const;
RichardE 2:52c4a0b3a509 69
RichardE 2:52c4a0b3a509 70 /** Get calibrated right joystick X reading.
RichardE 2:52c4a0b3a509 71 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 72 */
RichardE 2:52c4a0b3a509 73 float GetCalRJoyX( void ) const;
RichardE 2:52c4a0b3a509 74
RichardE 2:52c4a0b3a509 75 /** Get calibrated right joystick Y reading.
RichardE 2:52c4a0b3a509 76 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 77 */
RichardE 2:52c4a0b3a509 78 float GetCalRJoyY( void ) const;
RichardE 2:52c4a0b3a509 79
RichardE 2:52c4a0b3a509 80 /** Get calibrated left trigger reading.
RichardE 2:52c4a0b3a509 81 * @returns a reading between 0 and +1.
RichardE 2:52c4a0b3a509 82 */
RichardE 2:52c4a0b3a509 83 float GetCalLeftTrigger( void ) const;
RichardE 2:52c4a0b3a509 84
RichardE 2:52c4a0b3a509 85 /** Get calibrated right trigger reading.
RichardE 2:52c4a0b3a509 86 * @returns a reading between 0 and +1.
RichardE 2:52c4a0b3a509 87 */
RichardE 2:52c4a0b3a509 88 float GetCalRightTrigger( void ) const;
RichardE 2:52c4a0b3a509 89
RichardE 3:ecae3d286a99 90 /** Get indication that calibration is in progress.
RichardE 3:ecae3d286a99 91 * @returns true if calibration is in progress.
RichardE 3:ecae3d286a99 92 */
RichardE 3:ecae3d286a99 93 bool IsCalibrating( void ) const {
RichardE 3:ecae3d286a99 94 return calibrating;
RichardE 3:ecae3d286a99 95 }
RichardE 3:ecae3d286a99 96
RichardE 3:ecae3d286a99 97 /** Start calibrating.
RichardE 3:ecae3d286a99 98 * Every call to Read method updates calibration until StopCalibrating is called.
RichardE 3:ecae3d286a99 99 */
RichardE 3:ecae3d286a99 100 void StartCalibrating( void );
RichardE 3:ecae3d286a99 101
RichardE 3:ecae3d286a99 102 /** Stop calibrating.
RichardE 3:ecae3d286a99 103 */
RichardE 3:ecae3d286a99 104 void StopCalibrating( void );
RichardE 3:ecae3d286a99 105
RichardE 2:52c4a0b3a509 106 private :
RichardE 2:52c4a0b3a509 107
RichardE 3:ecae3d286a99 108 // Indicates calibration is in progress.
RichardE 3:ecae3d286a99 109 bool calibrating;
RichardE 3:ecae3d286a99 110
RichardE 2:52c4a0b3a509 111 // Record for each analogue input.
RichardE 2:52c4a0b3a509 112 class AnaInRec {
RichardE 3:ecae3d286a99 113
RichardE 2:52c4a0b3a509 114 public :
RichardE 3:ecae3d286a99 115
RichardE 2:52c4a0b3a509 116 float Scale;
RichardE 2:52c4a0b3a509 117 float Offset;
RichardE 3:ecae3d286a99 118 UInt8 MaxCount;
RichardE 3:ecae3d286a99 119 UInt8 MinCount;
RichardE 3:ecae3d286a99 120 UInt8 ZeroCount;
RichardE 3:ecae3d286a99 121
RichardE 3:ecae3d286a99 122 /** Calculate scale and offset for a bipolar reading.
RichardE 3:ecae3d286a99 123 * @param minValue minimum value to read.
RichardE 3:ecae3d286a99 124 * @param maxValue maximum value to read.
RichardE 3:ecae3d286a99 125 */
RichardE 3:ecae3d286a99 126 void CalculateScaleAndOffsetBiPolar( float minValue, float maxValue );
RichardE 3:ecae3d286a99 127
RichardE 3:ecae3d286a99 128 /** Calculate scale and offset for a unipolar reading.
RichardE 3:ecae3d286a99 129 * Minimum value is assumed to be zero.
RichardE 3:ecae3d286a99 130 * @param maxValue maximum value to read.
RichardE 3:ecae3d286a99 131 */
RichardE 3:ecae3d286a99 132 void CalculateScaleAndOffsetUniPolar( float maxValue );
RichardE 3:ecae3d286a99 133
RichardE 2:52c4a0b3a509 134 };
RichardE 2:52c4a0b3a509 135
RichardE 2:52c4a0b3a509 136 // Records for all analogue inputs.
RichardE 2:52c4a0b3a509 137 AnaInRec records[ (int)AnaInCount ];
RichardE 2:52c4a0b3a509 138
RichardE 2:52c4a0b3a509 139 /** Get scaled reading.
RichardE 2:52c4a0b3a509 140 * @param input analogue input to scale.
RichardE 2:52c4a0b3a509 141 * @param raw raw readings in counts.
RichardE 3:ecae3d286a99 142 * @param min minimum permitted value.
RichardE 3:ecae3d286a99 143 * @param max maximum permited value.
RichardE 2:52c4a0b3a509 144 * @returns scaled reading.
RichardE 2:52c4a0b3a509 145 */
RichardE 3:ecae3d286a99 146 float GetScaled( AnaIn input, UInt8 raw, float min, float max ) const;
RichardE 3:ecae3d286a99 147
RichardE 3:ecae3d286a99 148 /** Update calibration information.
RichardE 3:ecae3d286a99 149 */
RichardE 3:ecae3d286a99 150 void UpdateCalibration( void );
RichardE 2:52c4a0b3a509 151
RichardE 3:ecae3d286a99 152 /** Get the raw counts for one of the analogue inputs.
RichardE 3:ecae3d286a99 153 * @param input analogue input to read.
RichardE 3:ecae3d286a99 154 * @returns raw counts for input.
RichardE 3:ecae3d286a99 155 */
RichardE 3:ecae3d286a99 156 UInt8 GetAnaIn( AnaIn input ) const;
RichardE 3:ecae3d286a99 157
RichardE 2:52c4a0b3a509 158 };
RichardE 2:52c4a0b3a509 159
RichardE 2:52c4a0b3a509 160 #endif
RichardE 2:52c4a0b3a509 161
RichardE 2:52c4a0b3a509 162 /* END of WiiClassicControllerWithCalibration.h */
RichardE 2:52c4a0b3a509 163