Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Thu Apr 13 18:58:04 2017 +0000
Revision:
22:99ff69f7111a
Parent:
21:a23f87a688b2
Child:
23:db56e04d555b
messy

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 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
jennabarton 12:e127fa20d609 167 if(diffX > deadzone){
jennabarton 12:e127fa20d609 168 diffX -= deadzone;
jennabarton 12:e127fa20d609 169 } else if (diffX < -1*deadzone){
jennabarton 12:e127fa20d609 170 diffX += deadzone;
jennabarton 12:e127fa20d609 171 } else{
jennabarton 12:e127fa20d609 172 diffX = 0;
jennabarton 12:e127fa20d609 173 }
jennabarton 12:e127fa20d609 174 //fix diffY
jennabarton 12:e127fa20d609 175 if(diffY > deadzone){
jennabarton 12:e127fa20d609 176 diffY -= deadzone;
jennabarton 17:08d6d9badb3f 177 } else if (diffY < -1*deadzone){
jennabarton 12:e127fa20d609 178 diffY += deadzone;
jennabarton 12:e127fa20d609 179 } else{
jennabarton 12:e127fa20d609 180 diffY = 0;
jennabarton 12:e127fa20d609 181 }
jennabarton 12:e127fa20d609 182
jennabarton 14:568d4dac4fb6 183
jennabarton 14:568d4dac4fb6 184 //mouseCommand(0, (char) diffX, (char) diffY);
jennabarton 14:568d4dac4fb6 185 //TODO: this is defaulting to first finger - need to fix this
jennabarton 14:568d4dac4fb6 186 //update target position to move x and y
jennabarton 14:568d4dac4fb6 187 updatex[0] = diffX;
jennabarton 14:568d4dac4fb6 188 updatey[0] = diffY;
jennabarton 16:6b4a71e6f75a 189
jennabarton 17:08d6d9badb3f 190
jennabarton 16:6b4a71e6f75a 191 // pc.printf("updating x to : %d", diffX);
jennabarton 16:6b4a71e6f75a 192 // pc.printf("\t updating y to : %d \n", diffY);
jennabarton 16:6b4a71e6f75a 193
jennabarton 16:6b4a71e6f75a 194 // pc.printf("updating x to : %d", updatex[0]);
jennabarton 16:6b4a71e6f75a 195 // pc.printf("\t updating y to : %d \n", updatex[0]);
jennabarton 16:6b4a71e6f75a 196
jennabarton 20:550a57fb9344 197 }
jennabarton 12:e127fa20d609 198 }
jennabarton 12:e127fa20d609 199
jennabarton 12:e127fa20d609 200
jennabarton 12:e127fa20d609 201 //writes two bytes to the camera
jennabarton 12:e127fa20d609 202 void write2bytes(char data1, char data2){
jennabarton 12:e127fa20d609 203 char out[2];
jennabarton 12:e127fa20d609 204 out[0] = data1;
jennabarton 12:e127fa20d609 205 out[1] = data2;
jennabarton 12:e127fa20d609 206 camera1.write(slaveAddress, out, 2);
jennabarton 12:e127fa20d609 207 wait(0.01);
jennabarton 12:e127fa20d609 208 }
jennabarton 12:e127fa20d609 209
jennabarton 12:e127fa20d609 210
jennabarton 12:e127fa20d609 211
jennabarton 8:d27efcac2dd7 212 // Initialize WiiMote Camera
daviwang 1:2e895e5272ab 213 void initCamera(void){
daviwang 1:2e895e5272ab 214 write2bytes(0x30, 0x01);
daviwang 1:2e895e5272ab 215 write2bytes(0x00, 0x02);
daviwang 1:2e895e5272ab 216 write2bytes(0x00, 0x00);
daviwang 1:2e895e5272ab 217 write2bytes(0x71, 0x01);
daviwang 1:2e895e5272ab 218 write2bytes(0x07, 0x00);
daviwang 1:2e895e5272ab 219 write2bytes(sen1, 0x1A);
daviwang 1:2e895e5272ab 220 write2bytes(sen2, sen3);
daviwang 1:2e895e5272ab 221 write2bytes(0x33, 0x03);
daviwang 1:2e895e5272ab 222 write2bytes(0x30, 0x08);
jennabarton 3:7b0c215eb6a7 223 //wait(0.1);
daviwang 1:2e895e5272ab 224
daviwang 1:2e895e5272ab 225 }
daviwang 0:1c15cf9cc4f9 226
jennabarton 12:e127fa20d609 227
jennabarton 12:e127fa20d609 228 //update counts for click
jennabarton 12:e127fa20d609 229 void updateClickState(int currx, int curry, int prevx, int prevy){
jennabarton 12:e127fa20d609 230 bool xStable = false;
jennabarton 12:e127fa20d609 231 bool yStable = false;
jennabarton 20:550a57fb9344 232
jennabarton 22:99ff69f7111a 233
jennabarton 22:99ff69f7111a 234 if(currx != 1023 && curry != 1023 && readingClick){
jennabarton 22:99ff69f7111a 235 //finger is on surface and you are reading click
jennabarton 22:99ff69f7111a 236
jennabarton 22:99ff69f7111a 237 //test stability
jennabarton 12:e127fa20d609 238
jennabarton 22:99ff69f7111a 239 //check x stability
jennabarton 22:99ff69f7111a 240 if (currx == clickBaseX){
jennabarton 22:99ff69f7111a 241 //no movement in x direction
jennabarton 22:99ff69f7111a 242 xStable = true;
jennabarton 22:99ff69f7111a 243 } else if( abs(currx - clickBaseX) < CLICK_DEAD_ZONE){
jennabarton 22:99ff69f7111a 244 //barely moved in x direction
jennabarton 12:e127fa20d609 245 xStable = true;
jennabarton 12:e127fa20d609 246 }
jennabarton 22:99ff69f7111a 247
jennabarton 22:99ff69f7111a 248 //check y stability
jennabarton 22:99ff69f7111a 249 if( curry == clickBaseY){
jennabarton 22:99ff69f7111a 250 //no movement in y direction
jennabarton 22:99ff69f7111a 251 yStable = true;
jennabarton 22:99ff69f7111a 252 } else if ( abs(curry - clickBaseY) < CLICK_DEAD_ZONE){
jennabarton 22:99ff69f7111a 253 //barely moved in y direction
jennabarton 12:e127fa20d609 254 yStable = true;
jennabarton 12:e127fa20d609 255 }
jennabarton 22:99ff69f7111a 256
jennabarton 22:99ff69f7111a 257 //if stable, increment count
jennabarton 12:e127fa20d609 258 if(xStable && yStable){
jennabarton 22:99ff69f7111a 259 clickDurCount = clickDurCount + 1;
jennabarton 12:e127fa20d609 260 } else{
jennabarton 22:99ff69f7111a 261 //if not stable, no longer reading click, counter to zero
jennabarton 22:99ff69f7111a 262 readingClick = false;
jennabarton 22:99ff69f7111a 263 clickDurCount = 0;
jennabarton 12:e127fa20d609 264 }
jennabarton 22:99ff69f7111a 265
jennabarton 12:e127fa20d609 266
jennabarton 22:99ff69f7111a 267 } else if (currx != 1023 && curry != 1023 && prevx == 1023 && prevy == 1023 ){
jennabarton 22:99ff69f7111a 268 //finger has been placed on surface
jennabarton 22:99ff69f7111a 269
jennabarton 22:99ff69f7111a 270 //set reading click to true
jennabarton 22:99ff69f7111a 271 readingClick = true;
jennabarton 22:99ff69f7111a 272
jennabarton 22:99ff69f7111a 273 //save initial location
jennabarton 22:99ff69f7111a 274 clickBaseX = currx;
jennabarton 22:99ff69f7111a 275 clickBaseY = curry;
jennabarton 22:99ff69f7111a 276
jennabarton 22:99ff69f7111a 277 } else if (currx == 1023 && curry == 1023 && readingClick){
jennabarton 22:99ff69f7111a 278 //stable click and finger was removed
jennabarton 22:99ff69f7111a 279
jennabarton 22:99ff69f7111a 280 //if within bounds, you want to click
jennabarton 22:99ff69f7111a 281 if(clickDurCount > minLeftClickDur && clickDurCount < maxLeftClickDur){
jennabarton 22:99ff69f7111a 282 //set state to indicate left click
jennabarton 20:550a57fb9344 283 toLeftClick = true;
jennabarton 20:550a57fb9344 284 pc.printf("********LEFT mouse click \n");
jennabarton 22:99ff69f7111a 285 }
jennabarton 22:99ff69f7111a 286
jennabarton 22:99ff69f7111a 287
jennabarton 22:99ff69f7111a 288 //no longer reading click
jennabarton 22:99ff69f7111a 289 readingClick = false;
jennabarton 22:99ff69f7111a 290 //reset counter
jennabarton 22:99ff69f7111a 291 clickDurCount = 0;
jennabarton 22:99ff69f7111a 292 }
jennabarton 20:550a57fb9344 293
jennabarton 12:e127fa20d609 294 }
jennabarton 12:e127fa20d609 295
jennabarton 12:e127fa20d609 296
jennabarton 8:d27efcac2dd7 297 //get data from camera one
jennabarton 8:d27efcac2dd7 298 //populates onex and oney with values depending on the measured points
jennabarton 8:d27efcac2dd7 299 //NOTE: 1023 means nothing was detected
jennabarton 2:f501e506d62b 300 void readCameraData(void){
jennabarton 2:f501e506d62b 301
jennabarton 16:6b4a71e6f75a 302 //pc.printf("in read camera data \n");
jennabarton 15:54cee979f202 303
jennabarton 2:f501e506d62b 304 //request data from camera
jennabarton 2:f501e506d62b 305 char out[1];
jennabarton 2:f501e506d62b 306 out[0] = 0x36;
jennabarton 2:f501e506d62b 307 camera1.write(slaveAddress, out, 1);
jennabarton 2:f501e506d62b 308 //wait(0.2); //do we need this?
jennabarton 2:f501e506d62b 309
jennabarton 2:f501e506d62b 310 //get data from camera
jennabarton 2:f501e506d62b 311 camera1.read(slaveAddress, data_buf, 16);
jennabarton 8:d27efcac2dd7 312
jennabarton 2:f501e506d62b 313 //POINT 1
jennabarton 2:f501e506d62b 314 //get data
jennabarton 2:f501e506d62b 315 point1x = data_buf[1];
jennabarton 2:f501e506d62b 316 point1y = data_buf[2];
jennabarton 2:f501e506d62b 317 s = data_buf[3];
jennabarton 3:7b0c215eb6a7 318 //load x,y
jennabarton 3:7b0c215eb6a7 319 onex[0] = point1x + ((s & 0x30) << 4);
jennabarton 3:7b0c215eb6a7 320 oney[0] = point1y + ((s & 0xC0) << 2);
jennabarton 2:f501e506d62b 321
jennabarton 8:d27efcac2dd7 322
jennabarton 11:cd450ce343a8 323 //>>>>>>>>>>>>>>>>>Begin unfinished code for moving
jennabarton 11:cd450ce343a8 324
jennabarton 12:e127fa20d609 325 oneFingerResponse(onex[0], oney[0], prevX, prevY);
jennabarton 12:e127fa20d609 326 updateClickState(onex[0], oney[0], prevX, prevY);
jennabarton 11:cd450ce343a8 327
jennabarton 7:6b27977d1800 328
jennabarton 7:6b27977d1800 329 //update prev values
jennabarton 7:6b27977d1800 330 prevX = onex[0];
jennabarton 7:6b27977d1800 331 prevY = oney[0];
jennabarton 7:6b27977d1800 332
jennabarton 7:6b27977d1800 333
jennabarton 8:d27efcac2dd7 334 //<<<<<<<<<<<<<<<<End unfinished code for moving averages
jennabarton 8:d27efcac2dd7 335
jennabarton 20:550a57fb9344 336 //>>>>>>>>>>>>>>>>Begin unused parsing for multiple fingers
jennabarton 20:550a57fb9344 337 // //POINT 2
jennabarton 20:550a57fb9344 338 // //get data
jennabarton 20:550a57fb9344 339 // point2x = data_buf[4];
jennabarton 20:550a57fb9344 340 // point2y = data_buf[5];
jennabarton 20:550a57fb9344 341 // s = data_buf[6];
jennabarton 20:550a57fb9344 342 // //load x,y
jennabarton 20:550a57fb9344 343 // onex[1] = point2x + ((s & 0x30) << 4);
jennabarton 20:550a57fb9344 344 // oney[1] = point2y + ((s & 0xC0) << 2);
jennabarton 20:550a57fb9344 345 //
jennabarton 20:550a57fb9344 346 // //POINT 3
jennabarton 20:550a57fb9344 347 // //get data
jennabarton 20:550a57fb9344 348 // point3x = data_buf[7];
jennabarton 20:550a57fb9344 349 // point3y = data_buf[8];
jennabarton 20:550a57fb9344 350 // s = data_buf[9];
jennabarton 20:550a57fb9344 351 // //load x,y
jennabarton 20:550a57fb9344 352 // onex[2] = point3x + ((s & 0x30) << 4);
jennabarton 20:550a57fb9344 353 // oney[2] = point3y + ((s & 0xC0) << 2);
jennabarton 20:550a57fb9344 354 //
jennabarton 20:550a57fb9344 355 // //POINT 4
jennabarton 20:550a57fb9344 356 // //get data
jennabarton 20:550a57fb9344 357 // point4x = data_buf[10];
jennabarton 20:550a57fb9344 358 // point4y = data_buf[11];
jennabarton 20:550a57fb9344 359 // s = data_buf[12];
jennabarton 20:550a57fb9344 360 // //load x,y
jennabarton 20:550a57fb9344 361 // onex[3] = point4x + ((s & 0x30) << 4);
jennabarton 20:550a57fb9344 362 // oney[3] = point4y + ((s & 0xC0) << 2);
jennabarton 20:550a57fb9344 363 //<<<<<<<<<<<<<<<<<<<<<<End unused parsing for multiple fingers
jennabarton 2:f501e506d62b 364
jennabarton 2:f501e506d62b 365 }
jennabarton 2:f501e506d62b 366
jennabarton 8:d27efcac2dd7 367 //print to serial monitor the coordinates of the points stored in
jennabarton 8:d27efcac2dd7 368 //the passed x and y arrays
jennabarton 2:f501e506d62b 369 void printCamData(int xcor[4], int ycor[4]){
jennabarton 2:f501e506d62b 370 for(int i = 0; i<4; i++){
jennabarton 2:f501e506d62b 371 int x = xcor[i];
jennabarton 2:f501e506d62b 372 int y = ycor[i];
jennabarton 2:f501e506d62b 373 //determine what to print
jennabarton 2:f501e506d62b 374 //x coordinate
jennabarton 3:7b0c215eb6a7 375 pc.printf(" %d,", x);
jennabarton 2:f501e506d62b 376
jennabarton 2:f501e506d62b 377 //y coordinate
jennabarton 8:d27efcac2dd7 378 pc.printf(" %d\t", y);
jennabarton 2:f501e506d62b 379 }
jennabarton 2:f501e506d62b 380
jennabarton 2:f501e506d62b 381 //new line and delay
jennabarton 2:f501e506d62b 382 pc.printf("\n");
jennabarton 3:7b0c215eb6a7 383 //wait(0.01);
jennabarton 2:f501e506d62b 384 }
jennabarton 2:f501e506d62b 385
jennabarton 4:1f443e7a0122 386
jennabarton 4:1f443e7a0122 387
jennabarton 4:1f443e7a0122 388
jennabarton 8:d27efcac2dd7 389 //entrance to the code
daviwang 0:1c15cf9cc4f9 390 int main() {
jennabarton 15:54cee979f202 391
jennabarton 21:a23f87a688b2 392 //i2c increase
jennabarton 21:a23f87a688b2 393 camera1.frequency(400000);
jennabarton 21:a23f87a688b2 394
jennabarton 15:54cee979f202 395 //set values initially to zero
jennabarton 15:54cee979f202 396 updatex[0] = 0;
jennabarton 15:54cee979f202 397 updatey[0] = 0;
jennabarton 15:54cee979f202 398
daviwang 1:2e895e5272ab 399 myled = 0;
jennabarton 16:6b4a71e6f75a 400 myled2 = 0;
jennabarton 16:6b4a71e6f75a 401
jennabarton 3:7b0c215eb6a7 402 //slaveAddress = IRsensorAddress >> 1;
jennabarton 3:7b0c215eb6a7 403 slaveAddress = IRsensorAddress;
daviwang 1:2e895e5272ab 404 initCamera();
daviwang 1:2e895e5272ab 405
jennabarton 3:7b0c215eb6a7 406 //update baud rate
jennabarton 3:7b0c215eb6a7 407 pc.baud(115200);
jennabarton 3:7b0c215eb6a7 408
jennabarton 14:568d4dac4fb6 409 //attach ticker for interrupt
jennabarton 16:6b4a71e6f75a 410 //mouseStateTicker.attach_us(&updateMouseState, 100);
jennabarton 21:a23f87a688b2 411 mouseStateTicker.attach(&updateMouseState, 0.05);
jennabarton 21:a23f87a688b2 412
jennabarton 21:a23f87a688b2 413 //attach ticker for reading camera interrupt
jennabarton 21:a23f87a688b2 414 cameraReadTicker.attach(&readCameraData, 0.01);
jennabarton 16:6b4a71e6f75a 415
jennabarton 14:568d4dac4fb6 416
jennabarton 8:d27efcac2dd7 417 //loop to search for new info using the camera
daviwang 0:1c15cf9cc4f9 418 while(1) {
jennabarton 15:54cee979f202 419
jennabarton 16:6b4a71e6f75a 420 //pc.printf("while\n");
jennabarton 8:d27efcac2dd7 421
jennabarton 8:d27efcac2dd7 422 //toggle test LED
jennabarton 2:f501e506d62b 423 myled = 1 - myled;
jennabarton 2:f501e506d62b 424
jennabarton 16:6b4a71e6f75a 425 //pc.printf("while2\n");
jennabarton 15:54cee979f202 426
jennabarton 21:a23f87a688b2 427 //DEPRECATED: now interrupt
jennabarton 2:f501e506d62b 428 //get the camera data
jennabarton 21:a23f87a688b2 429 //readCameraData();
daviwang 1:2e895e5272ab 430
jennabarton 20:550a57fb9344 431 //printing clicking state -- FOR DEBUGGING
jennabarton 20:550a57fb9344 432 // pc.printf("readyForClick %s", readyForClick ? "true" : "false");
jennabarton 20:550a57fb9344 433 // pc.printf("\treadingClick %s", readingClick ? "true" : "false");
jennabarton 20:550a57fb9344 434 // pc.printf("\treadyForClickRelease %s\n", readyForClickRelease ? "true" : "false");
jennabarton 20:550a57fb9344 435
jennabarton 20:550a57fb9344 436
jennabarton 20:550a57fb9344 437
jennabarton 20:550a57fb9344 438
jennabarton 14:568d4dac4fb6 439 //printing mouse state -- FOR DEBUGGING
jennabarton 15:54cee979f202 440 // pc.printf("update mouse %d, %d", updatex[0], updatey[0]);
jennabarton 15:54cee979f202 441 // pc.printf("\tclick left %s", toLeftClick ? "true" : "false");
jennabarton 15:54cee979f202 442 // pc.printf("\tclick right %s\n", toRightClick ? "true" : "false");
jennabarton 14:568d4dac4fb6 443
jennabarton 2:f501e506d62b 444 //print points
jennabarton 15:54cee979f202 445 printCamData(onex, oney);
daviwang 1:2e895e5272ab 446
jennabarton 21:a23f87a688b2 447
jennabarton 21:a23f87a688b2 448
jennabarton 21:a23f87a688b2 449
jennabarton 21:a23f87a688b2 450
jennabarton 21:a23f87a688b2 451
jennabarton 8:d27efcac2dd7 452 //uncomment below to test infinite print
jennabarton 6:4ade0e1a3723 453 //keyOut.putc(0x41);
jennabarton 4:1f443e7a0122 454
jennabarton 12:e127fa20d609 455 //uncomment below to infinitely move mouse in a square
jennabarton 10:d67a15ba5748 456 // double delay = 0.1;
jennabarton 10:d67a15ba5748 457 // int change = 75;
jennabarton 10:d67a15ba5748 458 // mouseCommand(0,0, (char) -1*change);
jennabarton 10:d67a15ba5748 459 // wait(delay);
jennabarton 10:d67a15ba5748 460 // mouseCommand(0,(char) -1*change,0);
jennabarton 10:d67a15ba5748 461 // wait(delay);
jennabarton 10:d67a15ba5748 462 // mouseCommand(0,0, (char) change);
jennabarton 10:d67a15ba5748 463 // wait(delay);
jennabarton 10:d67a15ba5748 464 // mouseCommand(0,(char) change,0);
jennabarton 10:d67a15ba5748 465 // wait(delay);
jennabarton 9:55473409c585 466
jennabarton 9:55473409c585 467
daviwang 0:1c15cf9cc4f9 468 }
daviwang 0:1c15cf9cc4f9 469 }
jennabarton 22:99ff69f7111a 470