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:02:08 2013 +0000
Revision:
0:242100dadee8
Child:
1:9e766313a668
Moved WiiClassicController class to a library (WiiClassicControllerLib).

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