Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Wed Apr 05 02:43:57 2017 +0000
Revision:
19:0dd0fe82c3e7
Parent:
18:d7a681bc22e5
Child:
20:550a57fb9344
square for movement

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