diff --git a/common/touch/screen_calibrate.c b/common/touch/screen_calibrate.c new file mode 100644 index 0000000..518f159 --- /dev/null +++ b/common/touch/screen_calibrate.c @@ -0,0 +1,102 @@ +#include "screen_calibrate.h" +#include "tft.h" +#include "touch.h" + + +#define CCENTER 20 //Pixel Distance from Sides for Calibration Cross +#define CLENGTH 10 //Length of the Calibration Cross Lines +#define CBEGIN (CCENTER-CLENGTH/2) +#define CEND (CCENTER + CLENGTH/2) +#define DWIDTH 320 +#define DHEIGHT 240 + +extern volatile bool calibration; //from touch.c + + +static void enter(void* screen) { + int _x1,_y1,_x2,_y2,dx,dy; + + tft_clear(BLACK); + + tft_print_line(50,50,WHITE,BLACK,0,"Hit the markers exactly!"); + //-----------------First Point-------------------- + tft_draw_line(CCENTER,CBEGIN,CCENTER,CEND,WHITE); //Draw Cross + tft_draw_line(CBEGIN,CCENTER,CEND,CCENTER,WHITE); //Draw Cross + calibration=1; //TouchX + TouchY Values will not be converted to Pixels + while(calibration); //Wait on PenUp + POINT_STRUCT p1 = touch_get_last_point(); + _x1=p1.x; + _y1=p1.y; + tft_fill_rectangle(CBEGIN,CBEGIN,CEND,CEND,BLACK); //Clear Cross + + //-----------------Second Point------------------- + tft_draw_line(DWIDTH-CCENTER,DHEIGHT-CBEGIN,DWIDTH-CCENTER,DHEIGHT-CEND,WHITE); + tft_draw_line(DWIDTH-CBEGIN,DHEIGHT-CCENTER,DWIDTH-CEND,DHEIGHT-CCENTER,WHITE); + calibration=1; + while(calibration); + POINT_STRUCT p2 = touch_get_last_point(); + _x2=p2.x; + _y2=p2.y; + tft_fill_rectangle(DWIDTH-CBEGIN,DHEIGHT-CBEGIN,DWIDTH-CEND,DHEIGHT-CEND,BLACK); + + //-----------------Third Point-------------------- + tft_draw_line(CCENTER,DHEIGHT-CBEGIN,CCENTER,DHEIGHT-CEND,WHITE); + tft_draw_line(CBEGIN,DHEIGHT-CCENTER,CEND,DHEIGHT-CCENTER,WHITE); + calibration=1; + while(calibration); + POINT_STRUCT p3 = touch_get_last_point(); + _x1+=p3.x; //Add(!) values. We'll build the average later + _y2+=p3.y; + tft_fill_rectangle(CBEGIN,DHEIGHT-CBEGIN,CEND,DHEIGHT-CEND,BLACK); + + //------------------4. Point--------------------- + tft_draw_line(DWIDTH-CCENTER,CBEGIN,DWIDTH-CCENTER,CEND,WHITE); + tft_draw_line(DWIDTH-CBEGIN,CCENTER,DWIDTH-CEND,CCENTER,WHITE); + calibration=1; + while(calibration); + POINT_STRUCT p4 = touch_get_last_point(); + _x2+=p4.x; + _y1+=p4.y; + tft_fill_rectangle(DWIDTH-CBEGIN,CBEGIN,DWIDTH-CEND,CEND,BLACK); + //-------------------Calculation--------------------- + _x1++; //Add 1 and divide by 2 later = +0.5 (for correct rounding) + _y1++; + _x2++; + _y2++; + _x1>>=1; //Divide by 2 + _y1>>=1; + _x2>>=1; + _y2>>=1; + dx = (_x2-_x1); //Build the Difference + dy = (_y2-_y1); + + touch_set_calibration_valules(_x1,dx,_y1,dy); + tft_print_line(50,50,WHITE,BLACK,0,"Calibration Done. Press anywhere"); + + calibration=1; + while(calibration); + gui_screen_back(); + +} + +static void leave(void* screen) { + +} + +static void update(void* screen) { + +} + + +static SCREEN_STRUCT screen = { + enter, + leave, + update +}; + + +SCREEN_STRUCT* get_screen_calibrate() { + return &screen; +} + + diff --git a/common/touch/screen_calibrate.h b/common/touch/screen_calibrate.h new file mode 100644 index 0000000..df6e42b --- /dev/null +++ b/common/touch/screen_calibrate.h @@ -0,0 +1,24 @@ +#include "screen.h" + +/** + * @addtogroup touch + */ +/*@{*/ + + +/** + * @defgroup calibrate Calibrate (Screen) + * The calibrate screen for the touch module + */ +/*@{*/ + + +/** + * Returns a pointer to the calibrate screen + * \sa gui_screen_navigate + * @return + */ +SCREEN_STRUCT* get_screen_calibrate(); + +/*@}*/ +/*@}*/ diff --git a/common/touch/touch.c b/common/touch/touch.c index abd85b0..9947b28 100644 --- a/common/touch/touch.c +++ b/common/touch/touch.c @@ -19,6 +19,27 @@ TOUCH_AREA_STRUCT* areas[NUM_AREAS] = {NULL}; //list with pointers to all manage volatile POINT_STRUCT pos; //the last touch point volatile TOUCH_STATE oldState=TOUCH_UP; //the last touch state +volatile bool calibration = false; //whether or not we're currently calibrating + +//Calibration Constants(Defaults= Timo's 3.2") +/*int cal_xs=0x0231; +int cal_dx=0x0C08; +int cal_ys=0x0287; +int cal_dy=0x0B56;*/ + +int cal_xs=20; +int cal_dx=20; +int cal_ys=20; +int cal_dy=20; + +void touch_set_calibration_valules(int xs, int dx, int ys, int dy) { + cal_xs = xs; + cal_ys = ys; + cal_dx = dx; + cal_dy = dy; +} + + bool touch_init() { return ll_touch_init(); @@ -30,6 +51,24 @@ bool touch_add_raw_event(uint16_t touchX, uint16_t touchY, TOUCH_STATE state) { bool penDown = (state==TOUCH_DOWN); bool oldPenDown = (oldState==TOUCH_DOWN); oldState=state; + + if(calibration) //If in Calibration mode + { + + if(penDown) + { + pos.x=touchX; + pos.y=touchY; + } + else + { + if(oldPenDown) //Run only if we got at least one pen down + calibration=0; //Calibration finish (Touch X and Y are the values from the last measure, where the pen was down) + } + return true; + } + + pos.x=touchX; pos.y=touchY; diff --git a/common/touch/touch.h b/common/touch/touch.h index 6551ef4..41a00ef 100644 --- a/common/touch/touch.h +++ b/common/touch/touch.h @@ -110,6 +110,15 @@ void touch_unregister_area(TOUCH_AREA_STRUCT* area); */ POINT_STRUCT touch_get_last_point(); +/** + * Set's the new calibration values + * @param xs x offset (to calibration point 1) + * @param dx x difference (between calibration point 1 and 2) + * @param ys y offset (to calibration point 1) + * @param dy y difference (between calibration point 1 and 2) + */ +void touch_set_calibration_valules(int xs, int dx, int ys, int dy); + /*@}*/ diff --git a/emulator/qt/mainwindow.cpp b/emulator/qt/mainwindow.cpp index 80341f3..0ed5eea 100644 --- a/emulator/qt/mainwindow.cpp +++ b/emulator/qt/mainwindow.cpp @@ -69,7 +69,7 @@ void MainWindow::draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t //render_mutex.lock(); QPainter painter(&(image)); painter.setPen(QColorFromRGB565(color)); - painter.drawRect(x1,y1,abs(x2-x1)+1,abs(y2-y1)+1); + painter.drawRect(qMin(x1,x2),qMin(y1,y2),abs((int)x2-(int)x1)+1,abs((int)y2-(int)y1)+1); //render_mutex.unlock(); update(); } @@ -78,7 +78,7 @@ void MainWindow::fill_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t { //render_mutex.lock(); QPainter painter(&(image)); - painter.fillRect(x1,y1,abs(x2-x1)+1,abs(y2-y1)+1,QColorFromRGB565(color)); + painter.fillRect(qMin(x1,x2),qMin(y1,y2),abs((int)x2-(int)x1)+1,abs((int)y2-(int)y1)+1,QColorFromRGB565(color)); //render_mutex.unlock(); update(); }