PixArt Gesture Library for nRF051
Fork of Pixart_Gesture by
Gesture.cpp@0:726fdf0062c6, 2016-09-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |