Ghost Mouse / Mbed 2 deprecated ghost_mouse

Dependencies:   mbed

Committer:
jennabarton
Date:
Fri Apr 14 19:03:16 2017 +0000
Revision:
25:d7418ded06aa
Parent:
24:d4b944e1e6cd
Child:
26:f6aa46b550c3
working with erratic behavior - potentially int/short issue;

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