- ANALOG METER, initial offering - Emulation of an analog/mechanical meter using the SPI TFT display \"http://mbed.org/cookbook/SPI-driven-QVGA-TFT\" (touch not used) Meter takes an integer number from 0 - 100 and uses that number to position the meter\'s needle - An additional auto-scaling feature allows for + floating numbers from 0.0 - 10000.0 in \"NewfNumb\" Scaling is noted two ways a. Color of the meter body changes b. A text scale factor is displayed in the upper, right-hand corner, near the full scale reading Value of \"NewfNumb\" Meter_Body Scale_Factor < -0.0 Blue 0 0.1 - 9.9 Green x1 10.0 - 99.0 Yellow x10 100.0 - 999.0 Orange x100 1000.0 - 9990.0 Red x1k >= 10000.0 Red peg! - If NewfNumb is > 600.0, a flashing yellow warning message appears in the center of the meter movement - The date and time are displayed in the lower right corner of the display - The value of NewfNumb being shown in the movement is also displayed in the lower left coener of the display - A timer ISR automatically updates the meter\'s movement Other Stuff: - Additional demo test program, walks analog meter up and down through all auto scales by manipulating the value of NewfNumb - USB serial port used to dump a few messages. Not needed, set to 921600 BAUD - LED1 slowly gets brighter and dimmer as main loop runs - If for some reason, the \"MeterNumber\" int register ends up >100 or <0, a Purple display appears at 50% movement with a \"bad#\" scale factor - There is NO provision for setting the RTC. Note that TimeZone and DST are added to the RTC number
Touch_tft/touch_tft.cpp
- Committer:
- loopsva
- Date:
- 2012-01-31
- Revision:
- 0:fc70640071d2
File content as of revision 0:fc70640071d2:
/* mbed library for resistive touch pads * uses 4 pins - 2 IO and 2 Analog * c 2011 Peter Drescher - DC2PD * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "touch_tft.h" #include "mbed.h" #define threshold 0x2000 // threshold to detect pressed touch_tft::touch_tft(PinName xp, PinName xm, PinName yp, PinName ym, PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset,const char* name): _xp(xp),_xm(xm),_yp(yp),_ym(ym),_ax(xp),_ay(yp), SPI_TFT(mosi,miso,sclk,cs,reset,name) { xa = xp; ya = yp; } point touch_tft::get_touch() { unsigned short x1 = 0,x2 = 0, y1 = 0, y2 = 0; unsigned int s1 = 0,s2 = 0,d1 , d2; point p; do { // read y voltage _xp.output(); _xm.output(); switch (orientation) { case(0): case(3): _xp = 1; _xm = 0; break; case(1): case(2): _xp = 0; _xm = 1; break; } _ym.input(); // y- have to be passive AnalogIn Ay(ya); // we have to call the constructor to switch to analog mode wait_us(10); y1 = Ay.read_u16(); // get y voltage d1 = (y1 > y2)? (y1-y2) : (y2-y1); if (((y1 < 8000) && (d1 < 2000)) || ((y1 > 8000) && (d1 < 150))) s1 ++; else { if (s1 > 0) s1 --; } y2 = y1; // debug //locate(1,7); //printf("d: %4d y: %5d s1: %4d",d1,y1,s1); // read x voltage _yp.output(); _ym.output(); switch (orientation) { case(0): case(1): _yp = 1; _ym = 0; break; case(2): case(3): _yp = 0; _ym = 1; break; } _xm.input(); // x- have to be passive AnalogIn Ax(xa); // we have to call the constructor to switch to analog mode wait_us(10); x1 = Ax.read_u16(); // get x voltage d2 = (x1 > x2)? (x1-x2) : (x2-x1); if (((x1 < 8000) && (d2 < 2000)) || ((x1 > 8000) && (d2 < 150))) s2 ++; else { if (s2 > 0) s2 --; } x2 = x1; // debug //locate(1,8); //printf("d: %4d x: %5d s2: %4d",d2,x1,s2); } while (s1 < 3 || s2 < 3); // read until we have three samples close together switch (orientation) { case(0): case(2): p.y = (x1+x2) / 2; // average of two sample p.x = (y1+y2) / 2; break; case(1): case(3): p.x = (x1+x2) / 2; // average of two sample p.y = (y1+y2) / 2; break; } return(p); } void touch_tft::calibrate(void) { int i; int a = 0,b = 0,c = 0, d = 0; int pos; point p; cls(); line(0,3,6,3,White); line(3,0,3,6,White); pos = columns() / 2 - 5; locate(pos,5); printf("press cross"); locate(pos,6); printf("to calibrate"); for (i=0; i<5; i++) { do { p = get_touch(); } while (p.x < 0x2000 | p.y < 0x2000); // wait for touch a += p.x; b += p.y; } a = a / 5; b = b / 5; locate(pos,5); printf("OK "); do { p = get_touch(); } while (p.y > 0x2000 | p.x > 0x2000); // wait for no touch cls(); line(width() -5, height() - 8,width() - 5,height() -1,White); // paint cross line(width() - 8,height() - 5,width() - 1,height() - 5,White); locate(pos,5); printf("press cross"); locate(pos,6); printf("to calibrate"); for (i=0; i<5; i++) { do { p = get_touch(); } while (p.y < 0x2000 | p.x < 0x2000); // wait for touch c+= p.x; d+= p.y; } c = c / 5; d = d / 5; locate(pos,5); printf("OK "); do { p = get_touch(); } while (p.y > 0x2000 | p.x > 0x2000); // wait for no touch cls(); x_off = a; y_off = b; i = c-a; // delta x pp_tx = i / (width() - 6); i = d-b; // delta y pp_ty = i / (height() - 6); } // kb adds \/ \/ \/ unsigned short pp_txx, pp_tyy; unsigned short xx_off,yy_off; //unsigned short pp_txxx, pp_tyyy; //unsigned short xxx_off,yyy_off; unsigned short touch_tft::getCalDataX() { pp_txx = pp_tx; return(pp_txx); } unsigned short touch_tft::getCalDataY() { pp_tyy = pp_ty; return(pp_tyy); } unsigned short touch_tft::getCalOffX() { xx_off = x_off; return(xx_off); } unsigned short touch_tft::getCalOffY() { yy_off = y_off; return(yy_off); } void touch_tft::setCalDataX(unsigned short pp_txx) { pp_tx = pp_txx; } void touch_tft::setCalDataY(unsigned short pp_tyy) { pp_ty = pp_tyy; } void touch_tft::setCalOffX(unsigned short xx_off) { x_off = xx_off; } void touch_tft::setCalOffY(unsigned short yy_off) { y_off = yy_off; } // kb adds /\ /\ /\ point touch_tft::to_pixel(point a_point) { point p; p.x = (a_point.x - x_off) / pp_tx; if(p.x > width()) p.x = 0; p.y = (a_point.y - y_off) / pp_ty; if(p.y > height()) p.y = 0; return (p); } bool touch_tft::is_touched(point a){ if (a.x > threshold & a.y > threshold) return(true); else return(false); }