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

📄 guidemo_graph.c

📁 UCOSII在STM32平台的移植
💻 C
字号:
/*
*********************************************************************************************************
*                                                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        : GUIDEMO_Graph.c
Purpose     : Several GUIDEMO routines
----------------------------------------------------------------------
*/

//#include "GUI.h"
//#include "GUIDEMO.h"
#include "..\GUIinc\GUI.h"
#include "..\uCGUIDemo\GUIDEMO.h"

//#include "LCD_ConfDefaults.h"
#include "..\GUIinc\LCD_ConfDefaults.h"  /* valid LCD configuration */

#include <math.h>
#include <stdlib.h>
//#include "GUIDEMO.h"

#if GUI_SUPPORT_MEMDEV

/*********************************************************************
*
*       Structure containing information for drawing routine
*
**********************************************************************
*/

typedef struct
{
   I16* aY;
} PARAM;

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/

#if GUIDEMO_LARGE
#define YSIZE   (LCD_YSIZE - 100)
#else
#define YSIZE   (LCD_YSIZE - 30)
#endif
/*
#if LCD_YSIZE > 120
  #define YSIZE   (LCD_YSIZE - 100)
#else
  #define YSIZE   20
#endif
*/

#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

/*********************************************************************
*
*       Draws the graph
*
**********************************************************************
*/

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_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 _ShowText(const char* sText)
{
   GUI_SetColor(GUI_WHITE);
   GUI_SetBkColor(GUI_RED);
#if GUIDEMO_LARGE
   GUI_ClearRect(0, 0, LCD_XSIZE, 60);
   GUI_SetFont(&GUI_FontComic18B_ASCII);
   GUI_DispStringAt(sText, 10, 20);
#else
   sText = sText;  /* Avoid warning */
#endif
}

static void _LabelMS(void)
{
   GUI_SetFont(&GUI_Font6x8);
#if GUIDEMO_LARGE
   GUI_DispStringAt("msec/graph:", 10, 50);
#endif
}

static void _DisplayTime(int tDiff)
{
#if GUIDEMO_LARGE
   GUI_GotoXY(80, 50);
   GUI_SetColor(GUI_WHITE);
   GUI_SetBkColor(GUI_RED);
   GUI_DispDecSpace(tDiff, 3);
#else
   tDiff = tDiff; /* Avoid warning */
#endif
}

static void _DemoRandomGraph(void)
{
   PARAM Param;
   int tDiff, t0, Cnt = 0;
   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));
   _ShowText("Random graph");
   Param.aY = (I16 *) GUI_ALLOC_h2p(hMem);
   /*
   GUI_SetFont(&GUI_Font6x8);
   GUI_DispStringAt("msec/graph:", 10, 50);
   */
   _LabelMS();
   t0 = GUI_GetTime();
   while (((tDiff = (GUI_GetTime() - t0)) < 10000) && !GUIDEMO_CheckCancel())
   {
      int t1, tDiff2;
      _GetRandomData(Param.aY, tDiff, (LCD_XSIZE - 20));
      t1 = GUI_GetTime();
      GUI_MEMDEV_Draw(&Rect, _Draw, &Param, 0, GUI_MEMDEV_NOTRANS);
      tDiff2 = GUI_GetTime() - t1;
      if (tDiff2 < 100)
      {
         GUI_Delay(100 - tDiff2);
      }
      if (!((++Cnt) % 10))
      {
         _DisplayTime(tDiff2);
         /*
         GUI_GotoXY(80, 50);
         GUI_SetColor(GUI_WHITE);
         GUI_SetBkColor(GUI_RED);
         GUI_DispDecSpace(tDiff2, 3);
         */
      }
   }
   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_AllocZero((LCD_XSIZE + 90) * sizeof(I16));
   _ShowText("Sine wave");
   pStart = (I16 *) GUI_ALLOC_h2p(hMem);
   _GetSineData(pStart, LCD_XSIZE + 90);
   /*
   GUI_SetFont(&GUI_Font6x8);
   GUI_DispStringAt("msec/graph:", 10, 50);
   */
   _LabelMS();
   t0 = GUI_GetTime();
   while (((GUI_GetTime() - t0) < 10000) && !GUIDEMO_CheckCancel())
   {
      int t1, tDiff2;
      if (Cnt % 90)
      {
         Param.aY++;
      }
      else
      {
         Param.aY = pStart;
      }
      t1 = GUI_GetTime();
      GUI_MEMDEV_Draw(&Rect, _Draw2, &Param, 0, GUI_MEMDEV_NOTRANS);
      tDiff2 = GUI_GetTime() - t1;
      if (tDiff2 < 100)
      {
         GUI_Delay(100 - tDiff2);
      }
      if (!((++Cnt) % 10))
      {
         _DisplayTime(tDiff2);
         /*
         GUI_GotoXY(80, 50);
         GUI_SetColor(GUI_WHITE);
         GUI_SetBkColor(GUI_RED);
         GUI_DispDecSpace(tDiff2, 3);
         */
      }
   }
   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_AllocZero((LCD_XSIZE + 90) * sizeof(I16));
   _ShowText("Several waves...");
   Param.aY = (I16 *) GUI_ALLOC_h2p(hMem);
   _GetSineData(Param.aY, LCD_XSIZE + 90);
   GUI_MEMDEV_Draw(&Rect, _Draw, &Param, 0, GUI_MEMDEV_NOTRANS);
   for (i = 0; (i < 90) && !GUIDEMO_CheckCancel(); i++)
   {
      _DrawOrData(GUI_GREEN, ++Param.aY);
      GUI_Delay(10);
   }
   GUI_ALLOC_Free(hMem);
}

/*********************************************************************
*
*       GUIDEMO_Graph
*
**********************************************************************
*/

void GUIDEMO_Graph(void)
{
   GUIDEMO_ShowIntro("Drawing a graph",
      "\nOptimized drawing routine for"
      "\ndrawing graph data");
   GUI_Clear();
   _Label();
   _DemoRandomGraph();
   GUIDEMO_NotifyStartNext();
   _DemoSineWave();
   GUIDEMO_NotifyStartNext();
   _DemoOrData();
}

#elif defined(NC30) || defined(NC308)

void GUIDEMO_Graph(void)
{
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -