PixArt Gesture Library for nRF051

Fork of Pixart_Gesture by PixArt Imaging

Committer:
pixus_mbed
Date:
Thu Sep 15 18:07:48 2016 +0000
Revision:
0:726fdf0062c6
PixArt Gesture main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pixus_mbed 0:726fdf0062c6 1 #include "mbed.h"
pixus_mbed 0:726fdf0062c6 2 #include "PAC7620_30Set.h"
pixus_mbed 0:726fdf0062c6 3 #include "Gesture.h"
pixus_mbed 0:726fdf0062c6 4
pixus_mbed 0:726fdf0062c6 5
pixus_mbed 0:726fdf0062c6 6
pixus_mbed 0:726fdf0062c6 7 #define PAC7620_30_ADDR (0xE6) //PAC7620 address shift 1-bit
pixus_mbed 0:726fdf0062c6 8 #define I2C_ADDR PAC7620_30_ADDR
pixus_mbed 0:726fdf0062c6 9 #define PXI_WMI 0x20
pixus_mbed 0:726fdf0062c6 10 #define ID_7620 0x01
pixus_mbed 0:726fdf0062c6 11 #define ID_7630 0x00
pixus_mbed 0:726fdf0062c6 12 #define GestureRegAddrL 0x43
pixus_mbed 0:726fdf0062c6 13 #define GestureRegAddrH 0x44
pixus_mbed 0:726fdf0062c6 14 #define DebounceT 300 //debounce time, unit:ms
pixus_mbed 0:726fdf0062c6 15
pixus_mbed 0:726fdf0062c6 16
pixus_mbed 0:726fdf0062c6 17 Pixart_Gesture::Pixart_Gesture(I2C *i2c, int Period,GestureCallback callback,bool &Result)
pixus_mbed 0:726fdf0062c6 18 {
pixus_mbed 0:726fdf0062c6 19 m_i2c = i2c;
pixus_mbed 0:726fdf0062c6 20 m_GestureCallback = callback;
pixus_mbed 0:726fdf0062c6 21 //m_pc = pc;
pixus_mbed 0:726fdf0062c6 22 m_Period = Period;
pixus_mbed 0:726fdf0062c6 23
pixus_mbed 0:726fdf0062c6 24
pixus_mbed 0:726fdf0062c6 25 Result=PAC7620_30_init();
pixus_mbed 0:726fdf0062c6 26 }
pixus_mbed 0:726fdf0062c6 27
pixus_mbed 0:726fdf0062c6 28
pixus_mbed 0:726fdf0062c6 29
pixus_mbed 0:726fdf0062c6 30 bool Pixart_Gesture::PAC7620_30_init()
pixus_mbed 0:726fdf0062c6 31 { uint8_t q;
pixus_mbed 0:726fdf0062c6 32
pixus_mbed 0:726fdf0062c6 33 readRegister(0x00);
pixus_mbed 0:726fdf0062c6 34 wait_ms(50);
pixus_mbed 0:726fdf0062c6 35
pixus_mbed 0:726fdf0062c6 36 if(readRegister(0x00) == PXI_WMI)
pixus_mbed 0:726fdf0062c6 37 ;//m_pc->printf("I2C Link Successful!\n\r");
pixus_mbed 0:726fdf0062c6 38 else{
pixus_mbed 0:726fdf0062c6 39 //m_pc->printf(" I2C Link Fail!\n\r");
pixus_mbed 0:726fdf0062c6 40 return false;
pixus_mbed 0:726fdf0062c6 41 }
pixus_mbed 0:726fdf0062c6 42
pixus_mbed 0:726fdf0062c6 43 if(readRegister(0x02) == ID_7620)
pixus_mbed 0:726fdf0062c6 44 {
pixus_mbed 0:726fdf0062c6 45 // m_pc->printf("PAC7620 detected.\n\r");
pixus_mbed 0:726fdf0062c6 46
pixus_mbed 0:726fdf0062c6 47 writeRegister(0xff, 0x00); //wakeup
pixus_mbed 0:726fdf0062c6 48 wait_ms(10); //make a delay
pixus_mbed 0:726fdf0062c6 49 for(q=0;q<INIT_Ges7620_REG_ARRAY_SIZE;q++)
pixus_mbed 0:726fdf0062c6 50 writeRegister(init_ges7620_register_array[q][0], init_ges7620_register_array[q][1]);
pixus_mbed 0:726fdf0062c6 51
pixus_mbed 0:726fdf0062c6 52 wait_ms(DebounceT); //debounce, clean data
pixus_mbed 0:726fdf0062c6 53 readRegister(GestureRegAddrH); readRegister(GestureRegAddrL);
pixus_mbed 0:726fdf0062c6 54 Flag_7630 = 0;
pixus_mbed 0:726fdf0062c6 55 }
pixus_mbed 0:726fdf0062c6 56 else if(readRegister(0x02) == ID_7630)
pixus_mbed 0:726fdf0062c6 57 {
pixus_mbed 0:726fdf0062c6 58 //m_pc->printf("PAC7630 detected.\n\r");
pixus_mbed 0:726fdf0062c6 59
pixus_mbed 0:726fdf0062c6 60 writeRegister(0xff, 0x00); //wakeup
pixus_mbed 0:726fdf0062c6 61 wait_ms(10); //make a delay
pixus_mbed 0:726fdf0062c6 62 for(q=0;q<INIT_Ges7630_REG_ARRAY_SIZE;q++)
pixus_mbed 0:726fdf0062c6 63 writeRegister(init_ges7630_register_array[q][0], init_ges7630_register_array[q][1]);
pixus_mbed 0:726fdf0062c6 64
pixus_mbed 0:726fdf0062c6 65 wait_ms(DebounceT); //debounce, clean data
pixus_mbed 0:726fdf0062c6 66 readRegister(GestureRegAddrH); readRegister(GestureRegAddrL);
pixus_mbed 0:726fdf0062c6 67
pixus_mbed 0:726fdf0062c6 68 Flag_7630 = 1;
pixus_mbed 0:726fdf0062c6 69 }
pixus_mbed 0:726fdf0062c6 70 else
pixus_mbed 0:726fdf0062c6 71 ;// m_pc->printf("Device not support.\n\r");
pixus_mbed 0:726fdf0062c6 72
pixus_mbed 0:726fdf0062c6 73 m_ticker.attach_us(this,&Pixart_Gesture::periodicCallback, m_Period*1000);
pixus_mbed 0:726fdf0062c6 74
pixus_mbed 0:726fdf0062c6 75 //m_pc->printf("\n\r~~~Start Real-time Gesture Demo~~~ \n\r");
pixus_mbed 0:726fdf0062c6 76
pixus_mbed 0:726fdf0062c6 77 return true;
pixus_mbed 0:726fdf0062c6 78 }
pixus_mbed 0:726fdf0062c6 79
pixus_mbed 0:726fdf0062c6 80 void Pixart_Gesture::periodicCallback(void)
pixus_mbed 0:726fdf0062c6 81 {
pixus_mbed 0:726fdf0062c6 82 uint16_t gesture_code;
pixus_mbed 0:726fdf0062c6 83
pixus_mbed 0:726fdf0062c6 84 gesture_code = (readRegister(GestureRegAddrH)<<8) + readRegister(GestureRegAddrL);
pixus_mbed 0:726fdf0062c6 85 //pc.printf("Gesture Code: 0x %4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 86 //UP,DOWN,LEFT,RIGHT,PUSH,POLL,CLOCKWISE,COUNTER_CLOCKWISE,WAVE};
pixus_mbed 0:726fdf0062c6 87 if(gesture_code != 0)
pixus_mbed 0:726fdf0062c6 88 {
pixus_mbed 0:726fdf0062c6 89 switch (gesture_code)
pixus_mbed 0:726fdf0062c6 90 {
pixus_mbed 0:726fdf0062c6 91 case 0x01: // up
pixus_mbed 0:726fdf0062c6 92 if(Flag_7630 == 0)
pixus_mbed 0:726fdf0062c6 93 m_GestureCallback(DOWN);
pixus_mbed 0:726fdf0062c6 94 else
pixus_mbed 0:726fdf0062c6 95 m_GestureCallback(LEFT);
pixus_mbed 0:726fdf0062c6 96
pixus_mbed 0:726fdf0062c6 97 //m_pc->printf("up 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 98 break;
pixus_mbed 0:726fdf0062c6 99 case 0x02: // down
pixus_mbed 0:726fdf0062c6 100 if(Flag_7630 == 0)
pixus_mbed 0:726fdf0062c6 101 m_GestureCallback(UP);
pixus_mbed 0:726fdf0062c6 102 else
pixus_mbed 0:726fdf0062c6 103 m_GestureCallback(RIGHT);
pixus_mbed 0:726fdf0062c6 104
pixus_mbed 0:726fdf0062c6 105 //m_pc->printf("down 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 106 break;
pixus_mbed 0:726fdf0062c6 107 case 0x04: // left
pixus_mbed 0:726fdf0062c6 108 if(Flag_7630 == 0)
pixus_mbed 0:726fdf0062c6 109 m_GestureCallback(RIGHT);
pixus_mbed 0:726fdf0062c6 110 else
pixus_mbed 0:726fdf0062c6 111 m_GestureCallback(DOWN);
pixus_mbed 0:726fdf0062c6 112 //m_pc->printf("left 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 113 break;
pixus_mbed 0:726fdf0062c6 114 case 0x08: // right
pixus_mbed 0:726fdf0062c6 115 if(Flag_7630 == 0)
pixus_mbed 0:726fdf0062c6 116 m_GestureCallback(LEFT);
pixus_mbed 0:726fdf0062c6 117 else
pixus_mbed 0:726fdf0062c6 118 m_GestureCallback(UP);
pixus_mbed 0:726fdf0062c6 119 //m_pc->printf("right 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 120 break;
pixus_mbed 0:726fdf0062c6 121 case 0x10: // push
pixus_mbed 0:726fdf0062c6 122 m_GestureCallback(PUSH);
pixus_mbed 0:726fdf0062c6 123 //m_pc->printf("push 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 124 break;
pixus_mbed 0:726fdf0062c6 125 case 0x20: // pop
pixus_mbed 0:726fdf0062c6 126 m_GestureCallback(POLL);
pixus_mbed 0:726fdf0062c6 127 //m_pc->printf("pop 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 128 break;
pixus_mbed 0:726fdf0062c6 129 case 0x40: // rotate right
pixus_mbed 0:726fdf0062c6 130 m_GestureCallback(CLOCKWISE);
pixus_mbed 0:726fdf0062c6 131 //m_pc->printf("rotate right 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 132 break;
pixus_mbed 0:726fdf0062c6 133 case 0x80: // rotate left
pixus_mbed 0:726fdf0062c6 134 m_GestureCallback(COUNTER_CLOCKWISE);
pixus_mbed 0:726fdf0062c6 135 //m_pc->printf("rotate left 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 136 break;
pixus_mbed 0:726fdf0062c6 137 case 0x100:// wave
pixus_mbed 0:726fdf0062c6 138 m_GestureCallback(WAVE);
pixus_mbed 0:726fdf0062c6 139 //m_pc->printf("wave 0x%4X\n\r", gesture_code);
pixus_mbed 0:726fdf0062c6 140 break;
pixus_mbed 0:726fdf0062c6 141 }
pixus_mbed 0:726fdf0062c6 142 readRegister(GestureRegAddrH); readRegister(GestureRegAddrL);
pixus_mbed 0:726fdf0062c6 143 }
pixus_mbed 0:726fdf0062c6 144 }
pixus_mbed 0:726fdf0062c6 145
pixus_mbed 0:726fdf0062c6 146
pixus_mbed 0:726fdf0062c6 147
pixus_mbed 0:726fdf0062c6 148 void Pixart_Gesture::writeRegister(uint8_t addr, uint8_t data)
pixus_mbed 0:726fdf0062c6 149 {
pixus_mbed 0:726fdf0062c6 150 char data_write[2];
pixus_mbed 0:726fdf0062c6 151
pixus_mbed 0:726fdf0062c6 152 data_write[0] = addr;
pixus_mbed 0:726fdf0062c6 153 data_write[1] = data;
pixus_mbed 0:726fdf0062c6 154 m_i2c->write(I2C_ADDR, data_write, 2, 0);
pixus_mbed 0:726fdf0062c6 155 }
pixus_mbed 0:726fdf0062c6 156 uint8_t Pixart_Gesture::readRegister(uint8_t addr)
pixus_mbed 0:726fdf0062c6 157 {
pixus_mbed 0:726fdf0062c6 158 char data_write[2];
pixus_mbed 0:726fdf0062c6 159 char data_read[2];
pixus_mbed 0:726fdf0062c6 160
pixus_mbed 0:726fdf0062c6 161 data_write[0] = addr;
pixus_mbed 0:726fdf0062c6 162 m_i2c->write(I2C_ADDR, data_write, 1, 0);
pixus_mbed 0:726fdf0062c6 163 m_i2c->read(I2C_ADDR, data_read, 1, 0);
pixus_mbed 0:726fdf0062c6 164 return data_read[0];
pixus_mbed 0:726fdf0062c6 165 }