GUIDEMO_Graph.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. /*********************************************************************
  2. * SEGGER Microcontroller GmbH & Co. KG *
  3. * Solutions for real time microcontroller applications *
  4. **********************************************************************
  5. * *
  6. * (c) 1996 - 2015 SEGGER Microcontroller GmbH & Co. KG *
  7. * *
  8. * Internet: www.segger.com Support: support@segger.com *
  9. * *
  10. **********************************************************************
  11. ** emWin V5.32 - Graphical user interface for embedded applications **
  12. All Intellectual Property rights in the Software belongs to SEGGER.
  13. emWin is protected by international copyright laws. Knowledge of the
  14. source code may not be used to write a similar product. This file may
  15. only be used in accordance with the following terms:
  16. The software has been licensed to STMicroelectronics International
  17. N.V. a Dutch company with a Swiss branch and its headquarters in Plan-
  18. les-Ouates, Geneva, 39 Chemin du Champ des Filles, Switzerland for the
  19. purposes of creating libraries for ARM Cortex-M-based 32-bit microcon_
  20. troller products commercialized by Licensee only, sublicensed and dis_
  21. tributed under the terms and conditions of the End User License Agree_
  22. ment supplied by STMicroelectronics International N.V.
  23. Full source code is available at: www.segger.com
  24. We appreciate your understanding and fairness.
  25. ----------------------------------------------------------------------
  26. Licensing information
  27. Licensor: SEGGER Software GmbH
  28. Licensed to: STMicroelectronics International NV
  29. Licensed SEGGER software: emWin
  30. License number: GUI-00429
  31. License model: Buyout SRC [Buyout Source Code License, signed November 29th 2012]
  32. Licensed product: -
  33. Licensed platform: STMs ARM Cortex-M based 32 BIT CPUs
  34. Licensed number of seats: -
  35. ----------------------------------------------------------------------
  36. File : GUIDEMO_Graph.c
  37. Purpose : Demonstration of the GRAPH widget.
  38. ----------------------------------------------------------------------
  39. */
  40. #include "GUIDEMO.h"
  41. #if (SHOW_GUIDEMO_GRAPH && GUI_WINSUPPORT && GUI_SUPPORT_MEMDEV)
  42. /*********************************************************************
  43. *
  44. * Configuration defines
  45. *
  46. **********************************************************************
  47. */
  48. #define MAX_GRAPH_SIZE_X 440
  49. #define MAX_GRAPH_SIZE_Y ((MAX_GRAPH_SIZE_X * 11) / 20)
  50. #define DIST_TO_BORDER 10
  51. #define DIST_TO_WIN 5
  52. #define BORDER_TOP 0
  53. #define BORDER_BOTTOM 11
  54. #define BORDER_LEFT 19
  55. #define BORDER_RIGHT 0
  56. #define COLOR_BK GUI_DARKGRAY
  57. #define COLOR_BORDER BK_COLOR_1
  58. #define COLOR_FRAME GUI_BLACK
  59. #define COLOR_GRID GUI_GRAY
  60. #define SCALE_H_HEIGHT 4
  61. #define TICK_DIST_H 25
  62. #define TICK_DIST_V 20
  63. #define TIME_RUN 5000
  64. #define TIME_STEP 15
  65. #define MAX_NUM_DATA_OBJ 3
  66. #define GRAPH_DIV 9 // (2^9 = 512) If this value is changed _aWaves[] need to be changed too!
  67. #define GRID_DIST_X 25
  68. #define GRID_DIST_Y 10
  69. /*********************************************************************
  70. *
  71. * Typedef / Data
  72. *
  73. **********************************************************************
  74. */
  75. typedef struct {
  76. char * pName;
  77. int ScaleVOff;
  78. int DataVOff;
  79. int GridVOff;
  80. void (* pfAddData)(GRAPH_DATA_Handle hData, int DataID);
  81. int NumWaves;
  82. } GRAPH_WAVE;
  83. static int _HeartBeat[] = {
  84. 2, 4, 6, 8, 10, 6, 2, 0, 0, 0,
  85. -8, 16, 40, 64, 88, 58, 28, -2, -32, -30,
  86. -20, -10, 0, 2, 2, 4, 4, 6, 6, 8,
  87. 8, 10, 12, 14, 16, 18, 20, 16, 12, 8,
  88. 4, 2, 2, 0, 0, 0, 0, 0, 0, 0,
  89. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  90. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  91. };
  92. static GUI_COLOR _aColorData[MAX_NUM_DATA_OBJ] = {
  93. GUI_MAKE_COLOR(0x50C0FF),
  94. GUI_MAKE_COLOR(0xFFC050),
  95. GUI_MAKE_COLOR(0x50FFC0),
  96. };
  97. static GRAPH_SCALE_Handle _hScaleH;
  98. static GRAPH_SCALE_Handle _hScaleV;
  99. static int _DataAdjust;
  100. /*********************************************************************
  101. *
  102. * Static functions
  103. *
  104. **********************************************************************
  105. */
  106. /*********************************************************************
  107. *
  108. * _AddData_Sine
  109. */
  110. static void _AddData_Sine(GRAPH_DATA_Handle hData, int DataID) {
  111. static int x1000[MAX_NUM_DATA_OBJ];
  112. I32 SinHQ;
  113. int Multi;
  114. int Step;
  115. switch (DataID) {
  116. case 0:
  117. Multi = 70;
  118. Step = 3;
  119. break;
  120. case 1:
  121. Multi = 50;
  122. Step = 1;
  123. break;
  124. case 2:
  125. Multi = 30;
  126. Step = 7;
  127. break;
  128. default:
  129. return;
  130. }
  131. SinHQ = GUI__SinHQ(x1000[DataID]);
  132. x1000[DataID] += 1000 * Step;
  133. GRAPH_DATA_YT_AddValue(hData, SHIFT_RIGHT_16(SinHQ * Multi) + _DataAdjust);
  134. }
  135. /*********************************************************************
  136. *
  137. * _AddData_Heartbeat
  138. */
  139. static void _AddData_Heartbeat(GRAPH_DATA_Handle hData, int DataID) {
  140. static int Index;
  141. GUI_USE_PARA(DataID);
  142. GRAPH_DATA_YT_AddValue(hData, (_HeartBeat[Index]) + _DataAdjust);
  143. if (++Index == GUI_COUNTOF(_HeartBeat)) {
  144. Index = 0;
  145. }
  146. }
  147. /*********************************************************************
  148. *
  149. * DATA _aWave - Keep below _AddData-functions
  150. */
  151. GRAPH_WAVE _aWave[] = {
  152. { "Heartbeat", // Name
  153. 157, // Vertical scale offset in relation to GRAPH_DIV
  154. 152, // Vertical data offset in relation to GRAPH_DIV
  155. 21, // Vertical grid offset in relation to GRAPH_DIV
  156. _AddData_Heartbeat, // Pointer to specific AddData function
  157. 1 // Number of waves
  158. },
  159. { "Sine Waves",
  160. 265,
  161. 253,
  162. 23,
  163. _AddData_Sine,
  164. 3
  165. }
  166. };
  167. /*********************************************************************
  168. *
  169. * _ShowGraph
  170. */
  171. static void _ShowGraph(GRAPH_Handle hGraph, GRAPH_DATA_Handle hData[], int DataCount, void (* pfAddData)(GRAPH_DATA_Handle hData, int DataID)) {
  172. int Data_xSize;
  173. int NextState;
  174. int TimeStart;
  175. int TimeDiff;
  176. int TimeStep;
  177. int Count;
  178. int xSize;
  179. int i;
  180. xSize = LCD_GetXSize();
  181. Data_xSize = xSize - (DIST_TO_BORDER << 1) - (BORDER_LEFT + BORDER_RIGHT);
  182. Count = 0;
  183. //
  184. // Attach data objects
  185. //
  186. for (i = 0; i < DataCount; i++) {
  187. GRAPH_AttachData(hGraph, hData[i]);
  188. }
  189. //
  190. // Add values before GRAPH is displayed
  191. //
  192. while (Count < Data_xSize) {
  193. for (i = 0; i < DataCount; i++) {
  194. pfAddData(hData[i], i);
  195. }
  196. Count++;
  197. }
  198. //
  199. // Add values depending on time
  200. //
  201. TimeStart = GUIDEMO_GetTime();
  202. do {
  203. TimeDiff = GUIDEMO_GetTime() - TimeStart;
  204. for (i = 0; i < DataCount; i++) {
  205. pfAddData(hData[i], i);
  206. }
  207. NextState = GUIDEMO_CheckCancel();
  208. TimeStep = GUIDEMO_GetTime() - TimeStart;
  209. if ((TimeStep - TimeDiff) < TIME_STEP) {
  210. GUI_Delay(TIME_STEP - (TimeStep - TimeDiff));
  211. }
  212. } while ((TimeDiff < TIME_RUN) && (NextState == 0));
  213. for (i = 0; i < DataCount; i++) {
  214. GRAPH_DetachData(hGraph, hData[i]);
  215. }
  216. GUIDEMO_NotifyStartNext();
  217. }
  218. /*********************************************************************
  219. *
  220. * _cbBk
  221. */
  222. static void _cbBk(WM_MESSAGE * pMsg) {
  223. switch (pMsg->MsgId) {
  224. case WM_PAINT:
  225. GUIDEMO_DrawBk();
  226. break;
  227. default:
  228. WM_DefaultProc(pMsg);
  229. }
  230. }
  231. /*********************************************************************
  232. *
  233. * _GraphDemo
  234. */
  235. static void _GraphDemo(void) {
  236. const WIDGET_EFFECT * pEffectOld;
  237. GRAPH_DATA_Handle hData[MAX_NUM_DATA_OBJ];
  238. GRAPH_Handle hGraph;
  239. unsigned i;
  240. int Graph_xSize;
  241. int Graph_ySize;
  242. int Graph_xPos;
  243. int Graph_yPos;
  244. int Data_ySize;
  245. int xSize;
  246. int ySize;
  247. xSize = LCD_GetXSize();
  248. ySize = LCD_GetYSize();
  249. pEffectOld = WIDGET_SetDefaultEffect(&WIDGET_Effect_Simple);
  250. //
  251. // Set Callback function for background window
  252. //
  253. WM_SetCallback(WM_HBKWIN, _cbBk);
  254. //
  255. // Determine size of GRAPH
  256. //
  257. Graph_xSize = xSize - (DIST_TO_BORDER << 1); // xsize = Screen size subtracting twice the distance to the border of the screen
  258. Graph_ySize = ySize - INFO_SIZE_Y - (DIST_TO_WIN << 1); // ysize = Screen size subtracting the window sizes and twice the distance to the windows
  259. if (Graph_ySize > MAX_GRAPH_SIZE_Y) {
  260. Graph_ySize = MAX_GRAPH_SIZE_Y;
  261. if (Graph_xSize > (Graph_ySize * 20) / 11) {
  262. Graph_xSize = (Graph_ySize * 20) / 11;
  263. }
  264. }
  265. //
  266. // Create and configure GRAPH_WIDGET
  267. //
  268. Graph_xPos = (xSize - Graph_xSize) / 2;
  269. Graph_yPos = (ySize - Graph_ySize) / 2;
  270. if (Graph_yPos < INFO_SIZE_Y + DIST_TO_WIN) {
  271. Graph_yPos = INFO_SIZE_Y + DIST_TO_WIN;
  272. }
  273. hGraph = GRAPH_CreateEx(Graph_xPos, Graph_yPos, Graph_xSize, Graph_ySize, WM_HBKWIN, WM_CF_SHOW | WM_CF_CONST_OUTLINE, 0, 0);
  274. GRAPH_SetBorder(hGraph, BORDER_LEFT, BORDER_TOP, BORDER_RIGHT, BORDER_BOTTOM);
  275. WM_SetHasTrans (hGraph);
  276. GRAPH_SetColor (hGraph, COLOR_BK, GRAPH_CI_BK);
  277. GRAPH_SetColor (hGraph, COLOR_BORDER, GRAPH_CI_BORDER);
  278. GRAPH_SetColor (hGraph, COLOR_FRAME, GRAPH_CI_FRAME);
  279. GRAPH_SetColor (hGraph, COLOR_GRID, GRAPH_CI_GRID);
  280. //
  281. // Adjust grid
  282. //
  283. GRAPH_SetGridVis (hGraph, 1);
  284. GRAPH_SetGridDistX(hGraph, GRID_DIST_X);
  285. GRAPH_SetGridDistY(hGraph, GRID_DIST_Y);
  286. WM_BringToBottom (hGraph);
  287. //
  288. // Create and configure GRAPH_DATA_YT object
  289. //
  290. for (i = 0; i < MAX_NUM_DATA_OBJ; i++) {
  291. hData[i] = GRAPH_DATA_YT_Create(_aColorData[i], xSize - (DIST_TO_BORDER << 1) - BORDER_LEFT, 0, 0);
  292. }
  293. Data_ySize = Graph_ySize - BORDER_BOTTOM;
  294. //
  295. // Create and configure GRAPH_SCALE objects
  296. //
  297. _hScaleH = GRAPH_SCALE_Create(BORDER_BOTTOM >> 1, GUI_TA_VCENTER, GRAPH_SCALE_CF_HORIZONTAL, TICK_DIST_H);
  298. _hScaleV = GRAPH_SCALE_Create(BORDER_LEFT >> 1, GUI_TA_HCENTER, GRAPH_SCALE_CF_VERTICAL, TICK_DIST_V);
  299. GRAPH_AttachScale(hGraph, _hScaleH);
  300. GRAPH_AttachScale(hGraph, _hScaleV);
  301. GRAPH_SCALE_SetPos(_hScaleH, Graph_ySize - SCALE_H_HEIGHT);
  302. GRAPH_SCALE_SetOff(_hScaleH, -5);
  303. //
  304. // Show some graphs
  305. //
  306. for (i = 0; i < GUI_COUNTOF(_aWave); i++) {
  307. GUIDEMO_SetInfoText(_aWave[i].pName);
  308. _DataAdjust = GUIDEMO_ShiftRight(Data_ySize * _aWave[i].DataVOff, GRAPH_DIV);
  309. GRAPH_SetGridOffY (hGraph, GUIDEMO_ShiftRight(Data_ySize * _aWave[i].GridVOff, GRAPH_DIV));
  310. GRAPH_SCALE_SetOff(_hScaleV, GUIDEMO_ShiftRight((Data_ySize - BORDER_BOTTOM) * _aWave[i].ScaleVOff, GRAPH_DIV));
  311. _ShowGraph(hGraph, hData, _aWave[i].NumWaves, _aWave[i].pfAddData);
  312. }
  313. //
  314. // Clean up
  315. //
  316. GRAPH_DetachScale(hGraph, _hScaleH);
  317. GRAPH_DetachScale(hGraph, _hScaleV);
  318. GRAPH_SCALE_Delete(_hScaleH);
  319. GRAPH_SCALE_Delete(_hScaleV);
  320. for (i = 0; i < MAX_NUM_DATA_OBJ; i++) {
  321. GRAPH_DATA_YT_Delete(hData[i]);
  322. }
  323. WM_DeleteWindow(hGraph);
  324. WIDGET_SetDefaultEffect(pEffectOld);
  325. }
  326. /*********************************************************************
  327. *
  328. * Public functions
  329. *
  330. **********************************************************************
  331. */
  332. void GUIDEMO_Graph(void) {
  333. GUIDEMO_ConfigureDemo("Drawing a graph", "Optimized drawing routine\nfor drawing graph data", GUIDEMO_SHOW_CURSOR | GUIDEMO_SHOW_INFO | GUIDEMO_SHOW_CONTROL);
  334. _GraphDemo();
  335. GUIDEMO_NotifyStartNext();
  336. }
  337. #else
  338. void GUIDEMO_Graph_C(void);
  339. void GUIDEMO_Graph_C(void) {}
  340. #endif // SHOW_GUIDEMO_GRAPH && GUI_WINSUPPORT && GUI_SUPPORT_MEMDEV
  341. /*************************** End of file ****************************/