📄 memdev_drawgraph.c
字号:
/********************************************************************** SEGGER MICROCONTROLLER SYSTEME GmbH ** Solutions for real time microcontroller applications ** ** emWin GSC sample code ** ***********************************************************************----------------------------------------------------------------------File : MEMDEV_DrawGraph.cPurpose : Example for drawing graphs----------------------------------------------------------------------*/#include "GUI.h"#include "LCD_ConfDefaults.h"
#include "DIALOG.h"#include <math.h>#include <stdlib.h>/********************************************************************* 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
#define COLOR_GRAPH2 GUI_BLUE
#define ID_CHECKBOX0 WM_USER+0
#define ID_CHECKBOX1 WM_USER+1
#define ID_CHECKBOX2 WM_USER+2#endif/********************************************************************* structure containing information for drawing routine*/typedef struct{ I16 *aY;} PARAM;
CHECKBOX_Handle CheckBox0,CheckBox1,CheckBox2;/********************************************************************* static code**********************************************************************//********************************************************************* _Draw 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)); //画水平线,间隔20个像素点 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);}/********************************************************************* _Draw2*/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);}/********************************************************************* _Label Labels the x & y-axis*/static void _Label(void){ int x, y; GUI_SetBkColor(GUI_RED); //设置背景为红色 GUI_Clear(); GUI_SetColor(GUI_WHITE); //设置前景为白色 GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("MEMDEV_DrawGraph - Sample",160,5); 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); } }}/********************************************************************* _GetRandomData*/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; } }}/********************************************************************* _DemoRandomGraph*/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_AllocZero((LCD_XSIZE - 20) * sizeof(I16)); GUI_SetColor(GUI_WHITE); GUI_SetBkColor(GUI_RED); GUI_ClearRect(0, 55, LCD_XSIZE, 75); GUI_SetFont(&GUI_FontComic18B_1); GUI_DispStringAt("Random graph", 20, 55); GUI_Lock(); 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_Unlock(); GUI_ALLOC_Free(hMem);}/********************************************************************* _GetSineData*/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; }}/********************************************************************* _DemoSineWave*/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_AllocZero(405*sizeof(I16)); GUI_SetColor(GUI_WHITE); GUI_SetBkColor(GUI_RED); GUI_ClearRect(0,55,LCD_XSIZE,75); GUI_SetFont(&GUI_FontComic18B_1); GUI_DispStringAt("Sine wave",20,55); 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);}/********************************************************************* _DrawOrData*/static void _DrawOrData(GUI_COLOR Color,I16 *paY){ GUI_SetColor(Color); GUI_DrawGraph(paY,(LCD_XSIZE-20),19,(LCD_YSIZE-20)-YSIZE);}/********************************************************************* _DemoOrData*/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_AllocZero(405 * sizeof(I16)); GUI_SetColor(GUI_WHITE); GUI_SetBkColor(GUI_RED); GUI_ClearRect(0, 55, LCD_XSIZE, 75); GUI_SetFont(&GUI_FontComic18B_1); GUI_DispStringAt("Several waves...",20,55); 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** Demonstrates the use of a memory device**********************************************************************/static void _cbBkWindow(WM_MESSAGE *pMsg) //桌面回调函数
{
int NCode,Id;
WM_HWIN hDlg,hListBox,hItem;
hDlg=pMsg->hWin; //获取消息要发送的目标窗体的句柄
//hListBox=WM_GetDialogItem(hDlg,GUI_ID_MULTIEDIT0); //获取ID号为GUI_ID_MULTIEDIT0的控件句柄
switch(pMsg->MsgId)
{
case WM_PAINT: //窗口重绘消息
GUI_SetBkColor(GUI_RED); //重绘桌面窗口
GUI_Clear();
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_FontHZ_FangSong_GB2312_14);
//GUI_SetFont(&GUI_Font24_ASCII);
// GUI_DispStringHCenterAt("WIDGET_ListBoxOwnerDraw",160,5);
GUI_DispStringHCenterAt("ADC和DAC演示程序",160,5);
break;
case WM_TOUCH_CHILD: //触摸屏选择消息
WM_SetFocus(hListBox);
break;
case WM_NOTIFY_PARENT: //对话框的子窗口发送到对话框的通知消息
Id = WM_GetId(pMsg->hWinSrc); //获取发送消息的源控件的ID号 /* Id of widget */
NCode = pMsg->Data.v; //获取消息的通知代码 /* Notification code */
hItem = WM_GetDialogItem(hDlg,Id); //根据ID号获取发送消息的源控件的句柄
switch(NCode) //根据消息通知代码做相应处理
{
case WM_NOTIFICATION_SEL_CHANGED: //列表框选择改变消息
// LISTBOX_InvalidateItem(hListBox,LISTBOX_ALL_ITEMS);
break;
case WM_NOTIFICATION_RELEASED: // 鼠标或触摸松开消息
/* switch(Id)
{
case GUI_ID_OK:
GUI_EndDialog(hDlg,0);
break;
case GUI_ID_CANCEL:
GUI_EndDialog(hDlg,1);
break;
case GUI_ID_CHECK0:
_MultiSel ^= 1;
LISTBOX_SetMulti(hListBox,_MultiSel);
WM_SetFocus(hListBox);
LISTBOX_InvalidateItem(hListBox,LISTBOX_ALL_ITEMS);
break;
case GUI_ID_CHECK1:
_OwnerDrawn ^= 1;
if(_OwnerDrawn)
{
LISTBOX_SetOwnerDraw(hListBox,_OwnerDraw);
}
else
{
LISTBOX_SetOwnerDraw(hListBox,NULL);
}
LISTBOX_InvalidateItem(hListBox,LISTBOX_ALL_ITEMS);
break;
default:
break;
}//end switch(Id)
*/
break;
default:
break;
}//end switch(NCode)
break;
default:
WM_DefaultProc(pMsg); //默认消息处理
}
}
void MainTask(void){ // GUI_Init(); // _Label();
CheckBox0=CHECKBOX_Create(20,40,0,0,WM_GetDesktopWindow(),ID_CHECKBOX0,WM_CF_SHOW);
CHECKBOX_Check(CheckBox0);
GUI_SetFont(&GUI_FontComic18B_1);
GUI_DispStringAt("CH0",40,40);
WM_SetCallback(WM_HBKWIN,&_cbBkWindow); while(1) {
_DemoRandomGraph(); _DemoSineWave(); _DemoOrData(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -