diff -r 000000000000 -r b74b0e4902c3 components/tft/tft.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/tft/tft.h Sat Oct 20 13:23:15 2018 +0200 @@ -0,0 +1,583 @@ +/** + * @file tft.h + * @brief High level TFT functions + * @author LoBo 04/2017 + * @see https://github.com/loboris + */ + +#ifndef _TFT_H_ +#define _TFT_H_ + +#include +#include "tftspi.h" + +typedef struct { + uint16_t x1; + uint16_t y1; + uint16_t x2; + uint16_t y2; +} dispWin_t; + +typedef struct { + uint8_t *font; + uint8_t x_size; + uint8_t y_size; + uint8_t offset; + uint16_t numchars; + uint16_t size; + uint8_t max_x_size; + uint8_t bitmap; + color_t color; +} Font; + + +//========================================================================================== +// ==== Global variables =================================================================== +//========================================================================================== +extern uint8_t orientation; ///< current screen orientation +extern uint16_t font_rotate; ///< current font font_rotate angle (0~395) +extern uint8_t font_transparent; ///< if not 0 draw fonts transparent +extern uint8_t font_forceFixed; ///< if not zero force drawing proportional fonts with fixed width +extern uint8_t font_buffered_char; +extern uint8_t font_line_space; ///< additional spacing between text lines; added to font height +extern uint8_t text_wrap; ///< if not 0 wrap long text to the new line, else clip +extern color_t _fg; ///< current foreground color for fonts +extern color_t _bg; ///< current background for non transparent fonts +extern dispWin_t dispWin; ///< display clip window +extern float _angleOffset; ///< angle offset for arc, polygon and line by angle functions +extern uint8_t image_debug; ///< print debug messages during image decode if set to 1 + +extern Font cfont; ///< Current font structure + +extern int TFT_X; ///< X position of the next character after TFT_print() function +extern int TFT_Y; ///< Y position of the next character after TFT_print() function + +// ========================================================================================= + + +// Buffer is created during jpeg decode for sending data +// Total size of the buffer is 2 * (JPG_IMAGE_LINE_BUF_SIZE * 3) +// The size must be multiple of 256 bytes !! +#define JPG_IMAGE_LINE_BUF_SIZE 512 + +// --- Constants for ellipse function --- +#define TFT_ELLIPSE_UPPER_RIGHT 0x01 +#define TFT_ELLIPSE_UPPER_LEFT 0x02 +#define TFT_ELLIPSE_LOWER_LEFT 0x04 +#define TFT_ELLIPSE_LOWER_RIGHT 0x08 + +// Constants for Arc function +// number representing the maximum angle (e.g. if 100, then if you pass in start=0 and end=50, you get a half circle) +// this can be changed with setArcParams function at runtime +#define DEFAULT_ARC_ANGLE_MAX 360 +// rotational offset in degrees defining position of value 0 (-90 will put it at the top of circle) +// this can be changed with setAngleOffset function at runtime +#define DEFAULT_ANGLE_OFFSET -90 + +#define PI 3.14159265359 + +#define MIN_POLIGON_SIDES 3 +#define MAX_POLIGON_SIDES 60 + +// === Color names constants === +extern const color_t TFT_BLACK; +extern const color_t TFT_NAVY; +extern const color_t TFT_DARKGREEN; +extern const color_t TFT_DARKCYAN; +extern const color_t TFT_MAROON; +extern const color_t TFT_PURPLE; +extern const color_t TFT_OLIVE; +extern const color_t TFT_LIGHTGREY; +extern const color_t TFT_DARKGREY; +extern const color_t TFT_BLUE; +extern const color_t TFT_GREEN; +extern const color_t TFT_CYAN; +extern const color_t TFT_RED; +extern const color_t TFT_MAGENTA; +extern const color_t TFT_YELLOW; +extern const color_t TFT_WHITE; +extern const color_t TFT_ORANGE; +extern const color_t TFT_GREENYELLOW; +extern const color_t TFT_PINK; + +// === Color invert constants === +#define INVERT_ON 1 +#define INVERT_OFF 0 + +// === Special coordinates constants === +#define CENTER -9003 +#define RIGHT -9004 +#define BOTTOM -9004 + +#define LASTX 7000 +#define LASTY 8000 + +// === Embedded fonts constants === +#define DEFAULT_FONT 0 ///< 12 points 95 characters DejaVu font. +#define DEJAVU18_FONT 1 ///< 18 points 95 characters DejaVuSans font. +#define DEJAVU24_FONT 2 ///< 24 points 95 characters DejaVu font. +#define UBUNTU16_FONT 3 ///< 16 points 95 characters Ubuntu font. +#define COMIC24_FONT 4 ///< 24 points 95 characters Comic font. +#define MINYA24_FONT 5 ///< 24 points 95 characters Minya font. +#define TOONEY32_FONT 6 ///< 32 points 95 characters Tooney font. +#define SMALL_FONT 7 ///< 8x12 pixels 95 characters fixed font. +#define DEF_SMALL_FONT 8 ///< 9 points 95 characters font. +#define FONT_7SEG 9 ///< Variable size 14 characters 7 segment font. +#define USER_FONT 10 ///< font will be read from file + + + +// ===== PUBLIC FUNCTIONS ========================================================================= + + +/** + * @brief Draw pixel at given x,y coordinates + * @param x horizontal position + * @param y vertical position + * @param color pixel color + * @param sel if not 0 activate CS before and deactivat after sending pixel data to display + * when sending multiple pixels it is faster to activate the CS first, + * send all pixels an deactivate CS after all pixela was sent + */ +void TFT_drawPixel(int16_t x, int16_t y, color_t color, uint8_t sel); + +/** + * @brief Read pixel color value from display GRAM at given x,y coordinates + * @param[in] x horizontal position + * @param[in] y vertical position + */ +color_t TFT_readPixel(int16_t x, int16_t y); + +/** + * @brief Draw vertical line at given x,y coordinates + * + * @param x horizontal start position + * @param y vertical start position + * @param h line height in pixels + * @param color line color + */ +void TFT_drawFastVLine(int16_t x, int16_t y, int16_t h, color_t color); + +/** + * @brief Draw horizontal line at given x,y coordinates + * + * @param x horizontal start position + * @param y vertical start position + * @param w line width in pixels + * @param color line color + */ +void TFT_drawFastHLine(int16_t x, int16_t y, int16_t w, color_t color); + +/** + * @brief Draw line on screen + * + * @param x0 horizontal start position + * @param y0 vertical start position + * @param x1 horizontal end position + * @param y1 vertical end position + * @param color line color + */ +void TFT_drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, color_t color); + + +/** + * @brief Draw line on screen from (x,y) point at given angle + * Line drawing angle starts at lower right quadrant of the screen and is offseted by + * '_angleOffset' global variable (default: -90 degrees) + * + * @param x horizontal start position + * @param y vertical start position + * @param start start offset from (x,y) + * @param len length of the line + * @param angle line angle in degrees + * @param color line color + */ +void TFT_drawLineByAngle(uint16_t x, uint16_t y, uint16_t start, uint16_t len, uint16_t angle, color_t color); + +/** + * @brief Fill given rectangular screen region with color + * + * @param x horizontal rect start position + * @param y vertical rect start position + * @param w rectangle width + * @param h rectangle height + * @param color fill color + */ +void TFT_fillRect(int16_t x, int16_t y, int16_t w, int16_t h, color_t color); + +/** + * @brief Draw rectangle on screen + * + * @param x horizontal rect start position + * @param y vertical rect start position + * @param w rectangle width + * @param h rectangle height + * @param color rect line color + */ +void TFT_drawRect(uint16_t x1,uint16_t y1,uint16_t w,uint16_t h, color_t color); + +/** + * @brief Draw rectangle with rounded corners on screen + * + * @param x horizontal rect start position + * @param y vertical rect start position + * @param w rectangle width + * @param h rectangle height + * @param r corner radius + * @param color rectangle color + */ +void TFT_drawRoundRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t r, color_t color); + +/** + * @brief Fill given rectangular screen region with rounded corners with color + * + * @param x horizontal rect start position + * @param y vertical rect start position + * @param w rectangle width + * @param h rectangle height + * @param r corner radius + * @param color fill color + */ +void TFT_fillRoundRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t r, color_t color); + +/** + * @brief Fill the whole screen with color + * + * @param color fill color + */ +void TFT_fillScreen(color_t color); + +/** + * @brief Fill the current clip window with color + * + * @param color fill color + */ +void TFT_fillWindow(color_t color); + +/** + * @brief Draw triangle on screen + * + * @param x0 first triangle point x position + * @param y0 first triangle point y position + * @param x0 second triangle point x position + * @param y0 second triangle point y position + * @param x0 third triangle point x position + * @param y0 third triangle point y position + * @param color triangle color + */ +void TFT_drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color); + +/** + * @brief Fill triangular screen region with color + * + * @param x0 first triangle point x position + * @param y0 first triangle point y position + * @param x0 second triangle point x position + * @param y0 second triangle point y position + * @param x0 third triangle point x position + * @param y0 third triangle point y position + * @param color fill color + */ +void TFT_fillTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color); + +/** + * @brief Draw circle on screen + * + * @param x circle center x position + * @param y circle center x position + * @param r circle radius + * @param color circle color + */ +void TFT_drawCircle(int16_t x, int16_t y, int radius, color_t color); + +/** + * @brief Fill circle on screen with color + * + * @param x circle center x position + * @param y circle center x position + * @param r circle radius + * @param color circle fill color + */ +void TFT_fillCircle(int16_t x, int16_t y, int radius, color_t color); + +/** + * @brief Draw ellipse on screen + * + * @param x0 ellipse center x position + * @param y0 ellipse center x position + * @param rx ellipse horizontal radius + * @param ry ellipse vertical radius + * @param option drawing options, multiple options can be combined + * + * 1 (TFT_ELLIPSE_UPPER_RIGHT) draw upper right corner + * 2 (TFT_ELLIPSE_UPPER_LEFT) draw upper left corner + * 4 (TFT_ELLIPSE_LOWER_LEFT) draw lower left corner + * 8 (TFT_ELLIPSE_LOWER_RIGHT) draw lower right corner + * to draw the whole ellipse use option value 15 (1 | 2 | 4 | 8) + * @param color: circle color + */ +void TFT_drawEllipse(uint16_t x0, uint16_t y0, uint16_t rx, uint16_t ry, color_t color, uint8_t option); + +/** + * @brief Fill elliptical region on screen + * + * @param x0 ellipse center x position + * @param y0 ellipse center x position + * @param rx ellipse horizontal radius + * @param ry ellipse vertical radius + * @param option drawing options, multiple options can be combined + * + * 1 (TFT_ELLIPSE_UPPER_RIGHT) fill upper right corner + * 2 (TFT_ELLIPSE_UPPER_LEFT) fill upper left corner + * 4 (TFT_ELLIPSE_LOWER_LEFT) fill lower left corner + * 8 (TFT_ELLIPSE_LOWER_RIGHT) fill lower right corner + * to fill the whole ellipse use option value 15 (1 | 2 | 4 | 8) + * @param color fill color + */ +void TFT_fillEllipse(uint16_t x0, uint16_t y0, uint16_t rx, uint16_t ry, color_t color, uint8_t option); + + +/** + * @brief Draw circle arc on screen + * Arc drawing angle starts at lower right quadrant of the screen and is offseted by + * '_angleOffset' global variable (default: -90 degrees) + * + * @param cx arc center X position + * @param cy arc center Y position + * @param th thickness of the drawn arc + * @param ry arc vertical radius + * @param start arc start angle in degrees + * @param end arc end angle in degrees + * @param color arc outline color + * @param fillcolor arc fill color + */ +void TFT_drawArc(uint16_t cx, uint16_t cy, uint16_t r, uint16_t th, float start, float end, color_t color, color_t fillcolor); + +/** + * @brief Draw polygon on screen + * + * @param cx polygon center X position + * @param cy arc center Y position + * @param sides number of polygon sides; MAX_POLIGON_SIDES ~ MAX_POLIGON_SIDES (3 ~ 60) + * @param diameter diameter of the circle inside which the polygon is drawn + * @param color polygon outline color + * @param fill polygon fill color; if same as color, polygon is not filled + * @param deg polygon rotation angle; 0 ~ 360 + * @param th thickness of the polygon outline + */ +void TFT_drawPolygon(int cx, int cy, int sides, int diameter, color_t color, color_t fill, int deg, uint8_t th); + +/** + * @brief Set the font used for writing the text to display. + * + * ------------------------------------------------------------------------------------ + * For 7 segment font only characters 0,1,2,3,4,5,6,7,8,9, . , - , : , / are available. + * Character ‘/‘ draws the degree sign. + * ------------------------------------------------------------------------------------ + * + * @param font font number; use defined font names + * @param font_file pointer to font file name; NULL for embeded fonts + */ +void TFT_setFont(uint8_t font, const char *font_file); + +/** + * @brief Returns current font height & width in pixels. + * + * @param[in] width pointer to returned font width + * @param[in] height pointer to returned font height + */ +int TFT_getfontsize(int *width, int* height); + +/** + * @brief Returns current font height in pixels. + * @return The font height in pixels. + */ +int TFT_getfontheight(); + +/** + * @brief Write text to display. + * + * Rotation of the displayed text depends on 'font_rotate' variable (0~360) + * if 'font_transparent' variable is set to 1, no background pixels will be printed + * + * If the text does not fit the screen width it will be clipped (if text_wrap=0), + * or continued on next line (if text_wrap=1) + * + * Two special characters are allowed in strings: + * + * ‘\r’ CR (0x0D), clears the display to EOL + * ‘\n’ LF (ox0A), continues to the new line, x=0 + * + * @param st pointer to null terminated string to be printed + * @param x horizontal position of the upper left point in pixels. Special values can be entered: + * + * CENTER, centers the text + * RIGHT, right justifies the text + * LASTX, continues from last X position; offset can be used: LASTX+n + * + * @param y vertical position of the upper left point in pixels. Special values can be entered: + * + * CENTER, centers the text + * BOTTOM, bottom justifies the text + * LASTY, continues from last Y position; offset can be used: LASTY+n + * + */ +void TFT_print(char *st, int x, int y); + +/** + * @brief Set atributes for 7 segment vector font + * @note 7 segment font must be the current font to this function to have effect + * + * @param l 6~40; distance between bars in pixels + * @param w 1~12, max l/2; bar width in pixels + * @param outline draw font outline if set to 1 + * @param color font outline color, only used if outline=1 + */ +void set_7seg_font_atrib(uint8_t l, uint8_t w, int outline, color_t color); + +/** + * @brief Sets the clipping area coordinates. + * All writing to screen is clipped to that area. + * Starting x & y in all functions will be adjusted to the clipping area. + * + * @param x1,y1 upper left point of the clipping area + * @param x2,y2 bottom right point of the clipping area + */ +void TFT_setclipwin(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); + +/** + * @brief Resets the clipping area to full screen (0,0),(_wodth,_height) + */ +void TFT_resetclipwin(); + +/** + * @brief Save current clipping area to temporary variable + */ +void TFT_saveClipWin(); + +/** + * @brief Restore current clipping area from temporary variable + */ +void TFT_restoreClipWin(); + +/** + * @brief Set the screen rotation + * Also resets the clip window and clears the screen with current background color + * + * @param rot 0~3; screen rotation; use defined rotation constants: + * PORTRAIT, LANDSCAPE, PORTRAIT_FLIP, LANDSCAPE_FLIP + */ +void TFT_setRotation(uint8_t rot); + +/** + * @brief Set inverted/normal colors + * + * @param mode 0 or 1; use defined constants: INVERT_ON or INVERT_OFF + */ +void TFT_invertDisplay(const uint8_t mode); + +/** + * @brief Select gamma curve + * @param gm gama curve, values 0~3 + */ +void TFT_setGammaCurve(uint8_t gm); + +/** + * @brief Compare two color structures + * @return 0 if equal, 1 if not equal + * + * @param c1, c2 colors to be compared + */ +int TFT_compare_colors(color_t c1, color_t c2); + +/** + * @brief returns the string width in pixels. Useful for positions strings on the screen. + * @return The string width. + */ +int TFT_getStringWidth(char* str); + + +/** + * @brief Fills the rectangle occupied by string with current background color + * @param x X position + * @param Y Y position + * @param str The string + */ +void TFT_clearStringRect(int x, int y, char *str); + +/** + * @brief Converts the components of a color, as specified by the HSB model, + * to an equivalent set of values for the default RGB model. + * + * The color structure that is returned by HSBtoRGB encodes the value of a color as R, G & B component + * + * @param _hue any number, the floor of this number is subtracted from it to create a fraction between 0 and 1. + * This fractional number is then multiplied by 360 to produce the hue angle in the HSB color model. + * @param _sat 0 ~ 1.0 + * @param _brightness 0 ~ 1.0 + */ +color_t HSBtoRGB(float _hue, float _sat, float _brightness); + +/** + * @brief Decodes and displays JPG image + * Limits: + * Baseline only. Progressive and Lossless JPEG format are not supported. + * Image size: Up to 65520 x 65520 pixels + * Color space: YCbCr three components only. Gray scale image is not supported. + * Sampling factor: 4:4:4, 4:2:2 or 4:2:0. + * + * @param x image left position; constants CENTER & RIGHT can be used; negative value is accepted + * @param y image top position; constants CENTER & BOTTOM can be used; negative value is accepted + * @param scale image scale factor: 0~3; if scale>0, image is scaled by factor 1/(2^scale) (1/2, 1/4 or 1/8) + * @param fname pointer to the name of the file from which the image will be read + * if set to NULL, image will be read from memory buffer pointed to by 'buf' + * @param buf pointer to the memory buffer from which the image will be read; used if fname=NULL + * @param size size of the memory buffer from which the image will be read; used if fname=NULL & buf!=NULL + */ +void TFT_jpg_image(int x, int y, uint8_t scale, char *fname, uint8_t *buf, int size); + +/** + * @brief Decodes and displays BMP image + * Only uncompressed RGB 24-bit with no color space information BMP images can be displayed + * + * @param x image left position; constants CENTER & RIGHT can be used; negative value is accepted + * @param y image top position; constants CENTER & BOTTOM can be used; negative value is accepted + * @param scale image scale factor: 0~7; if scale>0, image is scaled by factor 1/(scale+1) + * @param fname pointer to the name of the file from which the image will be read + * if set to NULL, image will be read from memory buffer pointed to by 'imgbuf' + * @param imgbuf pointer to the memory buffer from which the image will be read; used if fname=NULL + * @param size size of the memory buffer from which the image will be read; used if fname=NULL & imgbuf!=NULL + */ +int TFT_bmp_image(int x, int y, uint8_t scale, char *fname, uint8_t *imgbuf, int size); + +/** + * @brief Get the touch panel coordinates. + * The coordinates are adjusted to screen orientation if raw=0 + * + * @param[in] x pointer to X coordinate + * @param[in] y pointer to Y coordinate + * @param raw if 0 returns calibrated screen coordinates; if 1 returns raw touch controller coordinates + * @return 0 if touch panel is not touched; x=y=0 + * 1 if touch panel is touched; x&y are the valid coordinates + */ +int TFT_read_touch(int *x, int* y, uint8_t raw); + + +/** + * @brief Compile font c source file to .fnt file + * which can be used in TFT_setFont() function to select external font + * Created file have the same name as source file and extension .fnt + * + * @param fontfile pointer to c source font file name; must have .c extension + * @param dbg if set to 1, prints debug information + * + * @return 0 on success, err no on error + */ +int compile_font_file(char *fontfile, uint8_t dbg); + +/** + * @brief Get all font's characters to buffer + */ +void getFontCharacters(uint8_t *buf); + +#endif