📄 test.c
字号:
//
// 滚动显示窗口
// by liaonh 2008/1
//
#include "config.h"
#include "test.h"
#include "S3C2410.h"
#include "control.h"
const char* gstr_exit = "ESC键或者点击屏幕右下角退出";
const char* gstr_welcome = "Welcome To GEC uC/OS-II";
int isMultiTask = 0;
int FetchChar(void)
{
int ch = -1;
int x,y,mouse;
ch = kbhit();
mouse = GetMousePos(&x,&y);
if( ch == 0 )
{// 检测鼠标动作
mouse = MouseDown();
if( mouse == MS_PRESSING )
ch = MOUSE_DOWN;
else if( mouse == MS_RELEASING )
ch = MOUSE_RELEASE;
else if( mouse == MS_PRESSED)
ch = MOUSE_MOVE;
}
if( ch == 0 )
{
if( isMultiTask )
OSTimeDly(OS_TICKS_PER_SEC/10);
}
return ch;
}
int PrintfFlag = 1;
char buffer[1024*2];
int myprintf(char* format,...)
{
int n;
va_list ap;
va_start(ap, format);
n = vsprintf(buffer,format,ap);
va_end(ap);
if( PrintfFlag & 0x01 )
UART_SendStr(buffer);
if( PrintfFlag & 0x02 )
AppendText(buffer);
return n;
}
void printbuf(const void* pdata,int len)
{
int i;
const unsigned char* ptr = (unsigned char*)pdata;
for( i = 0; i < len ; i++,ptr++)
{
printf("%02x ",*ptr);
if( (i%8) == 7 )
printf("\r\n");
else if( (i%8) == 7 )
printf(" ");
}
printf("\r\n");
}
unsigned int _5ms = 0;
unsigned int _10ms = 0;
unsigned int _100ms = 0;
void Pollint(void)
{
if ( 0 == PollintFlag )
return;
PollintFlag = 0;
if( ++_5ms >= 2 )
{
_5ms = 0;
if( ++_10ms >= 10 )
{
_10ms = 0;
if( ++_100ms == 100 )
{
_100ms = 0;
}
}
}
}
char kbhit(void)
{
static unsigned int lastkeytime = 0;
unsigned short ch = 0;
if( rUTRSTAT0 & 0x1 )
{
ch = RdURXH0();
UART_SendByte(ch);
}
else if( lastkeytime < RunTimeMs )
{
ch = Keyboard_GetKey();
ch &= 0xff;
lastkeytime = RunTimeMs;
if( ch != 0 )
lastkeytime += 250;
switch(ch)
{
case 0x01: ch = '0'; break;
case 0x05: ch = '1'; break;
case 0x09: ch = '2'; break;
case 0x0d: ch = '3'; break;
case 0x02: ch = '4'; break;
case 0x06: ch = '5'; break;
case 0x0a: ch = '6'; break;
case 0x0e: ch = '7'; break;
case 0x03: ch = '8'; break;
case 0x10: ch = '9'; break;
case 0x0b: ch = KEY_PAGEUP; break;
case 0x0f: ch = KEY_PAGEDOWN; break;
case 0x04: ch = KEY_ENTER; break;
case 0x08: ch = KEY_DOWN; break;
case 0x0c: ch = KEY_UP; break;
case 0x07: ch = KEY_ESC; break;
default: ch = 0; break;
}
}
if( ch == 0x18 || ch == 0x19 )
{
SendImage(ch==0x18);
}
return ch;
}
char getch(void)
{
char ch;
while(!(rUTRSTAT0 & 0x1)); //Receive data ready
ch = RdURXH0();
UART_SendByte(ch);
return ch;
}
char gstr_Input[200];
int gi_InputLen;
void ShowInput(void)
{
gstr_Input[gi_InputLen] = 0;
if( gi_InputLen < 32 )
StatusMessage("");
StatusMessage(gstr_Input);
}
void ClearInput(void)
{
gi_InputLen = 0;
memset(gstr_Input,0,sizeof(gstr_Input));
ShowInput();
}
int InputStr(const char* msg,const char* initstr)
{
int toExit = 0;
char ch;
ResetTextOut();
TextOut(2,SH-50,msg);
if( initstr && initstr[0] )
{
gi_InputLen = sprintf(gstr_Input,initstr);
ShowInput();
}
while( !toExit )
{
PollintNet();
ch = kbhit();
switch( ch )
{
case KEY_ESC:
if( gi_InputLen <= 0 )
{
return 0;
}
else
{
ClearInput();
ShowInput();
}
break;
case KEY_ENTER: return 1;
case 0x08:
if( gi_InputLen > 0 )
{
gstr_Input[--gi_InputLen] = 0;
ShowInput();
}
break;
default:
if( ch >= 0x20 && ch <= 0x80 )
{
if( gi_InputLen < (sizeof(gstr_Input)-1) )
{
gstr_Input[gi_InputLen++] = ch;
gstr_Input[gi_InputLen] = 0;
ShowInput();
}
}
break;
}
toExit = IsToMouseExit();
}
}
#define MENU_BEEP 1
#define MENU_GPRS 2
#define MENU_MOTOR 3
#define MENU_AUDIO 4
#define MENU_MORE 5
#define MENU_NET 6
#define MENU_REBOOT 7
#define MENU_ucGUI 8
#define MENU_CANBUS 9
#define MENU_IO 10
#define MENU_RF 11
#define MENU_MULTITASK 0xf0
void SystemReboot(void)
{
//PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset enable
rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<0);
rWTDAT = 0x0; //for first update
rWTCNT = 0x0; //resolution=64us @any PCLK
rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5)|(1<<0); //Watch-dog timer start
OS_ENTER_CRITICAL();
while(1);
OS_EXIT_CRITICAL();
}
void QuickReboot(void)
{
typedef void (*PFF)(void);
PFF pf = (PFF)0x30200000;
(*pf)();
}
int test_default(int v)
{
switch(v)
{
case 201: SystemReboot(); break;
case 202: QuickReboot(); break;
}
}
Menu gstr_MainMenu[] =
{
{"触摸屏,A/D",0,test_touchpad},
{"直流/步进电机",MENU_MOTOR,0},
{"GPS/GPRS",MENU_GPRS,0},
{"音频输入输出",MENU_AUDIO,0},
{"蜂鸣器/数码管",MENU_BEEP,0},
{"2x2Keys/键盘",0,test_keys},
{"系统重启",201,test_default},
{"快速重启",202,test_default},
{"更多...",MENU_MORE,0},
{0,0,0}
};
unsigned short HZ2UC(const char* src);
unsigned short UC2HZ(unsigned short uc);
MenuSetting set;
MenuSetting bakset;
Menu* CurrentMenu;
int CurrentMenuIdx = 0;
void InitMenuSet(MenuSetting* pset)
{
memset(pset,0,sizeof(*pset));
pset->maincaption = gstr_welcome;
pset->linespace = 6;
pset->ex = 2;
pset->ey = 2;
pset->x = 260;
pset->y = 70;
pset->captionx = 180;
pset->captiony = 30;
}
void InitIP(void);
typedef void (*PFF)(void);
void testit(void)
{
int bakItem;
InitIP();
SetHoriEnlarge(2);
SetVertEnlarge(2);
SetTextColor(COLOR_WHITE);
SetTextMode(TM_HALFTRANSPARENT2);
Beep(4000,500);
for( bakItem = 5; bakItem > 0; bakItem-- )
{
sprintf((char*)buf,"uc/OS-II正在启动...%-2d",bakItem);
TextOut(SW/4,SH*4/5,(char*)buf);
if( kbhit() )
Delay(300);
Delay(300);
}
ResetTextOut();
RestoreDesktop();
while(1)
{
InitMenuSet(&set);
switch( CurrentMenuIdx )
{
case MENU_BEEP:
CurrentMenu = gstr_BeepMenu;
break;
case MENU_GPRS:
ClearText();
set.pIdleAction = test_gprs_idle;
CurrentMenu = gstr_GprsMenu;
#ifdef INCLUDE_UART1_INTTERUPT
Uart1Set(1);
#endif
break;
case MENU_MOTOR:
CurrentMenu = gstr_MotorMenu;
break;
case MENU_MORE:
CurrentMenu = gstr_MoreMenu;
break;
case MENU_CANBUS:
set.pIdleAction = test_canbus_idle;
set.linespace = 1;
CurrentMenu = gstr_CANMenu;
break;
case MENU_IO:
CurrentMenu = gstr_IOMenu;
break;
case MENU_RF:
CurrentMenu = gstr_RFMenu;
break;
case MENU_NET:
set.pIdleAction = test_net_idle;
CurrentMenu = gstr_NetMenu;
break;
case MENU_AUDIO:
set.pIdleAction = test_Audito_idle;
CurrentMenu = gstr_AudioMenu;
break;
case MENU_ucGUI:
{
extern Menu gstr_TestucGUIMenu[];
set.maincaption = "Welcome To ucGUI";
CurrentMenu = gstr_TestucGUIMenu;
set.linespace = 1;
}
break;
case MENU_MULTITASK:
isMultiTask = !isMultiTask;
break;
default:
CurrentMenu = gstr_MainMenu;
set.CurrentItem = bakItem;
break;
}
CurrentMenuIdx = ExecMenu(CurrentMenu,&set);
if( CurrentMenu == gstr_MainMenu )
bakItem = set.CurrentItem;
ClearText();
RestoreDesktop();
}
}
int test_touchpad(int para)
{
int adflag = 0;
int toExit = 0;
char buffer[32];
unsigned char lastch = 0;
int x,y,sx,sy;
unsigned char ch;
RestoreDesktop();
TextOut(2,SH-FONT_HEIGHT-2,gstr_exit);
SetTextMode(TM_NOTTRANSPARENT);
SetHoriEnlarge(2);
SetVertEnlarge(2);
TouchFlag = 1;
while(!toExit)
{
ch = GetMousePos(&x, &y);
sx = TX2SX(x);
sy = TY2SY(y);
if ( ch )
{
sprintf(buffer,"鼠标位置:%3d,%3d >> %3d,%3d",x,y,sx,sy);
TextOut(0,0,buffer);
}
switch( MouseDown())
{
case MS_RELEASING:
sprintf(buffer,"鼠标释放:%3d,%3d >> %3d,%3d",x,y,sx,sy);
TextOut(0,40,buffer);
if( IsPtInRect(sx,sy,SW-50,SH-50,50,50) )
{
toExit = 1;
}
break;
case MS_PRESSING:
sprintf(buffer,"鼠标按下:%3d,%3d >> %3d,%3d",x,y,sx,sy);
TextOut(0,40,buffer);
break;
}
ch = kbhit();
switch(ch)
{
case 0: break;
case KEY_ESC: toExit = 1;
Touch_Screen_Off();
default:
if( ch >= 0xa1 )
{
if ( lastch == 0 )
{
lastch = ch;
break;
}
else
{
sprintf(buffer,"Key '%c%c' = 0x%04x",lastch,ch,lastch*0x100+ch);
}
}
else
{
sprintf(buffer,"Key '%c' = 0x%02x ",ch,ch);
}
lastch = 0;
TextOut(0,400,buffer);
break;
}
Pollint();
if( _10ms == 1 && adflag == 0 )
{
adflag = 1;
ShowADSample(0);
}
else if( _10ms == 6 && adflag == 0 )
{
adflag = 1;
ShowADSample(1);
}
else
{
adflag = 0;
}
}
ResetTextOut();
TouchFlag = 0;
return MENU_RETAIN;
}
void ShowADSample(int ch)
{
char buffer[32];
unsigned long ad;
AD_init();
start_adc(ch);
ad = read_value();
sprintf(buffer,"A/D通道%d:0x%06x >> %d",ch,ad,ad);
ch += 3;
TextOut(2,2+FONT_HEIGHT*ch*GetVertEnlarge(),buffer);
}
int IsToMouseExit(void)
{
int x,y,sx,sy;
GetMousePos(&x, &y);
sx = TX2SX(x);
sy = TY2SY(y);
switch( MouseDown())
{
case MS_RELEASING:
if( IsPtInRect(sx,sy,SW-50,SH-50,50,50) )
{
return 1;
}
break;
case MS_PRESSING:
break;
}
return 0;
}
int IsToExit(void)
{
char ch;
ch = IsToMouseExit();
if( ch )
return 1;
ch = kbhit();
switch(ch)
{
case 0: break;
case KEY_ESC: return 1;
default: break;
}
return 0;
}
int test_AD(int v)
{
return MENU_RETAIN;
}
void Delay(unsigned int time)
{
unsigned int timeout = RunTimeMs + time;
while(RunTimeMs < timeout)
{
OS_EXIT_CRITICAL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -