A simple program to be used to calibrate the TouchScreen library

Dependencies:   TouchScreen UniGraphic mbed-rtos mbed

Committer:
duncanFrance
Date:
Sat Mar 19 15:42:31 2016 +0000
Revision:
0:0df0b8e0dc55
Initial import

Who changed what in which revision?

UserRevisionLine numberNew contents of line
duncanFrance 0:0df0b8e0dc55 1 #include "mbed.h"
duncanFrance 0:0df0b8e0dc55 2 #include "rtos.h"
duncanFrance 0:0df0b8e0dc55 3
duncanFrance 0:0df0b8e0dc55 4 #include "Arial12x12.h"
duncanFrance 0:0df0b8e0dc55 5 #include "Arial24x23.h"
duncanFrance 0:0df0b8e0dc55 6 #include "ILI932x.h"
duncanFrance 0:0df0b8e0dc55 7 #include "TouchScreen.h"
duncanFrance 0:0df0b8e0dc55 8
duncanFrance 0:0df0b8e0dc55 9
duncanFrance 0:0df0b8e0dc55 10 #define LCD_X_RES 240
duncanFrance 0:0df0b8e0dc55 11 #define LCD_Y_RES 320
duncanFrance 0:0df0b8e0dc55 12
duncanFrance 0:0df0b8e0dc55 13 #define LCD_CS PH_0
duncanFrance 0:0df0b8e0dc55 14 #define LCD_RESET PH_1
duncanFrance 0:0df0b8e0dc55 15 #define LCD_RS PA_0
duncanFrance 0:0df0b8e0dc55 16 #define LCD_WR PA_1
duncanFrance 0:0df0b8e0dc55 17 #define LCD_RD PA_4
duncanFrance 0:0df0b8e0dc55 18
duncanFrance 0:0df0b8e0dc55 19
duncanFrance 0:0df0b8e0dc55 20 #define T_CLK PC_10
duncanFrance 0:0df0b8e0dc55 21 #define T_DIN PC_12
duncanFrance 0:0df0b8e0dc55 22 #define T_DOUT PC_11
duncanFrance 0:0df0b8e0dc55 23 #define T_CS PC_8
duncanFrance 0:0df0b8e0dc55 24 #define T_IRQ PB_9
duncanFrance 0:0df0b8e0dc55 25
duncanFrance 0:0df0b8e0dc55 26 /**
duncanFrance 0:0df0b8e0dc55 27 * My touch screen lies at a slight angle and hides some of the screen
duncanFrance 0:0df0b8e0dc55 28 * Adjust this value as needed until the calibration dots are visible on your screen
duncanFrance 0:0df0b8e0dc55 29 **/
duncanFrance 0:0df0b8e0dc55 30 #define CAL_OFFSET 4
duncanFrance 0:0df0b8e0dc55 31
duncanFrance 0:0df0b8e0dc55 32 /**
duncanFrance 0:0df0b8e0dc55 33 * hand-crafted values for the touch-screen calibration
duncanFrance 0:0df0b8e0dc55 34 **/
duncanFrance 0:0df0b8e0dc55 35 #define TOUCH_X_MIN 540
duncanFrance 0:0df0b8e0dc55 36 #define TOUCH_X_MAX 3700
duncanFrance 0:0df0b8e0dc55 37 #define TOUCH_Y_MIN 340
duncanFrance 0:0df0b8e0dc55 38 #define TOUCH_Y_MAX 3656
duncanFrance 0:0df0b8e0dc55 39
duncanFrance 0:0df0b8e0dc55 40 unsigned short backgroundcolor=Black;
duncanFrance 0:0df0b8e0dc55 41 unsigned short foregroundcolor=White;
duncanFrance 0:0df0b8e0dc55 42
duncanFrance 0:0df0b8e0dc55 43 ILI932x* mySCREEN;
duncanFrance 0:0df0b8e0dc55 44 TouchScreen* touchScreen;
duncanFrance 0:0df0b8e0dc55 45 Serial *pc;
duncanFrance 0:0df0b8e0dc55 46
duncanFrance 0:0df0b8e0dc55 47 volatile bool done;
duncanFrance 0:0df0b8e0dc55 48 volatile int xt, yt;
duncanFrance 0:0df0b8e0dc55 49 volatile int xmin = 9999;
duncanFrance 0:0df0b8e0dc55 50 volatile int xmax = 0;
duncanFrance 0:0df0b8e0dc55 51 volatile int ymin = 9999;
duncanFrance 0:0df0b8e0dc55 52 volatile int ymax = 0;
duncanFrance 0:0df0b8e0dc55 53
duncanFrance 0:0df0b8e0dc55 54
duncanFrance 0:0df0b8e0dc55 55 void touchStart(TouchPosition p) {
duncanFrance 0:0df0b8e0dc55 56 mySCREEN->fillcircle(p.screenX, p.screenY, 10, Blue) ;
duncanFrance 0:0df0b8e0dc55 57 }
duncanFrance 0:0df0b8e0dc55 58
duncanFrance 0:0df0b8e0dc55 59 void touchMove(TouchPosition p) {
duncanFrance 0:0df0b8e0dc55 60 mySCREEN->fillcircle(p.screenX+10, p.screenY, 10, Green) ;
duncanFrance 0:0df0b8e0dc55 61 }
duncanFrance 0:0df0b8e0dc55 62
duncanFrance 0:0df0b8e0dc55 63 void touchEnd(TouchPosition p) {
duncanFrance 0:0df0b8e0dc55 64 mySCREEN->fillcircle(p.screenX+20, p.screenY, 10, Red) ;
duncanFrance 0:0df0b8e0dc55 65 done = true;
duncanFrance 0:0df0b8e0dc55 66 xt = p.x;
duncanFrance 0:0df0b8e0dc55 67 yt = p.y;
duncanFrance 0:0df0b8e0dc55 68 }
duncanFrance 0:0df0b8e0dc55 69
duncanFrance 0:0df0b8e0dc55 70 void cal(int x, int y) {
duncanFrance 0:0df0b8e0dc55 71 done = false;
duncanFrance 0:0df0b8e0dc55 72 mySCREEN->fillcircle(x, y, 4, Red) ;
duncanFrance 0:0df0b8e0dc55 73 while(!done) {
duncanFrance 0:0df0b8e0dc55 74 // wait
duncanFrance 0:0df0b8e0dc55 75 }
duncanFrance 0:0df0b8e0dc55 76 pc->printf("X=%d, Y=%d\r\n", xt, yt);
duncanFrance 0:0df0b8e0dc55 77 if(xmin>xt) xmin=xt;
duncanFrance 0:0df0b8e0dc55 78 if(xmax<xt) xmax=xt;
duncanFrance 0:0df0b8e0dc55 79 if(ymin>yt) ymin=yt;
duncanFrance 0:0df0b8e0dc55 80 if(ymax<yt) ymax=yt;
duncanFrance 0:0df0b8e0dc55 81 }
duncanFrance 0:0df0b8e0dc55 82
duncanFrance 0:0df0b8e0dc55 83 void print_calibration() {
duncanFrance 0:0df0b8e0dc55 84 // We have max and min values corresponding to points inside the screen area
duncanFrance 0:0df0b8e0dc55 85 // Work out the scaling factor on each axis, and adjust the origin to account for the
duncanFrance 0:0df0b8e0dc55 86 // offset used during calibration
duncanFrance 0:0df0b8e0dc55 87 float xscale, yscale;
duncanFrance 0:0df0b8e0dc55 88 int axmin, axmax, aymin, aymax;
duncanFrance 0:0df0b8e0dc55 89 xscale = (xmax - xmin) / (LCD_X_RES - 2*CAL_OFFSET);
duncanFrance 0:0df0b8e0dc55 90 axmin = xmin - CAL_OFFSET * xscale;
duncanFrance 0:0df0b8e0dc55 91 axmax = xmax + CAL_OFFSET * xscale;
duncanFrance 0:0df0b8e0dc55 92
duncanFrance 0:0df0b8e0dc55 93 yscale = (ymax - ymin) / (LCD_Y_RES - 2*CAL_OFFSET);
duncanFrance 0:0df0b8e0dc55 94 aymin = ymin - CAL_OFFSET * yscale;
duncanFrance 0:0df0b8e0dc55 95 aymax = ymax + CAL_OFFSET * yscale;
duncanFrance 0:0df0b8e0dc55 96
duncanFrance 0:0df0b8e0dc55 97 pc->printf("#define TOUCH_X_MIN %u\r\n", axmin);
duncanFrance 0:0df0b8e0dc55 98 pc->printf("#define TOUCH_X_MAX %u\r\n", axmax);
duncanFrance 0:0df0b8e0dc55 99 pc->printf("#define TOUCH_Y_MIN %u\r\n", aymin);
duncanFrance 0:0df0b8e0dc55 100 pc->printf("#define TOUCH_Y_MAX %u\r\n", aymax);
duncanFrance 0:0df0b8e0dc55 101 }
duncanFrance 0:0df0b8e0dc55 102
duncanFrance 0:0df0b8e0dc55 103 int main()
duncanFrance 0:0df0b8e0dc55 104 {
duncanFrance 0:0df0b8e0dc55 105 pc = new Serial(USBTX, USBRX);
duncanFrance 0:0df0b8e0dc55 106 pc->baud (9600);
duncanFrance 0:0df0b8e0dc55 107 pc->printf("\n\nSystem Core Clock = %.3f MHZ\r\n",(float)SystemCoreClock/1000000);
duncanFrance 0:0df0b8e0dc55 108
duncanFrance 0:0df0b8e0dc55 109 mySCREEN = new ILI932x(PAR_8, PortC, LCD_CS, LCD_RESET, LCD_RS, LCD_WR, LCD_RD,"myLCD");
duncanFrance 0:0df0b8e0dc55 110
duncanFrance 0:0df0b8e0dc55 111 pc->printf("Screen id %d\r\n", mySCREEN->tftID);
duncanFrance 0:0df0b8e0dc55 112
duncanFrance 0:0df0b8e0dc55 113 mySCREEN->set_orientation(0);
duncanFrance 0:0df0b8e0dc55 114 mySCREEN->cls(); // clear the screen
duncanFrance 0:0df0b8e0dc55 115 mySCREEN->locate(0,0);
duncanFrance 0:0df0b8e0dc55 116 mySCREEN->background(backgroundcolor); // set background to black
duncanFrance 0:0df0b8e0dc55 117 mySCREEN->foreground(foregroundcolor); // set chars to white
duncanFrance 0:0df0b8e0dc55 118 mySCREEN->set_font((unsigned char*) Arial24x23);
duncanFrance 0:0df0b8e0dc55 119
duncanFrance 0:0df0b8e0dc55 120 touchScreen = new TouchScreen(T_DIN, T_DOUT, T_CLK, T_CS, T_IRQ);
duncanFrance 0:0df0b8e0dc55 121 touchScreen->setTouchStartHandler(&touchStart);
duncanFrance 0:0df0b8e0dc55 122 touchScreen->setTouchMoveHandler(&touchMove);
duncanFrance 0:0df0b8e0dc55 123 touchScreen->setTouchEndHandler(&touchEnd);
duncanFrance 0:0df0b8e0dc55 124 touchScreen->setLCDGeometry(LCD_X_RES, LCD_Y_RES, TOUCHSCREEN_ORIENTATION_PORTRAIT | TOUCHSCREEN_ORIENTATION_ROTATED);
duncanFrance 0:0df0b8e0dc55 125 touchScreen->setCalibration(TOUCH_X_MIN, TOUCH_X_MAX, TOUCH_Y_MIN, TOUCH_Y_MAX);
duncanFrance 0:0df0b8e0dc55 126
duncanFrance 0:0df0b8e0dc55 127 while (1) {
duncanFrance 0:0df0b8e0dc55 128 pc->printf("Calibrate..\r\n");
duncanFrance 0:0df0b8e0dc55 129 cal(CAL_OFFSET, CAL_OFFSET);
duncanFrance 0:0df0b8e0dc55 130 cal(LCD_X_RES-CAL_OFFSET, CAL_OFFSET);
duncanFrance 0:0df0b8e0dc55 131 cal(CAL_OFFSET, LCD_Y_RES-CAL_OFFSET);
duncanFrance 0:0df0b8e0dc55 132 cal(LCD_X_RES-CAL_OFFSET, LCD_Y_RES-CAL_OFFSET);
duncanFrance 0:0df0b8e0dc55 133 print_calibration();
duncanFrance 0:0df0b8e0dc55 134 Thread::wait(1000);
duncanFrance 0:0df0b8e0dc55 135 }
duncanFrance 0:0df0b8e0dc55 136 }