GUIDEMO_Graph.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:9k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : GUIDEMO_Graph.c
  16. Purpose     : Several GUIDEMO routines
  17. ----------------------------------------------------------------------
  18. */
  19. #include "GUI.h"
  20. //#include "LCD_ConfDefaults.h"      /* valid LCD configuration */
  21. #include <math.h>
  22. #include <stdlib.h>
  23. #include "GUIDEMO.H"
  24. #if GUI_SUPPORT_MEMDEV
  25. /*********************************************************************
  26. *
  27. *       Structure containing information for drawing routine
  28. *
  29. **********************************************************************
  30. */
  31. typedef struct {
  32.   I16 * aY;
  33. } PARAM;
  34. /*********************************************************************
  35. *
  36. *       Defines
  37. *
  38. **********************************************************************
  39. */
  40. #if GUIDEMO_LARGE
  41.   #define YSIZE   (LCD_YSIZE - 100)
  42. #else
  43.   #define YSIZE   (LCD_YSIZE - 30)
  44. #endif
  45. /*
  46. #if LCD_YSIZE > 120
  47.   #define YSIZE   (LCD_YSIZE - 100)
  48. #else
  49.   #define YSIZE   20
  50. #endif
  51. */
  52. #define DEG2RAD (3.1415926f / 180)
  53. #if LCD_BITSPERPIXEL == 1
  54.   #define COLOR_GRAPH0 GUI_WHITE
  55.   #define COLOR_GRAPH1 GUI_WHITE
  56. #else
  57.   #define COLOR_GRAPH0 GUI_GREEN
  58.   #define COLOR_GRAPH1 GUI_YELLOW
  59. #endif
  60. /*********************************************************************
  61. *
  62. *       Draws the graph
  63. *
  64. **********************************************************************
  65. */
  66. static void _Draw(void * p) {
  67.   int i;
  68.   PARAM * pParam = (PARAM *)p;
  69.   GUI_SetBkColor(GUI_BLACK);
  70.   GUI_SetColor(GUI_DARKGRAY);
  71.   GUI_ClearRect(19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21));
  72.   for (i = 0; i < (YSIZE / 2); i += 20) {
  73.     GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) + i, 19, (LCD_XSIZE - 2));
  74.     if (i) {
  75.       GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) - i, 19, (LCD_XSIZE - 2));
  76.     }
  77.   }
  78.   for (i = 40; i < (LCD_XSIZE - 20); i += 40) {
  79.     GUI_DrawVLine(18 + i, (LCD_YSIZE - 20) - YSIZE, (LCD_YSIZE - 21));
  80.   }
  81.   GUI_SetColor(COLOR_GRAPH0);
  82.   GUI_DrawGraph(pParam->aY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
  83. }
  84. static void _Draw2(void * p) {
  85.   PARAM * pParam = (PARAM *)p;
  86.   _Draw(p);
  87.   GUI_SetColor(COLOR_GRAPH1);
  88.   GUI_DrawGraph(pParam->aY+15, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
  89. }
  90. /*********************************************************************
  91. *
  92. *       Labels the x & y-axis
  93. *
  94. **********************************************************************
  95. */
  96. static void _Label(void) {
  97.   int x, y;
  98.   GUI_SetPenSize(1);
  99.   GUI_ClearRect(0, (LCD_YSIZE - 21) - YSIZE, (LCD_XSIZE - 1), (LCD_YSIZE - 1));
  100.   GUI_DrawRect(18, (LCD_YSIZE - 21) - YSIZE, (LCD_XSIZE - 1), (LCD_YSIZE - 20));
  101.   GUI_SetFont(&GUI_Font6x8);
  102.   for (x = 0; x < (LCD_XSIZE - 20); x += 40) {
  103.     int xPos = x + 18;
  104.     GUI_DrawVLine(xPos, (LCD_YSIZE - 20), (LCD_YSIZE - 14));
  105.     GUI_DispDecAt(x / 40, xPos - 2, (LCD_YSIZE - 9), 1);
  106.   }
  107.   for (y = 0; y < YSIZE / 2; y += 20) {
  108.     int yPos = (LCD_YSIZE - 20) - YSIZE / 2 + y;
  109.     GUI_DrawHLine(yPos, 13, 18);
  110.     if (y) {
  111.       GUI_GotoXY(1, yPos - 4);
  112.       GUI_DispSDec(-y / 20, 2);
  113.       yPos = (LCD_YSIZE - 20) - YSIZE / 2 - y;
  114.       GUI_DrawHLine(yPos, 13, 18);
  115.       GUI_GotoXY(1, yPos - 4);
  116.       GUI_DispSDec(y / 20, 2);
  117.     } else {
  118.       GUI_DispCharAt('0', 7, yPos - 4);
  119.     }
  120.   }
  121. }
  122. /*********************************************************************
  123. *
  124. *       Draws random data
  125. *
  126. **********************************************************************
  127. */
  128. static void _GetRandomData(I16 * paY, int Time, int n) {
  129.   int aDiff, i;
  130.   if (Time > 5000)
  131.     Time -= 5000;
  132.   if (Time > 2500)
  133.     Time = 5000 - Time;
  134.   Time /= 200;
  135.   aDiff = Time * Time + 1;
  136.   for (i = 0; i < n; i++) {
  137.     if (!i) {
  138.       paY[i] = rand() % YSIZE;
  139.     } else {
  140.       I16 yNew;
  141.       int yD = aDiff - (rand() % aDiff);
  142.       if (rand() & 1) {
  143.         yNew = paY[i-1] + yD;
  144.       } else {
  145.         yNew = paY[i-1] - yD;
  146.       }
  147.       if (yNew > YSIZE) {
  148.         yNew -= yD;
  149.       } else { if (yNew < 0)
  150.         yNew += yD;
  151.       }
  152.       paY[i] = yNew;
  153.     }
  154.   }
  155. }
  156. static void _ShowText(const char * sText) {
  157.   GUI_SetColor(GUI_WHITE);
  158.   GUI_SetBkColor(GUI_RED);
  159.   #if GUIDEMO_LARGE
  160.     GUI_ClearRect(0, 0, LCD_XSIZE, 60);
  161.     GUI_SetFont(&GUI_FontComic18B_1);
  162.     GUI_DispStringAt(sText, 10, 20);
  163.   #else
  164.     sText = sText;  /* Avoid warning */
  165.   #endif
  166. }
  167. static void _LabelMS(void) {
  168.   GUI_SetFont(&GUI_Font6x8);
  169.   #if GUIDEMO_LARGE
  170.     GUI_DispStringAt("msec/graph:", 10, 50);
  171.   #endif
  172. }
  173. static void _DisplayTime(int tDiff) {
  174.   #if GUIDEMO_LARGE
  175.     GUI_GotoXY(80, 50);
  176.     GUI_SetColor(GUI_WHITE);
  177.     GUI_SetBkColor(GUI_RED);
  178.     GUI_DispDecSpace(tDiff, 3);
  179.   #else
  180.     tDiff = tDiff; /* Avoid warning */
  181.   #endif
  182. }
  183. static void _DemoRandomGraph(void) {
  184.   PARAM Param;
  185.   int tDiff, t0, Cnt = 0;
  186.   GUI_RECT Rect = {19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)};
  187.   GUI_HMEM hMem = GUI_ALLOC_Alloc((LCD_XSIZE - 20) * sizeof(I16));
  188.   _ShowText("Random graph");
  189.   Param.aY = (I16*)GUI_ALLOC_h2p(hMem);
  190.   /*
  191.   GUI_SetFont(&GUI_Font6x8);
  192.   GUI_DispStringAt("msec/graph:", 10, 50);
  193.   */
  194.   _LabelMS();
  195.   t0 = GUI_GetTime();
  196.   while(((tDiff = (GUI_GetTime() - t0)) < 10000) && !GUIDEMO_CheckCancel()) {
  197.     int t1, tDiff2;
  198.     _GetRandomData(Param.aY, tDiff, (LCD_XSIZE - 20));
  199.     t1 = GUI_GetTime();
  200.     GUI_MEMDEV_Draw(&Rect, _Draw, &Param, 0, GUI_MEMDEV_NOTRANS);
  201.     tDiff2 = GUI_GetTime() - t1;
  202.     if (tDiff2 < 100) {
  203.       GUI_Delay(100 - tDiff2);
  204.     }
  205.     if(!((++Cnt)%10)) {
  206.       _DisplayTime(tDiff2);
  207.       /*
  208.       GUI_GotoXY(80, 50);
  209.       GUI_SetColor(GUI_WHITE);
  210.       GUI_SetBkColor(GUI_RED);
  211.       GUI_DispDecSpace(tDiff2, 3);
  212.       */
  213.     }
  214.   }
  215.   GUI_ALLOC_Free(hMem);
  216. }
  217. /*********************************************************************
  218. *
  219. *       Draws a sine wave
  220. *
  221. **********************************************************************
  222. */
  223. static void _GetSineData(I16 * paY, int n) {
  224.   int i;
  225.   for (i = 0; i < n; i++) {
  226.     float s = sin(i * DEG2RAD * 4);
  227.     paY[i] = s * YSIZE / 2 + YSIZE / 2;
  228.   }
  229. }
  230. static void _DemoSineWave(void) {
  231.   PARAM Param;
  232.   I16 * pStart;
  233.   int t0, Cnt = 0;
  234.   GUI_RECT Rect = {19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)};
  235.   GUI_HMEM hMem = GUI_ALLOC_Alloc((LCD_XSIZE + 90) * sizeof(I16));
  236.   _ShowText("Sine wave");
  237.   pStart = (I16*)GUI_ALLOC_h2p(hMem);
  238.   _GetSineData(pStart, LCD_XSIZE + 90);
  239.   /*
  240.   GUI_SetFont(&GUI_Font6x8);
  241.   GUI_DispStringAt("msec/graph:", 10, 50);
  242.   */
  243.   _LabelMS();
  244.   t0 = GUI_GetTime();
  245.   while(((GUI_GetTime() - t0) < 10000) && !GUIDEMO_CheckCancel()) {
  246.     int t1, tDiff2;
  247.     if (Cnt % 90) {
  248.       Param.aY++;
  249.     } else {
  250.       Param.aY = pStart;
  251.     }
  252.     t1 = GUI_GetTime();
  253.     GUI_MEMDEV_Draw(&Rect, _Draw2, &Param, 0, GUI_MEMDEV_NOTRANS);
  254.     tDiff2 = GUI_GetTime() - t1;
  255.     if (tDiff2 < 100) {
  256.       GUI_Delay(100 - tDiff2);
  257.     }
  258.     if(!((++Cnt) % 10)) {
  259.       _DisplayTime(tDiff2);
  260.       /*
  261.       GUI_GotoXY(80, 50);
  262.       GUI_SetColor(GUI_WHITE);
  263.       GUI_SetBkColor(GUI_RED);
  264.       GUI_DispDecSpace(tDiff2, 3);
  265.       */
  266.     }
  267.   }
  268.   GUI_ALLOC_Free(hMem);
  269. }
  270. /*********************************************************************
  271. *
  272. *       Adds several waves
  273. *
  274. **********************************************************************
  275. */
  276. static void _DrawOrData(GUI_COLOR Color, I16 * paY) {
  277.   GUI_SetColor(Color);
  278.   GUI_DrawGraph(paY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE);
  279. }
  280. static void _DemoOrData(void) {
  281.   int i;
  282.   PARAM Param;
  283.   GUI_RECT Rect = {19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)};
  284.   GUI_HMEM hMem = GUI_ALLOC_Alloc((LCD_XSIZE + 90) * sizeof(I16));
  285.   _ShowText("Several waves...");
  286.   Param.aY = (I16*)GUI_ALLOC_h2p(hMem);
  287.   _GetSineData(Param.aY, LCD_XSIZE + 90);
  288.   GUI_MEMDEV_Draw(&Rect, _Draw, &Param, 0, GUI_MEMDEV_NOTRANS);
  289.   for (i = 0; (i < 90) && !GUIDEMO_CheckCancel(); i++) {
  290.     _DrawOrData(GUI_GREEN, ++Param.aY);
  291.     GUI_Delay(10);
  292.   }
  293.   GUI_ALLOC_Free(hMem);
  294. }
  295. /*********************************************************************
  296. *
  297. *       GUIDEMO_Graph
  298. *
  299. **********************************************************************
  300. */
  301. void GUIDEMO_Graph(void) {
  302.   GUIDEMO_ShowIntro("Drawing a graph",
  303.                     "Optimized drawing routine for"
  304.                     "ndrawing graph data");
  305.   GUI_Clear();
  306.   _Label();
  307.   _DemoRandomGraph();
  308.   GUIDEMO_NotifyStartNext();
  309.   _DemoSineWave();
  310.   GUIDEMO_NotifyStartNext();
  311.   _DemoOrData();
  312. }
  313. #elif defined(NC30) || defined(NC308)
  314. void GUIDEMO_Graph(void) {}
  315. #endif