PixArt Gesture Library for nRF051
Fork of Pixart_Gesture by
Diff: Gesture.cpp
- Revision:
- 0:726fdf0062c6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gesture.cpp Thu Sep 15 18:07:48 2016 +0000 @@ -0,0 +1,165 @@ +#include "mbed.h" +#include "PAC7620_30Set.h" +#include "Gesture.h" + + + +#define PAC7620_30_ADDR (0xE6) //PAC7620 address shift 1-bit +#define I2C_ADDR PAC7620_30_ADDR +#define PXI_WMI 0x20 +#define ID_7620 0x01 +#define ID_7630 0x00 +#define GestureRegAddrL 0x43 +#define GestureRegAddrH 0x44 +#define DebounceT 300 //debounce time, unit:ms + + +Pixart_Gesture::Pixart_Gesture(I2C *i2c, int Period,GestureCallback callback,bool &Result) +{ + m_i2c = i2c; + m_GestureCallback = callback; + //m_pc = pc; + m_Period = Period; + + + Result=PAC7620_30_init(); +} + + + +bool Pixart_Gesture::PAC7620_30_init() +{ uint8_t q; + + readRegister(0x00); + wait_ms(50); + + if(readRegister(0x00) == PXI_WMI) + ;//m_pc->printf("I2C Link Successful!\n\r"); + else{ + //m_pc->printf(" I2C Link Fail!\n\r"); + return false; + } + + if(readRegister(0x02) == ID_7620) + { + // m_pc->printf("PAC7620 detected.\n\r"); + + writeRegister(0xff, 0x00); //wakeup + wait_ms(10); //make a delay + for(q=0;q<INIT_Ges7620_REG_ARRAY_SIZE;q++) + writeRegister(init_ges7620_register_array[q][0], init_ges7620_register_array[q][1]); + + wait_ms(DebounceT); //debounce, clean data + readRegister(GestureRegAddrH); readRegister(GestureRegAddrL); + Flag_7630 = 0; + } + else if(readRegister(0x02) == ID_7630) + { + //m_pc->printf("PAC7630 detected.\n\r"); + + writeRegister(0xff, 0x00); //wakeup + wait_ms(10); //make a delay + for(q=0;q<INIT_Ges7630_REG_ARRAY_SIZE;q++) + writeRegister(init_ges7630_register_array[q][0], init_ges7630_register_array[q][1]); + + wait_ms(DebounceT); //debounce, clean data + readRegister(GestureRegAddrH); readRegister(GestureRegAddrL); + + Flag_7630 = 1; + } + else + ;// m_pc->printf("Device not support.\n\r"); + + m_ticker.attach_us(this,&Pixart_Gesture::periodicCallback, m_Period*1000); + + //m_pc->printf("\n\r~~~Start Real-time Gesture Demo~~~ \n\r"); + + return true; +} + +void Pixart_Gesture::periodicCallback(void) +{ + uint16_t gesture_code; + + gesture_code = (readRegister(GestureRegAddrH)<<8) + readRegister(GestureRegAddrL); + //pc.printf("Gesture Code: 0x %4X\n\r", gesture_code); + //UP,DOWN,LEFT,RIGHT,PUSH,POLL,CLOCKWISE,COUNTER_CLOCKWISE,WAVE}; + if(gesture_code != 0) + { + switch (gesture_code) + { + case 0x01: // up + if(Flag_7630 == 0) + m_GestureCallback(DOWN); + else + m_GestureCallback(LEFT); + + //m_pc->printf("up 0x%4X\n\r", gesture_code); + break; + case 0x02: // down + if(Flag_7630 == 0) + m_GestureCallback(UP); + else + m_GestureCallback(RIGHT); + + //m_pc->printf("down 0x%4X\n\r", gesture_code); + break; + case 0x04: // left + if(Flag_7630 == 0) + m_GestureCallback(RIGHT); + else + m_GestureCallback(DOWN); + //m_pc->printf("left 0x%4X\n\r", gesture_code); + break; + case 0x08: // right + if(Flag_7630 == 0) + m_GestureCallback(LEFT); + else + m_GestureCallback(UP); + //m_pc->printf("right 0x%4X\n\r", gesture_code); + break; + case 0x10: // push + m_GestureCallback(PUSH); + //m_pc->printf("push 0x%4X\n\r", gesture_code); + break; + case 0x20: // pop + m_GestureCallback(POLL); + //m_pc->printf("pop 0x%4X\n\r", gesture_code); + break; + case 0x40: // rotate right + m_GestureCallback(CLOCKWISE); + //m_pc->printf("rotate right 0x%4X\n\r", gesture_code); + break; + case 0x80: // rotate left + m_GestureCallback(COUNTER_CLOCKWISE); + //m_pc->printf("rotate left 0x%4X\n\r", gesture_code); + break; + case 0x100:// wave + m_GestureCallback(WAVE); + //m_pc->printf("wave 0x%4X\n\r", gesture_code); + break; + } + readRegister(GestureRegAddrH); readRegister(GestureRegAddrL); + } +} + + + +void Pixart_Gesture::writeRegister(uint8_t addr, uint8_t data) +{ + char data_write[2]; + + data_write[0] = addr; + data_write[1] = data; + m_i2c->write(I2C_ADDR, data_write, 2, 0); +} +uint8_t Pixart_Gesture::readRegister(uint8_t addr) +{ + char data_write[2]; + char data_read[2]; + + data_write[0] = addr; + m_i2c->write(I2C_ADDR, data_write, 1, 0); + m_i2c->read(I2C_ADDR, data_read, 1, 0); + return data_read[0]; +} \ No newline at end of file