Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Fri Apr 14 21:52:46 2017 +0000
Revision:
26:f6aa46b550c3
Parent:
25:d7418ded06aa
demo ready;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daviwang 0:1c15cf9cc4f9 1 #include "mbed.h"
jennabarton 16:6b4a71e6f75a 2 #include <RawSerial.h>
jennabarton 21:a23f87a688b2 3 //#include <math.h>
daviwang 0:1c15cf9cc4f9 4
jennabarton 8:d27efcac2dd7 5 //******************************************************************
jennabarton 8:d27efcac2dd7 6 // All variables defined below
jennabarton 8:d27efcac2dd7 7 //******************************************************************
jennabarton 8:d27efcac2dd7 8
jennabarton 8:d27efcac2dd7 9 //communication
daviwang 0:1c15cf9cc4f9 10 DigitalOut myled(LED1);
jennabarton 16:6b4a71e6f75a 11 RawSerial pc(USBTX, USBRX);
jennabarton 16:6b4a71e6f75a 12 RawSerial keyOut(p13, p14);
daviwang 1:2e895e5272ab 13 I2C camera1(p9, p10);
daviwang 1:2e895e5272ab 14
jennabarton 16:6b4a71e6f75a 15
jennabarton 2:f501e506d62b 16 //initial camera data
daviwang 1:2e895e5272ab 17 int IRsensorAddress = 0xB0;
daviwang 1:2e895e5272ab 18 int slaveAddress;
daviwang 1:2e895e5272ab 19 char data_buf[16];
jennabarton 2:f501e506d62b 20 char s;
daviwang 1:2e895e5272ab 21 int i;
daviwang 1:2e895e5272ab 22
jennabarton 2:f501e506d62b 23 //point variables
jennabarton 26:f6aa46b550c3 24 short point1x = 0;
jennabarton 26:f6aa46b550c3 25 short point1y = 0;
jennabarton 26:f6aa46b550c3 26 short point2x = 0;
jennabarton 26:f6aa46b550c3 27 short point2y = 0;
jennabarton 26:f6aa46b550c3 28 short point3x = 0;
jennabarton 26:f6aa46b550c3 29 short point3y = 0;
jennabarton 26:f6aa46b550c3 30 short point4x = 0;
jennabarton 26:f6aa46b550c3 31 short point4y = 0;
jennabarton 2:f501e506d62b 32
daviwang 1:2e895e5272ab 33 //sensitivity
daviwang 1:2e895e5272ab 34 //Level 5: p0 = 0x96, p1 = 0xFE, p2 = 0xFE, p3 = 0x05
jennabarton 8:d27efcac2dd7 35 //highest sensitivity to more accurately detect points
daviwang 1:2e895e5272ab 36 int sen0 = 0x96;
daviwang 1:2e895e5272ab 37 int sen1 = 0xFE;
daviwang 1:2e895e5272ab 38 int sen2 = 0xFE;
daviwang 1:2e895e5272ab 39 int sen3 = 0x00;
daviwang 1:2e895e5272ab 40
jennabarton 12:e127fa20d609 41 //previous point values
jennabarton 26:f6aa46b550c3 42 short prevX = 1023;
jennabarton 26:f6aa46b550c3 43 short prevY = 1023;
jennabarton 12:e127fa20d609 44
jennabarton 8:d27efcac2dd7 45 //matrices of x and y coordinates from the first camera
jennabarton 26:f6aa46b550c3 46 short onex[4];
jennabarton 26:f6aa46b550c3 47 short oney[4];
daviwang 1:2e895e5272ab 48
jennabarton 12:e127fa20d609 49 //matrices of x and y coordinates from prev point
jennabarton 26:f6aa46b550c3 50 short prevx[4];
jennabarton 26:f6aa46b550c3 51 short prevy[4];
jennabarton 12:e127fa20d609 52
jennabarton 12:e127fa20d609 53 //movement
jennabarton 26:f6aa46b550c3 54 const short deadzone = 1;
jennabarton 26:f6aa46b550c3 55 const float mouseMoveMult = 1; //1 for accumulation, 3 for no accum
jennabarton 26:f6aa46b550c3 56 const float mouseMovePwr = 1.2; //was 1.2
jennabarton 26:f6aa46b550c3 57 const short MOVEMENT_CAP = 10; //working on the computer with 20
jennabarton 26:f6aa46b550c3 58 const short VALUES_TO_TOSS = 6;
jennabarton 26:f6aa46b550c3 59 short tossedValuesCounter = VALUES_TO_TOSS;
jennabarton 12:e127fa20d609 60
jennabarton 22:99ff69f7111a 61 //click state
jennabarton 26:f6aa46b550c3 62 const short CLICK_DEAD_ZONE = 50;
jennabarton 26:f6aa46b550c3 63 short clickBaseX;
jennabarton 26:f6aa46b550c3 64 short clickBaseY;
jennabarton 26:f6aa46b550c3 65 short clickDurCount = 0;
jennabarton 22:99ff69f7111a 66 bool readingClick = false;
jennabarton 26:f6aa46b550c3 67 short minLeftClickDur = 10;
jennabarton 26:f6aa46b550c3 68 short maxLeftClickDur = 50;
jennabarton 13:4f2181174071 69
jennabarton 20:550a57fb9344 70
jennabarton 20:550a57fb9344 71
jennabarton 14:568d4dac4fb6 72 //MOUSE STATE
jennabarton 14:568d4dac4fb6 73 //implemented for ticker behavior
jennabarton 14:568d4dac4fb6 74 //ticker depends on these values to update the state/location of the mouse
jennabarton 14:568d4dac4fb6 75 Ticker mouseStateTicker;
jennabarton 16:6b4a71e6f75a 76 short updatex[4];
jennabarton 16:6b4a71e6f75a 77 short updatey[4];
jennabarton 14:568d4dac4fb6 78 bool toLeftClick = false;
jennabarton 14:568d4dac4fb6 79 bool toRightClick = false;
jennabarton 14:568d4dac4fb6 80
jennabarton 21:a23f87a688b2 81
jennabarton 21:a23f87a688b2 82
jennabarton 21:a23f87a688b2 83 //READING FROM CAMERA VIA INTERRUPT
jennabarton 21:a23f87a688b2 84 Ticker cameraReadTicker;
jennabarton 21:a23f87a688b2 85
jennabarton 21:a23f87a688b2 86
jennabarton 16:6b4a71e6f75a 87 //LED
jennabarton 16:6b4a71e6f75a 88 DigitalOut myled2(LED2);
jennabarton 14:568d4dac4fb6 89
jennabarton 14:568d4dac4fb6 90
jennabarton 13:4f2181174071 91
jennabarton 8:d27efcac2dd7 92 //******************************************************************
jennabarton 8:d27efcac2dd7 93 // All methods defined below
jennabarton 8:d27efcac2dd7 94 //******************************************************************
daviwang 1:2e895e5272ab 95
jennabarton 12:e127fa20d609 96 //takes in values for the movement in the x and y direction
jennabarton 12:e127fa20d609 97 //also can indicate whether you want to "click"
jennabarton 12:e127fa20d609 98 //NOTE: hard coded wait of 0.1
jennabarton 16:6b4a71e6f75a 99 void mouseCommand(char buttons, short x, short y) {
jennabarton 21:a23f87a688b2 100
jennabarton 26:f6aa46b550c3 101
jennabarton 26:f6aa46b550c3 102 //x = rint((x > 0) ? powf(mouseMoveMult*( (float) x) , mouseMovePwr) : -powf(-mouseMoveMult*( (float) x) , mouseMovePwr));
jennabarton 26:f6aa46b550c3 103 // y = rint((y > 0) ? powf(mouseMoveMult*( (float) y) , mouseMovePwr) : -powf(-mouseMoveMult*( (float) y) , mouseMovePwr));
jennabarton 26:f6aa46b550c3 104
jennabarton 26:f6aa46b550c3 105 x = mouseMoveMult * ((x > 0) ? powf(( (float) x) , mouseMovePwr) : -powf(-( (float) x) , mouseMovePwr));
jennabarton 26:f6aa46b550c3 106 y = mouseMoveMult * ((y > 0) ? powf(( (float) y) , mouseMovePwr) : -powf(-( (float) y) , mouseMovePwr));
jennabarton 26:f6aa46b550c3 107
jennabarton 26:f6aa46b550c3 108 if(x>255){
jennabarton 26:f6aa46b550c3 109 x = 255;
jennabarton 26:f6aa46b550c3 110 } else if(x<-255){
jennabarton 26:f6aa46b550c3 111 x = -255;
jennabarton 26:f6aa46b550c3 112 }
jennabarton 26:f6aa46b550c3 113
jennabarton 26:f6aa46b550c3 114 if(y>255){
jennabarton 26:f6aa46b550c3 115 y = 255;
jennabarton 26:f6aa46b550c3 116 } else if (x<-255){
jennabarton 26:f6aa46b550c3 117 y = -255;
jennabarton 26:f6aa46b550c3 118 }
jennabarton 26:f6aa46b550c3 119
jennabarton 26:f6aa46b550c3 120 // pc.printf("%hd ", x);
jennabarton 26:f6aa46b550c3 121 // pc.printf("%hd\n", y);
jennabarton 26:f6aa46b550c3 122
jennabarton 26:f6aa46b550c3 123 // x = (x > 0) ? powf(( (float) x) , mouseMovePwr) : -powf(-( (float) x) , mouseMovePwr);
jennabarton 26:f6aa46b550c3 124 // y = (y > 0) ? powf(( (float) y) , mouseMovePwr) : -powf(-( (float) y) , mouseMovePwr);
jennabarton 26:f6aa46b550c3 125
jennabarton 26:f6aa46b550c3 126
jennabarton 26:f6aa46b550c3 127 //x = mouseMoveMult*x;
jennabarton 26:f6aa46b550c3 128 //y = mouseMoveMult*y;
jennabarton 26:f6aa46b550c3 129
jennabarton 26:f6aa46b550c3 130
jennabarton 21:a23f87a688b2 131 //x = x*abs(x);
jennabarton 26:f6aa46b550c3 132 //y = y*abs(y);
jennabarton 26:f6aa46b550c3 133
jennabarton 19:0dd0fe82c3e7 134 //x = x*sqrt((float)abs(x));
jennabarton 19:0dd0fe82c3e7 135 //y = y*sqrt((float)abs(y));
jennabarton 16:6b4a71e6f75a 136
jennabarton 10:d67a15ba5748 137 keyOut.putc(0xFD);
jennabarton 10:d67a15ba5748 138 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 139 keyOut.putc(0x03);
jennabarton 10:d67a15ba5748 140 keyOut.putc(buttons);
jennabarton 10:d67a15ba5748 141 keyOut.putc(x);
jennabarton 10:d67a15ba5748 142 keyOut.putc(y);
jennabarton 10:d67a15ba5748 143 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 144 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 145 keyOut.putc(0x00);
jennabarton 10:d67a15ba5748 146
jennabarton 10:d67a15ba5748 147 //delay for pushing data
jennabarton 15:54cee979f202 148 //wait(0.1); //how large does this need to be?
jennabarton 10:d67a15ba5748 149 }
jennabarton 10:d67a15ba5748 150
jennabarton 4:1f443e7a0122 151
jennabarton 14:568d4dac4fb6 152
jennabarton 16:6b4a71e6f75a 153
jennabarton 14:568d4dac4fb6 154 //the interrupt to update mouse state
jennabarton 14:568d4dac4fb6 155 //run every 100 us
jennabarton 14:568d4dac4fb6 156 void updateMouseState(){
jennabarton 14:568d4dac4fb6 157
jennabarton 16:6b4a71e6f75a 158 myled2 = 1 - myled2;
jennabarton 16:6b4a71e6f75a 159
jennabarton 16:6b4a71e6f75a 160
jennabarton 14:568d4dac4fb6 161 //move mouse
jennabarton 14:568d4dac4fb6 162 //handles only single finger actions
jennabarton 16:6b4a71e6f75a 163 mouseCommand(0, updatex[0], updatey[0]);
jennabarton 14:568d4dac4fb6 164
jennabarton 14:568d4dac4fb6 165 //clear out changes
jennabarton 14:568d4dac4fb6 166 updatex[0] = 0;
jennabarton 14:568d4dac4fb6 167 updatey[0] = 0;
jennabarton 14:568d4dac4fb6 168
jennabarton 14:568d4dac4fb6 169 //click
jennabarton 22:99ff69f7111a 170 if(toLeftClick){
jennabarton 22:99ff69f7111a 171 //send command to
jennabarton 25:d7418ded06aa 172 //mouseCommand(0, clickBaseX - onex[0] , clickBaseY - oney[0]);
jennabarton 25:d7418ded06aa 173 mouseCommand(0x01, 0, 0);
jennabarton 22:99ff69f7111a 174
jennabarton 25:d7418ded06aa 175 }
jennabarton 25:d7418ded06aa 176 //TODO: right click
jennabarton 25:d7418ded06aa 177 //else if (toRightClick){
jennabarton 25:d7418ded06aa 178 // mouseCommand(0x02, 0 , 0);
jennabarton 25:d7418ded06aa 179 // }
jennabarton 14:568d4dac4fb6 180
jennabarton 14:568d4dac4fb6 181 //fip clicking to false
jennabarton 14:568d4dac4fb6 182 toLeftClick = false;
jennabarton 14:568d4dac4fb6 183 toRightClick = false;
jennabarton 14:568d4dac4fb6 184
jennabarton 14:568d4dac4fb6 185 }
jennabarton 14:568d4dac4fb6 186
jennabarton 14:568d4dac4fb6 187
jennabarton 12:e127fa20d609 188 //moves mouse on screen from one finger input
jennabarton 12:e127fa20d609 189 //param
jennabarton 12:e127fa20d609 190 // current point (currx, curry)
jennabarton 12:e127fa20d609 191 // previous point (prevx, prevy)
jennabarton 14:568d4dac4fb6 192 //TODO: implement additional param to indicate which finger you are looking at
jennabarton 14:568d4dac4fb6 193 // current implementation defaults to zero (finger one)
jennabarton 26:f6aa46b550c3 194 void oneFingerResponse(short currx, short curry, short prevx, short prevy){
jennabarton 12:e127fa20d609 195 //look at delta btwn prev val and current
jennabarton 12:e127fa20d609 196 //TODO: moving average
jennabarton 12:e127fa20d609 197 if((prevx != 1023 || prevy != 1023) && (currx != 1023 && curry != 1023)){
jennabarton 17:08d6d9badb3f 198 short diffX = currx - prevx;
jennabarton 17:08d6d9badb3f 199 short diffY = -1*(curry - prevy);
jennabarton 12:e127fa20d609 200
jennabarton 12:e127fa20d609 201 //fix diffX
jennabarton 26:f6aa46b550c3 202 if(diffX < -MOVEMENT_CAP) {
jennabarton 26:f6aa46b550c3 203 diffX = -MOVEMENT_CAP;
jennabarton 26:f6aa46b550c3 204 } else if(diffX > MOVEMENT_CAP){
jennabarton 26:f6aa46b550c3 205 diffX = MOVEMENT_CAP;
daviwang 23:db56e04d555b 206 } else if(diffX > deadzone){
jennabarton 12:e127fa20d609 207 diffX -= deadzone;
jennabarton 12:e127fa20d609 208 } else if (diffX < -1*deadzone){
jennabarton 12:e127fa20d609 209 diffX += deadzone;
jennabarton 12:e127fa20d609 210 } else{
jennabarton 12:e127fa20d609 211 diffX = 0;
jennabarton 12:e127fa20d609 212 }
jennabarton 26:f6aa46b550c3 213
jennabarton 26:f6aa46b550c3 214
jennabarton 26:f6aa46b550c3 215
jennabarton 26:f6aa46b550c3 216
jennabarton 12:e127fa20d609 217 //fix diffY
jennabarton 26:f6aa46b550c3 218 if(diffY < -MOVEMENT_CAP) {
jennabarton 26:f6aa46b550c3 219 diffY = -MOVEMENT_CAP;
jennabarton 26:f6aa46b550c3 220 } else if (diffY > MOVEMENT_CAP){
jennabarton 26:f6aa46b550c3 221 diffY = MOVEMENT_CAP;
daviwang 23:db56e04d555b 222 } else if(diffY > deadzone){
jennabarton 12:e127fa20d609 223 diffY -= deadzone;
jennabarton 17:08d6d9badb3f 224 } else if (diffY < -1*deadzone){
jennabarton 12:e127fa20d609 225 diffY += deadzone;
jennabarton 12:e127fa20d609 226 } else{
jennabarton 12:e127fa20d609 227 diffY = 0;
jennabarton 26:f6aa46b550c3 228 }
jennabarton 26:f6aa46b550c3 229
jennabarton 26:f6aa46b550c3 230
jennabarton 26:f6aa46b550c3 231
jennabarton 26:f6aa46b550c3 232
jennabarton 26:f6aa46b550c3 233
jennabarton 26:f6aa46b550c3 234
jennabarton 26:f6aa46b550c3 235 ////fix diffX
jennabarton 26:f6aa46b550c3 236 // if(abs(diffX) > MOVEMENT_CAP) {
jennabarton 26:f6aa46b550c3 237 // diffX = 0;
jennabarton 26:f6aa46b550c3 238 // } else if(diffX > deadzone){
jennabarton 26:f6aa46b550c3 239 // diffX -= deadzone;
jennabarton 26:f6aa46b550c3 240 // } else if (diffX < -1*deadzone){
jennabarton 26:f6aa46b550c3 241 // diffX += deadzone;
jennabarton 26:f6aa46b550c3 242 // } else{
jennabarton 26:f6aa46b550c3 243 // diffX = 0;
jennabarton 26:f6aa46b550c3 244 // }
jennabarton 26:f6aa46b550c3 245 // //fix diffY
jennabarton 26:f6aa46b550c3 246 // if(abs(diffY) > MOVEMENT_CAP) {
jennabarton 26:f6aa46b550c3 247 // diffY = 0;
jennabarton 26:f6aa46b550c3 248 // } else if(diffY > deadzone){
jennabarton 26:f6aa46b550c3 249 // diffY -= deadzone;
jennabarton 26:f6aa46b550c3 250 // } else if (diffY < -1*deadzone){
jennabarton 26:f6aa46b550c3 251 // diffY += deadzone;
jennabarton 26:f6aa46b550c3 252 // } else{
jennabarton 26:f6aa46b550c3 253 // diffY = 0;
jennabarton 26:f6aa46b550c3 254 // }
jennabarton 12:e127fa20d609 255
jennabarton 14:568d4dac4fb6 256
jennabarton 14:568d4dac4fb6 257 //mouseCommand(0, (char) diffX, (char) diffY);
jennabarton 14:568d4dac4fb6 258 //TODO: this is defaulting to first finger - need to fix this
jennabarton 14:568d4dac4fb6 259 //update target position to move x and y
jennabarton 24:d4b944e1e6cd 260 //accumulates the diff until
jennabarton 26:f6aa46b550c3 261 //updatex[0] = updatex[0] + diffX;
jennabarton 26:f6aa46b550c3 262 // updatey[0] = updatey[0] + diffY;
jennabarton 26:f6aa46b550c3 263 updatex[0] += diffX;
jennabarton 26:f6aa46b550c3 264 updatey[0] += diffY;
jennabarton 17:08d6d9badb3f 265
jennabarton 16:6b4a71e6f75a 266 // pc.printf("updating x to : %d", diffX);
jennabarton 16:6b4a71e6f75a 267 // pc.printf("\t updating y to : %d \n", diffY);
jennabarton 16:6b4a71e6f75a 268
jennabarton 16:6b4a71e6f75a 269 // pc.printf("updating x to : %d", updatex[0]);
jennabarton 16:6b4a71e6f75a 270 // pc.printf("\t updating y to : %d \n", updatex[0]);
jennabarton 16:6b4a71e6f75a 271
jennabarton 20:550a57fb9344 272 }
jennabarton 12:e127fa20d609 273 }
jennabarton 12:e127fa20d609 274
jennabarton 12:e127fa20d609 275
jennabarton 12:e127fa20d609 276 //writes two bytes to the camera
jennabarton 12:e127fa20d609 277 void write2bytes(char data1, char data2){
jennabarton 12:e127fa20d609 278 char out[2];
jennabarton 12:e127fa20d609 279 out[0] = data1;
jennabarton 12:e127fa20d609 280 out[1] = data2;
jennabarton 12:e127fa20d609 281 camera1.write(slaveAddress, out, 2);
jennabarton 12:e127fa20d609 282 wait(0.01);
jennabarton 12:e127fa20d609 283 }
jennabarton 12:e127fa20d609 284
jennabarton 12:e127fa20d609 285
jennabarton 12:e127fa20d609 286
jennabarton 8:d27efcac2dd7 287 // Initialize WiiMote Camera
daviwang 1:2e895e5272ab 288 void initCamera(void){
daviwang 1:2e895e5272ab 289 write2bytes(0x30, 0x01);
daviwang 1:2e895e5272ab 290 write2bytes(0x00, 0x02);
daviwang 1:2e895e5272ab 291 write2bytes(0x00, 0x00);
daviwang 1:2e895e5272ab 292 write2bytes(0x71, 0x01);
daviwang 1:2e895e5272ab 293 write2bytes(0x07, 0x00);
daviwang 1:2e895e5272ab 294 write2bytes(sen1, 0x1A);
daviwang 1:2e895e5272ab 295 write2bytes(sen2, sen3);
daviwang 1:2e895e5272ab 296 write2bytes(0x33, 0x03);
daviwang 1:2e895e5272ab 297 write2bytes(0x30, 0x08);
jennabarton 3:7b0c215eb6a7 298 //wait(0.1);
daviwang 1:2e895e5272ab 299
daviwang 1:2e895e5272ab 300 }
daviwang 0:1c15cf9cc4f9 301
jennabarton 12:e127fa20d609 302
jennabarton 12:e127fa20d609 303 //update counts for click
jennabarton 26:f6aa46b550c3 304 void updateClickState(short currx, short curry, short prevx, short prevy){
jennabarton 12:e127fa20d609 305 bool xStable = false;
jennabarton 12:e127fa20d609 306 bool yStable = false;
jennabarton 20:550a57fb9344 307
jennabarton 22:99ff69f7111a 308
jennabarton 22:99ff69f7111a 309 if(currx != 1023 && curry != 1023 && readingClick){
jennabarton 22:99ff69f7111a 310 //finger is on surface and you are reading click
jennabarton 22:99ff69f7111a 311
jennabarton 22:99ff69f7111a 312 //test stability
jennabarton 12:e127fa20d609 313
jennabarton 22:99ff69f7111a 314 //check x stability
jennabarton 22:99ff69f7111a 315 if (currx == clickBaseX){
jennabarton 22:99ff69f7111a 316 //no movement in x direction
jennabarton 22:99ff69f7111a 317 xStable = true;
jennabarton 22:99ff69f7111a 318 } else if( abs(currx - clickBaseX) < CLICK_DEAD_ZONE){
jennabarton 22:99ff69f7111a 319 //barely moved in x direction
jennabarton 12:e127fa20d609 320 xStable = true;
jennabarton 12:e127fa20d609 321 }
jennabarton 22:99ff69f7111a 322
jennabarton 22:99ff69f7111a 323 //check y stability
jennabarton 22:99ff69f7111a 324 if( curry == clickBaseY){
jennabarton 22:99ff69f7111a 325 //no movement in y direction
jennabarton 22:99ff69f7111a 326 yStable = true;
jennabarton 22:99ff69f7111a 327 } else if ( abs(curry - clickBaseY) < CLICK_DEAD_ZONE){
jennabarton 22:99ff69f7111a 328 //barely moved in y direction
jennabarton 12:e127fa20d609 329 yStable = true;
jennabarton 12:e127fa20d609 330 }
jennabarton 22:99ff69f7111a 331
jennabarton 22:99ff69f7111a 332 //if stable, increment count
jennabarton 12:e127fa20d609 333 if(xStable && yStable){
jennabarton 22:99ff69f7111a 334 clickDurCount = clickDurCount + 1;
jennabarton 12:e127fa20d609 335 } else{
jennabarton 22:99ff69f7111a 336 //if not stable, no longer reading click, counter to zero
jennabarton 22:99ff69f7111a 337 readingClick = false;
jennabarton 22:99ff69f7111a 338 clickDurCount = 0;
jennabarton 12:e127fa20d609 339 }
jennabarton 22:99ff69f7111a 340
jennabarton 12:e127fa20d609 341
jennabarton 25:d7418ded06aa 342 } // rising edge
jennabarton 25:d7418ded06aa 343 else if (currx != 1023 && curry != 1023 && prevx == 1023 && prevy == 1023 ){
jennabarton 22:99ff69f7111a 344 //finger has been placed on surface
jennabarton 25:d7418ded06aa 345
jennabarton 25:d7418ded06aa 346 //tossedValuesCounter = VALUES_TO_TOSS;
jennabarton 22:99ff69f7111a 347
jennabarton 22:99ff69f7111a 348 //set reading click to true
jennabarton 22:99ff69f7111a 349 readingClick = true;
jennabarton 25:d7418ded06aa 350
jennabarton 25:d7418ded06aa 351
jennabarton 22:99ff69f7111a 352
jennabarton 22:99ff69f7111a 353 //save initial location
jennabarton 22:99ff69f7111a 354 clickBaseX = currx;
jennabarton 22:99ff69f7111a 355 clickBaseY = curry;
jennabarton 22:99ff69f7111a 356
jennabarton 25:d7418ded06aa 357 //} else if (currx == 1023 && curry == 1023 && readingClick){
jennabarton 25:d7418ded06aa 358 } else if (currx == 1023 && curry == 1023 && prevx == 1023 && prevy == 1023 && readingClick){
jennabarton 22:99ff69f7111a 359 //stable click and finger was removed
jennabarton 22:99ff69f7111a 360
jennabarton 22:99ff69f7111a 361 //if within bounds, you want to click
jennabarton 22:99ff69f7111a 362 if(clickDurCount > minLeftClickDur && clickDurCount < maxLeftClickDur){
jennabarton 22:99ff69f7111a 363 //set state to indicate left click
jennabarton 20:550a57fb9344 364 toLeftClick = true;
jennabarton 25:d7418ded06aa 365 // pc.printf("********LEFT mouse click \n");
jennabarton 25:d7418ded06aa 366
jennabarton 25:d7418ded06aa 367
jennabarton 25:d7418ded06aa 368 //toss out accumulations of diffs
jennabarton 25:d7418ded06aa 369 updatex[0] = 0;
jennabarton 25:d7418ded06aa 370 updatey[0] = 0;
jennabarton 25:d7418ded06aa 371
jennabarton 22:99ff69f7111a 372 }
jennabarton 22:99ff69f7111a 373
jennabarton 22:99ff69f7111a 374
jennabarton 22:99ff69f7111a 375 //no longer reading click
jennabarton 22:99ff69f7111a 376 readingClick = false;
jennabarton 22:99ff69f7111a 377 //reset counter
jennabarton 22:99ff69f7111a 378 clickDurCount = 0;
jennabarton 22:99ff69f7111a 379 }
jennabarton 20:550a57fb9344 380
jennabarton 12:e127fa20d609 381 }
jennabarton 12:e127fa20d609 382
jennabarton 12:e127fa20d609 383
jennabarton 8:d27efcac2dd7 384 //get data from camera one
jennabarton 8:d27efcac2dd7 385 //populates onex and oney with values depending on the measured points
jennabarton 8:d27efcac2dd7 386 //NOTE: 1023 means nothing was detected
jennabarton 2:f501e506d62b 387 void readCameraData(void){
jennabarton 24:d4b944e1e6cd 388 //update previous values
jennabarton 24:d4b944e1e6cd 389 //only updates for finger 1
jennabarton 24:d4b944e1e6cd 390 prevX = onex[0];
jennabarton 24:d4b944e1e6cd 391 prevY = oney[0];
jennabarton 15:54cee979f202 392
jennabarton 2:f501e506d62b 393 //request data from camera
jennabarton 2:f501e506d62b 394 char out[1];
jennabarton 2:f501e506d62b 395 out[0] = 0x36;
jennabarton 2:f501e506d62b 396 camera1.write(slaveAddress, out, 1);
jennabarton 2:f501e506d62b 397 //wait(0.2); //do we need this?
jennabarton 2:f501e506d62b 398
jennabarton 2:f501e506d62b 399 //get data from camera
jennabarton 2:f501e506d62b 400 camera1.read(slaveAddress, data_buf, 16);
jennabarton 8:d27efcac2dd7 401
jennabarton 2:f501e506d62b 402 //POINT 1
jennabarton 2:f501e506d62b 403 //get data
jennabarton 2:f501e506d62b 404 point1x = data_buf[1];
jennabarton 2:f501e506d62b 405 point1y = data_buf[2];
jennabarton 2:f501e506d62b 406 s = data_buf[3];
jennabarton 3:7b0c215eb6a7 407 //load x,y
jennabarton 3:7b0c215eb6a7 408 onex[0] = point1x + ((s & 0x30) << 4);
jennabarton 3:7b0c215eb6a7 409 oney[0] = point1y + ((s & 0xC0) << 2);
jennabarton 2:f501e506d62b 410
jennabarton 8:d27efcac2dd7 411
jennabarton 11:cd450ce343a8 412 //>>>>>>>>>>>>>>>>>Begin unfinished code for moving
jennabarton 11:cd450ce343a8 413
jennabarton 25:d7418ded06aa 414 //if(tossedValuesCounter > 0){
jennabarton 25:d7418ded06aa 415 // tossedValuesCounter -= 1;
jennabarton 25:d7418ded06aa 416 // }else{
jennabarton 25:d7418ded06aa 417 // oneFingerResponse(onex[0], oney[0], prevX, prevY);
jennabarton 25:d7418ded06aa 418 // }
jennabarton 25:d7418ded06aa 419 if(!readingClick){
jennabarton 25:d7418ded06aa 420 oneFingerResponse(onex[0], oney[0], prevX, prevY);
jennabarton 25:d7418ded06aa 421 }
jennabarton 25:d7418ded06aa 422
jennabarton 25:d7418ded06aa 423
jennabarton 12:e127fa20d609 424 updateClickState(onex[0], oney[0], prevX, prevY);
jennabarton 11:cd450ce343a8 425
jennabarton 7:6b27977d1800 426
jennabarton 24:d4b944e1e6cd 427 // //update prev values
jennabarton 24:d4b944e1e6cd 428 // prevX = onex[0];
jennabarton 24:d4b944e1e6cd 429 // prevY = oney[0];
jennabarton 7:6b27977d1800 430
jennabarton 7:6b27977d1800 431
jennabarton 8:d27efcac2dd7 432 //<<<<<<<<<<<<<<<<End unfinished code for moving averages
jennabarton 8:d27efcac2dd7 433
jennabarton 20:550a57fb9344 434 //>>>>>>>>>>>>>>>>Begin unused parsing for multiple fingers
jennabarton 20:550a57fb9344 435 // //POINT 2
jennabarton 20:550a57fb9344 436 // //get data
jennabarton 20:550a57fb9344 437 // point2x = data_buf[4];
jennabarton 20:550a57fb9344 438 // point2y = data_buf[5];
jennabarton 20:550a57fb9344 439 // s = data_buf[6];
jennabarton 20:550a57fb9344 440 // //load x,y
jennabarton 20:550a57fb9344 441 // onex[1] = point2x + ((s & 0x30) << 4);
jennabarton 20:550a57fb9344 442 // oney[1] = point2y + ((s & 0xC0) << 2);
jennabarton 20:550a57fb9344 443 //
jennabarton 20:550a57fb9344 444 // //POINT 3
jennabarton 20:550a57fb9344 445 // //get data
jennabarton 20:550a57fb9344 446 // point3x = data_buf[7];
jennabarton 20:550a57fb9344 447 // point3y = data_buf[8];
jennabarton 20:550a57fb9344 448 // s = data_buf[9];
jennabarton 20:550a57fb9344 449 // //load x,y
jennabarton 20:550a57fb9344 450 // onex[2] = point3x + ((s & 0x30) << 4);
jennabarton 20:550a57fb9344 451 // oney[2] = point3y + ((s & 0xC0) << 2);
jennabarton 20:550a57fb9344 452 //
jennabarton 20:550a57fb9344 453 // //POINT 4
jennabarton 20:550a57fb9344 454 // //get data
jennabarton 20:550a57fb9344 455 // point4x = data_buf[10];
jennabarton 20:550a57fb9344 456 // point4y = data_buf[11];
jennabarton 20:550a57fb9344 457 // s = data_buf[12];
jennabarton 20:550a57fb9344 458 // //load x,y
jennabarton 20:550a57fb9344 459 // onex[3] = point4x + ((s & 0x30) << 4);
jennabarton 20:550a57fb9344 460 // oney[3] = point4y + ((s & 0xC0) << 2);
jennabarton 20:550a57fb9344 461 //<<<<<<<<<<<<<<<<<<<<<<End unused parsing for multiple fingers
jennabarton 2:f501e506d62b 462
jennabarton 2:f501e506d62b 463 }
jennabarton 2:f501e506d62b 464
jennabarton 8:d27efcac2dd7 465 //print to serial monitor the coordinates of the points stored in
jennabarton 8:d27efcac2dd7 466 //the passed x and y arrays
jennabarton 26:f6aa46b550c3 467 void printCamData(short xcor[4], short ycor[4]){
jennabarton 2:f501e506d62b 468 for(int i = 0; i<4; i++){
jennabarton 26:f6aa46b550c3 469 short x = xcor[i];
jennabarton 26:f6aa46b550c3 470 short y = ycor[i];
jennabarton 2:f501e506d62b 471 //determine what to print
jennabarton 2:f501e506d62b 472 //x coordinate
jennabarton 3:7b0c215eb6a7 473 pc.printf(" %d,", x);
jennabarton 2:f501e506d62b 474
jennabarton 2:f501e506d62b 475 //y coordinate
jennabarton 8:d27efcac2dd7 476 pc.printf(" %d\t", y);
jennabarton 2:f501e506d62b 477 }
jennabarton 2:f501e506d62b 478
jennabarton 2:f501e506d62b 479 //new line and delay
jennabarton 2:f501e506d62b 480 pc.printf("\n");
jennabarton 3:7b0c215eb6a7 481 //wait(0.01);
jennabarton 2:f501e506d62b 482 }
jennabarton 2:f501e506d62b 483
jennabarton 4:1f443e7a0122 484
jennabarton 4:1f443e7a0122 485
jennabarton 4:1f443e7a0122 486
jennabarton 8:d27efcac2dd7 487 //entrance to the code
daviwang 0:1c15cf9cc4f9 488 int main() {
jennabarton 15:54cee979f202 489
jennabarton 21:a23f87a688b2 490 //i2c increase
jennabarton 21:a23f87a688b2 491 camera1.frequency(400000);
jennabarton 21:a23f87a688b2 492
jennabarton 15:54cee979f202 493 //set values initially to zero
jennabarton 26:f6aa46b550c3 494 for(int i = 0; i < 4; i++){
jennabarton 26:f6aa46b550c3 495 updatex[i] = 0;
jennabarton 26:f6aa46b550c3 496 updatey[i] = 0;
jennabarton 26:f6aa46b550c3 497 }
jennabarton 15:54cee979f202 498
daviwang 1:2e895e5272ab 499 myled = 0;
jennabarton 16:6b4a71e6f75a 500 myled2 = 0;
jennabarton 16:6b4a71e6f75a 501
jennabarton 3:7b0c215eb6a7 502 //slaveAddress = IRsensorAddress >> 1;
jennabarton 3:7b0c215eb6a7 503 slaveAddress = IRsensorAddress;
daviwang 1:2e895e5272ab 504 initCamera();
daviwang 1:2e895e5272ab 505
jennabarton 3:7b0c215eb6a7 506 //update baud rate
jennabarton 3:7b0c215eb6a7 507 pc.baud(115200);
jennabarton 3:7b0c215eb6a7 508
jennabarton 14:568d4dac4fb6 509 //attach ticker for interrupt
jennabarton 16:6b4a71e6f75a 510 //mouseStateTicker.attach_us(&updateMouseState, 100);
jennabarton 21:a23f87a688b2 511 mouseStateTicker.attach(&updateMouseState, 0.05);
jennabarton 21:a23f87a688b2 512
jennabarton 21:a23f87a688b2 513 //attach ticker for reading camera interrupt
jennabarton 21:a23f87a688b2 514 cameraReadTicker.attach(&readCameraData, 0.01);
jennabarton 16:6b4a71e6f75a 515
jennabarton 14:568d4dac4fb6 516
jennabarton 8:d27efcac2dd7 517 //loop to search for new info using the camera
daviwang 0:1c15cf9cc4f9 518 while(1) {
jennabarton 15:54cee979f202 519
jennabarton 16:6b4a71e6f75a 520 //pc.printf("while\n");
jennabarton 8:d27efcac2dd7 521
jennabarton 8:d27efcac2dd7 522 //toggle test LED
jennabarton 2:f501e506d62b 523 myled = 1 - myled;
jennabarton 2:f501e506d62b 524
jennabarton 16:6b4a71e6f75a 525 //pc.printf("while2\n");
jennabarton 15:54cee979f202 526
jennabarton 21:a23f87a688b2 527 //DEPRECATED: now interrupt
jennabarton 2:f501e506d62b 528 //get the camera data
jennabarton 21:a23f87a688b2 529 //readCameraData();
daviwang 1:2e895e5272ab 530
jennabarton 20:550a57fb9344 531 //printing clicking state -- FOR DEBUGGING
jennabarton 20:550a57fb9344 532 // pc.printf("readyForClick %s", readyForClick ? "true" : "false");
jennabarton 20:550a57fb9344 533 // pc.printf("\treadingClick %s", readingClick ? "true" : "false");
jennabarton 20:550a57fb9344 534 // pc.printf("\treadyForClickRelease %s\n", readyForClickRelease ? "true" : "false");
jennabarton 20:550a57fb9344 535
jennabarton 20:550a57fb9344 536
jennabarton 20:550a57fb9344 537
jennabarton 20:550a57fb9344 538
jennabarton 14:568d4dac4fb6 539 //printing mouse state -- FOR DEBUGGING
jennabarton 15:54cee979f202 540 // pc.printf("update mouse %d, %d", updatex[0], updatey[0]);
jennabarton 15:54cee979f202 541 // pc.printf("\tclick left %s", toLeftClick ? "true" : "false");
jennabarton 15:54cee979f202 542 // pc.printf("\tclick right %s\n", toRightClick ? "true" : "false");
jennabarton 14:568d4dac4fb6 543
jennabarton 2:f501e506d62b 544 //print points
jennabarton 26:f6aa46b550c3 545 //printCamData(onex, oney);
daviwang 1:2e895e5272ab 546
jennabarton 21:a23f87a688b2 547
jennabarton 21:a23f87a688b2 548
jennabarton 21:a23f87a688b2 549
jennabarton 21:a23f87a688b2 550
jennabarton 21:a23f87a688b2 551
jennabarton 8:d27efcac2dd7 552 //uncomment below to test infinite print
jennabarton 24:d4b944e1e6cd 553 // keyOut.putc(0x41);
jennabarton 4:1f443e7a0122 554
jennabarton 12:e127fa20d609 555 //uncomment below to infinitely move mouse in a square
jennabarton 10:d67a15ba5748 556 // double delay = 0.1;
jennabarton 10:d67a15ba5748 557 // int change = 75;
jennabarton 10:d67a15ba5748 558 // mouseCommand(0,0, (char) -1*change);
jennabarton 10:d67a15ba5748 559 // wait(delay);
jennabarton 10:d67a15ba5748 560 // mouseCommand(0,(char) -1*change,0);
jennabarton 10:d67a15ba5748 561 // wait(delay);
jennabarton 10:d67a15ba5748 562 // mouseCommand(0,0, (char) change);
jennabarton 10:d67a15ba5748 563 // wait(delay);
jennabarton 10:d67a15ba5748 564 // mouseCommand(0,(char) change,0);
jennabarton 10:d67a15ba5748 565 // wait(delay);
jennabarton 9:55473409c585 566
jennabarton 9:55473409c585 567
daviwang 0:1c15cf9cc4f9 568 }
daviwang 0:1c15cf9cc4f9 569 }
jennabarton 22:99ff69f7111a 570