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.h
- Committer:
- RichardE
- Date:
- 2013-06-30
- Revision:
- 4:79d04d737f02
- Parent:
- 3:ecae3d286a99
File content as of revision 4:79d04d737f02:
/* * SOURCE FILE : WiiClassicController.h * * Definition of class WiiClassicController. * Allows use of a Wii classic controller using an I2C bus. * */ #ifndef WiiClassicControllerDefined #define WiiClassicControllerDefined #include <mbed.h> #include "Types.h" #define CONTROLLER_ADDR 0xA4 // I2C library doesn't right shift the address, so provided shifted #define CONTROLLER_REGADDR 0x40 // relevant register address #define CONTROLLER_READLEN 0x06 // always read this many bytes back /// Allows use of a Wii classic controller using an I2C bus. class WiiClassicController { public : /** Constructor. * @param sda pin to use for SDA. * @param scl pin to use for SCL. */ WiiClassicController( PinName sda, PinName scl ); /** Destructor. */ virtual ~WiiClassicController(); /** Read from the controller. * @returns true on success, false on failure. */ virtual bool Read( void ); /** Read left joystick X axis. * @returns joystick reading as number between 0 and 63. */ UInt8 GetLJoyX( void ) const { return (UInt8)( readBuf[ 0 ] & 0x3F ); } /** Read left joystick Y axis. * @returns joystick reading as number between 0 and 63. */ UInt8 GetLJoyY( void ) const { return (UInt8)( readBuf[ 1 ] & 0x3F ); } /** Read right joystick X axis. * @returns joystick reading as number between 0 and 31. */ UInt8 GetRJoyX( void ) const { return (UInt8)( ( ( readBuf[ 2 ] & 0x80 ) >> 7 ) | ( ( readBuf[ 1 ] & 0xC0 ) >> 5 ) | ( ( readBuf[ 0 ] & 0xC0 ) >> 3 ) ); } /** Read right joystick Y axis. * @returns joystick reading as number between 0 and 31. */ UInt8 GetRJoyY( void ) const { return (UInt8)( readBuf[ 2 ] & 0x1F ); } /** Read X button. * @returns true if button is pressed. */ bool GetButtonX( void ) const { return ( readBuf[ 5 ] & 0x08 ) ? false : true; } /** Read Y button. * @returns true if button is pressed. */ bool GetButtonY( void ) const { return ( readBuf[ 5 ] & 0x20 ) ? false : true; } /** Read A button. * @returns true if button is pressed. */ bool GetButtonA( void ) const { return ( readBuf[ 5 ] & 0x10 ) ? false : true; } /** Read B button. * @returns true if button is pressed. */ bool GetButtonB( void ) const { return ( readBuf[ 5 ] & 0x40 ) ? false : true; } /** Read left trigger button. * @returns true if button is pressed. */ bool GetButtonLT( void ) const { return ( readBuf[ 4 ] & 0x20 ) ? false : true; } /** Read right trigger button. * @returns true if button is pressed. */ bool GetButtonRT( void ) const { return ( readBuf[ 4 ] & 0x02 ) ? false : true; } /** Read left trigger reading. * @returns reading as a number between 0 and 31. */ UInt8 GetLeftTrigger( void ) const { return (UInt8)( ( ( readBuf[ 3 ] & 0xE0 ) >> 5 ) | ( ( readBuf[ 2 ] & 0x60 ) >> 2 ) ); } /** Read right trigger reading. * @returns reading as a number between 0 and 31. */ UInt8 GetRightTrigger( void ) const { return (UInt8)( readBuf[ 3 ] & 0x1F ); } /** Read ZL button. * @returns true if button is pressed. */ bool GetButtonZL( void ) const { return ( readBuf[ 5 ] & 0x80 ) ? false : true; } /** Read ZR button. * @returns true if button is pressed. */ bool GetButtonZR( void ) const { return ( readBuf[ 5 ] & 0x04 ) ? false : true; } /** Read select (or minus) button. * @returns true if button is pressed. */ bool GetButtonSelect( void ) const { return ( readBuf[ 4 ] & 0x10 ) ? false : true; } /** Read home button. * @returns true if button is pressed. */ bool GetButtonHome( void ) const { return ( readBuf[ 4 ] & 0x08 ) ? false : true; } /** Read start (or plus) button. * @returns true if button is pressed. */ bool GetButtonStart( void ) const { return ( readBuf[ 4 ] & 0x04 ) ? false : true; } /** Read up button. * @returns true if button is pressed. */ bool GetButtonUp( void ) const { return ( readBuf[ 5 ] & 0x01 ) ? false : true; } /** Read down button. * @returns true if button is pressed. */ bool GetButtonDown( void ) const { return ( readBuf[ 4 ] & 0x40 ) ? false : true; } /** Read left button. * @returns true if button is pressed. */ bool GetButtonLeft( void ) const { return ( readBuf[ 5 ] & 0x02 ) ? false : true; } /** Read right button. * @returns true if button is pressed. */ bool GetButtonRight( void ) const { return ( readBuf[ 4 ] & 0x80 ) ? false : true; } /** Get size of read buffer. * @returns size of read buffer. */ UInt8 GetReadBufSize( void ) const { return sizeof(readBuf); } /** Get address of read buffer. * @returns pointer to read buffer. */ UInt8* GetReadBuf( void ) { return readBuf; } private : // I2C port used for comms with controller. I2C controllerPort; // Set to true once controller has been initialised. bool initialised; // Buffer for incoming data. UInt8 readBuf[ CONTROLLER_READLEN ]; /** Initialise the controller. * @returns true on success, false on failure. */ bool ControllerInit( void ); /** Read from the controller, assuming it has been initialised. * @returns true on success, false on failure. */ bool ControllerRead( void ); /** Decoder a byte in received packet. * @param x byte to decode * @returns decoded byte */ UInt8 Decode( UInt8 x ) { return (x ^ 0x17) + 0x17; } }; #endif /* END of WiiClassicController.h */