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:
Sat Jun 29 22:11:27 2013 +0000
Revision:
1:9e766313a668
Parent:
0:242100dadee8
Child:
3:ecae3d286a99
Fixed documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 0:242100dadee8 1 /*
RichardE 0:242100dadee8 2 * SOURCE FILE : WiiClassicController.h
RichardE 0:242100dadee8 3 *
RichardE 0:242100dadee8 4 * Definition of class WiiClassicController.
RichardE 0:242100dadee8 5 * Allows use of a Wii classic controller using an I2C bus.
RichardE 0:242100dadee8 6 *
RichardE 0:242100dadee8 7 */
RichardE 0:242100dadee8 8
RichardE 0:242100dadee8 9 #ifndef WiiClassicControllerDefined
RichardE 0:242100dadee8 10
RichardE 0:242100dadee8 11 #define WiiClassicControllerDefined
RichardE 0:242100dadee8 12
RichardE 0:242100dadee8 13 #include <mbed.h>
RichardE 0:242100dadee8 14 #include "Types.h"
RichardE 0:242100dadee8 15
RichardE 0:242100dadee8 16 #define CONTROLLER_ADDR 0xA4 // I2C library doesn't right shift the address, so provided shifted
RichardE 0:242100dadee8 17 #define CONTROLLER_REGADDR 0x40 // relevant register address
RichardE 0:242100dadee8 18 #define CONTROLLER_READLEN 0x06 // always read this many bytes back
RichardE 0:242100dadee8 19
RichardE 1:9e766313a668 20 /// Allows use of a Wii classic controller using an I2C bus.
RichardE 0:242100dadee8 21 class WiiClassicController {
RichardE 0:242100dadee8 22
RichardE 0:242100dadee8 23 public :
RichardE 0:242100dadee8 24
RichardE 0:242100dadee8 25 /** Constructor.
RichardE 0:242100dadee8 26 * @param sda pin to use for SDA.
RichardE 0:242100dadee8 27 * @param scl pin to use for SCL.
RichardE 0:242100dadee8 28 */
RichardE 0:242100dadee8 29 WiiClassicController( PinName sda, PinName scl );
RichardE 0:242100dadee8 30
RichardE 0:242100dadee8 31 /** Destructor.
RichardE 0:242100dadee8 32 */
RichardE 0:242100dadee8 33 virtual ~WiiClassicController();
RichardE 0:242100dadee8 34
RichardE 0:242100dadee8 35 /** Read from the controller.
RichardE 0:242100dadee8 36 * @returns true on success, false on failure.
RichardE 0:242100dadee8 37 */
RichardE 0:242100dadee8 38 bool Read( void );
RichardE 0:242100dadee8 39
RichardE 0:242100dadee8 40 /** Read left joystick X axis.
RichardE 0:242100dadee8 41 * @returns joystick reading as number between 0 and 63.
RichardE 0:242100dadee8 42 */
RichardE 0:242100dadee8 43 UInt8 GetLJoyX( void ) const {
RichardE 0:242100dadee8 44 return (UInt8)( readBuf[ 0 ] & 0x3F );
RichardE 0:242100dadee8 45 }
RichardE 0:242100dadee8 46
RichardE 0:242100dadee8 47 /** Read left joystick Y axis.
RichardE 0:242100dadee8 48 * @returns joystick reading as number between 0 and 63.
RichardE 0:242100dadee8 49 */
RichardE 0:242100dadee8 50 UInt8 GetLJoyY( void ) const {
RichardE 0:242100dadee8 51 return (UInt8)( readBuf[ 1 ] & 0x3F );
RichardE 0:242100dadee8 52 }
RichardE 0:242100dadee8 53
RichardE 0:242100dadee8 54 /** Read right joystick X axis.
RichardE 0:242100dadee8 55 * @returns joystick reading as number between 0 and 31.
RichardE 0:242100dadee8 56 */
RichardE 0:242100dadee8 57 UInt8 GetRJoyX( void ) const {
RichardE 0:242100dadee8 58 return (UInt8)(
RichardE 0:242100dadee8 59 ( ( readBuf[ 2 ] & 0x80 ) >> 7 ) |
RichardE 0:242100dadee8 60 ( ( readBuf[ 1 ] & 0xC0 ) >> 5 ) |
RichardE 0:242100dadee8 61 ( ( readBuf[ 0 ] & 0xC0 ) >> 3 )
RichardE 0:242100dadee8 62 );
RichardE 0:242100dadee8 63 }
RichardE 0:242100dadee8 64
RichardE 0:242100dadee8 65 /** Read right joystick Y axis.
RichardE 0:242100dadee8 66 * @returns joystick reading as number between 0 and 31.
RichardE 0:242100dadee8 67 */
RichardE 0:242100dadee8 68 UInt8 GetRJoyY( void ) const {
RichardE 0:242100dadee8 69 return (UInt8)( readBuf[ 2 ] & 0x1F );
RichardE 0:242100dadee8 70 }
RichardE 0:242100dadee8 71
RichardE 0:242100dadee8 72 /** Read X button.
RichardE 0:242100dadee8 73 * @returns true if button is pressed.
RichardE 0:242100dadee8 74 */
RichardE 0:242100dadee8 75 bool GetButtonX( void ) const {
RichardE 0:242100dadee8 76 return ( readBuf[ 5 ] & 0x08 ) ? false : true;
RichardE 0:242100dadee8 77 }
RichardE 0:242100dadee8 78
RichardE 0:242100dadee8 79 /** Read Y button.
RichardE 0:242100dadee8 80 * @returns true if button is pressed.
RichardE 0:242100dadee8 81 */
RichardE 0:242100dadee8 82 bool GetButtonY( void ) const {
RichardE 0:242100dadee8 83 return ( readBuf[ 5 ] & 0x20 ) ? false : true;
RichardE 0:242100dadee8 84 }
RichardE 0:242100dadee8 85
RichardE 0:242100dadee8 86 /** Read A button.
RichardE 0:242100dadee8 87 * @returns true if button is pressed.
RichardE 0:242100dadee8 88 */
RichardE 0:242100dadee8 89 bool GetButtonA( void ) const {
RichardE 0:242100dadee8 90 return ( readBuf[ 5 ] & 0x10 ) ? false : true;
RichardE 0:242100dadee8 91 }
RichardE 0:242100dadee8 92
RichardE 0:242100dadee8 93 /** Read B button.
RichardE 0:242100dadee8 94 * @returns true if button is pressed.
RichardE 0:242100dadee8 95 */
RichardE 0:242100dadee8 96 bool GetButtonB( void ) const {
RichardE 0:242100dadee8 97 return ( readBuf[ 5 ] & 0x40 ) ? false : true;
RichardE 0:242100dadee8 98 }
RichardE 0:242100dadee8 99
RichardE 0:242100dadee8 100 /** Read left trigger button.
RichardE 0:242100dadee8 101 * @returns true if button is pressed.
RichardE 0:242100dadee8 102 */
RichardE 0:242100dadee8 103 bool GetButtonLT( void ) const {
RichardE 0:242100dadee8 104 return ( readBuf[ 4 ] & 0x20 ) ? false : true;
RichardE 0:242100dadee8 105 }
RichardE 0:242100dadee8 106
RichardE 0:242100dadee8 107 /** Read right trigger button.
RichardE 0:242100dadee8 108 * @returns true if button is pressed.
RichardE 0:242100dadee8 109 */
RichardE 0:242100dadee8 110 bool GetButtonRT( void ) const {
RichardE 0:242100dadee8 111 return ( readBuf[ 4 ] & 0x02 ) ? false : true;
RichardE 0:242100dadee8 112 }
RichardE 0:242100dadee8 113
RichardE 0:242100dadee8 114 /** Read left trigger reading.
RichardE 0:242100dadee8 115 * @returns reading as a number between 0 and 31.
RichardE 0:242100dadee8 116 */
RichardE 0:242100dadee8 117 UInt8 GetLeftTrigger( void ) const {
RichardE 0:242100dadee8 118 return (UInt8)(
RichardE 0:242100dadee8 119 ( ( readBuf[ 3 ] & 0xE0 ) >> 5 ) |
RichardE 0:242100dadee8 120 ( ( readBuf[ 2 ] & 0x60 ) >> 2 )
RichardE 0:242100dadee8 121 );
RichardE 0:242100dadee8 122 }
RichardE 0:242100dadee8 123
RichardE 0:242100dadee8 124 /** Read right trigger reading.
RichardE 0:242100dadee8 125 * @returns reading as a number between 0 and 31.
RichardE 0:242100dadee8 126 */
RichardE 0:242100dadee8 127 UInt8 GetRightTrigger( void ) const {
RichardE 0:242100dadee8 128 return (UInt8)( readBuf[ 3 ] & 0x1F );
RichardE 0:242100dadee8 129 }
RichardE 0:242100dadee8 130
RichardE 0:242100dadee8 131 /** Read ZL button.
RichardE 0:242100dadee8 132 * @returns true if button is pressed.
RichardE 0:242100dadee8 133 */
RichardE 0:242100dadee8 134 bool GetButtonZL( void ) const {
RichardE 0:242100dadee8 135 return ( readBuf[ 5 ] & 0x80 ) ? false : true;
RichardE 0:242100dadee8 136 }
RichardE 0:242100dadee8 137
RichardE 0:242100dadee8 138 /** Read ZR button.
RichardE 0:242100dadee8 139 * @returns true if button is pressed.
RichardE 0:242100dadee8 140 */
RichardE 0:242100dadee8 141 bool GetButtonZR( void ) const {
RichardE 0:242100dadee8 142 return ( readBuf[ 5 ] & 0x04 ) ? false : true;
RichardE 0:242100dadee8 143 }
RichardE 0:242100dadee8 144
RichardE 0:242100dadee8 145 /** Read select (or minus) button.
RichardE 0:242100dadee8 146 * @returns true if button is pressed.
RichardE 0:242100dadee8 147 */
RichardE 0:242100dadee8 148 bool GetButtonSelect( void ) const {
RichardE 0:242100dadee8 149 return ( readBuf[ 4 ] & 0x10 ) ? false : true;
RichardE 0:242100dadee8 150 }
RichardE 0:242100dadee8 151
RichardE 0:242100dadee8 152 /** Read home button.
RichardE 0:242100dadee8 153 * @returns true if button is pressed.
RichardE 0:242100dadee8 154 */
RichardE 0:242100dadee8 155 bool GetButtonHome( void ) const {
RichardE 0:242100dadee8 156 return ( readBuf[ 4 ] & 0x08 ) ? false : true;
RichardE 0:242100dadee8 157 }
RichardE 0:242100dadee8 158
RichardE 0:242100dadee8 159 /** Read start (or plus) button.
RichardE 0:242100dadee8 160 * @returns true if button is pressed.
RichardE 0:242100dadee8 161 */
RichardE 0:242100dadee8 162 bool GetButtonStart( void ) const {
RichardE 0:242100dadee8 163 return ( readBuf[ 4 ] & 0x04 ) ? false : true;
RichardE 0:242100dadee8 164 }
RichardE 0:242100dadee8 165
RichardE 0:242100dadee8 166 /** Read up button.
RichardE 0:242100dadee8 167 * @returns true if button is pressed.
RichardE 0:242100dadee8 168 */
RichardE 0:242100dadee8 169 bool GetButtonUp( void ) const {
RichardE 0:242100dadee8 170 return ( readBuf[ 5 ] & 0x01 ) ? false : true;
RichardE 0:242100dadee8 171 }
RichardE 0:242100dadee8 172
RichardE 0:242100dadee8 173 /** Read down button.
RichardE 0:242100dadee8 174 * @returns true if button is pressed.
RichardE 0:242100dadee8 175 */
RichardE 0:242100dadee8 176 bool GetButtonDown( void ) const {
RichardE 0:242100dadee8 177 return ( readBuf[ 4 ] & 0x40 ) ? false : true;
RichardE 0:242100dadee8 178 }
RichardE 0:242100dadee8 179
RichardE 0:242100dadee8 180 /** Read left button.
RichardE 0:242100dadee8 181 * @returns true if button is pressed.
RichardE 0:242100dadee8 182 */
RichardE 0:242100dadee8 183 bool GetButtonLeft( void ) const {
RichardE 0:242100dadee8 184 return ( readBuf[ 5 ] & 0x02 ) ? false : true;
RichardE 0:242100dadee8 185 }
RichardE 0:242100dadee8 186
RichardE 0:242100dadee8 187 /** Read right button.
RichardE 0:242100dadee8 188 * @returns true if button is pressed.
RichardE 0:242100dadee8 189 */
RichardE 0:242100dadee8 190 bool GetButtonRight( void ) const {
RichardE 0:242100dadee8 191 return ( readBuf[ 4 ] & 0x80 ) ? false : true;
RichardE 0:242100dadee8 192 }
RichardE 0:242100dadee8 193
RichardE 0:242100dadee8 194 /** Get size of read buffer.
RichardE 0:242100dadee8 195 * @returns size of read buffer.
RichardE 0:242100dadee8 196 */
RichardE 0:242100dadee8 197 UInt8 GetReadBufSize( void ) const {
RichardE 0:242100dadee8 198 return sizeof(readBuf);
RichardE 0:242100dadee8 199 }
RichardE 0:242100dadee8 200
RichardE 0:242100dadee8 201 /** Get address of read buffer.
RichardE 0:242100dadee8 202 * @returns pointer to read buffer.
RichardE 0:242100dadee8 203 */
RichardE 0:242100dadee8 204 UInt8* GetReadBuf( void ) {
RichardE 0:242100dadee8 205 return readBuf;
RichardE 0:242100dadee8 206 }
RichardE 0:242100dadee8 207
RichardE 0:242100dadee8 208 private :
RichardE 0:242100dadee8 209
RichardE 0:242100dadee8 210 // I2C port used for comms with controller.
RichardE 0:242100dadee8 211 I2C controllerPort;
RichardE 0:242100dadee8 212
RichardE 0:242100dadee8 213 // Set to true once controller has been initialised.
RichardE 0:242100dadee8 214 bool initialised;
RichardE 0:242100dadee8 215
RichardE 0:242100dadee8 216 // Buffer for incoming data.
RichardE 0:242100dadee8 217 UInt8 readBuf[ CONTROLLER_READLEN ];
RichardE 0:242100dadee8 218
RichardE 0:242100dadee8 219 /** Initialise the controller.
RichardE 0:242100dadee8 220 * @returns true on success, false on failure.
RichardE 0:242100dadee8 221 */
RichardE 0:242100dadee8 222 bool ControllerInit( void );
RichardE 0:242100dadee8 223
RichardE 0:242100dadee8 224 /** Read from the controller, assuming it has been initialised.
RichardE 0:242100dadee8 225 * @returns true on success, false on failure.
RichardE 0:242100dadee8 226 */
RichardE 0:242100dadee8 227 bool ControllerRead( void );
RichardE 0:242100dadee8 228
RichardE 0:242100dadee8 229 /** Decoder a byte in received packet.
RichardE 0:242100dadee8 230 * @param x byte to decode
RichardE 0:242100dadee8 231 * @returns decoded byte
RichardE 0:242100dadee8 232 */
RichardE 0:242100dadee8 233 UInt8 Decode( UInt8 x ) {
RichardE 0:242100dadee8 234 return (x ^ 0x17) + 0x17;
RichardE 0:242100dadee8 235 }
RichardE 0:242100dadee8 236
RichardE 0:242100dadee8 237 };
RichardE 0:242100dadee8 238
RichardE 0:242100dadee8 239 #endif
RichardE 0:242100dadee8 240
RichardE 0:242100dadee8 241 /* END of WiiClassicController.h */
RichardE 0:242100dadee8 242
RichardE 0:242100dadee8 243