Library to use the wii nunchuk distributed by Nintendo
Diff: Nunchuk.cpp
- Revision:
- 0:37e9a0644485
- Child:
- 2:0a8f43931041
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Nunchuk.cpp Fri Nov 15 14:45:23 2013 +0000 @@ -0,0 +1,171 @@ +#include "Nunchuk.h" + +Nunchuk::Nunchuk(PinName sda,PinName scl,float mTe):myI2C(sda,scl) +{ + periodeTe=mTe; + myI2C.frequency(100000); + + this->joyX=0x00; + this->joyY=0x00; + this->accX=0; + this->accY=0; + this->accZ=0; + this->btnC=false; + this->btnZ=false; + + setup(); + + myTicker.attach(this,&Nunchuk::action,periodeTe); +} +//----------------------- +Nunchuk::~Nunchuk(void) +{ + myTicker.detach(); +} +//----------------------- +void Nunchuk::action(void) +{ + bool res=false; + static char datas[6]; + + int i=0; + + res=request(); //demande une mesure + if(res==false) { + return ; //pb + } + + if(myI2C.read(ADRESSE,datas,6)==0) { + res=true; + + for(i=0; i<6; i++) { + datas[i]=decode(datas[i]); + } + + // + if(datas[0] < 100) + joyX=-1; + else if(datas[0] >200) + joyX=1; + else + joyX=0; + // + if(datas[1] <100) + joyY=-1; + else if(datas[1] >140) + joyY=1; + else + joyY=0; + // + accX=datas[2]<<2; + accY=datas[3]<<2; + accZ=datas[4]<<2; + + //btnZ + if(datas[5] & 0x01) + btnZ=false; + else + btnZ=true; + + + //btnC + if(datas[5]& 0x02) + btnC=false; + else + btnC=true; + + accX+=(datas[5]>>2) & 0x0003; + accY+=(datas[5]>>4) & 0x0003; + accZ+=(datas[5]>>6) & 0x0003; + + + } else { + res=false; + joyX=0; + joyY=0; + + accX=0; + accY=0; + accZ=0; + btnZ=false; + btnC=false; + } + +} +//----------------------- +bool Nunchuk::setup(void) +{ + char cmd[2]; + bool res=false; + + cmd[0]=0x40; + cmd[1]=0x00; + + if(myI2C.write(ADRESSE,cmd,2)==0) { + res=true; + } else { + res=false; + } + return res; +} +//---------------------------- +bool Nunchuk::request(void) +{ + bool res=false; + char cmd[1]= {0x00}; + + if(myI2C.write(ADRESSE,cmd,1)==0) { + res=true; + wait(0.001); + + } else { + res=false; + } + + return res; +} +//----------------------------- +float Nunchuk::getPeriodeTe(void) +{ + return periodeTe; +} +//----------------------------- +char Nunchuk::decode(char data) +{ + return (data^0x17)+0x17; +} +//------------------------------ +signed char Nunchuk::getJoyX(void) +{ + return joyX; +} +//------------------------------- +signed char Nunchuk::getJoyY(void) +{ + return joyY; +} +//-------------------------------- +int Nunchuk::getAccX(void) +{ + return accX; +} +//------------------------------ +int Nunchuk::getAccY(void) +{ + return accY; +} +//---------------------------- +int Nunchuk::getAccZ(void) +{ + return accZ; +} +//----------------------------- +bool Nunchuk::getBtnC(void) +{ + return btnC; +} +//------------------------------- +bool Nunchuk::getBtnZ(void) +{ + return btnZ; +} \ No newline at end of file