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/
WiiClassicController.cpp@0:242100dadee8, 2013-06-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |