445 lines
12 KiB
C
445 lines
12 KiB
C
/*
|
|
*********************************************************************************************************
|
|
* uC/GUI
|
|
* Universal graphic software for embedded applications
|
|
*
|
|
* (c) Copyright 2002, Micrium Inc., Weston, FL
|
|
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
|
|
*
|
|
* µC/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.c
|
|
Purpose : Several GUIDEMO routines
|
|
----------------------------------------------------------------------
|
|
*/
|
|
|
|
#include <stddef.h>
|
|
#include "GUI.h"
|
|
#if GUI_WINSUPPORT
|
|
#include "PROGBAR.h"
|
|
#include "LISTBOX.h"
|
|
#include "FRAMEWIN.h"
|
|
#include "BUTTON.h"
|
|
#endif
|
|
#include "GUIDEMO.h"
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Static variables
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#if GUI_WINSUPPORT
|
|
static BUTTON_Handle _ahButton[2];
|
|
static FRAMEWIN_Handle _ahFrameWin[3];
|
|
static int _ButtonSizeX, _ButtonSizeY;
|
|
#if GUIDEMO_LARGE
|
|
static FRAMEWIN_Handle _ahInfoWin[2];
|
|
static const char* _sInfo;
|
|
#endif
|
|
#endif
|
|
|
|
static int _iTest, _iTestMinor;
|
|
static char _CmdNext;
|
|
static const char* _sExplain;
|
|
|
|
#define countof(Obj) (sizeof(Obj)/sizeof(Obj[0]))
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Routine table
|
|
*
|
|
**********************************************************************
|
|
|
|
The routines to be called are listed here. The advantage to calling
|
|
directly is that we can execute some code before and after.
|
|
*/
|
|
|
|
typedef void fVoidVoid(void);
|
|
|
|
static fVoidVoid * _apfTest[] = {
|
|
GUIDEMO_HardwareInfo,
|
|
GUIDEMO_Speed,
|
|
#if GUI_SUPPORT_MEMDEV
|
|
GUIDEMO_Graph,
|
|
#endif
|
|
GUIDEMO_Bitmap,
|
|
GUIDEMO_Cursor,
|
|
GUIDEMO_ShowInternationalFonts,
|
|
GUIDEMO_ShowColorBar,
|
|
GUIDEMO_ShowColorList,
|
|
//GUIDEMO_DemoLUT,
|
|
GUIDEMO_DemoPolygon,
|
|
GUIDEMO_Circle,
|
|
GUIDEMO_Automotive,
|
|
GUIDEMO_Navigation,
|
|
#if GUI_WINSUPPORT
|
|
GUIDEMO_Dialog,
|
|
GUIDEMO_DemoProgBar,
|
|
GUIDEMO_DemoFrameWin,
|
|
#if GUI_SUPPORT_TOUCH
|
|
GUIDEMO_Touch,
|
|
#endif
|
|
#endif
|
|
0
|
|
};
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Static routines
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
static void _UpdateCmdWin(void) {
|
|
#if GUI_WINSUPPORT && GUIDEMO_LARGE
|
|
WM_InvalidateWindow(_ahInfoWin[1]);
|
|
#endif
|
|
}
|
|
|
|
#if (GUI_WINSUPPORT && GUIDEMO_LARGE)
|
|
static void _cbCmdWin(WM_MESSAGE* pMsg) {
|
|
switch (pMsg->MsgId) {
|
|
case WM_PAINT:
|
|
/* Update info in command window */
|
|
GUI_SetBkColor(GUI_GRAY);
|
|
GUI_Clear();
|
|
GUI_DispStringAt("Demo ", 0, 0);
|
|
GUI_DispDecMin(_iTest + 1);
|
|
GUI_DispString(".");
|
|
GUI_DispDecMin(_iTestMinor);
|
|
GUI_DispString("/");
|
|
GUI_DispDecMin(countof(_apfTest));
|
|
default:
|
|
WM_DefaultProc(pMsg);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
static void _UpdateInfoWin(void) {
|
|
#if GUI_WINSUPPORT && GUIDEMO_LARGE
|
|
GUI_RECT rClient;
|
|
WM_HWIN hWin;
|
|
GUI_CONTEXT ContextOld;
|
|
GUI_SaveContext(&ContextOld);
|
|
/* Update info window */
|
|
WM_ShowWindow(_ahInfoWin[0]);
|
|
WM_ShowWindow(_ahFrameWin[0]);
|
|
hWin = WM_SelectWindow(_ahInfoWin[0]);
|
|
GUI_GetClientRect(&rClient);
|
|
GUI_SetBkColor(GUI_WHITE);
|
|
GUI_Clear();
|
|
GUI_SetColor(GUI_BLACK);
|
|
GUI_SetFont(&GUI_Font13_1);
|
|
GUI_SetTextAlign(GUI_TA_HCENTER);
|
|
GUI_DispStringHCenterAt(_sInfo, (rClient.x1 - rClient.x0) / 2, 0);
|
|
GUI_SetTextAlign(GUI_TA_LEFT);
|
|
GUI_SetFont(&GUI_Font8_ASCII);
|
|
GUI_DispStringAt(_sExplain, 0, 20);
|
|
WM_SelectWindow(hWin);
|
|
GUI_RestoreContext(&ContextOld);
|
|
#endif
|
|
}
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Exported routines
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
GUI_COLOR GUIDEMO_SetBkColor(GUI_COLOR Color) {
|
|
GUI_COLOR r;
|
|
if (GUI_ColorIsAvailable(GUI_RED)) {
|
|
r = Color;
|
|
} else {
|
|
r = GUI_BLACK;
|
|
}
|
|
GUI_SetBkColor(r);
|
|
return r;
|
|
}
|
|
|
|
GUI_COLOR GUIDEMO_SetColor(GUI_COLOR Color) {
|
|
GUI_COLOR r;
|
|
if (GUI_ColorIsAvailable(GUI_RED)) {
|
|
r = Color;
|
|
} else {
|
|
r = GUI_WHITE;
|
|
}
|
|
GUI_SetColor(r);
|
|
return r;
|
|
}
|
|
|
|
int GUIDEMO_Delay(int t) {
|
|
int r = 0;
|
|
#if GUI_WINSUPPORT
|
|
U32 value, tm;
|
|
#if GUIDEMO_LARGE
|
|
PROGBAR_Handle hProg;
|
|
#endif
|
|
WM_SetForegroundWindow(_ahButton[0]);
|
|
#if GUIDEMO_LARGE
|
|
hProg = (t > 100) ? PROGBAR_CreateAsChild(10, 10, 60, 7, _ahInfoWin[1], 0,
|
|
WM_CF_SHOW | WM_CF_STAYONTOP| WM_CF_MEMDEV) : 0;
|
|
PROGBAR_SetMinMax(hProg, 0, t);
|
|
#endif
|
|
tm = GUI_GetTime();
|
|
do {
|
|
value = GUI_GetTime() - tm;
|
|
#if GUIDEMO_LARGE
|
|
PROGBAR_SetValue(hProg, value);
|
|
WM_ExecIdle();
|
|
#endif
|
|
GUI_Delay(10);
|
|
} while ((value < (U32)t) && !GUIDEMO_CheckCancel());
|
|
#if GUIDEMO_LARGE
|
|
PROGBAR_Delete(hProg);
|
|
#endif
|
|
_UpdateCmdWin();
|
|
WM_ExecIdle();
|
|
#else
|
|
GUI_Delay(t);
|
|
#endif
|
|
return r;
|
|
}
|
|
|
|
void GUIDEMO_Wait(void) {
|
|
GUIDEMO_Delay(4000);
|
|
GUIDEMO_NotifyStartNext();
|
|
}
|
|
|
|
int GUIDEMO_CheckCancel(void) {
|
|
int c = GUI_GetKey();
|
|
#if GUI_WINSUPPORT
|
|
WM_ExecIdle();
|
|
#endif
|
|
if ((c == 'n') || (c=='N'))
|
|
_CmdNext =1;
|
|
if ((c == 'h') || (c=='H')) {
|
|
GUI_Delay(500);
|
|
do {
|
|
GUI_Delay(10);
|
|
#if GUI_WINSUPPORT
|
|
WM_ExecIdle();
|
|
#endif
|
|
c = GUI_GetKey();
|
|
} while (!c);
|
|
}
|
|
return _CmdNext;
|
|
}
|
|
|
|
void GUIDEMO_ShowInfo(const char* s) {
|
|
_sExplain = s;
|
|
_UpdateInfoWin();
|
|
}
|
|
|
|
void GUIDEMO_HideInfoWin(void) {
|
|
#if GUI_WINSUPPORT
|
|
WM_HideWindow(_ahFrameWin[0]);
|
|
#endif
|
|
}
|
|
|
|
|
|
void GUIDEMO_NotifyStartNext(void) {
|
|
_CmdNext = 0;
|
|
_UpdateCmdWin();
|
|
_iTestMinor++;
|
|
}
|
|
|
|
int GUIDEMO_WaitKey(void) {
|
|
int r = 0;
|
|
U32 tMax = GUI_GetTime() + 4000;
|
|
U32 tDiff;
|
|
#if GUI_WINSUPPORT
|
|
PROGBAR_Handle hProg = PROGBAR_Create(LCD_GetXSize() - 70,
|
|
LCD_GetYSize() - 40,
|
|
80, 5, WM_CF_SHOW);
|
|
#endif
|
|
while (tDiff = tMax - GUI_GetTime(), (tDiff > 0) && !GUIDEMO_CheckCancel()) {
|
|
if ((r = GUI_GetKey()) != 0)
|
|
break;
|
|
}
|
|
#if GUI_WINSUPPORT
|
|
PROGBAR_Delete(hProg);
|
|
WM_ExecIdle();
|
|
#endif
|
|
return r;
|
|
}
|
|
|
|
void GUIDEMO_ShowIntro(const char * s, const char * sExp) {
|
|
GUI_CONTEXT ContextOld;
|
|
GUI_SaveContext(&ContextOld);
|
|
#if GUI_WINSUPPORT && GUIDEMO_LARGE
|
|
_sInfo = s;
|
|
#endif
|
|
_sExplain = sExp;
|
|
GUI_SetDefault();
|
|
GUIDEMO_HideInfoWin();
|
|
GUIDEMO_SetBkColor(GUI_BLUE);
|
|
GUI_SetColor(GUI_WHITE);
|
|
GUI_Clear();
|
|
#if !(GUIDEMO_TINY)
|
|
GUI_SetFont(&GUI_FontComic18B_ASCII);
|
|
GUI_DispStringHCenterAt(s, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 3 - 10);
|
|
#else
|
|
GUI_SetFont(&GUI_Font13B_ASCII);
|
|
GUI_DispStringHCenterAt(s, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 3 - 18);
|
|
#endif
|
|
if (_sExplain) {
|
|
GUI_SetFont(&GUI_Font8_ASCII);
|
|
#if !(GUIDEMO_TINY)
|
|
GUI_DispStringHCenterAt(_sExplain, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 2 - 10);
|
|
#else
|
|
GUI_DispStringHCenterAt(_sExplain, LCD_GET_XSIZE() / 2, LCD_GET_YSIZE() / 2 - 14);
|
|
#endif
|
|
}
|
|
GUIDEMO_Delay(_sExplain ? 2000 : 4000);
|
|
#if GUI_WINSUPPORT
|
|
_UpdateInfoWin();
|
|
_UpdateCmdWin();
|
|
#endif
|
|
GUI_RestoreContext(&ContextOld);
|
|
#if GUI_WINSUPPORT
|
|
WM_ExecIdle();
|
|
#endif
|
|
GUIDEMO_NotifyStartNext();
|
|
GUIDEMO_SetBkColor(GUI_RED);
|
|
GUI_Clear();
|
|
}
|
|
|
|
/*********************************************************************
|
|
*
|
|
* GUIDEMO_main(): Large version of the demo
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#if GUIDEMO_LARGE
|
|
|
|
void GUIDEMO_main(void) {
|
|
#if GUI_WINSUPPORT
|
|
int i;
|
|
int xSize, ySize, xPos, yPos;
|
|
#endif
|
|
#if (GUI_SUPPORT_CURSOR|GUI_SUPPORT_TOUCH)
|
|
GUI_CURSOR_Show();
|
|
#endif
|
|
GUI_Clear();
|
|
#if GUI_WINSUPPORT
|
|
#if GUI_NUM_LAYERS > 1
|
|
_ahFrameWin[2] = FRAMEWIN_CreateAsChild(10, 10, 100, 100, WM_GetDesktopWindowEx(1), "Display 1", NULL, WM_CF_SHOW);
|
|
WM_SetDesktopColorEx(GUI_RED, 1);
|
|
GUI_Delay(1000);
|
|
#endif
|
|
WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */
|
|
/* Calculate position and size of FrameWin[1] */
|
|
_ButtonSizeX = 30;
|
|
_ButtonSizeY = 20;
|
|
/* Create the control window incl. buttons */
|
|
_ahFrameWin[1] = FRAMEWIN_Create("Control", &_cbCmdWin, WM_CF_SHOW | WM_CF_STAYONTOP,
|
|
LCD_GetXSize() - 80, LCD_GetYSize() - 60, 80, 60);
|
|
_ahInfoWin[1] = WM_GetClientWindow(_ahFrameWin[1]);
|
|
_ahButton[0] = BUTTON_CreateAsChild(4, 20, _ButtonSizeX, _ButtonSizeY, _ahInfoWin[1],
|
|
'H' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
|
|
_ahButton[1] = BUTTON_CreateAsChild(40, 20, _ButtonSizeX, _ButtonSizeY, _ahInfoWin[1],
|
|
'N' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
|
|
BUTTON_SetText(_ahButton[0], "Halt");
|
|
BUTTON_SetText(_ahButton[1], "Next");
|
|
_UpdateCmdWin();
|
|
WM_ExecIdle();
|
|
#endif
|
|
/* Show Intro */
|
|
GUIDEMO_Intro();
|
|
#if GUI_WINSUPPORT
|
|
/* Calculate position and size of FrameWin[0] */
|
|
xSize = LCD_GetXSize() / 2;
|
|
ySize = 65;
|
|
xPos = LCD_GetXSize() - xSize;
|
|
yPos = 0;
|
|
/* Create info window and run the individual demos */
|
|
_ahFrameWin[0] = FRAMEWIN_Create("emWin Demo", NULL, WM_CF_STAYONTOP,
|
|
xPos, yPos, xSize, ySize);
|
|
// _ahInfoWin[0] = WM_GetFirstChild(_ahFrameWin[0]);
|
|
_ahInfoWin[0] = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetFirstChild(_ahFrameWin[0]), WM_CF_SHOW | WM_CF_STAYONTOP, 0, 0);
|
|
WM_ExecIdle();
|
|
#endif
|
|
/* Run the individual demos ! */
|
|
for (_iTest = 0; _apfTest[_iTest]; _iTest++) {
|
|
GUI_CONTEXT ContextOld;
|
|
GUI_SaveContext(&ContextOld);
|
|
_iTestMinor = 0;
|
|
_UpdateCmdWin();
|
|
(*_apfTest[_iTest])();
|
|
_CmdNext = 0;
|
|
GUI_RestoreContext(&ContextOld);
|
|
}
|
|
/* Cleanup */
|
|
#if GUI_WINSUPPORT
|
|
for (i = 0; i < countof(_ahFrameWin); i++) {
|
|
WM_DeleteWindow(_ahFrameWin[i]);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#else /* GUIDEMO_LARGE */
|
|
|
|
/*********************************************************************
|
|
*
|
|
* GUIDEMO_main(): Small version of the demo
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
void GUIDEMO_main(void) {
|
|
#if GUI_WINSUPPORT
|
|
int i;
|
|
#endif
|
|
#if GUI_WINSUPPORT
|
|
#if GUI_NUM_LAYERS > 1
|
|
FRAMEWIN_CreateAsChild(10, 10, 100, 100, WM_GetDesktopWindowEx(1), "Display 1", NULL, WM_CF_SHOW);
|
|
GUI_Delay(1000);
|
|
#endif
|
|
WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */
|
|
_ButtonSizeX = 27;
|
|
_ButtonSizeY = 14;
|
|
_ahButton[0] = BUTTON_Create(LCD_GetXSize() - _ButtonSizeX * 2 - 4,
|
|
LCD_GetYSize() - _ButtonSizeY - 2,
|
|
_ButtonSizeX, _ButtonSizeY,
|
|
'H' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
|
|
_ahButton[1] = BUTTON_Create(LCD_GetXSize() - _ButtonSizeX - 2,
|
|
LCD_GetYSize() - _ButtonSizeY - 2,
|
|
_ButtonSizeX, _ButtonSizeY,
|
|
'N' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV);
|
|
BUTTON_SetFont(_ahButton[0], &GUI_Font8_ASCII);
|
|
BUTTON_SetFont(_ahButton[1], &GUI_Font8_ASCII);
|
|
BUTTON_SetText(_ahButton[0], "Halt");
|
|
BUTTON_SetText(_ahButton[1], "Next");
|
|
_UpdateCmdWin();
|
|
WM_ExecIdle();
|
|
#endif
|
|
/* Show Intro */
|
|
GUIDEMO_Intro();
|
|
/* Run the individual demos ! */
|
|
for (_iTest = 0; _apfTest[_iTest]; _iTest++) {
|
|
GUI_CONTEXT ContextOld;
|
|
GUI_SaveContext(&ContextOld);
|
|
_iTestMinor = 0;
|
|
_UpdateCmdWin();
|
|
(*_apfTest[_iTest])();
|
|
_CmdNext = 0;
|
|
GUI_RestoreContext(&ContextOld);
|
|
}
|
|
/* Cleanup */
|
|
#if GUI_WINSUPPORT
|
|
for (i = 0; i < countof(_ahButton); i++) {
|
|
BUTTON_Delete(_ahButton[i]);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#endif /* GUIDEMO_LARGE */
|