Library for 4D systems touchscreen
Diff: TouchScreen.cpp
- Revision:
- 0:edf5f3d8645e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TouchScreen.cpp Tue Aug 21 14:40:18 2012 +0000 @@ -0,0 +1,417 @@ +/** + * @file + * @version + * @author Ashley.Mills@vodafone.com + * @brief Touchscreen control. + */ + +#include "TouchScreen.h" + +#define WAIT_TIMEOUT_MS 1000 + +TouchScreen::TouchScreen(PinName tx, PinName rx, PinName resetPin, const char *name) : Serial(tx,rx,name) { + baud(9600); + _resetPin = new DigitalOut(resetPin); + _resetPin->write(1); + reset(); + _initOK = false; + putc('U'); + _initOK = gack(); + _fillColor = createRGBClassic(21,21,21); + _strokeColor = createRGBClassic(221,221,221); +} + +TouchScreen::TouchScreen(PinName tx, PinName rx, PinName resetPin, eBaudRate baudRate, const char *name) : Serial (tx,rx,name) { + baud(9600); + _resetPin = new DigitalOut(resetPin); + _resetPin->write(1); + reset(); + _initOK = false; + putc('U'); + if((_initOK=gack())) { + setBaudRate(baudRate); + } + _fillColor = createRGBClassic(21,21,21); + _strokeColor = createRGBClassic(221,221,221); +} + +void TouchScreen::reset() { + _resetPin->write(0); + Thread::wait(2); + _resetPin->write(1); + Thread::wait(3000); +} + +void TouchScreen::clearScreen() { + putc('E'); + gack(); +} + +bool TouchScreen::setBaudRate(eBaudRate baudRate) { + long newRate = 9600; + uint8_t rateCommand = (uint8_t)0x06; + putc('Q'); + switch(baudRate) { + case BAUD_9600: + rateCommand = (uint8_t)0x06; + newRate = 9600; + break; + + case BAUD_14400: + rateCommand = (uint8_t)0x07; + newRate = 14400; + break; + + case BAUD_19200: + rateCommand = (uint8_t)0x08; + newRate = 19200; + break; + + case BAUD_57600: + rateCommand = (uint8_t)0x0C; + newRate = 57600; + break; + + case BAUD_115200: + rateCommand = (uint8_t)0x0D; + newRate = 115200; + break; + + case BAUD_256000: + rateCommand = (uint8_t)0x0F; + newRate = 256000; + break; + } + putc((uint8_t)rateCommand); + // doesn't seem to want to acknowledge at either the old baud rate or the new baud rate + dropBytes(1); + baud(newRate); + return true; +} + +void TouchScreen::setPenSolid() { + putc('p'); + putc((uint8_t)0x0); + gack(); +} + +void TouchScreen::setPenWireframe() { + putc('p'); + putc((uint8_t)0x1); + gack(); +} + +void TouchScreen::setBackgroundColor(uint16_t color) { + putc('K'); + putc(highByte(color)); + putc(lowByte(color)); + gack(); +} + +bool TouchScreen::waitUntilReadable() { + long timeOut = WAIT_TIMEOUT_MS; + Timer timer; + timer.start(); + while(1) { + if(readable()) + return true; + if(timer.read_ms()>timeOut) + return false; + } +} + +bool TouchScreen::gack() { + if(waitUntilReadable()) { + uint8_t b = getc(); + return (b==0x06); + } + return false; +} + +void TouchScreen::drawPixel(uint16_t xPos, uint16_t yPos, uint16_t color) { + putc('P'); + putc(highByte(xPos)); // x pos + putc(lowByte(xPos)); + + putc(highByte(yPos)); // y pos + putc(lowByte(yPos)); + + putc(highByte(color)); // color + putc(lowByte(color)); + gack(); +} + +void TouchScreen::drawCircle(uint16_t xPos, uint16_t yPos, uint16_t radius, uint16_t color) { + putc('C'); + putc(highByte(xPos)); // x pos + putc(lowByte(xPos)); + + putc(highByte(yPos)); // y pos + putc(lowByte(yPos)); + + putc(highByte(radius)); // radius + putc(lowByte(radius)); + + putc(highByte(color)); // color + putc(lowByte(color)); + gack(); +} + +uint16_t TouchScreen::createRGBClassic(int r, int g, int b) { + return createRGBF(r/255.0f,g/255.0f,b/255.0f); +} + +uint16_t TouchScreen::createRGB(uint8_t r, uint8_t g, uint8_t b) { + if(r>31) r = 31; + if(g>63) g = 63; + if(b>31) b = 31; + uint16_t o = 0; + o |= (r<<0xb); + o |= (g<<0x5); + o |= b; + return o; +} + +uint16_t TouchScreen::createRGBF(float r, float g, float b) { + return createRGB((uint8_t)(r*31.0f),(uint8_t)(g*63.0f),(uint8_t)(b*31.0f)); +} + +void TouchScreen::enableTouch() { + putc('Y'); + putc((uint8_t)0x5); + putc((uint8_t)0x0); + gack(); +} + +void TouchScreen::disableTouch() { + putc('Y'); + putc((uint8_t)0x5); + putc((uint8_t)0x1); + gack(); +} + +void TouchScreen::setOrientation(eScreenOrientation o) { + putc('Y'); + putc((uint8_t)0x4); + putc((uint8_t)o); + gack(); +} + +void TouchScreen::getVersion() { + putc('V'); + putc((uint8_t)0x1); + dropBytes((uint16_t)5); +} + +void TouchScreen::dropBytes(uint16_t numBytes) { + while(numBytes--) { + dropByte(); + } +} + +void TouchScreen::drawImage(char *name, uint16_t x, uint16_t y) { + putc('@'); + putc('m'); + printf(name); + putc((uint8_t)0); + putc(highByte((uint16_t)x)); + putc(lowByte((uint16_t)x)); + putc(highByte((uint16_t)y)); + putc(lowByte((uint16_t)y)); + putc((uint8_t)0x00); + putc((uint8_t)0x00); + putc((uint8_t)0x00); + putc((uint8_t)0x00); + gack(); +} + +void TouchScreen::dropByte() { + if(waitUntilReadable()) { + getc(); + } +} + +void TouchScreen::dropByteAndWaitUntilReadable() { + if(waitUntilReadable()) { + getc(); + } + waitUntilReadable(); +} + +eTouchStatus TouchScreen::getTouchStatus() { + putc('o'); + putc((uint8_t)0x4); + dropByteAndWaitUntilReadable(); + uint8_t touchStatus = getc(); + dropByte(); + dropByte(); + return (eTouchStatus)touchStatus; +} + +TouchPoint TouchScreen::getLastTouch() { + TouchPoint p; + + putc('o'); + putc((uint8_t)0x05); + waitUntilReadable(); + uint8_t v = getc(); + p.x = (v<<0x8); + waitUntilReadable(); + p.x += getc(); + waitUntilReadable(); + v = getc(); + p.y = (v<<0x8); + waitUntilReadable(); + p.y += getc(); + return p; +} + +void TouchScreen::setBacklight(bool state) { + putc('Y'); + putc((uint8_t)0x00); + if(state) { + putc((uint8_t)0x01); + } else { + putc((uint8_t)0x00); + } + gack(); +} + +void TouchScreen::setContrast(uint8_t value) { + if(value>0x0F) + value = 0x0F; + putc('Y'); + putc((uint8_t)0x02); + putc(value); + gack(); +} + +void TouchScreen::drawGraphicsFormatString(uint16_t x, uint16_t y, eInternalFont font, uint16_t textColor, uint8_t charWidth, uint8_t charHeight, char* text) { + putc('S'); + putc((uint8_t)highByte(x)); + putc((uint8_t)lowByte(x)); + putc((uint8_t)highByte(y)); + putc((uint8_t)lowByte(y)); + putc((uint8_t)font); + putc((uint8_t)highByte(textColor)); + putc((uint8_t)lowByte(textColor)); + putc((uint8_t)charWidth); + putc((uint8_t)charHeight); + if(strlen(text)==256) { // change to own implementation of strnlen + text[256] = 0; + } + printf(text); + putc((uint8_t)0x00); + gack(); +} + + +void TouchScreen::drawTextFormatString(uint8_t row, uint8_t column, eInternalFont font, uint16_t textColor, char* text) { + putc('s'); + putc((uint8_t)column); + putc((uint8_t)row); + putc((uint8_t)font); + putc((uint8_t)highByte(textColor)); + putc((uint8_t)lowByte(textColor)); + if(strlen(text)==256) { // change to own implementation of strnlen + text[256] = 0; + } + printf(text); + putc((uint8_t)0x00); + gack(); +} + +void TouchScreen::drawRectangle(uint16_t topLeftX, uint16_t topLeftY, uint16_t botRightX, uint16_t botRightY, uint16_t color) { + putc('r'); + putc(highByte(topLeftX)); + putc(lowByte (topLeftX)); + putc(highByte(topLeftY)); + putc(lowByte (topLeftY)); + putc(highByte(botRightX)); + putc(lowByte (botRightX)); + putc(highByte(botRightY)); + putc(lowByte (botRightY)); + putc(highByte(color)); + putc(lowByte (color)); + gack(); +} + +void TouchScreen::drawRectangleWH(uint16_t topLeftX, uint16_t topLeftY, uint16_t width, uint16_t height, uint16_t color) { + uint16_t botRightX = topLeftX + width; + uint16_t botRightY = topLeftY + height; + putc('r'); + putc(highByte(topLeftX)); + putc(lowByte (topLeftX)); + putc(highByte(topLeftY)); + putc(lowByte (topLeftY)); + putc(highByte(botRightX)); + putc(lowByte (botRightX)); + putc(highByte(botRightY)); + putc(lowByte (botRightY)); + putc(highByte(color)); + putc(lowByte (color)); + gack(); +} + +void TouchScreen::drawRectangleWH(uint16_t topLeftX, uint16_t topLeftY, uint16_t width, uint16_t height) { + setPenSolid(); + drawRectangleWH(topLeftX,topLeftY,width,height,_fillColor); + setPenWireframe(); + drawRectangleWH(topLeftX,topLeftY,width,height,_strokeColor); + setPenSolid(); +} + + +void TouchScreen::drawLine(uint16_t topLeftX, uint16_t topLeftY, uint16_t botRightX, uint16_t botRightY, uint16_t color) { + putc('L'); + putc(highByte(topLeftX)); + putc(lowByte (topLeftX)); + putc(highByte(topLeftY)); + putc(lowByte (topLeftY)); + putc(highByte(botRightX)); + putc(lowByte (botRightX)); + putc(highByte(botRightY)); + putc(lowByte (botRightY)); + putc(highByte(color)); + putc(lowByte (color)); + gack(); +} + +void TouchScreen::drawChar(char c, uint16_t x, uint16_t y, uint16_t color, uint8_t width, uint8_t height) { + putc('t'); + putc(c); + putc(highByte(x)); + putc(lowByte (x)); + putc(highByte(y)); + putc(lowByte (y)); + putc(highByte(color)); + putc(lowByte (color)); + putc(width); + putc(height); + gack(); +} + + +void TouchScreen::setFont(uint8_t fontIndex) { + putc('F'); + putc(fontIndex); + gack(); +} + +void TouchScreen::drawText(char *s, uint16_t x, uint16_t y) { + drawGraphicsFormatString( + x,y, + INTERNAL_FONT_8x8, + _strokeColor, + 1,1, + s + ); +} + +void TouchScreen::setFillColor(uint16_t c) { + _fillColor = c; +} + +void TouchScreen::setStrokeColor(uint16_t c) { + _strokeColor = c; +}