⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ui_clock.c

📁 可实炬力方案2004—2042无误差农历显示
💻 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 + -