/* * High level EPD functions * Author: LoBo 06/2017, https://github/loboris * */ #ifndef _EPD_H_ #define _EPD_H_ #include #include "EPDspi.h" #ifdef __cplusplus extern "C" { #endif typedef uint8_t color_t; 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_t; //========================================================================================== // ==== 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 Font_t cfont; // Current font structure extern uint8_t image_debug; extern int EPD_X; // X position of the next character after EPD_print() function extern int EPD_Y; // Y position of the next character after EPD_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 EPD_ELLIPSE_UPPER_RIGHT 0x01 #define EPD_ELLIPSE_UPPER_LEFT 0x02 #define EPD_ELLIPSE_LOWER_LEFT 0x04 #define EPD_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 === #define EPD_BLACK 15 #define EPD_WHITE 0 // === Color invert constants === #define INVERT_ON 1 #define INVERT_OFF 0 // === Screen orientation constants === #define LANDSCAPE_0 1 #define LANDSCAPE_180 2 // === 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 #define DEJAVU18_FONT 1 #define DEJAVU24_FONT 2 #define UBUNTU16_FONT 3 #define COMIC24_FONT 4 #define MINYA24_FONT 5 #define TOONEY32_FONT 6 #define SMALL_FONT 7 #define FONT_7SEG 8 #define USER_FONT 9 // font will be read from file // ===== PUBLIC FUNCTIONS ========================================================================= /* * Draw pixel at given x,y coordinates * * Params: * x: horizontal position * y: vertical position * color: pixel color */ //------------------------------------------------------ void EPD_drawPixel(int16_t x, int16_t y, color_t color); /* * Read pixel color value from display GRAM at given x,y coordinates * * Params: * x: horizontal position * y: vertical position * * Returns: * pixel color at x,y */ //------------------------------------------ color_t EPD_readPixel(int16_t x, int16_t y); /* * Draw vertical line at given x,y coordinates * * Params: * x: horizontal start position * y: vertical start position * h: line height in pixels * color: line color */ //--------------------------------------------------------------------- void EPD_drawFastVLine(int16_t x, int16_t y, int16_t h, color_t color); /* * Draw horizontal line at given x,y coordinates * * Params: * x: horizontal start position * y: vertical start position * w: line width in pixels * color: line color */ //--------------------------------------------------------------------- void EPD_drawFastHLine(int16_t x, int16_t y, int16_t w, color_t color); /* * Draw line on screen * * Params: * x0: horizontal start position * y0: vertical start position * x1: horizontal end position * y1: vertical end position * color: line color */ //------------------------------------------------------------------------------- void EPD_drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, color_t color); /* * 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) * * Params: * x: horizontal start position * y: vertical start position * start: start offset from (x,y) * len: length of the line * angle: line angle in degrees * color: line color */ //----------------------------------------------------------------------------------------------------------- void EPD_drawLineByAngle(uint16_t x, uint16_t y, uint16_t start, uint16_t len, uint16_t angle, color_t color); /* * Fill given rectangular screen region with color * * Params: * x: horizontal rect start position * y: vertical rect start position * w: rectangle width * h: rectangle height * color: fill color */ //--------------------------------------------------------------------------- void EPD_fillRect(int16_t x, int16_t y, int16_t w, int16_t h, color_t color); /* * Draw rectangle on screen * * Params: * x: horizontal rect start position * y: vertical rect start position * w: rectangle width * h: rectangle height * color: rect line color */ //------------------------------------------------------------------------------ void EPD_drawRect(uint16_t x1,uint16_t y1,uint16_t w,uint16_t h, color_t color); /* * Draw rectangle with rounded corners on screen * * Params: * x: horizontal rect start position * y: vertical rect start position * w: rectangle width * h: rectangle height * r: corner radius * color: rectangle color */ //---------------------------------------------------------------------------------------------- void EPD_drawRoundRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t r, color_t color); /* * Fill given rectangular screen region with rounded corners with color * * Params: * x: horizontal rect start position * y: vertical rect start position * w: rectangle width * h: rectangle height * r: corner radius * color: fill color */ //---------------------------------------------------------------------------------------------- void EPD_fillRoundRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t r, color_t color); /* * Fill the whole screen with color * * Params: * color: fill color */ //-------------------------------- void EPD_fillScreen(color_t color); /* * Fill the current clip window with color * * Params: * color: fill color */ //--------------------------------- void EPD_fillWindow(color_t color); /* * Draw triangle on screen * * Params: * x0: first triangle point x position * y0: first triangle point y position * x0: second triangle point x position * y0: second triangle point y position * x0: third triangle point x position * y0: third triangle point y position * color: triangle color */ //----------------------------------------------------------------------------------------------------------------- void EPD_drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color); /* * Fill triangular screen region with color * * Params: * x0: first triangle point x position * y0: first triangle point y position * x0: second triangle point x position * y0: second triangle point y position * x0: third triangle point x position * y0: third triangle point y position * color: fill color */ //----------------------------------------------------------------------------------------------------------------- void EPD_fillTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color); /* * Draw circle on screen * * Params: * x: circle center x position * y: circle center x position * r: circle radius * color: circle color */ //------------------------------------------------------------------- void EPD_drawCircle(int16_t x, int16_t y, int radius, color_t color); /* * Fill circle on screen with color * * Params: * x: circle center x position * y: circle center x position * r: circle radius * color: circle fill color */ //------------------------------------------------------------------- void EPD_fillCircle(int16_t x, int16_t y, int radius, color_t color); /* * Draw ellipse on screen * * Params: * x0: ellipse center x position * y0: ellipse center x position * rx: ellipse horizontal radius * ry: ellipse vertical radius * 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) * * color: circle color */ //------------------------------------------------------------------------------------------------------ void EPD_drawEllipse(uint16_t x0, uint16_t y0, uint16_t rx, uint16_t ry, color_t color, uint8_t option); /* * Fill elliptical region on screen * * Params: * x0: ellipse center x position * y0: ellipse center x position * rx: ellipse horizontal radius * ry: ellipse vertical radius * 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) * * color: fill color */ //------------------------------------------------------------------------------------------------------ void EPD_fillEllipse(uint16_t x0, uint16_t y0, uint16_t rx, uint16_t ry, color_t color, uint8_t option); /* * 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) * * Params: * cx: arc center X position * cy: arc center Y position * th: thickness of the drawn arc * ry: arc vertical radius * start: arc start angle in degrees * end: arc end angle in degrees * color: arc outline color * fillcolor: arc fill color */ //---------------------------------------------------------------------------------------------------------------------------- void EPD_drawArc(uint16_t cx, uint16_t cy, uint16_t r, uint16_t th, float start, float end, color_t color, color_t fillcolor); /* * Draw polygon on screen * * Params: * cx: polygon center X position * cy: arc center Y position * sides: number of polygon sides; MAX_POLIGON_SIDES ~ MAX_POLIGON_SIDES (3 ~ 60) * diameter: diameter of the circle inside which the polygon is drawn * color: polygon outline color * fill: polygon fill color; if same as color, polygon is not filled * deg: polygon rotation angle; 0 ~ 360 * th: thickness of the polygon outline */ //-------------------------------------------------------------------------------------------------------------- void EPD_drawPolygon(int cx, int cy, int sides, int diameter, color_t color, color_t fill, int deg, uint8_t th); //-------------------------------------------------------------------------------------- //void EPD_drawStar(int cx, int cy, int diameter, color_t color, bool fill, float factor); /* * 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. * ------------------------------------------------------------------------------------ * * Params: * font: font number; use defined font names * font_file: pointer to font file name; NULL for embeded fonts */ //---------------------------------------------------- void EPD_setFont(uint8_t font, const char *font_file); /* * Returns current font height & width in pixels. * * Params: * width: pointer to returned font width * height: pointer to returned font height */ //------------------------------------------- int EPD_getfontsize(int *width, int* height); /* * Returns current font height in pixels. * */ //---------------------- int EPD_getfontheight(); /* * 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 * * Params: * st: pointer to null terminated string to be printed * 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 * 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 EPD_print(char *st, int x, int y); /* * Set atributes for 7 segment vector font * == 7 segment font must be the current font to this function to have effect == * * Params: * l: 6~40; distance between bars in pixels * w: 1~12, max l/2; bar width in pixels * outline: draw font outline if set to 1 * 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); /* * 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. * * Params: * x1,y1: upper left point of the clipping area * x2,y2: bottom right point of the clipping area * */ //---------------------------------------------------------------------- void EPD_setclipwin(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); /* * Resets the clipping area to full screen (0,0),(_wodth,_height) * */ //---------------------- void EPD_resetclipwin(); /* * Save current clipping area to temporary variable * */ //--------------------- void EPD_saveClipWin(); /* * Restore current clipping area from temporary variable * */ //------------------------ void EPD_restoreClipWin(); /* * returns the string width in pixels. * Useful for positions strings on the screen. */ //-------------------------------- int EPD_getStringWidth(char* str); /* * Fills the rectangle occupied by string with current background color */ void EPD_clearStringRect(int x, int y, char *str); /* * Compile font c source file to .fnt file * which can be used in EPD_setFont() function to select external font * Created file have the same name as source file and extension .fnt * * Params: * fontfile: pointer to c source font file name; must have .c extension * dbg: if set to 1, prints debug information * * Returns: * 0 on success * err no on error * */ //------------------------------------------------ int compile_font_file(char *fontfile, uint8_t dbg); /* * Get all font's characters to buffer */ void getFontCharacters(uint8_t *buf); /* * Decodes and displays JPG image. RGB colors are converted to 4-bit Gray scale * 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. * * Params: * x: image left position; constants CENTER & RIGHT can be used; negative value is accepted * y: image top position; constants CENTER & BOTTOM can be used; negative value is accepted * scale: image scale factor: 0~3; if scale>0, image is scaled by factor 1/(2^scale) (1/2, 1/4 or 1/8) * 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' * buf: pointer to the memory buffer from which the image will be read; used if fname=NULL * size: size of the memory buffer from which the image will be read; used if fname=NULL & buf!=NULL * */ int EPD_jpg_image(int x, int y, uint8_t scale, char *fname, uint8_t *buf, int size); #ifdef __cplusplus } #endif #endif