Dependents:   HoverboardTest RobotArmControl

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WiiNunchuck.cpp Source File

WiiNunchuck.cpp

00001 #include "mbed.h"
00002 #include "WiiNunchuck.h"
00003 
00004 WiiNunchuck::WiiNunchuck(PinName p_sda, PinName p_scl):i2c(p_sda, p_scl)
00005 {
00006     WiiNunInitFlag = init();
00007     timer.start();
00008 }
00009 
00010 
00011 bool WiiNunchuck::init()
00012 {
00013     bool result = false; 
00014     unsigned char cmd[] = {NUNCHUCK_REGADDR, 0x00};    
00015     if (i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
00016         result = true;
00017     }
00018     return result;
00019 }
00020 
00021 
00022 void WiiNunchuck::read()
00023 {
00024     int i;
00025     
00026     if(timer.read_ms() < 50) return;
00027     
00028     if(!WiiNunInitFlag) {
00029         WiiNunInitFlag = init();
00030     }
00031     
00032     if(WiiNunInitFlag) {
00033         const unsigned char cmd[] = {0x00};
00034         if (i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
00035             wait(I2C_READ_DELAY);
00036             if (i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) {
00037                 for(i = 0; i < NUNCHUCK_READLEN; ++i) {
00038                     readBuf[i] = (readBuf[i] ^ 0x17) + 0x17;
00039                 }
00040                 joyX = readBuf[Joy_X];
00041                 joyY = readBuf[Joy_Y];
00042                 accX = readBuf[Acc_X] << 2;
00043                 accY = readBuf[Acc_Y] << 2;
00044                 accZ = readBuf[Acc_Z] << 2;
00045                 
00046                 if(readBuf[Button] & 0x01) {
00047                     buttonZ = 0;
00048                 } else {
00049                     buttonZ = 1;
00050                 }
00051                 if(readBuf[Button] & 0x02) {
00052                     buttonC = 0;
00053                 } else {
00054                     buttonC = 1;
00055                 }
00056                 if(readBuf[Button] & 0x04) accX += 1;
00057                 if(readBuf[Button] & 0x08) accX += 2;
00058                 if(readBuf[Button] & 0x10) accY += 1;
00059                 if(readBuf[Button] & 0x20) accY += 2;
00060                 if(readBuf[Button] & 0x40) accZ += 1;
00061                 if(readBuf[Button] & 0x80) accZ += 2;
00062            }
00063         }
00064     }
00065     timer.reset();
00066 }
00067 
00068 
00069 unsigned char WiiNunchuck::joyx()
00070 {
00071     read();
00072     return joyX;
00073 }
00074 
00075 
00076 unsigned char WiiNunchuck::joyy()
00077 {
00078     read();
00079     return joyY;
00080 }
00081 
00082 
00083 int WiiNunchuck::accx()
00084 {
00085     read();
00086     return accX;
00087 }
00088 
00089 
00090 int WiiNunchuck::accy()
00091 {
00092     read();
00093     return accY;
00094 }
00095 
00096 
00097 int WiiNunchuck::accz()
00098 {
00099     read();
00100     return accZ;
00101 }
00102 
00103 
00104 bool WiiNunchuck::buttonc()
00105 {
00106     read();
00107     return buttonC;
00108 }
00109 
00110 
00111 bool WiiNunchuck::buttonz()
00112 {
00113     read();
00114     return buttonZ;
00115 }