PixArt Gesture Library for nRF051
Fork of Pixart_Gesture by
Gesture.cpp
- Committer:
- pixus_mbed
- Date:
- 2016-09-15
- Revision:
- 0:726fdf0062c6
File content as of revision 0:726fdf0062c6:
#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]; }