Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
daviwang
Date:
Thu Apr 13 21:41:19 2017 +0000
Revision:
23:db56e04d555b
Parent:
22:99ff69f7111a
Child:
24:d4b944e1e6cd
added write cap to filter out finger lift/place jitter

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