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:
3:ecae3d286a99
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.cpp
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 #include "WiiClassicController.h"
RichardE 0:242100dadee8 10
RichardE 0:242100dadee8 11 // REMOVE THIS!
RichardE 0:242100dadee8 12 extern Serial pc;
RichardE 0:242100dadee8 13
RichardE 0:242100dadee8 14 /** Constructor.
RichardE 0:242100dadee8 15 * @param sda pin to use for SDA.
RichardE 0:242100dadee8 16 * @param scl pin to use for SCL.
RichardE 0:242100dadee8 17 */
RichardE 0:242100dadee8 18 WiiClassicController::WiiClassicController( PinName sda, PinName scl ) :
RichardE 0:242100dadee8 19 controllerPort( sda, scl ),
RichardE 0:242100dadee8 20 initialised( false )
RichardE 0:242100dadee8 21 {
RichardE 0:242100dadee8 22 }
RichardE 0:242100dadee8 23
RichardE 0:242100dadee8 24 /** Destructor.
RichardE 0:242100dadee8 25 */
RichardE 0:242100dadee8 26 WiiClassicController::~WiiClassicController() {
RichardE 0:242100dadee8 27 }
RichardE 0:242100dadee8 28
RichardE 0:242100dadee8 29 /** Read from the controller.
RichardE 0:242100dadee8 30 * @returns true on success, false on failure.
RichardE 0:242100dadee8 31 */
RichardE 0:242100dadee8 32 bool WiiClassicController::Read( void ) {
RichardE 0:242100dadee8 33 // Don't expect client to remember to send an init to the nunchuck
RichardE 0:242100dadee8 34 // so do it for them here.
RichardE 0:242100dadee8 35 if( ! initialised ) {
RichardE 0:242100dadee8 36 initialised = ControllerInit();
RichardE 0:242100dadee8 37 }
RichardE 0:242100dadee8 38 // Don't start reading if init failed
RichardE 0:242100dadee8 39 return initialised && ControllerRead();
RichardE 0:242100dadee8 40 }
RichardE 0:242100dadee8 41
RichardE 0:242100dadee8 42 /** Initialise the controller.
RichardE 0:242100dadee8 43 * @returns true on success, false on failure.
RichardE 0:242100dadee8 44 */
RichardE 0:242100dadee8 45 bool WiiClassicController::ControllerInit( void ) {
RichardE 0:242100dadee8 46 const UInt8 cmd[] = { CONTROLLER_REGADDR, 0x00 };
RichardE 0:242100dadee8 47 bool ok = ( controllerPort.write( CONTROLLER_ADDR, (const char*)cmd, sizeof(cmd) ) == 0 );
RichardE 0:242100dadee8 48 pc.printf( "ControllerInit returned %d\r\n", (int)ok );
RichardE 0:242100dadee8 49 return ok;
RichardE 0:242100dadee8 50 }
RichardE 0:242100dadee8 51
RichardE 0:242100dadee8 52 /** Read from the controller, assuming it has been initialised.
RichardE 0:242100dadee8 53 * @returns true on success, false on failure.
RichardE 0:242100dadee8 54 */
RichardE 0:242100dadee8 55 bool WiiClassicController::ControllerRead() {
RichardE 0:242100dadee8 56 // write the address we want to read from
RichardE 0:242100dadee8 57 const UInt8 cmd[] = { 0x00 };
RichardE 0:242100dadee8 58 if( controllerPort.write( CONTROLLER_ADDR, (const char*)cmd, sizeof(cmd) ) == 0 ) {
RichardE 0:242100dadee8 59 // The Wii Classic Controller is non-standard I2C
RichardE 0:242100dadee8 60 // and can't manage setting the read address and immediately supplying the data
RichardE 0:242100dadee8 61 // so wait a bit.
RichardE 0:242100dadee8 62 wait( 0.01 );
RichardE 0:242100dadee8 63 if( controllerPort.read( CONTROLLER_ADDR, (char*)readBuf, sizeof(readBuf) ) == 0 ) {
RichardE 0:242100dadee8 64 for( int i = 0; i < CONTROLLER_READLEN; ++i ) {
RichardE 0:242100dadee8 65 readBuf[ i ] = Decode( readBuf[ i ] );
RichardE 0:242100dadee8 66 }
RichardE 0:242100dadee8 67 return true;
RichardE 0:242100dadee8 68 }
RichardE 0:242100dadee8 69 else {
RichardE 0:242100dadee8 70 return false;
RichardE 0:242100dadee8 71 }
RichardE 0:242100dadee8 72 }
RichardE 0:242100dadee8 73 else {
RichardE 0:242100dadee8 74 return false;
RichardE 0:242100dadee8 75 }
RichardE 0:242100dadee8 76 }