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
main.cpp@4:71f5e3d2b0c6, 2013-06-30 (annotated)
- 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?
User | Revision | Line number | New 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 | } |