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 12:05:27 2013 +0000
Revision:
2:52c4a0b3a509
Child:
3:ecae3d286a99
Added WiiClassicControllerWithCalibration class. Scale and offset are present but there is currently no way to perform a calibration.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 2:52c4a0b3a509 1 /*
RichardE 2:52c4a0b3a509 2 * SOURCE FILE : WiiClassicControllerWithCalibration.cpp
RichardE 2:52c4a0b3a509 3 *
RichardE 2:52c4a0b3a509 4 * Definition of class WiiClassicControllerWithCalibration.
RichardE 2:52c4a0b3a509 5 *
RichardE 2:52c4a0b3a509 6 */
RichardE 2:52c4a0b3a509 7
RichardE 2:52c4a0b3a509 8 #include "WiiClassicControllerWithCalibration.h"
RichardE 2:52c4a0b3a509 9
RichardE 2:52c4a0b3a509 10 /** Constructor
RichardE 2:52c4a0b3a509 11 * @param sda pin to use for SDA.
RichardE 2:52c4a0b3a509 12 * @param scl pin to use for SCL.
RichardE 2:52c4a0b3a509 13 */
RichardE 2:52c4a0b3a509 14 WiiClassicControllerWithCalibration::WiiClassicControllerWithCalibration( PinName sda, PinName scl ) :
RichardE 2:52c4a0b3a509 15 WiiClassicController( sda, scl )
RichardE 2:52c4a0b3a509 16 {
RichardE 2:52c4a0b3a509 17 // Set default scaling factors.
RichardE 2:52c4a0b3a509 18 // Left joystick is 6 bit reading. Raw reading of 0 gives -1. Raw reading of 63 gives +1.
RichardE 2:52c4a0b3a509 19 SetScaling( LeftJoyX, (float)( 2.0 / 63.0 ), -1 );
RichardE 2:52c4a0b3a509 20 SetScaling( LeftJoyY, (float)( 2.0 / 63.0 ), -1 );
RichardE 2:52c4a0b3a509 21 // Right joystick is 5 bit reading. Raw reading of 0 gives -1. Raw reading of 31 gives +1.
RichardE 2:52c4a0b3a509 22 SetScaling( RightJoyX, (float)( 2.0 / 31.0 ), -1 );
RichardE 2:52c4a0b3a509 23 SetScaling( RightJoyY, (float)( 2.0 / 31.0 ), -1 );
RichardE 2:52c4a0b3a509 24 // Left trigger is 5 bit reading. Raw reading of 0 gives 0. Raw reading of 31 gives +1.
RichardE 2:52c4a0b3a509 25 SetScaling( LeftTrigger, (float)( 1.0 / 31.0 ), 0 );
RichardE 2:52c4a0b3a509 26 // Right trigger is 5 bit reading. Raw reading of 0 gives 0. Raw reading of 31 gives +1.
RichardE 2:52c4a0b3a509 27 SetScaling( RightTrigger, (float)( 1.0 / 31.0 ), 0 );
RichardE 2:52c4a0b3a509 28 }
RichardE 2:52c4a0b3a509 29
RichardE 2:52c4a0b3a509 30 /** Destructor
RichardE 2:52c4a0b3a509 31 */
RichardE 2:52c4a0b3a509 32 WiiClassicControllerWithCalibration::~WiiClassicControllerWithCalibration() {
RichardE 2:52c4a0b3a509 33 }
RichardE 2:52c4a0b3a509 34
RichardE 2:52c4a0b3a509 35 /** Set scaling for a particular analogue input.
RichardE 2:52c4a0b3a509 36 * @param m scale (multiplier) for this analogue input.
RichardE 2:52c4a0b3a509 37 * @param c offset for this analogue input.
RichardE 2:52c4a0b3a509 38 */
RichardE 2:52c4a0b3a509 39 void WiiClassicControllerWithCalibration::SetScaling( AnaIn input, float m, float c ) {
RichardE 2:52c4a0b3a509 40 if( ( (int)input >= 0 ) && ( (int)input < (int)AnaInCount ) ) {
RichardE 2:52c4a0b3a509 41 AnaInRec *ptr = records + (int)input;
RichardE 2:52c4a0b3a509 42 ptr->Scale = m;
RichardE 2:52c4a0b3a509 43 ptr->Offset = c;
RichardE 2:52c4a0b3a509 44 }
RichardE 2:52c4a0b3a509 45 }
RichardE 2:52c4a0b3a509 46
RichardE 2:52c4a0b3a509 47 /** Get calibrated left joystick X reading.
RichardE 2:52c4a0b3a509 48 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 49 */
RichardE 2:52c4a0b3a509 50 float WiiClassicControllerWithCalibration::GetCalLJoyX( void ) const {
RichardE 2:52c4a0b3a509 51 return GetScaled( LeftJoyX, GetLJoyX() );
RichardE 2:52c4a0b3a509 52 }
RichardE 2:52c4a0b3a509 53
RichardE 2:52c4a0b3a509 54 /** Get calibrated left joystick Y reading.
RichardE 2:52c4a0b3a509 55 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 56 */
RichardE 2:52c4a0b3a509 57 float WiiClassicControllerWithCalibration::GetCalLJoyY( void ) const {
RichardE 2:52c4a0b3a509 58 return GetScaled( LeftJoyY, GetLJoyY() );
RichardE 2:52c4a0b3a509 59 }
RichardE 2:52c4a0b3a509 60
RichardE 2:52c4a0b3a509 61 /** Get calibrated right joystick X reading.
RichardE 2:52c4a0b3a509 62 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 63 */
RichardE 2:52c4a0b3a509 64 float WiiClassicControllerWithCalibration::GetCalRJoyX( void ) const {
RichardE 2:52c4a0b3a509 65 return GetScaled( RightJoyX, GetRJoyX() );
RichardE 2:52c4a0b3a509 66 }
RichardE 2:52c4a0b3a509 67
RichardE 2:52c4a0b3a509 68 /** Get calibrated right joystick Y reading.
RichardE 2:52c4a0b3a509 69 * @returns a reading between -1 and +1.
RichardE 2:52c4a0b3a509 70 */
RichardE 2:52c4a0b3a509 71 float WiiClassicControllerWithCalibration::GetCalRJoyY( void ) const {
RichardE 2:52c4a0b3a509 72 return GetScaled( RightJoyY, GetRJoyY() );
RichardE 2:52c4a0b3a509 73 }
RichardE 2:52c4a0b3a509 74
RichardE 2:52c4a0b3a509 75 /** Get calibrated left trigger reading.
RichardE 2:52c4a0b3a509 76 * @returns a reading between 0 and +1.
RichardE 2:52c4a0b3a509 77 */
RichardE 2:52c4a0b3a509 78 float WiiClassicControllerWithCalibration::GetCalLeftTrigger( void ) const {
RichardE 2:52c4a0b3a509 79 return GetScaled( LeftTrigger, GetLeftTrigger() );
RichardE 2:52c4a0b3a509 80 }
RichardE 2:52c4a0b3a509 81
RichardE 2:52c4a0b3a509 82 /** Get calibrated right trigger reading.
RichardE 2:52c4a0b3a509 83 * @returns a reading between 0 and +1.
RichardE 2:52c4a0b3a509 84 */
RichardE 2:52c4a0b3a509 85 float WiiClassicControllerWithCalibration::GetCalRightTrigger( void ) const {
RichardE 2:52c4a0b3a509 86 return GetScaled( RightTrigger, GetRightTrigger() );
RichardE 2:52c4a0b3a509 87 }
RichardE 2:52c4a0b3a509 88
RichardE 2:52c4a0b3a509 89 /** Get scaled reading.
RichardE 2:52c4a0b3a509 90 * @param input analogue input to scale.
RichardE 2:52c4a0b3a509 91 * @param raw raw readings in counts.
RichardE 2:52c4a0b3a509 92 * @returns scaled reading.
RichardE 2:52c4a0b3a509 93 */
RichardE 2:52c4a0b3a509 94 float WiiClassicControllerWithCalibration::GetScaled( AnaIn input, UInt8 raw ) const {
RichardE 2:52c4a0b3a509 95 if( ( (int)input >= 0 ) && ( (int)input < (int)AnaInCount ) ) {
RichardE 2:52c4a0b3a509 96 const AnaInRec *ptr = records + (int)input;
RichardE 2:52c4a0b3a509 97 return (float)raw * ptr->Scale + ptr->Offset;
RichardE 2:52c4a0b3a509 98 }
RichardE 2:52c4a0b3a509 99 else {
RichardE 2:52c4a0b3a509 100 return (float)0;
RichardE 2:52c4a0b3a509 101 }
RichardE 2:52c4a0b3a509 102 }