Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Wed Apr 05 02:12:47 2017 +0000
Revision:
18:d7a681bc22e5
Parent:
17:08d6d9badb3f
Child:
19:0dd0fe82c3e7
working but limited scope of reading

Who changed what in which revision?

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