Parallax Gesture Sensor
GestureSensor.cpp@0:817f868ca9c1, 2015-03-13 (annotated)
- Committer:
- frost1h
- Date:
- Fri Mar 13 20:53:11 2015 +0000
- Revision:
- 0:817f868ca9c1
Gesture Sensor
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frost1h | 0:817f868ca9c1 | 1 | |
frost1h | 0:817f868ca9c1 | 2 | #include "GestureSensor.h" |
frost1h | 0:817f868ca9c1 | 3 | |
frost1h | 0:817f868ca9c1 | 4 | GestureSensor::GestureSensor(PinName sda, PinName scl) |
frost1h | 0:817f868ca9c1 | 5 | { |
frost1h | 0:817f868ca9c1 | 6 | wait_ms(15); |
frost1h | 0:817f868ca9c1 | 7 | i2cp = new I2C(sda, scl); |
frost1h | 0:817f868ca9c1 | 8 | |
frost1h | 0:817f868ca9c1 | 9 | restart(); |
frost1h | 0:817f868ca9c1 | 10 | } |
frost1h | 0:817f868ca9c1 | 11 | |
frost1h | 0:817f868ca9c1 | 12 | void GestureSensor::restart() |
frost1h | 0:817f868ca9c1 | 13 | { |
frost1h | 0:817f868ca9c1 | 14 | command(RESET); |
frost1h | 0:817f868ca9c1 | 15 | wait_ms(15); |
frost1h | 0:817f868ca9c1 | 16 | |
frost1h | 0:817f868ca9c1 | 17 | // Setting up LED Power to full |
frost1h | 0:817f868ca9c1 | 18 | wreg(HW_KEY,HW_KEY_VAL0); |
frost1h | 0:817f868ca9c1 | 19 | wreg(PS_LED21,0xAA); |
frost1h | 0:817f868ca9c1 | 20 | wreg(PS_LED3,0x0A); |
frost1h | 0:817f868ca9c1 | 21 | wreg(PARAM_WR, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK); |
frost1h | 0:817f868ca9c1 | 22 | |
frost1h | 0:817f868ca9c1 | 23 | command(PARAM_SET + (CHLIST & 0x1F)); |
frost1h | 0:817f868ca9c1 | 24 | |
frost1h | 0:817f868ca9c1 | 25 | wreg(INT_CFG,0); |
frost1h | 0:817f868ca9c1 | 26 | wreg(IRQ_ENABLE,0); |
frost1h | 0:817f868ca9c1 | 27 | wreg(IRQ_MODE1,0); |
frost1h | 0:817f868ca9c1 | 28 | wreg(IRQ_MODE2,0); |
frost1h | 0:817f868ca9c1 | 29 | } |
frost1h | 0:817f868ca9c1 | 30 | |
frost1h | 0:817f868ca9c1 | 31 | void GestureSensor::command(char code) |
frost1h | 0:817f868ca9c1 | 32 | { |
frost1h | 0:817f868ca9c1 | 33 | int num; |
frost1h | 0:817f868ca9c1 | 34 | |
frost1h | 0:817f868ca9c1 | 35 | num = rreg(RESPONSE,1); |
frost1h | 0:817f868ca9c1 | 36 | while(num!=0) |
frost1h | 0:817f868ca9c1 | 37 | { |
frost1h | 0:817f868ca9c1 | 38 | wreg(COMMAND,NOP); |
frost1h | 0:817f868ca9c1 | 39 | num = rreg(RESPONSE,1); |
frost1h | 0:817f868ca9c1 | 40 | } |
frost1h | 0:817f868ca9c1 | 41 | do{ |
frost1h | 0:817f868ca9c1 | 42 | wreg(COMMAND,code); |
frost1h | 0:817f868ca9c1 | 43 | if(code==RESET) break; |
frost1h | 0:817f868ca9c1 | 44 | num = rreg(RESPONSE,1); |
frost1h | 0:817f868ca9c1 | 45 | }while(num==0); |
frost1h | 0:817f868ca9c1 | 46 | } |
frost1h | 0:817f868ca9c1 | 47 | |
frost1h | 0:817f868ca9c1 | 48 | //read a register |
frost1h | 0:817f868ca9c1 | 49 | char GestureSensor::rreg(char address, int data) |
frost1h | 0:817f868ca9c1 | 50 | { |
frost1h | 0:817f868ca9c1 | 51 | char array[1]; |
frost1h | 0:817f868ca9c1 | 52 | char array2[1]; |
frost1h | 0:817f868ca9c1 | 53 | |
frost1h | 0:817f868ca9c1 | 54 | array[0] = address; |
frost1h | 0:817f868ca9c1 | 55 | i2cp->write((IR_ADDRESS << 1) & 0xFE, array, data); |
frost1h | 0:817f868ca9c1 | 56 | wait_ms(1); |
frost1h | 0:817f868ca9c1 | 57 | |
frost1h | 0:817f868ca9c1 | 58 | i2cp->read((IR_ADDRESS << 1) | 0x01, array2, data); |
frost1h | 0:817f868ca9c1 | 59 | wait_ms(1); |
frost1h | 0:817f868ca9c1 | 60 | |
frost1h | 0:817f868ca9c1 | 61 | return array2[0]; |
frost1h | 0:817f868ca9c1 | 62 | } |
frost1h | 0:817f868ca9c1 | 63 | |
frost1h | 0:817f868ca9c1 | 64 | //write to register |
frost1h | 0:817f868ca9c1 | 65 | void GestureSensor::wreg(char address, char data) |
frost1h | 0:817f868ca9c1 | 66 | { |
frost1h | 0:817f868ca9c1 | 67 | char array[2]; |
frost1h | 0:817f868ca9c1 | 68 | |
frost1h | 0:817f868ca9c1 | 69 | array[0] = address; |
frost1h | 0:817f868ca9c1 | 70 | array[1] = data; |
frost1h | 0:817f868ca9c1 | 71 | i2cp->write((IR_ADDRESS << 1) & 0xFE, array, 2); |
frost1h | 0:817f868ca9c1 | 72 | wait_ms(1); |
frost1h | 0:817f868ca9c1 | 73 | } |
frost1h | 0:817f868ca9c1 | 74 | |
frost1h | 0:817f868ca9c1 | 75 | void GestureSensor::baseline(int time, int num) |
frost1h | 0:817f868ca9c1 | 76 | { |
frost1h | 0:817f868ca9c1 | 77 | wait(time); |
frost1h | 0:817f868ca9c1 | 78 | sampleleft = sample_left(num); |
frost1h | 0:817f868ca9c1 | 79 | sampletop = sample_top(num); |
frost1h | 0:817f868ca9c1 | 80 | sampleright = sample_right(num); |
frost1h | 0:817f868ca9c1 | 81 | } |
frost1h | 0:817f868ca9c1 | 82 | |
frost1h | 0:817f868ca9c1 | 83 | //Check Left LED Samples |
frost1h | 0:817f868ca9c1 | 84 | int GestureSensor::sample_left(int num) |
frost1h | 0:817f868ca9c1 | 85 | { |
frost1h | 0:817f868ca9c1 | 86 | int stack = 0; |
frost1h | 0:817f868ca9c1 | 87 | |
frost1h | 0:817f868ca9c1 | 88 | command(PSALS_FORCE); |
frost1h | 0:817f868ca9c1 | 89 | |
frost1h | 0:817f868ca9c1 | 90 | for(int n=num; n>0; n=n-1) |
frost1h | 0:817f868ca9c1 | 91 | { |
frost1h | 0:817f868ca9c1 | 92 | firstHalf = rreg(PS1_DATA0,1); |
frost1h | 0:817f868ca9c1 | 93 | secondHalf = rreg(PS1_DATA1,1); |
frost1h | 0:817f868ca9c1 | 94 | stack = stack + (secondHalf * 256) + firstHalf; |
frost1h | 0:817f868ca9c1 | 95 | } |
frost1h | 0:817f868ca9c1 | 96 | left = stack / num; |
frost1h | 0:817f868ca9c1 | 97 | |
frost1h | 0:817f868ca9c1 | 98 | if(left > sampleleft) |
frost1h | 0:817f868ca9c1 | 99 | left = left - sampleleft; |
frost1h | 0:817f868ca9c1 | 100 | else |
frost1h | 0:817f868ca9c1 | 101 | left = 0; |
frost1h | 0:817f868ca9c1 | 102 | |
frost1h | 0:817f868ca9c1 | 103 | return left; |
frost1h | 0:817f868ca9c1 | 104 | } |
frost1h | 0:817f868ca9c1 | 105 | |
frost1h | 0:817f868ca9c1 | 106 | //Check Top LED Samples |
frost1h | 0:817f868ca9c1 | 107 | int GestureSensor::sample_top(int num) |
frost1h | 0:817f868ca9c1 | 108 | { |
frost1h | 0:817f868ca9c1 | 109 | int stack = 0; |
frost1h | 0:817f868ca9c1 | 110 | |
frost1h | 0:817f868ca9c1 | 111 | command(PSALS_FORCE); |
frost1h | 0:817f868ca9c1 | 112 | |
frost1h | 0:817f868ca9c1 | 113 | for(int n=num; n>0; n=n-1) |
frost1h | 0:817f868ca9c1 | 114 | { |
frost1h | 0:817f868ca9c1 | 115 | firstHalf = rreg(PS2_DATA0,1); |
frost1h | 0:817f868ca9c1 | 116 | secondHalf = rreg(PS2_DATA1,1); |
frost1h | 0:817f868ca9c1 | 117 | stack = stack + (secondHalf * 256) + firstHalf; |
frost1h | 0:817f868ca9c1 | 118 | } |
frost1h | 0:817f868ca9c1 | 119 | top = stack / num; |
frost1h | 0:817f868ca9c1 | 120 | |
frost1h | 0:817f868ca9c1 | 121 | if(top > sampletop) |
frost1h | 0:817f868ca9c1 | 122 | top = top - sampletop; |
frost1h | 0:817f868ca9c1 | 123 | else |
frost1h | 0:817f868ca9c1 | 124 | top = 0; |
frost1h | 0:817f868ca9c1 | 125 | |
frost1h | 0:817f868ca9c1 | 126 | return top; |
frost1h | 0:817f868ca9c1 | 127 | } |
frost1h | 0:817f868ca9c1 | 128 | |
frost1h | 0:817f868ca9c1 | 129 | //Check Right LED samples |
frost1h | 0:817f868ca9c1 | 130 | int GestureSensor::sample_right(int num) |
frost1h | 0:817f868ca9c1 | 131 | { |
frost1h | 0:817f868ca9c1 | 132 | int stack = 0; |
frost1h | 0:817f868ca9c1 | 133 | |
frost1h | 0:817f868ca9c1 | 134 | command(PSALS_FORCE); |
frost1h | 0:817f868ca9c1 | 135 | |
frost1h | 0:817f868ca9c1 | 136 | for(int n=num; n>0; n=n-1) |
frost1h | 0:817f868ca9c1 | 137 | { |
frost1h | 0:817f868ca9c1 | 138 | firstHalf = rreg(PS3_DATA0,1); |
frost1h | 0:817f868ca9c1 | 139 | secondHalf = rreg(PS3_DATA1,1); |
frost1h | 0:817f868ca9c1 | 140 | stack = stack + (secondHalf * 256) + firstHalf; |
frost1h | 0:817f868ca9c1 | 141 | } |
frost1h | 0:817f868ca9c1 | 142 | right = stack / num; |
frost1h | 0:817f868ca9c1 | 143 | |
frost1h | 0:817f868ca9c1 | 144 | if(right > sampleright) |
frost1h | 0:817f868ca9c1 | 145 | right = right - sampleright; |
frost1h | 0:817f868ca9c1 | 146 | else |
frost1h | 0:817f868ca9c1 | 147 | right = 0; |
frost1h | 0:817f868ca9c1 | 148 | |
frost1h | 0:817f868ca9c1 | 149 | return right; |
frost1h | 0:817f868ca9c1 | 150 | } |