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/
WiiClassicControllerWithCalibration.cpp@2:52c4a0b3a509, 2013-06-30 (annotated)
- 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?
User | Revision | Line number | New 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 | } |