Fork with support for ILI9341 controller

Dependents:   CANary_9341 CANary

Fork of TOUCH_TFTx2 by Tick Tock

Committer:
TickTock
Date:
Sun Mar 03 17:13:58 2013 +0000
Revision:
11:ce7ae1584207
Parent:
10:fd7ae99850a9
Child:
13:220e3da2dd00
merged new calbypass with setcal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:d78b00f167cb 1 /* mbed library for resistive touch pads
dreschpe 0:d78b00f167cb 2 * uses 4 pins - 2 IO and 2 Analog
dreschpe 0:d78b00f167cb 3
dreschpe 0:d78b00f167cb 4 * c 2011 Peter Drescher - DC2PD
dreschpe 0:d78b00f167cb 5 *
dreschpe 0:d78b00f167cb 6 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dreschpe 0:d78b00f167cb 7 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dreschpe 0:d78b00f167cb 8 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dreschpe 0:d78b00f167cb 9 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dreschpe 0:d78b00f167cb 10 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dreschpe 0:d78b00f167cb 11 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dreschpe 0:d78b00f167cb 12 * THE SOFTWARE.
dreschpe 0:d78b00f167cb 13 */
dreschpe 0:d78b00f167cb 14
dreschpe 0:d78b00f167cb 15
TickTock 3:3db7309b6146 16 #include "TOUCH_TFTx2.h"
dreschpe 0:d78b00f167cb 17 #include "mbed.h"
dreschpe 0:d78b00f167cb 18
TickTock 6:a91b668b058a 19 #define threshold 0x8000 // threshold to detect pressed
TickTock 7:9cc43f20e365 20 #define accuracy 1000 // noise filter
TickTock 5:a9890c586a64 21 #define numsamp 16 // number of averaging samples
dreschpe 0:d78b00f167cb 22
TickTock 3:3db7309b6146 23 TOUCH_TFTx2::TOUCH_TFTx2(PinName xp, PinName xm, PinName yp, PinName ym,
TickTock 3:3db7309b6146 24 PinName mosi, PinName miso, PinName sclk, PinName cs0, PinName cs1, PinName reset,const char* name):
dreschpe 0:d78b00f167cb 25 _xp(xp),_xm(xm),_yp(yp),_ym(ym),_ax(xp),_ay(yp),
TickTock 3:3db7309b6146 26 SPI_TFTx2(mosi,miso,sclk,cs0,cs1,reset,name) {
dreschpe 0:d78b00f167cb 27 xa = xp;
dreschpe 0:d78b00f167cb 28 ya = yp;
dreschpe 0:d78b00f167cb 29
dreschpe 0:d78b00f167cb 30 }
dreschpe 0:d78b00f167cb 31
TickTock 3:3db7309b6146 32 point TOUCH_TFTx2::get_touch() {
TickTock 7:9cc43f20e365 33 unsigned short x1, x2=0, y1, y2=0, i=0, j=0, k;
TickTock 5:a9890c586a64 34 unsigned long dy , dx, xs1=0, ys1=0, xs2=0, ys2=0;
dreschpe 0:d78b00f167cb 35 point p;
dreschpe 0:d78b00f167cb 36
TickTock 5:a9890c586a64 37 for (k=0; j<numsamp; k++) {
dreschpe 0:d78b00f167cb 38 // read y voltage
TickTock 4:a3cd26c97b76 39 _ym.input(); //LAJ y- has to be passive
TickTock 4:a3cd26c97b76 40 _yp.input(); //LAJ y+ has to be passive
dreschpe 0:d78b00f167cb 41 _xp.output();
dreschpe 0:d78b00f167cb 42 _xm.output();
dreschpe 0:d78b00f167cb 43 switch (orientation) {
dreschpe 0:d78b00f167cb 44 case(0):
dreschpe 0:d78b00f167cb 45 case(3):
dreschpe 0:d78b00f167cb 46 _xp = 1;
dreschpe 0:d78b00f167cb 47 _xm = 0;
dreschpe 0:d78b00f167cb 48 break;
dreschpe 0:d78b00f167cb 49 case(1):
dreschpe 0:d78b00f167cb 50 case(2):
dreschpe 0:d78b00f167cb 51 _xp = 0;
dreschpe 0:d78b00f167cb 52 _xm = 1;
dreschpe 0:d78b00f167cb 53 break;
dreschpe 0:d78b00f167cb 54 }
dreschpe 0:d78b00f167cb 55 AnalogIn Ay(ya); // we have to call the constructor to switch to analog mode
dreschpe 0:d78b00f167cb 56 wait_us(10);
dreschpe 0:d78b00f167cb 57 y1 = Ay.read_u16(); // get y voltage
TickTock 5:a9890c586a64 58 dy = (y1 > y2)? (y1-y2) : (y2-y1);
dreschpe 0:d78b00f167cb 59 y2 = y1;
dreschpe 0:d78b00f167cb 60
dreschpe 0:d78b00f167cb 61 // read x voltage
TickTock 4:a3cd26c97b76 62 _xm.input(); //LAJ x- has to be passive
TickTock 4:a3cd26c97b76 63 _xp.input(); //LAJ x+ has to be passive
dreschpe 0:d78b00f167cb 64 _yp.output();
dreschpe 0:d78b00f167cb 65 _ym.output();
dreschpe 0:d78b00f167cb 66 switch (orientation) {
dreschpe 0:d78b00f167cb 67 case(0):
dreschpe 0:d78b00f167cb 68 case(1):
dreschpe 0:d78b00f167cb 69 _yp = 1;
dreschpe 0:d78b00f167cb 70 _ym = 0;
dreschpe 0:d78b00f167cb 71 break;
dreschpe 0:d78b00f167cb 72 case(2):
dreschpe 0:d78b00f167cb 73 case(3):
dreschpe 0:d78b00f167cb 74 _yp = 0;
dreschpe 0:d78b00f167cb 75 _ym = 1;
dreschpe 0:d78b00f167cb 76 break;
dreschpe 0:d78b00f167cb 77 }
dreschpe 0:d78b00f167cb 78 AnalogIn Ax(xa); // we have to call the constructor to switch to analog mode
dreschpe 0:d78b00f167cb 79 wait_us(10);
dreschpe 0:d78b00f167cb 80 x1 = Ax.read_u16(); // get x voltage
TickTock 5:a9890c586a64 81 dx = (x1 > x2)? (x1-x2) : (x2-x1);
dreschpe 0:d78b00f167cb 82 x2 = x1;
TickTock 5:a9890c586a64 83 if(dy<accuracy && dx<accuracy) {
TickTock 8:fd0abf6a7f59 84 if(k<numsamp/2){
TickTock 5:a9890c586a64 85 xs1 += x1;
TickTock 5:a9890c586a64 86 ys1 += y1;
TickTock 5:a9890c586a64 87 i++;
TickTock 5:a9890c586a64 88 } else {
TickTock 5:a9890c586a64 89 xs2 += x1;
TickTock 5:a9890c586a64 90 ys2 += y1;
TickTock 5:a9890c586a64 91 j++;
TickTock 5:a9890c586a64 92 }
TickTock 5:a9890c586a64 93 }
TickTock 5:a9890c586a64 94 } // for:next
TickTock 5:a9890c586a64 95 xs1 = xs1 / i;
TickTock 5:a9890c586a64 96 ys1 = ys1 / i;
TickTock 5:a9890c586a64 97 xs2 = xs2 / j;
TickTock 5:a9890c586a64 98 ys2 = ys2 / j;
TickTock 5:a9890c586a64 99 dy = (ys1 > ys2)? (ys1-ys2) : (ys2-ys1);
TickTock 5:a9890c586a64 100 dx = (xs1 > xs2)? (xs1-xs2) : (xs2-xs1);
TickTock 5:a9890c586a64 101 if(dy<accuracy && dx<accuracy) {
TickTock 5:a9890c586a64 102
TickTock 5:a9890c586a64 103 switch (orientation) {
TickTock 5:a9890c586a64 104 case(0):
TickTock 5:a9890c586a64 105 case(2):
TickTock 5:a9890c586a64 106 p.y = (xs1+xs2) / 2; // average
TickTock 5:a9890c586a64 107 p.x = (ys1+ys2) / 2;
TickTock 5:a9890c586a64 108 break;
TickTock 5:a9890c586a64 109 case(1):
TickTock 5:a9890c586a64 110 case(3):
TickTock 5:a9890c586a64 111 p.x = (xs1+xs2) / 2; // average
TickTock 5:a9890c586a64 112 p.y = (ys1+ys2) / 2;
TickTock 5:a9890c586a64 113 break;
TickTock 5:a9890c586a64 114 }
TickTock 5:a9890c586a64 115 } else { // sample average moved too much so discard
TickTock 7:9cc43f20e365 116 p.x = 65535;
TickTock 7:9cc43f20e365 117 p.y = 65535;
dreschpe 0:d78b00f167cb 118 }
TickTock 5:a9890c586a64 119 // debug
TickTock 5:a9890c586a64 120 //locate(1,80);
TickTock 5:a9890c586a64 121 //printf("d: %4d y: %5d",dy,p.y);
TickTock 5:a9890c586a64 122 //locate(1,100);
TickTock 5:a9890c586a64 123 //printf("d: %4d x: %5d",dx,p.x);
TickTock 5:a9890c586a64 124 //wait(0.25);
TickTock 6:a91b668b058a 125 wfi(); //enable touchpad input
dreschpe 0:d78b00f167cb 126 return(p);
TickTock 5:a9890c586a64 127 }//*/
dreschpe 0:d78b00f167cb 128
TickTock 7:9cc43f20e365 129
TickTock 7:9cc43f20e365 130
TickTock 7:9cc43f20e365 131 point TOUCH_TFTx2::to_pixel(point a_point) {
TickTock 7:9cc43f20e365 132 static point p;
TickTock 7:9cc43f20e365 133
TickTock 7:9cc43f20e365 134 if (a_point.x < x_mid) { // left screen
TickTock 7:9cc43f20e365 135 p.x = (a_point.x - x0_off) / x0_pp + 3;
TickTock 7:9cc43f20e365 136 if (p.x > width()-1) p.x = width()-1;
TickTock 7:9cc43f20e365 137 p.y = (a_point.y - y0_off) / y0_pp + 3;
TickTock 7:9cc43f20e365 138 }else{ // right screen
TickTock 7:9cc43f20e365 139 p.x = (a_point.x - x1_off) / x1_pp + 3;
TickTock 7:9cc43f20e365 140 if (p.x > width()-1) p.x = 2*width()-1;
TickTock 7:9cc43f20e365 141 else p.x += width(); // add width to indicate right screen
TickTock 7:9cc43f20e365 142 p.y = (a_point.y - y1_off) / y1_pp + 3;
TickTock 7:9cc43f20e365 143 }
TickTock 7:9cc43f20e365 144 if (p.y > height()-1) p.y = height()-1;
TickTock 7:9cc43f20e365 145 //locate(1,60); //debug
TickTock 7:9cc43f20e365 146 //printf("x: %d\ty: %d",p.x,p.y);
TickTock 7:9cc43f20e365 147 return (p);
TickTock 7:9cc43f20e365 148 }
TickTock 7:9cc43f20e365 149
TickTock 7:9cc43f20e365 150 bool TOUCH_TFTx2::is_touched(void) {
TickTock 7:9cc43f20e365 151 unsigned short y1;
TickTock 7:9cc43f20e365 152 // read y voltage
TickTock 7:9cc43f20e365 153 _xm.input(); //x- has to be passive
TickTock 7:9cc43f20e365 154 _xp.input(); //x+ has to be passive
TickTock 7:9cc43f20e365 155 _xm.mode(PullDown);
TickTock 7:9cc43f20e365 156 _xp.mode(PullDown);
TickTock 7:9cc43f20e365 157 _yp.output();
TickTock 7:9cc43f20e365 158 _ym.output();
TickTock 7:9cc43f20e365 159 _yp = 1; //drive y+ high
TickTock 7:9cc43f20e365 160 _ym = 1; //drive y- high
TickTock 7:9cc43f20e365 161 AnalogIn Ay(xa); // we have to call the constructor to switch to analog mode
TickTock 7:9cc43f20e365 162 wait_us(10);
TickTock 7:9cc43f20e365 163 y1 = Ay.read_u16(); // get y voltage
TickTock 7:9cc43f20e365 164 return (y1>threshold);
TickTock 7:9cc43f20e365 165 }
TickTock 7:9cc43f20e365 166
TickTock 7:9cc43f20e365 167 void TOUCH_TFTx2::wfi(void) {
TickTock 7:9cc43f20e365 168 _xm.input(); //x- has to be passive
TickTock 7:9cc43f20e365 169 _xp.input(); //x+ has to be passive
TickTock 7:9cc43f20e365 170 _xm.mode(PullDown);
TickTock 7:9cc43f20e365 171 _xp.mode(PullDown);
TickTock 7:9cc43f20e365 172 _yp.output();
TickTock 7:9cc43f20e365 173 _ym.output();
TickTock 7:9cc43f20e365 174 _yp = 1; //drive y+ high
TickTock 7:9cc43f20e365 175 _ym = 1; //drive y- high
TickTock 7:9cc43f20e365 176 }
TickTock 7:9cc43f20e365 177
TickTock 10:fd7ae99850a9 178 void TOUCH_TFTx2::setcal(int _x0off, int _y0off, int _x0pp, int _y0pp, int _x1off, int _y1off, int _x1pp, int _y1pp, int _xmid) {
TickTock 10:fd7ae99850a9 179 x0_off = _x0off;
TickTock 10:fd7ae99850a9 180 y0_off = _y0off;
TickTock 10:fd7ae99850a9 181 x0_pp = _x0pp;
TickTock 10:fd7ae99850a9 182 y0_pp = _y0pp;
TickTock 10:fd7ae99850a9 183 x1_off = _x1off;
TickTock 10:fd7ae99850a9 184 y1_off = _y1off;
TickTock 10:fd7ae99850a9 185 x1_pp = _x1pp;
TickTock 10:fd7ae99850a9 186 y1_pp = _y1pp;
TickTock 10:fd7ae99850a9 187 x_mid = _xmid;
TickTock 10:fd7ae99850a9 188 }
TickTock 10:fd7ae99850a9 189
TickTock 3:3db7309b6146 190 void TOUCH_TFTx2::calibrate(void) {
dreschpe 0:d78b00f167cb 191 int i;
TickTock 5:a9890c586a64 192 int ulx0 = 0, uly0 = 0, brx0 = 0, bry0 = 0;
TickTock 5:a9890c586a64 193 int ulx1 = 0, uly1 = 0, brx1 = 0, bry1 = 0;
dreschpe 2:ef7972c29c0e 194 int pos_x, pos_y;
dreschpe 0:d78b00f167cb 195 point p;
TickTock 11:ce7ae1584207 196 seldisp=1; // select right display
TickTock 11:ce7ae1584207 197 cls();
TickTock 11:ce7ae1584207 198 line(0,3,6,3,White);
TickTock 11:ce7ae1584207 199 line(3,0,3,6,White);
TickTock 11:ce7ae1584207 200
TickTock 11:ce7ae1584207 201 // get the center of the screen
TickTock 11:ce7ae1584207 202 pos_x = columns() / 2 - 3;
TickTock 11:ce7ae1584207 203 pos_x = pos_x * font[1];
TickTock 11:ce7ae1584207 204 pos_y = (rows() / 2) - 1;
TickTock 11:ce7ae1584207 205 pos_y = pos_y * font[2];
TickTock 6:a91b668b058a 206
TickTock 11:ce7ae1584207 207 //calibrate right screen
TickTock 11:ce7ae1584207 208 locate(pos_x,pos_y);
TickTock 11:ce7ae1584207 209 printf("press cross");
TickTock 11:ce7ae1584207 210 locate(pos_x,pos_y + font[2]);
TickTock 11:ce7ae1584207 211 printf("to calibrate");
TickTock 11:ce7ae1584207 212 do {
TickTock 11:ce7ae1584207 213 wait(0.1);
TickTock 11:ce7ae1584207 214 } while (!is_touched()); //Wait for touch
TickTock 11:ce7ae1584207 215 for (i=0; i<5; i++) {
TickTock 6:a91b668b058a 216 do {
TickTock 11:ce7ae1584207 217 p = get_touch();
TickTock 11:ce7ae1584207 218 } while (p.x==0 && p.y==0);
TickTock 11:ce7ae1584207 219 ulx1 += p.x;
TickTock 11:ce7ae1584207 220 uly1 += p.y;
TickTock 11:ce7ae1584207 221 }
TickTock 11:ce7ae1584207 222 ulx1 /= 5;
TickTock 11:ce7ae1584207 223 uly1 /= 5;
TickTock 11:ce7ae1584207 224 locate(pos_x,pos_y);
TickTock 11:ce7ae1584207 225 printf("OK ");
TickTock 11:ce7ae1584207 226 printf(" ");
TickTock 11:ce7ae1584207 227 do {
TickTock 11:ce7ae1584207 228 wait(0.1);
TickTock 11:ce7ae1584207 229 } while (is_touched()); //Wait for no touch
TickTock 11:ce7ae1584207 230
TickTock 11:ce7ae1584207 231 cls();
TickTock 11:ce7ae1584207 232 line(width() -1, height() - 4,width() - 7,height() -4,White); // paint cross
TickTock 11:ce7ae1584207 233 line(width() - 4,height() - 1,width() - 4,height() - 7,White);
TickTock 11:ce7ae1584207 234 locate(pos_x,pos_y);
TickTock 11:ce7ae1584207 235 printf("press cross");
TickTock 11:ce7ae1584207 236 locate(pos_x,pos_y + font[2]);
TickTock 11:ce7ae1584207 237 printf("to calibrate");
TickTock 11:ce7ae1584207 238 do {
TickTock 11:ce7ae1584207 239 wait(0.1);
TickTock 11:ce7ae1584207 240 } while (!is_touched()); //Wait for touch
TickTock 11:ce7ae1584207 241 for (i=0; i<5; i++) {
TickTock 6:a91b668b058a 242 do {
TickTock 11:ce7ae1584207 243 p = get_touch();
TickTock 11:ce7ae1584207 244 } while (p.x==0 && p.y==0); p = get_touch();
TickTock 11:ce7ae1584207 245 brx1 += p.x;
TickTock 11:ce7ae1584207 246 bry1 += p.y;
TickTock 11:ce7ae1584207 247 }
TickTock 11:ce7ae1584207 248 brx1 /= 5;
TickTock 11:ce7ae1584207 249 bry1 /= 5;
TickTock 11:ce7ae1584207 250
TickTock 11:ce7ae1584207 251 locate(pos_x, pos_y);
TickTock 11:ce7ae1584207 252 printf("OK ");
TickTock 11:ce7ae1584207 253 printf(" ");
TickTock 11:ce7ae1584207 254 do {
TickTock 11:ce7ae1584207 255 wait(0.1);
TickTock 11:ce7ae1584207 256 } while (is_touched()); //Wait for no touch
TickTock 11:ce7ae1584207 257
TickTock 11:ce7ae1584207 258 cls();
TickTock 11:ce7ae1584207 259 seldisp=0; // select left display
TickTock 11:ce7ae1584207 260 cls();
TickTock 11:ce7ae1584207 261 line(0,3,6,3,White);
TickTock 11:ce7ae1584207 262 line(3,0,3,6,White);
TickTock 11:ce7ae1584207 263
TickTock 11:ce7ae1584207 264 // now calibrate left screen
TickTock 11:ce7ae1584207 265 locate(pos_x,pos_y);
TickTock 11:ce7ae1584207 266 printf("press cross");
TickTock 11:ce7ae1584207 267 locate(pos_x,pos_y + font[2]);
TickTock 11:ce7ae1584207 268 printf("to calibrate");
TickTock 11:ce7ae1584207 269 do {
TickTock 11:ce7ae1584207 270 wait(0.1);
TickTock 11:ce7ae1584207 271 } while (!is_touched()); //Wait for touch
TickTock 11:ce7ae1584207 272 for (i=0; i<5; i++) {
TickTock 6:a91b668b058a 273 do {
TickTock 11:ce7ae1584207 274 p = get_touch();
TickTock 11:ce7ae1584207 275 } while (p.x==0 && p.y==0);
TickTock 11:ce7ae1584207 276 ulx0 += p.x;
TickTock 11:ce7ae1584207 277 uly0 += p.y;
TickTock 11:ce7ae1584207 278 }
TickTock 11:ce7ae1584207 279 ulx0 /= 5;
TickTock 11:ce7ae1584207 280 uly0 /= 5;
TickTock 11:ce7ae1584207 281 locate(pos_x,pos_y);
TickTock 11:ce7ae1584207 282 printf("OK ");
TickTock 11:ce7ae1584207 283 printf(" ");
TickTock 11:ce7ae1584207 284 do {
TickTock 11:ce7ae1584207 285 wait(0.1);
TickTock 11:ce7ae1584207 286 } while (is_touched()); //Wait for no touch
TickTock 11:ce7ae1584207 287
TickTock 11:ce7ae1584207 288 cls();
TickTock 11:ce7ae1584207 289 line(width() -1, height() - 4,width() - 7,height() -4,White); // paint cross
TickTock 11:ce7ae1584207 290 line(width() - 4,height() - 1,width() - 4,height() - 7,White);
TickTock 11:ce7ae1584207 291 locate(pos_x,pos_y);
TickTock 11:ce7ae1584207 292 printf("press cross");
TickTock 11:ce7ae1584207 293 locate(pos_x,pos_y + font[2]);
TickTock 11:ce7ae1584207 294 printf("to calibrate");
TickTock 11:ce7ae1584207 295 do {
TickTock 11:ce7ae1584207 296 wait(0.1);
TickTock 11:ce7ae1584207 297 } while (!is_touched()); //Wait for touch
TickTock 11:ce7ae1584207 298 for (i=0; i<5; i++) {
TickTock 11:ce7ae1584207 299 do {
TickTock 11:ce7ae1584207 300 p = get_touch();
TickTock 11:ce7ae1584207 301 } while (p.x==0 && p.y==0);
TickTock 11:ce7ae1584207 302 brx0 += p.x;
TickTock 11:ce7ae1584207 303 bry0 += p.y;
TickTock 11:ce7ae1584207 304 }
TickTock 11:ce7ae1584207 305 brx0 /= 5;
TickTock 11:ce7ae1584207 306 bry0 /= 5;
TickTock 11:ce7ae1584207 307
TickTock 11:ce7ae1584207 308 locate(pos_x, pos_y);
TickTock 11:ce7ae1584207 309 printf("OK ");
TickTock 11:ce7ae1584207 310 printf(" ");
TickTock 11:ce7ae1584207 311 do {
TickTock 11:ce7ae1584207 312 wait(0.1);
TickTock 11:ce7ae1584207 313 } while (is_touched()); //Wait for no touch
TickTock 11:ce7ae1584207 314
TickTock 11:ce7ae1584207 315 cls();
TickTock 11:ce7ae1584207 316
TickTock 11:ce7ae1584207 317 x0_off = ulx0;
TickTock 11:ce7ae1584207 318 y0_off = uly0;
TickTock 11:ce7ae1584207 319 x0_pp = (brx0-ulx0) / (width() - 6);
TickTock 11:ce7ae1584207 320 y0_pp = (bry0-uly0) / (height() - 6);
TickTock 6:a91b668b058a 321
TickTock 6:a91b668b058a 322
TickTock 11:ce7ae1584207 323 x1_off = ulx1;
TickTock 11:ce7ae1584207 324 y1_off = uly1;
TickTock 11:ce7ae1584207 325 x1_pp = (brx1-ulx1) / (width() - 6);
TickTock 11:ce7ae1584207 326 y1_pp = (bry1-uly1) / (height() - 6);
TickTock 11:ce7ae1584207 327 x_mid = (brx0 + ulx1) / 2;
TickTock 11:ce7ae1584207 328 //debug
TickTock 11:ce7ae1584207 329 //printf("x0_off:%d y0_off:%d x0_pp:%d y0_pp:%d\n",x0_off,y0_off,x0_pp,y0_pp);
TickTock 11:ce7ae1584207 330 //printf("x1_off:%d y1_off:%d x1_pp:%d y1_pp:%d\n",x1_off,y1_off,x1_pp,y1_pp);
TickTock 11:ce7ae1584207 331 //printf("x_mid:%d\n",x_mid);
dreschpe 0:d78b00f167cb 332 }