⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memdev_drawgraph.c

📁 SDIO文件系统forHMI-STM32
💻 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 + -