Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 | } |

PAJ7620 Integrated Gesture Recognition Optical CMOS Sensor