Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
WiiChuck.cpp@3:13e1d0a345a6, 2011-02-02 (annotated)
- Committer:
- FrankWeissenborn
- Date:
- Wed Feb 02 19:44:59 2011 +0000
- Revision:
- 3:13e1d0a345a6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
FrankWeissenborn | 3:13e1d0a345a6 | 1 | #include "WiiChuck.h" |
FrankWeissenborn | 3:13e1d0a345a6 | 2 | |
FrankWeissenborn | 3:13e1d0a345a6 | 3 | |
FrankWeissenborn | 3:13e1d0a345a6 | 4 | |
FrankWeissenborn | 3:13e1d0a345a6 | 5 | WiiChuck::WiiChuck(PinName data, PinName clk):_i2c(data, clk) { |
FrankWeissenborn | 3:13e1d0a345a6 | 6 | Error = true; |
FrankWeissenborn | 3:13e1d0a345a6 | 7 | unsigned char cmd[] = {NUNCHUCK_REGADDR, 0x00}; |
FrankWeissenborn | 3:13e1d0a345a6 | 8 | if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) { |
FrankWeissenborn | 3:13e1d0a345a6 | 9 | Error = false; |
FrankWeissenborn | 3:13e1d0a345a6 | 10 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 11 | _oldC = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 12 | _oldZ = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 13 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 14 | |
FrankWeissenborn | 3:13e1d0a345a6 | 15 | bool WiiChuck::Read(int* joyX,int* joyY,int* accX,int* accY,int* accZ,int* buttonC,int* buttonZ) { |
FrankWeissenborn | 3:13e1d0a345a6 | 16 | |
FrankWeissenborn | 3:13e1d0a345a6 | 17 | int i; |
FrankWeissenborn | 3:13e1d0a345a6 | 18 | char readBuf[NUNCHUCK_READLEN]; |
FrankWeissenborn | 3:13e1d0a345a6 | 19 | |
FrankWeissenborn | 3:13e1d0a345a6 | 20 | if (Error) { |
FrankWeissenborn | 3:13e1d0a345a6 | 21 | return false; |
FrankWeissenborn | 3:13e1d0a345a6 | 22 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 23 | |
FrankWeissenborn | 3:13e1d0a345a6 | 24 | const unsigned char cmd[] = {0x00}; |
FrankWeissenborn | 3:13e1d0a345a6 | 25 | if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) { |
FrankWeissenborn | 3:13e1d0a345a6 | 26 | wait(I2C_READ_DELAY); |
FrankWeissenborn | 3:13e1d0a345a6 | 27 | if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) { |
FrankWeissenborn | 3:13e1d0a345a6 | 28 | //init values |
FrankWeissenborn | 3:13e1d0a345a6 | 29 | *joyX = 0; *joyY = 0; *accX = 0; *accY = 0; *accZ = 0; *buttonC = 0; *buttonZ = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 30 | |
FrankWeissenborn | 3:13e1d0a345a6 | 31 | for (i = 0; i < NUNCHUCK_READLEN; ++i) { |
FrankWeissenborn | 3:13e1d0a345a6 | 32 | readBuf[i] = (readBuf[i] ^ 0x17) + 0x17; |
FrankWeissenborn | 3:13e1d0a345a6 | 33 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 34 | *joyX = readBuf[Joy_X]; |
FrankWeissenborn | 3:13e1d0a345a6 | 35 | *joyY = readBuf[Joy_Y]; |
FrankWeissenborn | 3:13e1d0a345a6 | 36 | *accX = readBuf[Acc_X] << 2; |
FrankWeissenborn | 3:13e1d0a345a6 | 37 | *accY = readBuf[Acc_Y] << 2; |
FrankWeissenborn | 3:13e1d0a345a6 | 38 | *accZ = readBuf[Acc_Z] << 2; |
FrankWeissenborn | 3:13e1d0a345a6 | 39 | |
FrankWeissenborn | 3:13e1d0a345a6 | 40 | if (readBuf[Button] & 0x01) { |
FrankWeissenborn | 3:13e1d0a345a6 | 41 | *buttonZ = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 42 | } else { |
FrankWeissenborn | 3:13e1d0a345a6 | 43 | *buttonZ = 1; |
FrankWeissenborn | 3:13e1d0a345a6 | 44 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 45 | if (readBuf[Button] & 0x02) { |
FrankWeissenborn | 3:13e1d0a345a6 | 46 | *buttonC = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 47 | } else { |
FrankWeissenborn | 3:13e1d0a345a6 | 48 | *buttonC = 1; |
FrankWeissenborn | 3:13e1d0a345a6 | 49 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 50 | if (readBuf[Button] & 0x04) accX += 2; |
FrankWeissenborn | 3:13e1d0a345a6 | 51 | if (readBuf[Button] & 0x08) accX += 1; |
FrankWeissenborn | 3:13e1d0a345a6 | 52 | if (readBuf[Button] & 0x10) accY += 2; |
FrankWeissenborn | 3:13e1d0a345a6 | 53 | if (readBuf[Button] & 0x20) accY += 1; |
FrankWeissenborn | 3:13e1d0a345a6 | 54 | if (readBuf[Button] & 0x40) accZ += 2; |
FrankWeissenborn | 3:13e1d0a345a6 | 55 | if (readBuf[Button] & 0x80) accZ += 1; |
FrankWeissenborn | 3:13e1d0a345a6 | 56 | return true; |
FrankWeissenborn | 3:13e1d0a345a6 | 57 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 58 | else |
FrankWeissenborn | 3:13e1d0a345a6 | 59 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 60 | return false; |
FrankWeissenborn | 3:13e1d0a345a6 | 61 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 62 | } else { |
FrankWeissenborn | 3:13e1d0a345a6 | 63 | return false; |
FrankWeissenborn | 3:13e1d0a345a6 | 64 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 65 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 66 | |
FrankWeissenborn | 3:13e1d0a345a6 | 67 | void WiiChuck::start() |
FrankWeissenborn | 3:13e1d0a345a6 | 68 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 69 | _getValues.attach(this, &WiiChuck::getValues,0.2); |
FrankWeissenborn | 3:13e1d0a345a6 | 70 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 71 | void WiiChuck::stop() |
FrankWeissenborn | 3:13e1d0a345a6 | 72 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 73 | _getValues.detach(); |
FrankWeissenborn | 3:13e1d0a345a6 | 74 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 75 | |
FrankWeissenborn | 3:13e1d0a345a6 | 76 | void WiiChuck::getValues() |
FrankWeissenborn | 3:13e1d0a345a6 | 77 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 78 | int joyX = 0;int joyY = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 79 | int accX = 0;int accY = 0;int accZ = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 80 | int buttonC = 0;int buttonZ = 0; |
FrankWeissenborn | 3:13e1d0a345a6 | 81 | |
FrankWeissenborn | 3:13e1d0a345a6 | 82 | bool read = Read(&joyX,&joyY,&accX,&accY,&accZ,&buttonC,&buttonZ); |
FrankWeissenborn | 3:13e1d0a345a6 | 83 | |
FrankWeissenborn | 3:13e1d0a345a6 | 84 | if(read) |
FrankWeissenborn | 3:13e1d0a345a6 | 85 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 86 | //analyse |
FrankWeissenborn | 3:13e1d0a345a6 | 87 | if(_oldC == 0 && buttonC == 1) |
FrankWeissenborn | 3:13e1d0a345a6 | 88 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 89 | _oldC = 1; |
FrankWeissenborn | 3:13e1d0a345a6 | 90 | _callback_input(BUTTON_CANCEL_VALUE); |
FrankWeissenborn | 3:13e1d0a345a6 | 91 | return; |
FrankWeissenborn | 3:13e1d0a345a6 | 92 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 93 | else |
FrankWeissenborn | 3:13e1d0a345a6 | 94 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 95 | _oldC = buttonC; |
FrankWeissenborn | 3:13e1d0a345a6 | 96 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 97 | |
FrankWeissenborn | 3:13e1d0a345a6 | 98 | //analyse |
FrankWeissenborn | 3:13e1d0a345a6 | 99 | if(_oldZ == 0 && buttonZ == 1) |
FrankWeissenborn | 3:13e1d0a345a6 | 100 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 101 | _oldZ = 1; |
FrankWeissenborn | 3:13e1d0a345a6 | 102 | _callback_input(BUTTON_OK_VALUE); |
FrankWeissenborn | 3:13e1d0a345a6 | 103 | return; |
FrankWeissenborn | 3:13e1d0a345a6 | 104 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 105 | else |
FrankWeissenborn | 3:13e1d0a345a6 | 106 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 107 | _oldZ = buttonZ; |
FrankWeissenborn | 3:13e1d0a345a6 | 108 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 109 | |
FrankWeissenborn | 3:13e1d0a345a6 | 110 | if(joyY>160) |
FrankWeissenborn | 3:13e1d0a345a6 | 111 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 112 | _callback_input(BUTTON_VOLUME_PLUS); |
FrankWeissenborn | 3:13e1d0a345a6 | 113 | return; |
FrankWeissenborn | 3:13e1d0a345a6 | 114 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 115 | if(joyY<80) |
FrankWeissenborn | 3:13e1d0a345a6 | 116 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 117 | |
FrankWeissenborn | 3:13e1d0a345a6 | 118 | _callback_input(BUTTON_VOLUME_MINUS); |
FrankWeissenborn | 3:13e1d0a345a6 | 119 | return; |
FrankWeissenborn | 3:13e1d0a345a6 | 120 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 121 | if(joyX>160) |
FrankWeissenborn | 3:13e1d0a345a6 | 122 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 123 | _callback_input(BUTTON_NEXT_VALUE); |
FrankWeissenborn | 3:13e1d0a345a6 | 124 | return; |
FrankWeissenborn | 3:13e1d0a345a6 | 125 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 126 | if(joyX<80) |
FrankWeissenborn | 3:13e1d0a345a6 | 127 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 128 | |
FrankWeissenborn | 3:13e1d0a345a6 | 129 | _callback_input(BUTTON_PREV_VALUE); |
FrankWeissenborn | 3:13e1d0a345a6 | 130 | return; |
FrankWeissenborn | 3:13e1d0a345a6 | 131 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 132 | |
FrankWeissenborn | 3:13e1d0a345a6 | 133 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 134 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 135 | void WiiChuck::attach(pt2Func function) |
FrankWeissenborn | 3:13e1d0a345a6 | 136 | { |
FrankWeissenborn | 3:13e1d0a345a6 | 137 | _callback_input = function; |
FrankWeissenborn | 3:13e1d0a345a6 | 138 | } |
FrankWeissenborn | 3:13e1d0a345a6 | 139 | |
FrankWeissenborn | 3:13e1d0a345a6 | 140 |