Dependents:   WiiNunchuckTest

Committer:
FrankWeissenborn
Date:
Mon Feb 28 06:49:27 2011 +0000
Revision:
4:9169c602b0d8

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FrankWeissenborn 4:9169c602b0d8 1 #include "WiiChuck.h"
FrankWeissenborn 4:9169c602b0d8 2
FrankWeissenborn 4:9169c602b0d8 3
FrankWeissenborn 4:9169c602b0d8 4
FrankWeissenborn 4:9169c602b0d8 5 WiiChuck::WiiChuck(PinName data, PinName clk):_i2c(data, clk) {
FrankWeissenborn 4:9169c602b0d8 6 Error = true;
FrankWeissenborn 4:9169c602b0d8 7 unsigned char cmd[] = {NUNCHUCK_REGADDR, 0x00};
FrankWeissenborn 4:9169c602b0d8 8 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
FrankWeissenborn 4:9169c602b0d8 9 Error = false;
FrankWeissenborn 4:9169c602b0d8 10 }
FrankWeissenborn 4:9169c602b0d8 11 _oldC = 0;
FrankWeissenborn 4:9169c602b0d8 12 _oldZ = 0;
FrankWeissenborn 4:9169c602b0d8 13 }
FrankWeissenborn 4:9169c602b0d8 14
FrankWeissenborn 4:9169c602b0d8 15 bool WiiChuck::Read(int* joyX,int* joyY,int* accX,int* accY,int* accZ,int* buttonC,int* buttonZ) {
FrankWeissenborn 4:9169c602b0d8 16
FrankWeissenborn 4:9169c602b0d8 17 int i;
FrankWeissenborn 4:9169c602b0d8 18 char readBuf[NUNCHUCK_READLEN];
FrankWeissenborn 4:9169c602b0d8 19
FrankWeissenborn 4:9169c602b0d8 20 if (Error) {
FrankWeissenborn 4:9169c602b0d8 21 return false;
FrankWeissenborn 4:9169c602b0d8 22 }
FrankWeissenborn 4:9169c602b0d8 23
FrankWeissenborn 4:9169c602b0d8 24 const unsigned char cmd[] = {0x00};
FrankWeissenborn 4:9169c602b0d8 25 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
FrankWeissenborn 4:9169c602b0d8 26 wait(I2C_READ_DELAY);
FrankWeissenborn 4:9169c602b0d8 27 if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) {
FrankWeissenborn 4:9169c602b0d8 28 //init values
FrankWeissenborn 4:9169c602b0d8 29 *joyX = 0; *joyY = 0; *accX = 0; *accY = 0; *accZ = 0; *buttonC = 0; *buttonZ = 0;
FrankWeissenborn 4:9169c602b0d8 30
FrankWeissenborn 4:9169c602b0d8 31 for (i = 0; i < NUNCHUCK_READLEN; ++i) {
FrankWeissenborn 4:9169c602b0d8 32 readBuf[i] = (readBuf[i] ^ 0x17) + 0x17;
FrankWeissenborn 4:9169c602b0d8 33 }
FrankWeissenborn 4:9169c602b0d8 34 *joyX = readBuf[Joy_X];
FrankWeissenborn 4:9169c602b0d8 35 *joyY = readBuf[Joy_Y];
FrankWeissenborn 4:9169c602b0d8 36 *accX = readBuf[Acc_X] << 2;
FrankWeissenborn 4:9169c602b0d8 37 *accY = readBuf[Acc_Y] << 2;
FrankWeissenborn 4:9169c602b0d8 38 *accZ = readBuf[Acc_Z] << 2;
FrankWeissenborn 4:9169c602b0d8 39
FrankWeissenborn 4:9169c602b0d8 40 if (readBuf[Button] & 0x01) {
FrankWeissenborn 4:9169c602b0d8 41 *buttonZ = 0;
FrankWeissenborn 4:9169c602b0d8 42 } else {
FrankWeissenborn 4:9169c602b0d8 43 *buttonZ = 1;
FrankWeissenborn 4:9169c602b0d8 44 }
FrankWeissenborn 4:9169c602b0d8 45 if (readBuf[Button] & 0x02) {
FrankWeissenborn 4:9169c602b0d8 46 *buttonC = 0;
FrankWeissenborn 4:9169c602b0d8 47 } else {
FrankWeissenborn 4:9169c602b0d8 48 *buttonC = 1;
FrankWeissenborn 4:9169c602b0d8 49 }
FrankWeissenborn 4:9169c602b0d8 50 if (readBuf[Button] & 0x04) accX += 2;
FrankWeissenborn 4:9169c602b0d8 51 if (readBuf[Button] & 0x08) accX += 1;
FrankWeissenborn 4:9169c602b0d8 52 if (readBuf[Button] & 0x10) accY += 2;
FrankWeissenborn 4:9169c602b0d8 53 if (readBuf[Button] & 0x20) accY += 1;
FrankWeissenborn 4:9169c602b0d8 54 if (readBuf[Button] & 0x40) accZ += 2;
FrankWeissenborn 4:9169c602b0d8 55 if (readBuf[Button] & 0x80) accZ += 1;
FrankWeissenborn 4:9169c602b0d8 56 return true;
FrankWeissenborn 4:9169c602b0d8 57 }
FrankWeissenborn 4:9169c602b0d8 58 else
FrankWeissenborn 4:9169c602b0d8 59 {
FrankWeissenborn 4:9169c602b0d8 60 return false;
FrankWeissenborn 4:9169c602b0d8 61 }
FrankWeissenborn 4:9169c602b0d8 62 } else {
FrankWeissenborn 4:9169c602b0d8 63 return false;
FrankWeissenborn 4:9169c602b0d8 64 }
FrankWeissenborn 4:9169c602b0d8 65 }
FrankWeissenborn 4:9169c602b0d8 66
FrankWeissenborn 4:9169c602b0d8 67 void WiiChuck::start()
FrankWeissenborn 4:9169c602b0d8 68 {
FrankWeissenborn 4:9169c602b0d8 69 _getValues.attach(this, &WiiChuck::getValues,0.2);
FrankWeissenborn 4:9169c602b0d8 70 }
FrankWeissenborn 4:9169c602b0d8 71 void WiiChuck::stop()
FrankWeissenborn 4:9169c602b0d8 72 {
FrankWeissenborn 4:9169c602b0d8 73 _getValues.detach();
FrankWeissenborn 4:9169c602b0d8 74 }
FrankWeissenborn 4:9169c602b0d8 75
FrankWeissenborn 4:9169c602b0d8 76 void WiiChuck::getValues()
FrankWeissenborn 4:9169c602b0d8 77 {
FrankWeissenborn 4:9169c602b0d8 78 int joyX = 0;int joyY = 0;
FrankWeissenborn 4:9169c602b0d8 79 int accX = 0;int accY = 0;int accZ = 0;
FrankWeissenborn 4:9169c602b0d8 80 int buttonC = 0;int buttonZ = 0;
FrankWeissenborn 4:9169c602b0d8 81
FrankWeissenborn 4:9169c602b0d8 82 bool read = Read(&joyX,&joyY,&accX,&accY,&accZ,&buttonC,&buttonZ);
FrankWeissenborn 4:9169c602b0d8 83
FrankWeissenborn 4:9169c602b0d8 84 if(read)
FrankWeissenborn 4:9169c602b0d8 85 {
FrankWeissenborn 4:9169c602b0d8 86 //analyse
FrankWeissenborn 4:9169c602b0d8 87 if(_oldC == 0 && buttonC == 1)
FrankWeissenborn 4:9169c602b0d8 88 {
FrankWeissenborn 4:9169c602b0d8 89 _oldC = 1;
FrankWeissenborn 4:9169c602b0d8 90 _callback_input(BUTTON_CANCEL_VALUE);
FrankWeissenborn 4:9169c602b0d8 91 return;
FrankWeissenborn 4:9169c602b0d8 92 }
FrankWeissenborn 4:9169c602b0d8 93 else
FrankWeissenborn 4:9169c602b0d8 94 {
FrankWeissenborn 4:9169c602b0d8 95 _oldC = buttonC;
FrankWeissenborn 4:9169c602b0d8 96 }
FrankWeissenborn 4:9169c602b0d8 97
FrankWeissenborn 4:9169c602b0d8 98 //analyse
FrankWeissenborn 4:9169c602b0d8 99 if(_oldZ == 0 && buttonZ == 1)
FrankWeissenborn 4:9169c602b0d8 100 {
FrankWeissenborn 4:9169c602b0d8 101 _oldZ = 1;
FrankWeissenborn 4:9169c602b0d8 102 _callback_input(BUTTON_OK_VALUE);
FrankWeissenborn 4:9169c602b0d8 103 return;
FrankWeissenborn 4:9169c602b0d8 104 }
FrankWeissenborn 4:9169c602b0d8 105 else
FrankWeissenborn 4:9169c602b0d8 106 {
FrankWeissenborn 4:9169c602b0d8 107 _oldZ = buttonZ;
FrankWeissenborn 4:9169c602b0d8 108 }
FrankWeissenborn 4:9169c602b0d8 109
FrankWeissenborn 4:9169c602b0d8 110 if(joyY>160)
FrankWeissenborn 4:9169c602b0d8 111 {
FrankWeissenborn 4:9169c602b0d8 112 _callback_input(BUTTON_VOLUME_PLUS);
FrankWeissenborn 4:9169c602b0d8 113 return;
FrankWeissenborn 4:9169c602b0d8 114 }
FrankWeissenborn 4:9169c602b0d8 115 if(joyY<80)
FrankWeissenborn 4:9169c602b0d8 116 {
FrankWeissenborn 4:9169c602b0d8 117
FrankWeissenborn 4:9169c602b0d8 118 _callback_input(BUTTON_VOLUME_MINUS);
FrankWeissenborn 4:9169c602b0d8 119 return;
FrankWeissenborn 4:9169c602b0d8 120 }
FrankWeissenborn 4:9169c602b0d8 121 if(joyX>160)
FrankWeissenborn 4:9169c602b0d8 122 {
FrankWeissenborn 4:9169c602b0d8 123 _callback_input(BUTTON_NEXT_VALUE);
FrankWeissenborn 4:9169c602b0d8 124 return;
FrankWeissenborn 4:9169c602b0d8 125 }
FrankWeissenborn 4:9169c602b0d8 126 if(joyX<80)
FrankWeissenborn 4:9169c602b0d8 127 {
FrankWeissenborn 4:9169c602b0d8 128
FrankWeissenborn 4:9169c602b0d8 129 _callback_input(BUTTON_PREV_VALUE);
FrankWeissenborn 4:9169c602b0d8 130 return;
FrankWeissenborn 4:9169c602b0d8 131 }
FrankWeissenborn 4:9169c602b0d8 132
FrankWeissenborn 4:9169c602b0d8 133 }
FrankWeissenborn 4:9169c602b0d8 134 }
FrankWeissenborn 4:9169c602b0d8 135 void WiiChuck::attach(pt2Func function)
FrankWeissenborn 4:9169c602b0d8 136 {
FrankWeissenborn 4:9169c602b0d8 137 _callback_input = function;
FrankWeissenborn 4:9169c602b0d8 138 }
FrankWeissenborn 4:9169c602b0d8 139
FrankWeissenborn 4:9169c602b0d8 140