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 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 3:ecae3d286a99 11 // Delay to slow things down. Doesn;t work without this.
RichardE 3:ecae3d286a99 12 #define WAIT_TIME ((float)0.01 ) // in seconds
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 3:ecae3d286a99 48 wait( WAIT_TIME );
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 3:ecae3d286a99 56 bool ok = false;
RichardE 0:242100dadee8 57 // write the address we want to read from
RichardE 0:242100dadee8 58 const UInt8 cmd[] = { 0x00 };
RichardE 0:242100dadee8 59 if( controllerPort.write( CONTROLLER_ADDR, (const char*)cmd, sizeof(cmd) ) == 0 ) {
RichardE 0:242100dadee8 60 // The Wii Classic Controller is non-standard I2C
RichardE 0:242100dadee8 61 // and can't manage setting the read address and immediately supplying the data
RichardE 0:242100dadee8 62 // so wait a bit.
RichardE 3:ecae3d286a99 63 wait( WAIT_TIME );
RichardE 0:242100dadee8 64 if( controllerPort.read( CONTROLLER_ADDR, (char*)readBuf, sizeof(readBuf) ) == 0 ) {
RichardE 0:242100dadee8 65 for( int i = 0; i < CONTROLLER_READLEN; ++i ) {
RichardE 0:242100dadee8 66 readBuf[ i ] = Decode( readBuf[ i ] );
RichardE 0:242100dadee8 67 }
RichardE 3:ecae3d286a99 68 ok = true;
RichardE 0:242100dadee8 69 }
RichardE 0:242100dadee8 70 }
RichardE 3:ecae3d286a99 71 // wait( WAIT_TIME );
RichardE 3:ecae3d286a99 72 return ok;
RichardE 0:242100dadee8 73 }