Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Mon Apr 10 20:46:08 2017 +0000
Revision:
20:550a57fb9344
Parent:
19:0dd0fe82c3e7
Child:
21:a23f87a688b2
slow with some clicking

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