Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Wed Apr 12 21:04:40 2017 +0000
Revision:
21:a23f87a688b2
Parent:
20:550a57fb9344
Child:
22:99ff69f7111a
mouse pow of 1.2 and mult of 3 is working relatively well

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