Parallax Gesture Sensor

Committer:
frost1h
Date:
Fri Mar 13 20:53:11 2015 +0000
Revision:
0:817f868ca9c1
Gesture Sensor

Who changed what in which revision?

UserRevisionLine numberNew 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 }