Revision 0:d0e2979d7ed6, committed 2012-04-10
- Comitter:
- apm_litoral
- Date:
- Tue Apr 10 03:34:09 2012 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r d0e2979d7ed6 touch_tft.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/touch_tft.cpp Tue Apr 10 03:34:09 2012 +0000
@@ -0,0 +1,257 @@
+#include "touch_tft.h"
+#include "mbed.h"
+#include "Arial12x12.h"
+
+#define threshold 10000
+
+touch_tft::touch_tft(PinName xp, PinName xm, PinName yp, PinName ym, PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset, PinName bk, const char *name)
+ :_xp(xp),_xm(xm),_yp(yp),_ym(ym),_ax(xp),_ay(yp), SPI_TFT(mosi,miso,sclk,cs,reset,bk,name) {
+ xa = xp;
+ ya = yp;
+
+}
+
+/* Esta clase trae el valor de p, siendo "p" un puntero
+*
+*/
+point touch_tft::get_touch() { //puntero a touch clase get_touch
+ unsigned short x1 = 0,x2 = 0, y1 = 0, y2 = 0;
+ unsigned int s1 = 0,s2 = 0,d1 = 0 , d2 = 0;
+ point p;
+
+ do {
+ /******************************************************************************************/
+ // lee el voltaje en Y
+ _xp.output(); //define salidas para x+ y x-
+ _xm.output();
+ switch (orientation) {
+ case(0): //En casos de orientacion 0 y 3
+ case(3): //pone en alto el x+
+ _xp = 1; //pone en bajo el x-
+ _xm = 0;
+ break;
+ case(1): //sino lo contrario
+ case(2):
+ _xp = 0;
+ _xm = 1;
+ break;
+ }
+ _ym.input(); // define y- como entrada para q sea "pasivo"
+ AnalogIn Ay(ya); // define constructor analogico como Ay para el pin y+
+ // wait_us(10);
+ y1 = Ay.read_u16(); // trae el voltaje en y1 desde y+ en el rango de 0 a 65535
+ d1 = (y1 > y2)? (y1-y2) : (y2-y1); // //condiciona si y1 es mayor q y2 entonces opera d1=y1-y2 y si no es correcto entonces opera d1=y2-y1
+ if (((y1 < 8000) && (d1 < 2000)) || ((y1 > 8000) && (d1 < 150))) s1 ++; // si (y1<8000 Y d1<2000) O (y1>8000 Y d1<150)
+ // 32768 8192 32768 336
+ else {
+ if (s1 > 0) s1=0; //entonces s1 = s1+1, sino pregunta si s1>0 entonces s1 = s1-1
+ }
+ y2 = y1; //y2 es ahora igual a y1
+ //debug
+ //locate(1,7);
+ //printf("d: %4d y: %5d s1: %4d",d1,y1,s1);
+ /******************************************************************************************/
+ // // lee el voltaje en X
+ _yp.output(); //define salidas para y+ y y-
+ _ym.output();
+ switch (orientation) {
+ case(0): //En casos de orientacion 0 y 3
+ case(1): //pone en alto el x+
+ _yp = 1; //pone en bajo el x-
+ _ym = 0;
+ break;
+ case(2):
+ case(3):
+ _yp = 0; //sino lo contrario
+ _ym = 1;
+ break;
+ }
+ _xm.input(); // define x- como entrada para q sea "pasivo"
+ AnalogIn Ax(xa); // define constructor analogico como Ax para el pin x+
+ // wait_us(0);
+ x1 = Ax.read_u16(); // trae el voltaje en x1 desde x+ en el rango de 0 a 65535
+ d2 = (x1 > x2)? (x1-x2) : (x2-x1); //condiciona si x1 es mayor q x2 entonces opera d2=x1-x2 y si no es correcto entonces opera d2=x2-x1
+ if (((x1 < 8000) && (d2 < 2000)) || ((x1 > 8000) && (d2 < 150))) s2 ++; // si (x1<8000 Y d2<2000) O (x1>8000 Y d2<150) //si(1+1)-> s2++
+ // 32768 8192 32768 336
+ else {
+ if (s2 > 0) s2=0; //entonces s2 = s2+1, sino pregunta si s2>0 entonces s2 = s2-1
+ }
+ x2 = x1; //y2 es ahora igual a y1
+ // debug
+ //locate(1,18);
+ //printf("d: %4d x: %5d s2: %4d",d2,x1,s2);
+
+
+ //wait_us(20);
+
+ } while (s1 < 5 || s2 < 5); // read until we have three samples close together
+
+
+
+
+ switch (orientation) {
+ case(0):
+ case(2):
+ p.y = (x1+x2) / 2; // promedio de dos muestras
+ p.x = (y1+y2) / 2;
+ break;
+ case(1):
+ case(3):
+ p.x = (x1+x2) / 2; // promedio de dos muestras
+ p.y = (y1+y2) / 2;
+ break;
+ }
+
+ return(p);
+}
+
+void touch_tft::calibrate(void) {
+ int i;
+ int a = 0,b = 0,c = 0, d = 0;
+
+ //desde aki ocultar despues
+/*
+ int pos_x, pos_y;
+ point p;
+
+ set_font((unsigned char*)Arial12x12); // select the font
+ // get the center of the screen
+ pos_x = (columns() / 2) + 2;
+ pos_x = pos_x * font[1];
+ pos_y = (rows() / 2) - 1;
+ pos_y = pos_y * font[2];
+
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ //calcula primera posicion en extremo superior derecho
+ cls();
+ line(0,3,3,3,Orange);
+ line(3,0,3,3,Orange);
+ locate(pos_x- font[2]*3,pos_y);
+ printf(" top ");
+ locate(pos_x - font[2]*3 ,pos_y + font[2]);
+ printf("right");
+
+ for (i=0; i<5; i++) {
+ while (p.y < threshold | p.x < threshold) // wait for TRUE touch 8192
+ {
+ p = get_touch();
+ }
+ a += p.x;
+ b += p.y;
+ }
+
+ a = a/5;//55025;//a / 5;
+ b = b/5;//9566;//b / 5;
+ locate(1,36);
+ printf("a: %4d b: %5d p.x: %4d p.y: %4d",a,b,p.x,p.y);//55405 9202 54669 9394 55069 9602 54957 10066 promedio a:55025
+ wait(10);
+ cls();
+ locate(pos_x - font[2]*2,pos_y);
+ printf("Good!");
+ wait(0.5);
+
+ while (p.y > 10000 | p.x > 10000) // wait for no touch
+ {
+ p = get_touch();
+ locate(1,36);
+ printf("p.x: %4d p.y: %4d",p.x,p.y);//55405 9202 54669 9394 55069 9602 54957 10066 promedio a:55025
+ }
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ //calcula segunda posicion en extremo inferior izquierdo
+ cls();
+ line(317,237,320,237,Orange); // paint cross
+ line(317,237,317,240,Orange);
+ locate(pos_x- font[2]*3,pos_y);
+ printf("booton");
+ locate(pos_x- font[2]*3,pos_y + font[2]);
+ printf(" left ");
+ for (i=0; i<5; i++) {
+ while (p.y < threshold | p.x < threshold) // wait for TRUE touch
+ {
+ p = get_touch();
+ }
+ c+= p.x;
+ d+= p.y;
+ }
+ c = c/5;//9786;// c / 5;
+ d = d/5;//55933;// d / 5;
+ locate(1,66);
+ printf("c: %4d d: %5d p.x: %4d p.y: %4d",c,d,p.x,p.y);// 9842 55965 9122 55901 9730 56541
+ wait(10);
+ cls();
+ locate(pos_x - font[2]*2,pos_y);
+ printf("Good!");
+ wait(0.5);
+
+ while (p.y > 10000 | p.x > 10000) // wait for no touch
+ {
+ p = get_touch();
+ locate(1,36);
+ printf("p.x: %4d p.y: %4d",p.x,p.y);//55405 9202 54669 9394 55069 9602 54957 10066 promedio a:55025
+ }
+
+*/
+///////////////////////////////////////////////////HASTA AKI LAS OPERACIONES////////////////////////////////////////////////////////
+//Constantes para orientaciones 1 y 3:
+ /*
+ a = 9850;
+ b = 9314;//11650
+ c = 55250;
+ d = 54821;//55313
+ */
+//Constantes para orientaciones 0 y 2:
+
+ a = 9750;
+ b = 8550;//11650
+ c = 55250;
+ d = 54521;//55313
+
+
+ x_off = a;
+ y_off = b;
+
+ i = c-a; // delta x pp_tx = (c-a)/(w-6) = (54450-11600)/(320-6) = 42850/(314) = 136.46
+ pp_tx = abs(i) / (width() - 6);
+
+ i = d-b; // delta y
+ pp_ty = abs(i) / (height() - 4);
+ //cls();
+}
+
+
+point touch_tft::to_pixel(point a_point) {
+ point p;
+
+
+ p.x = ((a_point.x - x_off) / pp_tx)+4;
+ if (p.x > width()) p.x = width();
+ p.y = (a_point.y - y_off) / pp_ty;
+ if (p.y > height()) p.y = height();
+ return (p);
+}
+
+bool touch_tft::is_touched(point a) {
+ if (a.x > threshold & a.y > threshold) return(true);
+ else return(false);
+}
+
+point touch_tft::shared_pointer(unsigned int xo,unsigned int xf, unsigned int speed, unsigned repetitions) {
+ int Delta_X;
+ point p;
+ Delta_X = (xf-xo);
+ windows (xo,0,xf,240);
+ p = get_touch();
+ if (is_touched(p)) {
+ p = to_pixel(p);
+ if (p.x <= xf && p.x >= xo){
+ //if (p.x <= Delta_X)
+ sharepoint(xo,320-xf,Delta_X,abs(Delta_X-p.x-1),speed,repetitions);
+ }
+ wait(0.125);
+ }
+ return (p);
+
+}
\ No newline at end of file
diff -r 000000000000 -r d0e2979d7ed6 touch_tft.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/touch_tft.h Tue Apr 10 03:34:09 2012 +0000
@@ -0,0 +1,79 @@
+#ifndef MBED_TOUCH_H
+#define MBED_TOUCH_H
+
+#include "mbed.h"
+#include "SPI_TFT.h"
+
+struct point{
+ unsigned short x;
+ unsigned short y;
+ };
+
+
+class touch_tft : public SPI_TFT{
+public:
+ /** create a TFT with touch object connected to the pins:
+ *
+ * @param pin xp resistiv touch x+
+ * @param pin xm resistiv touch x-
+ * @param pin yp resistiv touch y+
+ * @param pin ym resistiv touch y-
+ * @param mosi,miso,sclk SPI connection to TFT
+ * @param cs pin connected to CS of display
+ * @param reset pin connected to RESET of display
+ * based on my SPI_TFT lib
+ */
+ touch_tft(PinName xp, PinName xm, PinName yp, PinName ym,PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset, PinName bk, const char* name ="TFT");
+
+ /** calibrate the touch display
+ *
+ * User is asked to touch on two points on the screen
+ */
+ void calibrate(void);
+
+ /** read x and y analog samples
+ *
+ * @returns point(x,y)
+ */
+ point get_touch(void);
+
+ /** calculate coord on screen
+ *
+ * @param a_point point(analog x, analog y)
+ * @returns point(pixel x, pixel y)
+ *
+ */
+ point to_pixel(point a_point);
+
+ /** test if screen is touched
+ *
+ * @param point analog x,y
+ * @returns true is touched
+ *
+ */
+ point shared_pointer(unsigned int xo, unsigned int xf, unsigned int speed, unsigned repetitions);
+
+
+
+ bool is_touched(point a);
+
+protected:
+ DigitalInOut _xp;
+ DigitalInOut _xm;
+ DigitalInOut _yp;
+ DigitalInOut _ym;
+ AnalogIn _ax;
+ AnalogIn _ay;
+ PinName xa;
+ PinName ya;
+
+
+ unsigned short x_a,y_a;
+ unsigned short x_off,y_off;
+ unsigned short pp_tx,pp_ty;
+
+
+
+ };
+
+#endif