GPS Tracker with a TFT display, GPLV3

Dependencies:   MAX17055 MAX32620FTHR MAX77650 SerialGPS

Revision:
0:48d0ba737b93
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LCD_GUI.cpp	Sat Aug 18 22:34:58 2018 +0000
@@ -0,0 +1,422 @@
+#include "LCD_GUI.h"
+#include <stdio.h>
+#include "fonts.h"
+#include "font8.h"
+#include "font12.h"
+#include "font16.h"
+#include "font20.h"
+#include "font24.h"
+
+extern LCD_DIS sLCD_DIS;
+
+void GUI_Swop(POINT Point1, POINT Point2)
+{
+    POINT Temp;
+    Temp = Point1;
+    Point1 = Point2;
+    Point2 = Temp;
+}
+
+/********************************************************************************
+function:   Draw Point(Xpoint, Ypoint) Fill the color
+parameter:
+            Xpoint      :   The x coordinate of the point
+            Ypoint      :   The y coordinate of the point
+            Color       :   Set color
+            Dot_Pixel   :   point size
+********************************************************************************/
+void GUI_DrawPoint(POINT Xpoint, POINT Ypoint, COLOR Color,
+                   DOT_PIXEL Dot_Pixel, DOT_STYLE DOT_STYLE)
+{
+    if(Xpoint > sLCD_DIS.LCD_Dis_Column || Ypoint > sLCD_DIS.LCD_Dis_Page) {
+        return;
+    }
+
+    uint16_t XDir_Num ,YDir_Num;
+    if(DOT_STYLE == DOT_STYLE_DFT) {
+        for(XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) {
+            for(YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) {
+                LCD_SetPointlColor(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color);
+            }
+        }
+    } else {
+        for(XDir_Num = 0; XDir_Num <  Dot_Pixel; XDir_Num++) {
+            for(YDir_Num = 0; YDir_Num <  Dot_Pixel; YDir_Num++) {
+                LCD_SetPointlColor(Xpoint + XDir_Num - 1 , Ypoint + YDir_Num -1 , Color);
+            }
+        }
+    }
+}
+
+/********************************************************************************
+function:   Draw a line of arbitrary slope
+parameter:
+            Xstart :Starting x point coordinates
+            Ystart :Starting x point coordinates
+            Xend   :End point x coordinate
+            Yend   :End point y coordinate
+            Color  :The color of the line segment
+********************************************************************************/
+void GUI_DrawLine(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend,
+                  COLOR Color, LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel)
+{
+
+    if(Xstart > sLCD_DIS.LCD_Dis_Column || Ystart > sLCD_DIS.LCD_Dis_Page ||
+       Xend > sLCD_DIS.LCD_Dis_Column || Yend > sLCD_DIS.LCD_Dis_Page) {
+        return;
+    }
+
+    if(Xstart > Xend)
+        GUI_Swop(Xstart,Xend);
+    if(Ystart > Yend)
+        GUI_Swop(Ystart,Yend);
+
+    POINT Xpoint = Xstart;
+    POINT Ypoint = Ystart;
+    int32_t dx =(int32_t)Xend -(int32_t)Xstart >= 0 ? Xend - Xstart : Xstart - Xend;
+    int32_t dy =(int32_t)Yend -(int32_t)Ystart <= 0 ? Yend - Ystart : Ystart - Yend;
+
+    // Increment direction, 1 is positive, -1 is counter;
+    int32_t XAddway = Xstart < Xend ? 1 : -1;
+    int32_t YAddway = Ystart < Yend ? 1 : -1;
+
+    //Cumulative error
+    int32_t Esp = dx + dy;
+    int8_t Line_Style_Temp = 0;
+
+    for(;;) {
+        Line_Style_Temp++;
+        //Painted dotted line, 2 point is really virtual
+        if(Line_Style == LINE_DOTTED && Line_Style_Temp %3 == 0) {
+            //printf("LINE_DOTTED\r\n");
+            GUI_DrawPoint(Xpoint, Ypoint, GUI_BACKGROUND, Dot_Pixel, DOT_STYLE_DFT);
+            Line_Style_Temp = 0;
+        } else {
+            GUI_DrawPoint(Xpoint, Ypoint, Color, Dot_Pixel, DOT_STYLE_DFT);
+        }
+        if(2 * Esp >= dy) {
+            if(Xpoint == Xend) break;
+            Esp += dy;
+            Xpoint += XAddway;
+        }
+        if(2 * Esp <= dx) {
+            if(Ypoint == Yend) break;
+            Esp += dx;
+            Ypoint += YAddway;
+        }
+    }
+}
+
+/********************************************************************************
+function:   Draw a rectangle
+parameter:
+            Xstart :Rectangular  Starting x point coordinates
+            Ystart :Rectangular  Starting x point coordinates
+            Xend   :Rectangular  End point x coordinate
+            Yend   :Rectangular  End point y coordinate
+            Color  :The color of the Rectangular segment
+            Filled : Whether it is filled--- 1 solid 0:empty
+********************************************************************************/
+void GUI_DrawRectangle(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend,
+                       COLOR Color, DRAW_FILL Filled, DOT_PIXEL Dot_Pixel )
+{
+    if(Xstart > sLCD_DIS.LCD_Dis_Column || Ystart > sLCD_DIS.LCD_Dis_Page ||
+       Xend > sLCD_DIS.LCD_Dis_Column || Yend > sLCD_DIS.LCD_Dis_Page) {
+        return;
+    }
+    
+    if(Xstart > Xend)
+        GUI_Swop(Xstart,Xend);
+    if(Ystart > Yend)
+        GUI_Swop(Ystart,Yend);
+
+    POINT Ypoint;
+    if(Filled ) {
+        for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) {
+            GUI_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , LINE_SOLID, Dot_Pixel);
+        }
+    } else {
+        GUI_DrawLine(Xstart, Ystart, Xend, Ystart, Color , LINE_SOLID, Dot_Pixel);
+        GUI_DrawLine(Xstart, Ystart, Xstart, Yend, Color , LINE_SOLID, Dot_Pixel);
+        GUI_DrawLine(Xend, Yend, Xend, Ystart, Color , LINE_SOLID, Dot_Pixel);
+        GUI_DrawLine(Xend, Yend, Xstart, Yend, Color , LINE_SOLID, Dot_Pixel);
+    }
+}
+
+/********************************************************************************
+function:   Use the 8-point method to draw a circle of the
+                specified size at the specified position.
+parameter:
+            X_Center :Center X coordinate
+            Y_Center :Center Y coordinate
+            Radius   :circle Radius
+            Color  :The color of the :circle segment
+            Filled : Whether it is filled: 1 filling 0:Do not
+********************************************************************************/
+void GUI_DrawCircle(POINT X_Center, POINT Y_Center, LENGTH Radius,
+                    COLOR Color, DRAW_FILL  Draw_Fill , DOT_PIXEL Dot_Pixel)
+{
+    if(X_Center > sLCD_DIS.LCD_Dis_Column || Y_Center >= sLCD_DIS.LCD_Dis_Page) {
+        return;
+    }
+
+    //Draw a circle from(0, R) as a starting point
+    int16_t XCurrent, YCurrent;
+    XCurrent = 0;
+    YCurrent = Radius;
+
+    //Cumulative error,judge the next point of the logo
+    int16_t Esp = 3 -(Radius << 1 );
+
+    int16_t sCountY;
+    if(Draw_Fill == DRAW_FULL) {
+        while(XCurrent <= YCurrent ) { //Realistic circles
+            for(sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) {
+                GUI_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );             //1
+                GUI_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );             //2
+                GUI_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );             //3
+                GUI_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );             //4
+                GUI_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );             //5
+                GUI_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );             //6
+                GUI_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );             //7
+                GUI_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );
+            }
+            if(Esp < 0 )
+                Esp += 4 * XCurrent + 6;
+            else {
+                Esp += 10 + 4 *(XCurrent - YCurrent );
+                YCurrent --;
+            }
+            XCurrent ++;
+        }
+    } else { //Draw a hollow circle
+        while(XCurrent <= YCurrent ) {
+            GUI_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //1
+            GUI_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //2
+            GUI_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //3
+            GUI_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //4
+            GUI_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //5
+            GUI_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //6
+            GUI_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //7
+            GUI_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT );             //0
+
+            if(Esp < 0 )
+                Esp += 4 * XCurrent + 6;
+            else {
+                Esp += 10 + 4 *(XCurrent - YCurrent );
+                YCurrent --;
+            }
+            XCurrent ++;
+        }
+    }
+}
+
+/********************************************************************************
+function:   Show English characters
+parameter:
+            Xpoint :X coordinate
+            Ypoint :Y coordinate
+            Acsii_Char   :To display the English characters
+            Font  :A structure pointer that displays a character size
+            Color_Background : Select the background color of the English character
+            Color_Foreground : Select the foreground color of the English character
+********************************************************************************/
+void GUI_DisChar(POINT Xpoint, POINT Ypoint, const char Acsii_Char,
+                 sFONT* Font, COLOR Color_Background, COLOR Color_Foreground)
+{
+    POINT Page, Column;
+
+    if(Xpoint >= sLCD_DIS.LCD_Dis_Column || Ypoint >= sLCD_DIS.LCD_Dis_Page) {
+        return;
+    }
+
+    uint32_t Char_Offset =(Acsii_Char - ' ') * Font->Height *(Font->Width / 8 +(Font->Width % 8 ? 1 : 0));
+    const unsigned char *ptr = &Font->table[Char_Offset];
+
+    for(Page = 0; Page < Font->Height; Page ++ ) {
+        for(Column = 0; Column < Font->Width; Column ++ ) {
+
+            //To determine whether the font background color and screen background color is consistent
+            if(FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan
+                if(*ptr &(0x80 >>(Column % 8)))
+                    GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
+            } else {
+                if(*ptr &(0x80 >>(Column % 8))) {
+                    GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
+                } else {
+                    GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT);
+                }
+            }
+            //One pixel is 8 bits
+            if(Column % 8 == 7)
+                ptr++;
+        }/* Write a line */
+        if(Font->Width % 8 != 0)
+            ptr++;
+    }/* Write all */
+}
+
+/********************************************************************************
+function:   Display the string
+parameter:
+            Xstart    :X coordinate
+            Ystart    :Y coordinate
+            pString   :The first address of the English string to be displayed
+            Font      :A structure pointer that displays a character size
+            Color_Background : Select the background color of the English character
+            Color_Foreground : Select the foreground color of the English character
+********************************************************************************/
+void GUI_DisString_EN(POINT Xstart, POINT Ystart, const char * pString,
+                      sFONT* Font,COLOR Color_Background, COLOR Color_Foreground )
+{
+    POINT Xpoint = Xstart;
+    POINT Ypoint = Ystart;
+
+    if(Xstart >= sLCD_DIS.LCD_Dis_Column || Ystart >= sLCD_DIS.LCD_Dis_Page) {
+        return;
+    }
+
+    while(* pString != '\0') {
+        //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the height of the character
+        if((Xpoint + Font->Width ) > sLCD_DIS.LCD_Dis_Column ) {
+            Xpoint = Xstart;
+            Ypoint += Font->Height;
+        }
+
+        // If the Y direction is full, reposition to(Xstart, Ystart)
+        if((Ypoint  + Font->Height ) > sLCD_DIS.LCD_Dis_Page ) {
+            Xpoint = Xstart;
+            Ypoint = Ystart;
+        }
+        GUI_DisChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground);
+
+        //The next character of the address
+        pString ++;
+
+        //The next word of the abscissa increases the font of the broadband
+        Xpoint += Font->Width + 1;
+    }
+}
+
+/****************************************WHITE****************************************
+function:   Display the string
+parameter:
+            Xstart :X coordinate
+            Ystart : Y coordinate
+            Nummber: The number displayed
+            Font  :A structure pointer that displays a character size
+            Color_Background : Select the background color of the English character
+            Color_Foreground : Select the foreground color of the English character
+********************************************************************************/
+#define  ARRAY_LEN 255
+void GUI_DisNum(POINT Xpoint, POINT Ypoint, int32_t Nummber,
+                sFONT* Font,COLOR Color_Background, COLOR Color_Foreground )
+{
+
+    int16_t Num_Bit = 0, Str_Bit = 0;
+    uint8_t Str_Array[ARRAY_LEN] = {0},Num_Array[ARRAY_LEN] = {0};
+    uint8_t *pStr = Str_Array;
+
+    if(Xpoint >= sLCD_DIS.LCD_Dis_Column || Ypoint >= sLCD_DIS.LCD_Dis_Page) {
+        return;
+    }
+
+    //Converts a number to a string
+    while(Nummber) {
+        Num_Array[Num_Bit] = Nummber % 10 + '0';
+        Num_Bit++;
+        Nummber /= 10;
+    }
+
+    //The string is inverted
+    while(Num_Bit > 0) {
+        Str_Array[Str_Bit] = Num_Array[Num_Bit -1];
+        Str_Bit ++;
+        Num_Bit --;
+    }
+
+    //show
+    GUI_DisString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground );
+}
+
+void GUI_Disbitmap(POINT Xpoint, POINT Ypoint, const unsigned char *pBmp,
+                        POINT Width, POINT Height)
+{
+    POINT i, j, byteWidth = (Width + 7)/8;
+    for(j = 0; j < Height; j++) {
+        for(i = 0; i <Width; i ++) {
+            if(*(pBmp + j*byteWidth + i/8) & (128 >> (i & 7))) {
+                GUI_DrawPoint(Xpoint+i, Ypoint+j, WHITE, DOT_PIXEL_DFT, DOT_STYLE_DFT);
+            }
+        }
+    }
+}
+
+/**
+ * @brief This function paints an image with a specific heigh and width on the display at a specific coordinate.
+ * @param picture[] Integer array containg picture image in rgb565 format
+ * @param width Image width
+ * @param height Image height
+ * @param x X coordinates of image
+ * @param y Y coordinates of image
+ * @return none
+ */
+void    GUI_DisplayImage(POINT Xpoint, POINT Ypoint,COLOR picture[],POINT Width, POINT Height)
+{
+    unsigned int i,j,k;
+    k=0;
+    for(i=0;i<Width;i++)
+    {
+        for(j=0;j<Height;j++)
+        {
+            GUI_DrawPoint(Xpoint+i, Ypoint+j, picture[k], DOT_PIXEL_DFT, DOT_STYLE_DFT);
+            k++;
+        }
+    }
+}
+
+/********************************************************************************
+function:   LCD_Show
+parameter:
+********************************************************************************/
+void GUI_Show(void)
+{   
+    LCD_Clear(GUI_BACKGROUND);
+    
+    printf("GUI Draw Line \r\n");
+    GUI_DrawLine(0, 10, sLCD_DIS.LCD_Dis_Column, 10, RED,LINE_SOLID, DOT_PIXEL_2X2);
+    //GUI_DrawLine(0, sLCD_DIS.LCD_Dis_Page - 10, sLCD_DIS.LCD_Dis_Column, sLCD_DIS.LCD_Dis_Page - 10, RED,LINE_SOLID, DOT_PIXEL_2X2);  
+    GUI_DrawLine(0, 20, sLCD_DIS.LCD_Dis_Column, 20, RED,LINE_DOTTED, DOT_PIXEL_DFT);
+    //GUI_DrawLine(0, sLCD_DIS.LCD_Dis_Page - 20, sLCD_DIS.LCD_Dis_Column, sLCD_DIS.LCD_Dis_Page - 20, RED,LINE_DOTTED, DOT_PIXEL_DFT);
+
+    printf("GUI Draw Rectangle \r\n");
+    GUI_DrawRectangle(0,0,160,9,BLUE, DRAW_FULL, DOT_PIXEL_1X1);
+    //GUI_DrawRectangle(1,1,128,128,RED,DRAW_EMPTY,DOT_PIXEL_2X2);
+    
+    printf("GUI Draw Olympic Rings\r\n");
+    uint16_t Cx1 = 40, Cy1 = 85, Cr = 12;
+    uint16_t Cx2 = Cx1 + (2.5 * Cr), Cy2 = Cy1;
+    uint16_t Cx3 = Cx1 + (5 * Cr), Cy3 = Cy1;
+    uint16_t Cx4 = ( Cx1 + Cx2 )/2, Cy4 = Cy1 + Cr;
+    uint16_t Cx5 = ( Cx2 + Cx3 )/2, Cy5 = Cy1 + Cr;
+
+    GUI_DrawCircle( Cx1, Cy1, Cr, BLUE, DRAW_EMPTY, DOT_PIXEL_DFT);
+    GUI_DrawCircle( Cx2, Cy2, Cr, BLACK, DRAW_EMPTY, DOT_PIXEL_DFT);
+    GUI_DrawCircle( Cx3, Cy3, Cr, RED, DRAW_EMPTY, DOT_PIXEL_DFT);
+    GUI_DrawCircle( Cx4, Cy4, Cr, YELLOW, DRAW_EMPTY, DOT_PIXEL_DFT);
+    GUI_DrawCircle( Cx5, Cy5, Cr, GREEN, DRAW_EMPTY, DOT_PIXEL_DFT);
+
+    printf("GUI Draw Realistic circles\r\n");
+    GUI_DrawCircle(15, 110, 10, BRRED, DRAW_FULL, DOT_PIXEL_DFT);
+    GUI_DrawCircle(sLCD_DIS.LCD_Dis_Column - 15, 110, 10, BRRED, DRAW_FULL, DOT_PIXEL_DFT);
+
+    printf("GUI Display String \r\n");
+    GUI_DisString_EN(35,20,"ZYNQ",&Font12,GUI_BACKGROUND,BLUE);
+    GUI_DisString_EN(32,33,"ST7735",&Font12,GUI_BACKGROUND,BLUE);
+    GUI_DisString_EN(28,45,"1.44inch TFTLCD",&Font8,RED,GRED);
+
+    printf("GUI Display Nummber \r\n");
+    GUI_DisNum(28,55,1234567890,&Font20,GUI_BACKGROUND,BLUE);
+}
+
+