Fork with support for ILI9341 controller

Dependents:   CANary_9341 CANary

Fork of TOUCH_TFTx2 by Tick Tock

Committer:
TickTock
Date:
Sun Mar 24 01:25:53 2013 +0000
Revision:
13:220e3da2dd00
Parent:
11:ce7ae1584207
Child:
14:c58c98c5020a
Added setfont, foreground, and background to calibration routine (so doesn't have to be set by the caller)

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