Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Fri Apr 14 18:05:09 2017 +0000
Revision:
24:d4b944e1e6cd
Parent:
23:db56e04d555b
Child:
25:d7418ded06aa
updated deadzones and works

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