📄 gui_widget_graphytdemo.c
字号:
/*********************************************************************
* SEGGER MICROCONTROLLER SYSTEME GmbH *
* Solutions for real time microcontroller applications *
**********************************************************************
* *
* (c) 1995 - 2007 SEGGER Microcontroller Systeme GmbH *
* *
* www.segger.com Support: support@segger.com *
* *
**********************************************************************
* *
* embOS * Real time operating system for microcontrollers *
* *
* *
* Please note: *
* *
* Knowledge of this file may under no circumstances *
* be used to write a similar product or a real-time *
* operating system for in-house use. *
* *
* Thank you for your fairness ! *
* *
**********************************************************************
* *
* embOS version: 3.32p *
* *
**********************************************************************
----------------------------------------------------------------------
File : GUI_WIDGET_GraphYtDemo.c
Purpose : Demonstrates the use of the GRAPH widget
-------- END-OF-HEADER ---------------------------------------------
*/
#include <stdlib.h>
#include <string.h>
#include "BSP.h"
#include "GUI.h"
#include "DIALOG.h"
#include "GRAPH.h"
/*********************************************************************
*
* Defines
*
**********************************************************************
*/
#define MAX_VALUE 180
/*********************************************************************
*
* Static data
*
**********************************************************************
*/
static GRAPH_DATA_Handle _ahData[3]; /* Array of handles for the GRAPH_DATA objects */
static GRAPH_SCALE_Handle _hScaleV; /* Handle of vertical scale */
static GRAPH_SCALE_Handle _hScaleH; /* Handle of horizontal scale */
static I16 _aValue[3];
static int _Stop;
static GUI_COLOR _aColor[] = {GUI_RED, GUI_GREEN, GUI_LIGHTBLUE}; /* Array of colors for the GRAPH_DATA objects */
/* Dialog ressource */
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "Graph widget demo", 0 , 0, 0, 320, 240, FRAMEWIN_CF_MOVEABLE },
{ GRAPH_CreateIndirect, 0, GUI_ID_GRAPH0 , 5, 5, 270, 175 },
{ TEXT_CreateIndirect, "Spacing X:", 0 , 10, 185, 50, 20 },
{ TEXT_CreateIndirect, "Spacing Y:", 0 , 10, 205, 50, 20 },
{ SLIDER_CreateIndirect, 0, GUI_ID_SLIDER0 , 60, 185, 60, 16 },
{ SLIDER_CreateIndirect, 0, GUI_ID_SLIDER1 , 60, 205, 60, 16 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK0 , 130, 185, 50, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK1 , 130, 205, 50, 0 },
{ TEXT_CreateIndirect, "Border", 0 , 280, 5, 35, 15 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK2 , 280, 20, 35, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK3 , 280, 40, 35, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK4 , 280, 60, 35, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK5 , 280, 80, 35, 0 },
{ TEXT_CreateIndirect, "Effect", 0 , 280, 100, 35, 15 },
{ RADIO_CreateIndirect, 0, GUI_ID_RADIO0 , 275, 115, 35, 0, 0, 3 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK6 , 180, 185, 50, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK7 , 180, 205, 50, 0 },
{ BUTTON_CreateIndirect, "Full Screen", GUI_ID_BUTTON0 , 235, 185, 65, 18 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK8 , 235, 205, 70, 0 },
};
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
/*********************************************************************
*
* _AddValues
*
* Purpose:
* This routine calculates new random values in dependence of the previous added values
* and adds them to the GRAPH_DATA objects
*/
static void _AddValues(WM_HWIN hGraph) {
int i;
for (i = 0; i < GUI_COUNTOF(_aValue); i++) {
int Add = rand() % (2 + i * i);
int Vz = ((rand() % 2) << 1) - 1;
_aValue[i] += Add * Vz;
if (_aValue[i] > MAX_VALUE) {
_aValue[i] = MAX_VALUE;
} else if (_aValue[i] < 0) {
_aValue[i] = 0;
}
GRAPH_DATA_YT_AddValue(_ahData[i], _aValue[i]);
}
}
/*********************************************************************
*
* _UserDraw
*
* Purpose:
* This routine is called by the GRAPH object before anything is drawn
* and after the last drawing operation.
*/
static void _UserDraw(WM_HWIN hWin, int Stage) {
if (Stage == GRAPH_DRAW_LAST) {
char acText[] = "Temperature";
GUI_RECT Rect, RectInvalid;
int FontSizeY;
GUI_SetFont(&GUI_Font13_ASCII);
FontSizeY = GUI_GetFontSizeY();
WM_GetInsideRect(&Rect);
WM_GetInvalidRect(hWin, &RectInvalid);
Rect.x1 = Rect.x0 + FontSizeY;
GUI_SetColor(GUI_RED);
GUI_DispStringInRectEx(acText, &Rect, GUI_TA_HCENTER, strlen(acText), GUI_ROTATE_CCW);
}
}
/*********************************************************************
*
* _ForEach
*
* Purpose:
* This routine hides/shows all windows except the button, graph and scroll bar widgets
*/
static void _ForEach(WM_HWIN hWin, void * pData) {
int Id, FullScreenMode;
FullScreenMode = *(int *)pData;
Id = WM_GetId(hWin);
if ((Id == GUI_ID_GRAPH0) || (Id == GUI_ID_BUTTON0) || (Id == GUI_ID_VSCROLL) || (Id == GUI_ID_HSCROLL)) {
return;
}
if (FullScreenMode) {
WM_HideWindow(hWin);
} else {
WM_ShowWindow(hWin);
}
}
/*********************************************************************
*
* _ToggleFullScreenMode
*
* Purpose:
* This routine switches between full screen mode and normal mode by hiding or showing the
* widgets of the dialog, enlarging/shrinking the graph widget and modifying some other
* attributes of the dialog widgets.
*/
static void _ToggleFullScreenMode(WM_HWIN hDlg) {
static int FullScreenMode;
static GUI_RECT Rect;
static unsigned ScalePos;
WM_HWIN hGraph, hButton;
hGraph = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
hButton = WM_GetDialogItem(hDlg, GUI_ID_BUTTON0);
FullScreenMode ^= 1;
if (FullScreenMode) {
/* Enter the full screen mode */
WM_HWIN hClient;
GUI_RECT RectInside;
hClient = WM_GetClientWindow(hDlg);
BUTTON_SetText(hButton, "Back");
WM_MoveWindow(hButton, 0, 11);
FRAMEWIN_SetTitleVis(hDlg, 0);
WM_GetInsideRectEx(hClient, &RectInside);
WM_GetWindowRectEx(hGraph, &Rect);
WM_ForEachDesc(hClient, _ForEach, &FullScreenMode); /* Hide all descendants */
WM_SetWindowPos(hGraph, WM_GetWindowOrgX(hClient), WM_GetWindowOrgX(hClient), RectInside.x1, RectInside.y1);
ScalePos = GRAPH_SCALE_SetPos(_hScaleH, RectInside.y1 - 20);
} else {
/* Return to normal mode */
BUTTON_SetText(hButton, "Full Screen");
WM_MoveWindow(hButton, 0, -11);
WM_ForEachDesc(WM_GetClientWindow(hDlg), _ForEach, &FullScreenMode); /* Show all descendants */
WM_SetWindowPos(hGraph, Rect.x0, Rect.y0, Rect.x1 - Rect.x0 + 1, Rect.y1 - Rect.y0 + 1);
FRAMEWIN_SetTitleVis(hDlg, 1);
GRAPH_SCALE_SetPos(_hScaleH, ScalePos);
}
}
/*********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -