PixArt Gesture Library for nRF051
Fork of Pixart_Gesture by
Diff: Gesture.cpp
- Revision:
- 0:726fdf0062c6
diff -r 000000000000 -r 726fdf0062c6 Gesture.cpp
--- /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

PAJ7620 Integrated Gesture Recognition Optical CMOS Sensor