Jul
01
2009

Athena: Wiimote and Mac OS X

Battery Life Remaining

One thing I never understood about the Wiimote design, is that it is used for moving actions and gestures, so why not have a kinetic charger built into it to try and take some load off the batteries.

It is helpful to know how much power the battery has left, so to do so you just need to request a status report.

//
//
void HIDInput::Wiimote::RequestStatusReport( IOHIDDeviceRef inDeviceRef, const bool inVibrate )
{
//
const unsigned char kFlags = inVibrate ? WIIMOTE_VIBRATE : WIIMOTE_NOVIBRATE;

//
const Core::u8 kReportType = 0x15;
const Core::u8 kReportSize = 2;

const Core::byte kReportData[kReportSize] =
{
kReportType,
kFlags,
};

//
DeviceSendReport( inDeviceRef, kReportType, kReportData, kReportSize );
}

This will return with a message id of 0×20, that will contains details about the battery, as well as a few other things.

//
//
#define STATUS_REPORT_LOWBATTERY ( 1 << 0 )
#define STATUS_REPORT_EXTENSION ( 1 << 1 )
#define STATUS_REPORT_SPEAKER ( 1 << 2 )
#define STATUS_REPORT_ALWAYS ( 1 << 3 )
#define STATUS_REPORT_P1_LED ( 1 << 4 )
#define STATUS_REPORT_P2_LED ( 1 << 5 )
#define STATUS_REPORT_P3_LED ( 1 << 6 )
#define STATUS_REPORT_P4_LED ( 1 << 7 )

//
#define FULL_BATTERY ( 0xC0 )

//
//
void HIDInput::Wiimote::DeviceIOHIDReportCallback( const unsigned char * inReportData, const unsigned int inSize )
{
switch( inReportData[0] )
{
// Status
case 0x20:
{
//
GetButtonData( &inReport[1] );

//
printf( "P1 LED: %s\n", inReport[3] & STATUS_REPORT_P1_LED ? "true" : "false" );
printf( "P2 LED: %s\n", inReport[3] & STATUS_REPORT_P2_LED ? "true" : "false" );
printf( "P3 LED: %s\n", inReport[3] & STATUS_REPORT_P3_LED ? "true" : "false" );
printf( "P4 LED: %s\n", inReport[3] & STATUS_REPORT_P4_LED ? "true" : "false" );
printf( "Always: %s\n", inReport[3] & STATUS_REPORT_ALWAYS ? "true" : "false" );
printf( "Speaker: %s\n", inReport[3] & STATUS_REPORT_SPEAKER ? "true" : "false" );
printf( "Extension: %s\n", inReport[3] & STATUS_REPORT_EXTENSION ? "true" : "false" );
printf( "Low Battery: %s\n", inReport[3] & STATUS_REPORT_LOWBATTERY ? "true" : "false" );
printf( "Battery: %.2f%%\n", static_cast<Core::f32>( inReport[6] ) / static_cast<Core::f32>( FULL_BATTERY ) );
printf( "\n" );
}
break;

// Command Status
case 0x22:
{
// ...
}
break;

// Button Input Report
case 0x30:
{
// ...
}
break;

default:
break;
}
}

Whenever an extension is plugged in or removed, a status message will be sent to inform you, so whenever you get one of these messages, its usually good to check to see if the extension status has changed so you can request a new input report.

Well thats all for now, all I need is a Playstation 3 pad to play around with. As I’ve mentioned, I may expand it further when I’ve gotten the accelerometer and IR camera working properly.

[Previous Page...]

Written by Kaluriel in: Athena, Code, Tutorials | Tags: , , , , , , , ,

Pages: 1 2 3 4


No Comments »

RSS feed for comments on this post. TrackBack URL

Leave a comment

You must be logged in to post a comment.

Theme: TheBuckmaker.com Blog Themes | The best Webhosting Plans, Eigenes Internet Radio