guimaintask.c
来自「瑞泰创新的GX-ARM9-2410EP教学实验系统UCOS移植源代码,包含GUI」· C语言 代码 · 共 447 行
C
447 行
/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* 礐/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : MEMDEV_DrawGraph.c
Purpose : Example for drawing graphs
----------------------------------------------------------------------
*/
#include <stddef.h>
#include "gui.h"
#include "LCD_ConfDefaults.h"
#include <math.h>
#include <stdlib.h>
#include "DIALOG.h"
/*******************************************************************
*
* Structure containing information for drawing routine
*
*******************************************************************
*/
typedef struct {
I16 *aY;
} PARAM;
/*******************************************************************
*
* Defines
*
********************************************************************
*/
#define YSIZE (LCD_YSIZE - 100)
#define DEG2RAD (3.1415926f / 180)
#if LCD_BITSPERPIXEL == 1
#define COLOR_GRAPH0 GUI_WHITE
#define COLOR_GRAPH1 GUI_WHITE
#else
#define COLOR_GRAPH0 GUI_GREEN
#define COLOR_GRAPH1 GUI_YELLOW
#endif
/*******************************************************************
*
* static variables
*
********************************************************************
*/
static const GUI_POINT _aPointArrow[] = {
{ 0, 0},
{-40, -30},
{-10, -20},
{-10, -70},
{ 10, -70},
{ 10, -20},
{ 40, -30},
};
static const GUI_POINT _aPointStar[] = {
{ 0, -36},
{ 8, -8},
{ 36, 0},
{ 8, 8},
{ 0, 36},
{ -8, 8},
{-36, 0},
{ -8, -8}
};
static const GUI_POINT _aPointHexagon[] = {
{ 0, -30},
{ 26, -15},
{ 26, 15},
{ 0, 30},
{-26, 15},
{-26, -15},
};
/*******************************************************************
*
* static code
*
********************************************************************
*/
/*******************************************************************
*
* _DrawPolygon
Draws polygons of different shapes and colors
*/
static void _DrawPolygon(void) {
int y = 90;
/* clear display */
GUI_SetBkColor(GUI_BLACK);
GUI_Clear();
/* display text */
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_Font24_ASCII);
GUI_SetTextAlign(GUI_TA_HCENTER);
GUI_DispStringAt("DrawPolygon - Sample", 160, 5);
GUI_SetFont(&GUI_Font8x16);
GUI_DispStringAt("using", 5, 40);
GUI_DispStringAt("GUI_FillPolygon", 5, 55);
GUI_SetTextAlign(GUI_TA_HCENTER);
GUI_DispStringAt("Polygons of arbitrary shape\nin any color", 160, y + 90);
GUI_Delay(500);
/* draw filled polygons */
// while (1) {
GUI_ClearRect(100, y, 220, y + 85);
GUI_SetColor(GUI_BLUE);
GUI_FillPolygon (&_aPointArrow[0], 7, 160, y + 80);
GUI_Delay(1000);
GUI_ClearRect(100, y, 220, y + 85);
GUI_SetColor(GUI_RED);
GUI_FillPolygon (&_aPointStar[0], 8, 160, y + 45);
GUI_Delay(1000);
GUI_ClearRect(100, y, 220, y + 85);
GUI_SetColor(GUI_GREEN);
GUI_FillPolygon(&_aPointHexagon[0], 6, 160, y + 45);
GUI_Delay(1000);
// }
}
/*******************************************************************
*
* Draws 13 color bars
*
********************************************************************
*/
void ShowColorBar(void) {
int x0 = 60, y0 = 40, yStep = 15, i;
int xsize = LCD_GetDevCap(LCD_DEVCAP_XSIZE) - x0;
GUI_SetFont(&GUI_Font8x16);
#if (LCD_FIXEDPALETTE)
GUI_DispString("Fixed palette: ");
GUI_DispDecMin(LCD_FIXEDPALETTE);
#endif
GUI_DispStringAt("Red", 0, y0 + yStep);
GUI_DispStringAt("Green", 0, y0 + 3 * yStep);
GUI_DispStringAt("Blue", 0, y0 + 5 * yStep);
GUI_DispStringAt("Grey", 0, y0 + 6 * yStep);
GUI_DispStringAt("Yellow", 0, y0 + 8 * yStep);
GUI_DispStringAt("Cyan", 0, y0 + 10 * yStep);
GUI_DispStringAt("Magenta", 0, y0 + 12 * yStep);
for (i = 0; i < xsize; i++) {
U16 cs = (255 * (U32)i) / xsize;
U16 x = x0 + i;;
/* Red */
GUI_SetColor(cs);
GUI_DrawVLine(x, y0 , y0 + yStep - 1);
GUI_SetColor(0xff + (255 - cs) * 0x10100L);
GUI_DrawVLine(x, y0 + yStep, y0 + 2 * yStep - 1);
/* Green */
GUI_SetColor(cs<<8);
GUI_DrawVLine(x, y0 + 2 * yStep, y0 + 3 * yStep - 1);
GUI_SetColor(0xff00 + (255 - cs) * 0x10001L);
GUI_DrawVLine(x, y0 + 3 * yStep, y0 + 4 * yStep - 1);
/* Blue */
GUI_SetColor(cs * 0x10000L);
GUI_DrawVLine(x, y0 + 4 * yStep, y0 + 5 * yStep - 1);
GUI_SetColor(0xff0000 + (255 - cs) * 0x101L);
GUI_DrawVLine(x, y0 + 5 * yStep, y0 + 6 * yStep - 1);
/* Gray */
GUI_SetColor((U32)cs * 0x10101L);
GUI_DrawVLine(x, y0 + 6 * yStep, y0 + 7 * yStep - 1);
/* Yellow */
GUI_SetColor(cs * 0x101);
GUI_DrawVLine(x, y0 + 7 * yStep, y0 + 8 * yStep - 1);
GUI_SetColor(0xffff + (255 - cs) * 0x10000L);
GUI_DrawVLine(x, y0 + 8 * yStep, y0 + 9 * yStep - 1);
/* Cyan */
GUI_SetColor(cs * 0x10100L);
GUI_DrawVLine(x, y0 + 9 * yStep, y0 + 10 * yStep - 1);
GUI_SetColor(0xffff00 + (255 - cs) * 0x1L);
GUI_DrawVLine(x, y0 + 10 * yStep, y0 + 11 * yStep - 1);
/* Magenta */
GUI_SetColor(cs * 0x10001);
GUI_DrawVLine(x, y0 + 11 * yStep, y0 + 12 * yStep - 1);
GUI_SetColor(0xff00ff + (255 - cs) * 0x100L);
GUI_DrawVLine(x, y0 + 12 * yStep, y0 + 13 * yStep - 1);
}
}
/*******************************************************************
*
* Draws the graph area
*
********************************************************************
*/
static void Draw(void * p) {
int i;
PARAM * pParam = (PARAM *)p;
GUI_SetBkColor(GUI_BLACK);
GUI_SetColor(GUI_DARKGRAY);
GUI_ClearRect(19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21));
for (i = 0; i < (YSIZE / 2); i += 20) {
GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) + i, 19, (LCD_XSIZE - 2));
if (i) {
GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) - i, 19, (LCD_XSIZE - 2));
}
}
for (i = 40; i < (LCD_XSIZE - 20); i += 40) {
GUI_DrawVLine(18 + i, (LCD_YSIZE - 20) - YSIZE, (LCD_YSIZE - 21));
}
GUI_SetColor(COLOR_GRAPH0);
GUI_DrawGraph(pParam->aY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
}
static void Draw2(void * p) {
PARAM * pParam = (PARAM *)p;
Draw(p);
GUI_SetColor(COLOR_GRAPH1);
GUI_DrawGraph(pParam->aY+15, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
}
/*******************************************************************
*
* Labels the x & y-axis
*
********************************************************************
*/
static void Label(void) {
int x, y;
GUI_SetBkColor(GUI_RED);
GUI_Clear();
GUI_SetPenSize(1);
GUI_ClearRect(0, (LCD_YSIZE - 21) - YSIZE, (LCD_XSIZE - 1), (LCD_YSIZE - 1));
GUI_DrawRect(18, (LCD_YSIZE - 21) - YSIZE, (LCD_XSIZE - 1), (LCD_YSIZE - 20));
GUI_SetFont(&GUI_Font6x8);
for (x = 0; x < (LCD_XSIZE - 20); x += 40) {
int xPos = x + 18;
GUI_DrawVLine(xPos, (LCD_YSIZE - 20), (LCD_YSIZE - 14));
GUI_DispDecAt(x / 40, xPos - 2, (LCD_YSIZE - 9), 1);
}
for (y = 0; y < YSIZE / 2; y += 20) {
int yPos = (LCD_YSIZE - 20) - YSIZE / 2 + y;
GUI_DrawHLine(yPos, 13, 18);
if (y) {
GUI_GotoXY(1, yPos - 4);
GUI_DispSDec(-y / 20, 2);
yPos = (LCD_YSIZE - 20) - YSIZE / 2 - y;
GUI_DrawHLine(yPos, 13, 18);
GUI_GotoXY(1, yPos - 4);
GUI_DispSDec(y / 20, 2);
} else {
GUI_DispCharAt('0', 7, yPos - 4);
}
}
}
/*******************************************************************
*
* Draws random data
*
********************************************************************
*/
static void GetRandomData(I16 * paY, int Time, int n) {
int aDiff, i;
if (Time > 5000)
Time -= 5000;
if (Time > 2500)
Time = 5000 - Time;
Time /= 200;
aDiff = Time * Time + 1;
for (i = 0; i < n; i++) {
if (!i) {
paY[i] = rand() % YSIZE;
} else {
I16 yNew;
int yD = aDiff - (rand() % aDiff);
if (rand() & 1) {
yNew = paY[i-1] + yD;
} else {
yNew = paY[i-1] - yD;
}
if (yNew > YSIZE) {
yNew -= yD;
} else { if (yNew < 0)
yNew += yD;
}
paY[i] = yNew;
}
}
}
static void DemoRandomGraph(void) {
PARAM Param;
int tDiff, t0;
GUI_RECT Rect = {19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)};
GUI_HMEM hMem = GUI_ALLOC_Alloc((LCD_XSIZE - 20) * sizeof(I16));
GUI_SetColor(GUI_WHITE);
GUI_SetBkColor(GUI_RED);
GUI_ClearRect(0, 0, LCD_XSIZE, 60);
GUI_SetFont(&GUI_FontComic18B_1);
GUI_DispStringAt("Random graph", 10, 20);
Param.aY = GUI_ALLOC_h2p(hMem);
GUI_SetFont(&GUI_Font6x8);
t0 = GUI_GetTime();
while((tDiff = (GUI_GetTime() - t0)) < 10000) {
int t1, tDiff2;
GetRandomData(Param.aY, tDiff, (LCD_XSIZE - 20));
t1 = GUI_GetTime();
GUI_MEMDEV_Draw(&Rect, Draw, &Param, 0, 0);
tDiff2 = GUI_GetTime() - t1;
if (tDiff2 < 100) {
GUI_Delay(100 - tDiff2);
}
}
GUI_ALLOC_Free(hMem);
}
/*******************************************************************
*
* Draws a sine wave
*
********************************************************************
*/
static void GetSineData(I16 * paY, int n) {
int i;
for (i = 0; i < n; i++) {
float s = sin(i * DEG2RAD * 4);
paY[i] = s * YSIZE / 2 + YSIZE / 2;
}
}
static void DemoSineWave(void) {
PARAM Param;
I16 * pStart;
int t0, Cnt = 0;
GUI_RECT Rect = {19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)};
GUI_HMEM hMem = GUI_ALLOC_Alloc(405 * sizeof(I16));
GUI_SetColor(GUI_WHITE);
GUI_SetBkColor(GUI_RED);
GUI_ClearRect(0, 0, LCD_XSIZE, 60);
GUI_SetFont(&GUI_FontComic18B_1);
GUI_DispStringAt("Sine wave", 10, 20);
pStart = GUI_ALLOC_h2p(hMem);
GetSineData(pStart, 405);
GUI_SetFont(&GUI_Font6x8);
t0 = GUI_GetTime();
while((GUI_GetTime() - t0) < 10000) {
int t1, tDiff2;
if (Cnt++ % 90) {
Param.aY++;
} else {
Param.aY = pStart;
}
t1 = GUI_GetTime();
GUI_MEMDEV_Draw(&Rect, Draw2, &Param, 0, 0);
tDiff2 = GUI_GetTime() - t1;
if (tDiff2 < 100) {
GUI_Delay(100 - tDiff2);
}
}
GUI_ALLOC_Free(hMem);
}
/*******************************************************************
*
* Adds several waves
*
********************************************************************
*/
static void DrawOrData(GUI_COLOR Color, I16 * paY) {
GUI_SetColor(Color);
GUI_DrawGraph(paY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
}
static void DemoOrData(void) {
int i;
PARAM Param;
GUI_RECT Rect = {19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)};
GUI_HMEM hMem = GUI_ALLOC_Alloc(405 * sizeof(I16));
GUI_SetColor(GUI_WHITE);
GUI_SetBkColor(GUI_RED);
GUI_ClearRect(0, 0, LCD_XSIZE, 60);
GUI_SetFont(&GUI_FontComic18B_1);
GUI_DispStringAt("Several waves...",0,20);
Param.aY = GUI_ALLOC_h2p(hMem);
GetSineData(Param.aY, 405);
GUI_MEMDEV_Draw(&Rect, Draw, &Param, 0, 0);
for (i = 0; (i < 90); i++) {
DrawOrData(GUI_GREEN, ++Param.aY);
GUI_Delay(10);
}
GUI_ALLOC_Free(hMem);
}
/*******************************************************************
*
* MainTask
*
********************************************************************
*/
void GUIMainTask(void) {
GUI_Init();
GUI_MEMDEV_Load();
while(1) {
Label();
DemoRandomGraph();
DemoSineWave();
DemoOrData();
GUI_Delay(1000);
_DrawPolygon();
GUI_Delay(1000);
ShowColorBar();
GUI_Delay(1000);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?