Based on Alfredo Guerrero's WiiClassicControllerReader although I had to do additional decoding of packet. KL25Z talking to Wii classic controller.

Dependencies:   CommonTypes WiiClassicControllerLib mbed

Committer:
RichardE
Date:
Sun Jun 30 16:51:43 2013 +0000
Revision:
4:71f5e3d2b0c6
Parent:
3:21e262cee052
Now shows the calibrated analogue readings as well as the raw counts and allows operator to calibrate analogue inputs by pressing A and B. Baud rate to PC changed to 115200 baud 8N1.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 3:21e262cee052 1 /*
RichardE 3:21e262cee052 2 * SOURCE FILE : main.cpp
RichardE 3:21e262cee052 3 *
RichardE 3:21e262cee052 4 * Test program to test out WiiClassicController class.
RichardE 3:21e262cee052 5 *
RichardE 3:21e262cee052 6 */
RichardE 3:21e262cee052 7
RichardE 3:21e262cee052 8 #include "mbed.h"
RichardE 3:21e262cee052 9 #include "WiiClassicControllerWithCalibration.h"
RichardE 3:21e262cee052 10
RichardE 3:21e262cee052 11 // Define this to dump packet in hex.
RichardE 4:71f5e3d2b0c6 12 #undef DUMP_PACKET
RichardE 3:21e262cee052 13
RichardE 4:71f5e3d2b0c6 14 #define LOOP_DELAY (float)0.025 // seconds
RichardE 3:21e262cee052 15
RichardE 3:21e262cee052 16 // global declarations
RichardE 3:21e262cee052 17 Serial pc(USBTX, USBRX);
RichardE 3:21e262cee052 18
RichardE 3:21e262cee052 19 /* Read from the Wii classic controller and display results on serial port output.
RichardE 3:21e262cee052 20 * @param ctrlr Controller to read from.
RichardE 3:21e262cee052 21 * @param portname Name of port you are reading from.
RichardE 3:21e262cee052 22 */
RichardE 3:21e262cee052 23 static void ReadAndReport( WiiClassicControllerWithCalibration *ctrlr, const char *portname ) {
RichardE 4:71f5e3d2b0c6 24 static int counter = 0;
RichardE 3:21e262cee052 25 if( ctrlr->Read() ) {
RichardE 3:21e262cee052 26
RichardE 4:71f5e3d2b0c6 27 // Display updated every tenth time.
RichardE 4:71f5e3d2b0c6 28 if( counter == 0 ) {
RichardE 4:71f5e3d2b0c6 29
RichardE 4:71f5e3d2b0c6 30 pc.printf( "%c[H", 27 ); // VT100 home cursor
RichardE 4:71f5e3d2b0c6 31 pc.printf("%s\r\n", portname);
RichardE 3:21e262cee052 32
RichardE 4:71f5e3d2b0c6 33 #ifdef DUMP_PACKET
RichardE 4:71f5e3d2b0c6 34 int bufSize = ctrlr->GetReadBufSize();
RichardE 4:71f5e3d2b0c6 35 UInt8 *bufPtr = ctrlr->GetReadBuf();
RichardE 4:71f5e3d2b0c6 36 for (int i = 0; i < bufSize; i++) {
RichardE 4:71f5e3d2b0c6 37 pc.printf("%x ", bufPtr[i]);
RichardE 4:71f5e3d2b0c6 38 }
RichardE 4:71f5e3d2b0c6 39 pc.printf("\r\n");
RichardE 4:71f5e3d2b0c6 40 #endif
RichardE 4:71f5e3d2b0c6 41
RichardE 4:71f5e3d2b0c6 42 pc.printf("A=%u\r\n", ctrlr->GetButtonA());
RichardE 4:71f5e3d2b0c6 43 pc.printf("B=%u\r\n", ctrlr->GetButtonB());
RichardE 4:71f5e3d2b0c6 44 pc.printf("X=%u\r\n", ctrlr->GetButtonX());
RichardE 4:71f5e3d2b0c6 45 pc.printf("Y=%u\r\n", ctrlr->GetButtonY());
RichardE 4:71f5e3d2b0c6 46 pc.printf("ZL=%u\r\n", ctrlr->GetButtonZL());
RichardE 4:71f5e3d2b0c6 47 pc.printf("ZR=%u\r\n", ctrlr->GetButtonZR());
RichardE 4:71f5e3d2b0c6 48 pc.printf("Up=%u\r\n", ctrlr->GetButtonUp());
RichardE 4:71f5e3d2b0c6 49 pc.printf("Down=%u\r\n", ctrlr->GetButtonDown());
RichardE 4:71f5e3d2b0c6 50 pc.printf("Left=%u\r\n", ctrlr->GetButtonLeft());
RichardE 4:71f5e3d2b0c6 51 pc.printf("Right=%u\r\n", ctrlr->GetButtonRight());
RichardE 4:71f5e3d2b0c6 52 pc.printf("Home=%u\r\n", ctrlr->GetButtonHome());
RichardE 4:71f5e3d2b0c6 53 pc.printf("Select=%u\r\n", ctrlr->GetButtonSelect());
RichardE 4:71f5e3d2b0c6 54 pc.printf("Start=%u\r\n", ctrlr->GetButtonStart());
RichardE 4:71f5e3d2b0c6 55 pc.printf("LeftTrigger=%2u (%6.3f)\r\n", ctrlr->GetLeftTrigger(), ctrlr->GetCalLeftTrigger() );
RichardE 4:71f5e3d2b0c6 56 pc.printf("ButtonLT=%u\r\n", ctrlr->GetButtonLT());
RichardE 4:71f5e3d2b0c6 57 pc.printf("RightTrigger=%2u (%6.3f)\r\n", ctrlr->GetRightTrigger(), ctrlr->GetCalRightTrigger() );
RichardE 4:71f5e3d2b0c6 58 pc.printf("ButtonRT=%u\r\n", ctrlr->GetButtonRT());
RichardE 4:71f5e3d2b0c6 59 pc.printf("LJoyX=%2u (%6.3f)\r\n", ctrlr->GetLJoyX(), ctrlr->GetCalLJoyX() );
RichardE 4:71f5e3d2b0c6 60 pc.printf("LJoyY=%2u (%6.3f)\r\n", ctrlr->GetLJoyY(), ctrlr->GetCalLJoyY() );
RichardE 4:71f5e3d2b0c6 61 pc.printf("RJoyX=%2u (%6.3f)\r\n", ctrlr->GetRJoyX(), ctrlr->GetCalRJoyX() );
RichardE 4:71f5e3d2b0c6 62 pc.printf("RJoyY=%2u (%6.3f)\r\n", ctrlr->GetRJoyY(), ctrlr->GetCalRJoyY() );
RichardE 4:71f5e3d2b0c6 63 if( ctrlr->IsCalibrating() ) {
RichardE 4:71f5e3d2b0c6 64 pc.puts( "Wiggle joysticks and triggers. Press HOME button to end calibration." );
RichardE 4:71f5e3d2b0c6 65 }
RichardE 4:71f5e3d2b0c6 66 else {
RichardE 4:71f5e3d2b0c6 67 pc.puts( "Press A and B buttons simultaneously to start calibration." );
RichardE 4:71f5e3d2b0c6 68 }
RichardE 4:71f5e3d2b0c6 69
RichardE 4:71f5e3d2b0c6 70 }
RichardE 4:71f5e3d2b0c6 71
RichardE 4:71f5e3d2b0c6 72 // Update counter.
RichardE 4:71f5e3d2b0c6 73 // Display is updated every so often.
RichardE 4:71f5e3d2b0c6 74 counter++;
RichardE 4:71f5e3d2b0c6 75 counter %= 10;
RichardE 4:71f5e3d2b0c6 76
RichardE 3:21e262cee052 77 }
RichardE 3:21e262cee052 78 else {
RichardE 3:21e262cee052 79 pc.puts( "READ FAILURE\r\n" );
RichardE 3:21e262cee052 80 }
RichardE 0:3c7f660dbc34 81 }
RichardE 3:21e262cee052 82
RichardE 4:71f5e3d2b0c6 83 /** Clear the screen.
RichardE 4:71f5e3d2b0c6 84 */
RichardE 4:71f5e3d2b0c6 85 static void ClearScreen( void ) {
RichardE 4:71f5e3d2b0c6 86 pc.printf( "%c[2J", 27 ); // VT100 clear screen
RichardE 4:71f5e3d2b0c6 87 }
RichardE 4:71f5e3d2b0c6 88
RichardE 3:21e262cee052 89 /** Main program.
RichardE 3:21e262cee052 90 */
RichardE 3:21e262cee052 91 int main() {
RichardE 3:21e262cee052 92 WiiClassicControllerWithCalibration ctrlrA( PTE0, PTE1 );
RichardE 4:71f5e3d2b0c6 93 pc.baud( 115200 );
RichardE 4:71f5e3d2b0c6 94 pc.format( 8, Serial::None, 1 );
RichardE 4:71f5e3d2b0c6 95 ClearScreen();
RichardE 3:21e262cee052 96 while (true) {
RichardE 3:21e262cee052 97 ReadAndReport( &ctrlrA, "PORT A" );
RichardE 4:71f5e3d2b0c6 98 // If both A and B buttons are pressed and not already calibrating
RichardE 4:71f5e3d2b0c6 99 // then start calibrating and clear the screen.
RichardE 4:71f5e3d2b0c6 100 if( ctrlrA.GetButtonA() && ctrlrA.GetButtonB() && ! ctrlrA.IsCalibrating() ) {
RichardE 4:71f5e3d2b0c6 101 ctrlrA.StartCalibrating();
RichardE 4:71f5e3d2b0c6 102 ClearScreen();
RichardE 4:71f5e3d2b0c6 103 }
RichardE 4:71f5e3d2b0c6 104 // If HOME buttons is pressed and doing a calibration
RichardE 4:71f5e3d2b0c6 105 // then stop calibrating and clear the screen.
RichardE 4:71f5e3d2b0c6 106 if( ctrlrA.GetButtonHome() && ctrlrA.IsCalibrating() ) {
RichardE 4:71f5e3d2b0c6 107 ctrlrA.StopCalibrating();
RichardE 4:71f5e3d2b0c6 108 ClearScreen();
RichardE 4:71f5e3d2b0c6 109 }
RichardE 3:21e262cee052 110 wait(LOOP_DELAY);
RichardE 3:21e262cee052 111 }
RichardE 3:21e262cee052 112 // Never gets here.
RichardE 3:21e262cee052 113 // return EXIT_SUCCESS;
RichardE 3:21e262cee052 114 }