📄 ui_clock.c
字号:
/*
*******************************************************************************
* ACTOS AP
* system setting ap of sdk 3.0, ui part,
* this function is too big to fit in a bank with others
*
* (c) Copyright, Actions Co,Ld.
* All Right Reserved
*
* $Id: ui_clock.c,v 1.1.1.1 2006/04/21 08:22:43 selina Exp $
*******************************************************************************
*/
#include "actos.h"
#include "enhanced.h"
#include "ap_common.h"
#include "ap_setting.h"
#include"time.h"
/************************************定义显示坐标位置********************************************/
#define P_CLOCK_X 0
#define P_CLOCK_Y 0
#define P_Ck_YEAR P_CLOCK_X+28,P_CLOCK_Y+82
#define P_Ck_MOUTH P_CLOCK_X+76,P_CLOCK_Y+82
#define P_Ck_DATE P_CLOCK_X+107,P_CLOCK_Y+82
#define P_Ck_HOUR P_CLOCK_X+33,P_CLOCK_Y+45
#define P_Ck_MIN P_CLOCK_X+66,P_CLOCK_Y+45
#define P_Ck_SEC P_CLOCK_X+99,P_CLOCK_Y+45
#define P_Nong_year P_CLOCK_X+28,P_CLOCK_Y+12
#define P_Nong_month P_CLOCK_X+76,P_CLOCK_Y+12
#define P_Nong_day P_CLOCK_X+107,P_CLOCK_Y+12
/*****************************新增农历显示功能——国祖(2009.04.21)****************/
uchar yun=0,Nmaxd,nmonth=1,nday=4;
WORD nyear=2006;
const WORD Nbs[38]= //2004年~~~~~2042年的16进制表示农历对应月份的最大天数
{0x7551,0x56a0,0xabb6,0x25d0,0x92d0,0xcab4,0xa950,0xb4a0,0xaaa0,0xad70,
0x55d0,0x4ba0,0xa5b0,0x517d,0x52b0,0xa930,0x7953,0x6aa0,0xad50,0x5b51,
0x4b60,0xa6e5,0xa4e0,0xd260,0xea64,0xd530,0x5aa0,0x76a2,0x96d0,0x4bd6,
0x4ad0,0xa4d0,0xd0b0,0xd250,0xd520,0xdd44,0xb5a0,0x56d0};
const WORD Y_n[38]= //2004年-----2042年的农历阳历的初值差
{0x4a4e,0x3559,0x4226,0x2d50,0x375c,0x4629,0x3153,0x3b5e,0x484c,0x3457,
0x4124,0x2b4f,0x365a,0x4427,0x2f52,0x3a5c,0x47ca,0x3255,0x3d23,0x4a4e,
0x3459,0x4326,0x2d50,0x385b,0x4529,0x3154,0x3c21,0x484c,0x3358,0x4125,
0x2b4f,0x3659,0x4427,0x3052,0x3a5d,0x472a,0x3156,0x3d23};
/*********************************************************************************
*农历换算必备三大函数(国祖——2008.05.15)
*uchar fday(WORD year,uchar month);
*uchar fnday(WORD yy,uchar mm);
*void Y_nd(WORD year,uchar month,uchar day);
****************************************************************************************/
uchar fday(WORD year,uchar month) //阳历月份天数
{
return(30+(((month&1)^(month&8)>>3)!=0)-(month==2)*2+(!(year%4)&&(year%100)&&(month==2)||!(year%400)));
}
uchar fnday(WORD yy,uchar mm) //农历月份的天数
{
yy-=2004; yy%=38;
if(yun==1)
{ yun=0; return ((Nbs[yy]&0x08)!=0)+29; }
else
{
if(Nbs[yy]&0x07)
yun=((mm==(Nbs[yy]&0x07)+1));
return ((Nbs[yy]&(0x8000>>mm-1))!=0)+29;
}
}
void Y_nd(WORD year,uchar month,uchar day) //阳历换算农历函数;
{
uchar mun=day-1;
uchar nni;
WORD mi;
if(month>5)
{
nni=6;
while(nni<month)
mun+=fday(year,nni++);
nni=6-((Y_n[(year-2004)%38]&0x60)>>5);
mun+=0x1f&Y_n[(year-2004)%38];
if(0x0080&Y_n[(year-2004)%38])
yun=1;
else
yun=0;
Nmaxd=fnday(year,nni);
while(mun>Nmaxd)
{mun-=Nmaxd;
if(yun==0)
Nmaxd=fnday(year,++nni);
else Nmaxd=fnday(year,nni);
;}
nyear=year; nmonth=nni; nday=mun;
}
else
{
nni=1;
while(nni<month)
mun+=fday(year,nni++);
mi=year-1;
nni=10+((0x6000&Y_n[(year-2004)%38])>>13);
mun+=(0x1f00&Y_n[(year-2004)%38])>>8;
if(0x8000&Y_n[(year-2004)%38])
yun=1;
else
yun=0;
Nmaxd=fnday(mi,nni);
while(mun>Nmaxd)
{
mun-=Nmaxd;
if(yun==0)
{
if(++nni>12)
{nni=1; mi++;}
Nmaxd=fnday(mi,nni);
}
else Nmaxd=fnday(mi,nni);
}
nyear=mi; nmonth=nni; nday=mun;
}
}
/**************************************结束定义农历显示所需参数和函数********************************/
/*********************************************************************************
* Description : 录音时间设定界面
*
* Arguments :
*
* Returns :
*
* Notes :
*
*********************************************************************************/
void clock_sub(BOOL onoff,char *buf,char x,char y)
{
if (onoff)
{
SetPenColor(Color_RED_def);
SetBackgdColor(0x0000945f);
}
else
{
SetPenColor(Color_BLACK_def);
SetBackgdColor(Color_WHITE_def);
// SetBackgdColor(0x0000bd5c);
}
SetTextPos(x,y);
PutS(buf, -1);
}
int show_clock(void)
{
date_t date={2006, 2, 1};
time_t time={12, 00, 00};
char buf[11]; //date & time
char key;
char set_what=0; //0, 非设定状态, 1,year, 2,month...
BOOL show_what=TRUE; //true, 显示, false, 不显示
char days; //本月的天数
BOOL result;
BOOL need_draw=TRUE;
BOOL need_draw_backgroud=TRUE;
BOOL set_ok=FALSE; //设置完成
BOOL adjusting=FALSE; //正在设置,不要闪烁
region_t region;
kval_t kval;
//read date & time
result = TM_GetDate(&date, 0);
ASSERT(result);
result = TM_GetTime(&time);
while(1)
{
//显示背景
if(need_draw_backgroud)
{
//SetBackgdColor(Color_BLACK_def);
//ClearScreen(NULL);
SetAsciiFont(FONT_TYPE_LARGE);
ResShowPic(CLOCK_BK,P_CLOCK_X,P_CLOCK_Y);
SetBackgdColor(Color_CLOCK_BK_def);
//SetTextOutMode(0x0f); //Tommy 070519
SetPenColor(Color_BLACK_def);
//ResShowMultiString(SMAIN1,g_comval.langid,P_CLOCK_X+4,P_CLOCK_Y+(87-1-18),-1);
ResShowMultiString(SMAIN1,g_comval.langid,-1,P_CLOCK_Y+(160-3-18),-1);
//SetTextOutMode(0x00);
CLEAR_WATCHDOG();
need_draw_backgroud = FALSE;
}
//显示时钟
if(need_draw)
{
SetAsciiFont(FONT_TYPE_LARGE);
Y_nd(date.year,date.month,date.day); //转换函数;
itoa_4(date.year, buf);
if(set_what == 1)
clock_sub(TRUE,buf, P_Ck_YEAR);
else
clock_sub(FALSE,buf,P_Ck_YEAR);
itoa_2(date.month, buf);
if(set_what == 2)
clock_sub(TRUE,buf, P_Ck_MOUTH);
else
clock_sub(FALSE,buf,P_Ck_MOUTH);
itoa_2(date.day, buf);
if(set_what == 3)
clock_sub(TRUE,buf, P_Ck_DATE);
else
clock_sub(FALSE,buf,P_Ck_DATE);
itoa_2(time.hour, buf);
if(set_what == 4)
clock_sub(TRUE,buf, P_Ck_HOUR);
else
clock_sub(FALSE,buf,P_Ck_HOUR);
itoa_2(time.minute, buf);
if(set_what == 5)
clock_sub(TRUE,buf, P_Ck_MIN);
else
clock_sub(FALSE,buf,P_Ck_MIN);
itoa_2(time.second, buf);
if(set_what == 6)
clock_sub(TRUE,buf, P_Ck_SEC);
else
clock_sub(FALSE,buf,P_Ck_SEC);
///////////// 显示农历/////////
itoa_4(nyear, buf);
clock_sub(FALSE,buf,P_Nong_year);
itoa_2(nmonth,buf);
clock_sub(FALSE,buf,P_Nong_month);
itoa_2(nday,buf);
clock_sub(FALSE,buf,P_Nong_day);
CLEAR_WATCHDOG();
need_draw = FALSE;
}
//handle msg
key = ap_get_message();
switch( key )
{
case AP_MSG_CHARGING:
case AP_MSG_RTC:
if(adjusting)
show_what = TRUE;
else
show_what = !show_what;
need_draw = TRUE;
break;
case AP_KEY_PLAY|AP_KEY_UP:
case AP_KEY_VOLADD | AP_KEY_UP:
if(set_what >= 6)
set_what = 1;
else
set_what++;
need_draw = TRUE;
break;
case AP_KEY_VOLSUB | AP_KEY_UP:
if(set_what == 1)
set_what = 6;
else
set_what--;
need_draw = TRUE;
break;
case AP_KEY_NEXT: //in setting clock
case AP_KEY_NEXT | AP_KEY_HOLD:
adjusting = TRUE;
switch(set_what)
{
case 1: //year
if(date.year < 2200)
date.year++;
else
date.year = 1900;
break;
case 2: //month
if(date.month < 12)
date.month++;
else
date.month = 1;
break;
case 3: //day
days=fday(date.year,date.month);
if(date.day < days )
date.day++;
else
date.day = 1;
break;
case 4: //hour
if(time.hour < 23)
time.hour++;
else
time.hour = 0;
break;
case 5: //min
if(time.minute < 59)
time.minute++;
else
time.minute = 0;
break;
case 6: //sec
if(time.second< 59)
time.second++;
else
time.second= 0;
break;
default: //no in setting
break;
} //set_what
//clear the key buffer
do
{
key = ap_get_message();
if(key == (AP_KEY_NEXT | AP_KEY_UP))
{
adjusting = FALSE;
break;
}
}
while(key != 0);
need_draw = TRUE;
break;
case AP_KEY_PREV: //in setting clock
case AP_KEY_PREV | AP_KEY_HOLD:
adjusting = TRUE;
switch(set_what)
{
case 1: //year
if(date.year > 1900)
date.year--;
else
date.year = 2200;
break;
case 2: //month
if(date.month > 1)
date.month--;
else
date.month = 12;
break;
case 3: //day
days=fday(date.year,date.month);
if(date.day > 1 )
date.day--;
else
date.day = days;
break;
case 4: //hour
if(time.hour > 0)
time.hour--;
else
time.hour = 23;
break;
case 5: //min
if(time.minute > 0)
time.minute--;
else
time.minute = 59;
break;
case 6: //sec
if(time.second> 0)
time.second--;
else
time.second = 59;
break;
default: //no in setting
break;
} //set_what
//clear the key buffer
do
{
key = ap_get_message();
if(key == (AP_KEY_PREV | AP_KEY_UP))
{
adjusting = FALSE;
break;
}
}
while(key != 0);
need_draw = TRUE;
break;
case AP_KEY_NEXT | AP_KEY_UP:
case AP_KEY_PREV| AP_KEY_UP:
adjusting = FALSE;
break;
case AP_MSG_WAIT_TIMEOUT: //子菜单界面在8秒后返回系统功能菜单,
case AP_KEY_MODE | AP_KEY_UP:
//return 0; //退出
key = 0;
set_ok = TRUE;
break;
default:
key = ap_handle_hotkey(key);
if(key == RESULT_REDRAW)
{
need_draw_backgroud = TRUE;
need_draw = TRUE;
}
else if(key != 0)
{
set_ok = TRUE;
}
} //switch(key)
if(set_ok)
break;
}//while(1)
days = fday(date.year,date.month);
if(date.day > days)
date.day = days;
//save date & time
result = TM_SetDate(&date, 0);
//DUMP("set date", 0);
ASSERT(result);
result = TM_SetTime(&time);
//DUMP("set time", 0);
ASSERT(result);
/*
//将systemtime 和 gwtime写回到VRAM中
VMRead(&kval, VM_KERNEL, sizeof(kval_t));
kval.systemtime = systemtime; //全局变量
kval.gwtime = gwtime; //全局变量
VMWrite(&kval, VM_KERNEL);
*/
return key;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -