569 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			569 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| ////////////////////////////////////////////////////////////////////////////////
 | |
| #include "SysCommon.h"
 | |
| //#include "AppCommon.h"
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| #include "PStore.h"
 | |
| #include "WiFiIpc/nvtwifi.h"
 | |
| #include "UIInfo.h"
 | |
| #include "DateTimeInfo.h"
 | |
| #include <comm/hwclock.h>
 | |
| #include "GxGfx/GxRect.h"
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Date Time
 | |
| //-----------------------------------------------------------------------------
 | |
| #define THIS_DBGLVL         2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| #define __MODULE__          DateTimeInfo
 | |
| #define __DBGLVL__          ((THIS_DBGLVL>=PRJ_DBG_LVL)?THIS_DBGLVL:PRJ_DBG_LVL)
 | |
| #define __DBGFLT__          "*" //*=All, [mark]=CustomClass
 | |
| #include <kwrap/debug.h>
 | |
| 
 | |
| #define DbgMsg_UISetDate    DBG_IND
 | |
| #define RANGE_YEAR  (MAX_YEAR-MIN_YEAR+1)
 | |
| //struct tm gUIDateTime = {0, 0, 0, DEF_DAY, DEF_MONTH, DEF_YEAR, 0, 0, 0};
 | |
| 
 | |
| INT32  gUIDateYear = DEF_YEAR;
 | |
| INT32  gUIDateMonth = DEF_MONTH;
 | |
| INT32  gUIDateDay = DEF_DAY;
 | |
| INT32  gUITimeHour = 0;
 | |
| INT32  gUITimeMinute = 0;
 | |
| INT32  gUITimeSecond = 0;
 | |
| 
 | |
| INT32  gUIDateSetFmt = DATEFMT_YMD;
 | |
| INT32  gUITimeSetFmt = TIMEFMT_24HR;
 | |
| 
 | |
| void Validate_Date(INT32 *pYear, INT32 *pMonth, INT32 *pDay,
 | |
| 				   BOOL bClampY, BOOL bClampM, BOOL bClampD);
 | |
| void Validate_Time(INT32 *pHour, INT32 *pMinute,
 | |
| 				   BOOL bClampH, BOOL bClampM);
 | |
| 
 | |
| void DateTime_Init(void)
 | |
| {
 | |
| 	gUIDateYear = DEF_YEAR;
 | |
| 	gUIDateMonth = DEF_MONTH;
 | |
| 	gUIDateDay = DEF_DAY;
 | |
| 	gUITimeHour = gUITimeMinute = gUITimeSecond = 0;
 | |
| 	gUIDateSetFmt = DATEFMT_YMD;
 | |
| 	gUITimeSetFmt = TIMEFMT_24HR;
 | |
| }
 | |
| 
 | |
| void DateTime_Load(void)
 | |
| {
 | |
| 	struct tm cUIDateTime;
 | |
| 
 | |
| 	//load date-time
 | |
| 	cUIDateTime = hwclock_get_time(TIME_ID_CURRENT);
 | |
| 	gUIDateYear = cUIDateTime.tm_year;
 | |
| 	gUIDateMonth = cUIDateTime.tm_mon;
 | |
| 	gUIDateDay = cUIDateTime.tm_mday;
 | |
| 	gUITimeHour = cUIDateTime.tm_hour;
 | |
| 	gUITimeMinute = cUIDateTime.tm_min;
 | |
| 	gUITimeSecond = cUIDateTime.tm_sec;
 | |
| 	DbgMsg_UISetDate(("Curr Date:Y=%d,M=%d,D=%d\r\n", gUIDateYear, gUIDateMonth, gUIDateDay));
 | |
| 	DbgMsg_UISetDate(("Curr Time:H=%d,M=%d,S=%d\r\n", gUITimeHour, gUITimeMinute, gUITimeSecond));
 | |
| 
 | |
| 	//load format
 | |
| 	gUIDateSetFmt = UI_GetData(FL_DateFormatIndex);
 | |
| 	gUITimeSetFmt = UI_GetData(FL_TimeFormatIndex);
 | |
| 	DbgMsg_UISetDate(("Curr DateFmt:%d\r\n", gUIDateSetFmt));
 | |
| 	DbgMsg_UISetDate(("Curr TimeFmt:%d\r\n", gUITimeSetFmt));
 | |
| 
 | |
| 	//validate date
 | |
| 	{
 | |
| 		INT32 y, m, d;
 | |
| 		y = gUIDateYear;
 | |
| 		m = gUIDateMonth;
 | |
| 		d = gUIDateDay;
 | |
| 		Validate_Date(&y, &m, &d, 1, 1, 1);
 | |
| 		if ((y != gUIDateYear) && (m != gUIDateMonth) && (d != gUIDateDay)) {
 | |
| 			DBG_ERR("Date is invalidate=%d,M=%d,D=%d\r\n", gUIDateYear, gUIDateMonth, gUIDateDay);
 | |
| 			DBG_ERR("Date is clamped=%d,M=%d,D=%d\r\n", y, m, d);
 | |
| 			gUIDateYear = y;
 | |
| 			gUIDateMonth = m;
 | |
| 			gUIDateDay = d;;
 | |
| 			DateTime_Save();
 | |
| 			DBG_ERR("Date is saved\r\n");
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void DateTime_Save(void)
 | |
| {
 | |
| 	struct tm cUIDateTime = {0};
 | |
| 
 | |
| 	DbgMsg_UISetDate(("Save Date:Y=%d,M=%d,D=%d\r\n", gUIDateYear, gUIDateMonth, gUIDateDay));
 | |
| 	DbgMsg_UISetDate(("Save Time:H=%d,M=%d\r\n", gUITimeHour, gUITimeMinute));
 | |
| 	//save date-time
 | |
| 	cUIDateTime.tm_year = gUIDateYear;
 | |
| 	cUIDateTime.tm_mon = gUIDateMonth;
 | |
| 	cUIDateTime.tm_mday = gUIDateDay;
 | |
| 	cUIDateTime.tm_hour = gUITimeHour;
 | |
| 	cUIDateTime.tm_min = gUITimeMinute;
 | |
| 	cUIDateTime.tm_sec = gUITimeSecond;
 | |
| 	hwclock_set_time(TIME_ID_CURRENT, cUIDateTime, 0);
 | |
| 
 | |
| 	DbgMsg_UISetDate(("Save DateFmt:%d\r\n", gUIDateSetFmt));
 | |
| 	DbgMsg_UISetDate(("Save TimeFmt:%d\r\n", gUITimeSetFmt));
 | |
| 	//save format
 | |
| 	UI_SetData(FL_DateFormatIndex, gUIDateSetFmt);
 | |
| 	UI_SetData(FL_TimeFormatIndex, gUITimeSetFmt);
 | |
| 
 | |
| }
 | |
| 
 | |
| void DateTime_SaveToDefault(void)
 | |
| {
 | |
| 	DateTime_Init();
 | |
| 	DateTime_Save();
 | |
| 	DateTime_Load();
 | |
| }
 | |
| 
 | |
| void Validate_Date(INT32 *pYear, INT32 *pMonth, INT32 *pDay,
 | |
| 				   BOOL bClampY, BOOL bClampM, BOOL bClampD)
 | |
| {
 | |
| #define LOC_Y   (*pYear)
 | |
| #define LOC_M   (*pMonth)
 | |
| #define LOC_D   (*pDay)
 | |
| 
 | |
| 	INT32 maxDay = 0;
 | |
| 
 | |
| 	//clamp/loop year to MIN_YEAR ~ MAX_YEAR
 | |
| 	if (bClampY) {
 | |
| 		LOC_Y = RANGE_Clamp(MIN_YEAR, MAX_YEAR, LOC_Y);
 | |
| 	} else {
 | |
| 		LOC_Y = ((LOC_Y - MIN_YEAR + RANGE_YEAR) % RANGE_YEAR) + MIN_YEAR;
 | |
| 	}
 | |
| 
 | |
| 	//clamp/loop month to 1~12
 | |
| 	if (bClampM) {
 | |
| 		LOC_M = RANGE_Clamp(1, 12, LOC_M);
 | |
| 	} else {
 | |
| 		LOC_M = ((LOC_M - 1 + 12) % 12) + 1;
 | |
| 	}
 | |
| 
 | |
| 	//clamp/loop day to 1~maxday
 | |
| 	maxDay = timeutil_calc_month_days(LOC_Y, LOC_M);
 | |
| 	if (bClampD) {
 | |
| 		LOC_D = RANGE_Clamp(1, maxDay, LOC_D);
 | |
| 	} else {
 | |
| 		LOC_D = ((LOC_D - 1 + maxDay) % maxDay) + 1;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void Validate_Time(INT32 *pHour, INT32 *pMinute,
 | |
| 				   BOOL bClampH, BOOL bClampM)
 | |
| {
 | |
| #define LOC_h   (*pHour)
 | |
| #define LOC_m   (*pMinute)
 | |
| 
 | |
| 	//clamp/loop hour to 0~23
 | |
| 	if (bClampH) {
 | |
| 		LOC_h = RANGE_Clamp(0, 23, LOC_h);
 | |
| 	} else {
 | |
| 		LOC_h = (LOC_h + 24) % 24;
 | |
| 	}
 | |
| 
 | |
| 	//clamp/loop minute to 0~59
 | |
| 	if (bClampM) {
 | |
| 		LOC_m = RANGE_Clamp(0, 59, LOC_m);
 | |
| 	} else {
 | |
| 		LOC_m = (LOC_m + 60) % 60;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| INT32 DateTime_Get(int element)
 | |
| {
 | |
| 	INT32 rvalue;
 | |
| 	switch (element) {
 | |
| 	case DATETIME_YEAR:
 | |
| 		rvalue = gUIDateYear;
 | |
| 		break;
 | |
| 	case DATETIME_MONTH:
 | |
| 		rvalue = gUIDateYear;
 | |
| 		break;
 | |
| 	case DATETIME_DAY:
 | |
| 		rvalue = gUIDateDay;
 | |
| 		break;
 | |
| 	case DATETIME_HOUR:
 | |
| 		rvalue = gUITimeHour;
 | |
| 		break;
 | |
| 	case DATETIME_MINUTE:
 | |
| 		rvalue = gUITimeMinute;
 | |
| 		break;
 | |
| 	case DATETIME_DATEFMT:
 | |
| 		rvalue = gUIDateSetFmt;
 | |
| 		break;
 | |
| 	case DATETIME_TIMEFMT:
 | |
| 		rvalue = gUITimeSetFmt;
 | |
| 		break;
 | |
| 	default:
 | |
| 		rvalue = 0;
 | |
| 		break;
 | |
| 	}
 | |
| 	return rvalue;
 | |
| }
 | |
| 
 | |
| void DateTime_Edit(int element, int bias)
 | |
| {
 | |
| 	switch (element) {
 | |
| 	case DATETIME_YEAR:
 | |
| 		gUIDateYear += bias;
 | |
| 		Validate_Date(&gUIDateYear, &gUIDateMonth, &gUIDateDay, 0, 1, 1);
 | |
| 		break;
 | |
| 	case DATETIME_MONTH:
 | |
| 		gUIDateMonth += bias;
 | |
| 		Validate_Date(&gUIDateYear, &gUIDateMonth, &gUIDateDay, 0, 0, 1);
 | |
| 		break;
 | |
| 	case DATETIME_DAY:
 | |
| 		gUIDateDay += bias;
 | |
| 		Validate_Date(&gUIDateYear, &gUIDateMonth, &gUIDateDay, 0, 0, 0);
 | |
| 		break;
 | |
| 	case DATETIME_HOUR:
 | |
| 		gUITimeHour += bias;
 | |
| 		Validate_Time(&gUITimeHour, &gUITimeMinute, 0, 0);
 | |
| 		break;
 | |
| 	case DATETIME_MINUTE:
 | |
| 		gUITimeMinute += bias;
 | |
| 		Validate_Time(&gUITimeHour, &gUITimeMinute, 0, 0);
 | |
| 		break;
 | |
| 	case DATETIME_DATEFMT:
 | |
| 		gUIDateSetFmt += bias;
 | |
| 		gUIDateSetFmt = ((gUIDateSetFmt + 3) % 3);
 | |
| 		break;
 | |
| 	case DATETIME_TIMEFMT:
 | |
| 		gUITimeSetFmt += bias;
 | |
| 		gUITimeSetFmt = ((gUITimeSetFmt + 2) % 2);
 | |
| 		break;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| char gUIDateTime_StrBuf[60];
 | |
| 
 | |
| char TimeFmtNameTable[2][5] = {
 | |
| 	"24HR",
 | |
| 	"12HR",
 | |
| };
 | |
| char Time12HRNameTable[3][4] = {
 | |
| 	"",
 | |
| 	"AM",
 | |
| 	"PM"
 | |
| };
 | |
| 
 | |
| UINT32 DateTime_StrBuf_Size(void)
 | |
| {
 | |
| 	return sizeof(gUIDateTime_StrBuf);
 | |
| }
 | |
| 
 | |
| //using by date-stamp
 | |
| char *DateTime_MakeYMD(void)
 | |
| {
 | |
| 	if (gUIDateSetFmt == DATEFMT_YMD) { //YMD
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%04ld/%02ld/%02ld",
 | |
| 				 gUIDateYear, gUIDateMonth, gUIDateDay);
 | |
| 	} else if (gUIDateSetFmt == DATEFMT_MDY) { //MDY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%04ld",
 | |
| 				 gUIDateMonth, gUIDateDay, gUIDateYear);
 | |
| 	} else { //if(gUIDateSetFmt == DATEFMT_DMY) //DMY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%04ld",
 | |
| 				 gUIDateDay, gUIDateMonth, gUIDateYear);
 | |
| 	}
 | |
| 
 | |
| 	return gUIDateTime_StrBuf;
 | |
| }
 | |
| 
 | |
| //using by setup menu
 | |
| char *DateTime_MakeYMDHM(void)
 | |
| {
 | |
| 	INT32 hr, ti;
 | |
| 
 | |
| 	hr = gUITimeHour;
 | |
| 	ti = 0;
 | |
| 	if (gUITimeSetFmt == TIMEFMT_12HR) { //apply Time Format
 | |
| 		if (gUITimeHour < 12) {
 | |
| 			ti = 1;
 | |
| 		}
 | |
| 		if (gUITimeHour >= 12) {
 | |
| 			ti = 2;
 | |
| 		}
 | |
| 		hr = hr % 12;
 | |
| 		if (hr == 0) {
 | |
| 			hr = 12;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (gUIDateSetFmt == DATEFMT_YMD) { //YMD
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%04ld/%02ld/%02ld %02ld:%02ld%s",
 | |
| 				 gUIDateYear, gUIDateMonth, gUIDateDay, hr, gUITimeMinute, Time12HRNameTable[ti]);
 | |
| 	} else if (gUIDateSetFmt == DATEFMT_MDY) { //MDY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%04ld %02ld:%02ld%s",
 | |
| 				 gUIDateMonth, gUIDateDay, gUIDateYear, hr, gUITimeMinute, Time12HRNameTable[ti]);
 | |
| 	} else { //if(gUIDateSetFmt == DATEFMT_DMY) //DMY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%04ld %02ld:%02ld%s",
 | |
| 				 gUIDateDay, gUIDateMonth, gUIDateYear, hr, gUITimeMinute, Time12HRNameTable[ti]);
 | |
| 	}
 | |
| 
 | |
| 	return gUIDateTime_StrBuf;
 | |
| }
 | |
| 
 | |
| 
 | |
| //using by date-time dialog
 | |
| char *DateTime_MakeYMDHM_Edit(void)
 | |
| {
 | |
| 	INT32 hr;
 | |
| 
 | |
| 	hr = gUITimeHour;
 | |
| 	if (gUITimeSetFmt == TIMEFMT_12HR) { //apply Time Format
 | |
| 		hr = hr % 12;
 | |
| 		if (hr == 0) {
 | |
| 			hr = 12;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	snprintf((char *)gUIDateTime_StrBuf + 0, sizeof(gUIDateTime_StrBuf) - 1, "%04ld", gUIDateYear);
 | |
| 	snprintf((char *)gUIDateTime_StrBuf + 5, sizeof(gUIDateTime_StrBuf) - 6, "%02ld", gUIDateMonth);
 | |
| 	snprintf((char *)gUIDateTime_StrBuf + 8, sizeof(gUIDateTime_StrBuf) - 9, "%02ld", gUIDateDay);
 | |
| 	snprintf((char *)gUIDateTime_StrBuf + 11, sizeof(gUIDateTime_StrBuf) - 12, "%02ld", hr);
 | |
| 	snprintf((char *)gUIDateTime_StrBuf + 14, sizeof(gUIDateTime_StrBuf) - 15, "%02ld", gUITimeMinute);
 | |
| 
 | |
| 	return gUIDateTime_StrBuf;
 | |
| }
 | |
| 
 | |
| //using by date-stamp, show time.second
 | |
| char *DateTime_MakeYMDHMS(void)
 | |
| {
 | |
| 	INT32 hr, ti;
 | |
| 
 | |
| 	hr = gUITimeHour;
 | |
| 	ti = 0;
 | |
| 	if (gUITimeSetFmt == TIMEFMT_12HR) { //apply Time Format
 | |
| 		if (gUITimeHour < 12) {
 | |
| 			ti = 1;
 | |
| 		}
 | |
| 		if (gUITimeHour >= 12) {
 | |
| 			ti = 2;
 | |
| 		}
 | |
| 		hr = hr % 12;
 | |
| 		if (hr == 0) {
 | |
| 			hr = 12;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (gUIDateSetFmt == DATEFMT_YMD) { //YMD
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%04ld/%02ld/%02ld %02ld:%02ld:%02ld%s",
 | |
| 				 gUIDateYear, gUIDateMonth, gUIDateDay, hr, gUITimeMinute, gUITimeSecond, Time12HRNameTable[ti]);
 | |
| 	} else if (gUIDateSetFmt == DATEFMT_MDY) { //MDY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%04ld %02ld:%02ld:%02ld%s",
 | |
| 				 gUIDateMonth, gUIDateDay, gUIDateYear, hr, gUITimeMinute, gUITimeSecond, Time12HRNameTable[ti]);
 | |
| 	} else { //if(gUIDateSetFmt == DATEFMT_DMY) //DMY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%04ld %02ld:%02ld:%02ld%s",
 | |
| 				 gUIDateDay, gUIDateMonth, gUIDateYear, hr, gUITimeMinute, gUITimeSecond, Time12HRNameTable[ti]);
 | |
| 	}
 | |
| 
 | |
| 	return gUIDateTime_StrBuf;
 | |
| }
 | |
| 
 | |
| 
 | |
| //using by playback, using short year
 | |
| char *User_MakeYMDHM(UINT32 Year, UINT32 Month, UINT32 Day, UINT32 Hour, UINT32 Minute)
 | |
| {
 | |
| 	INT32 hr, ti;
 | |
| 
 | |
| 	//load format
 | |
| 	gUIDateSetFmt = UI_GetData(FL_DateFormatIndex);
 | |
| 	gUITimeSetFmt = UI_GetData(FL_TimeFormatIndex);
 | |
| 
 | |
| 	hr = Hour;
 | |
| 	ti = 0;
 | |
| 	if (gUITimeSetFmt == TIMEFMT_12HR) { //apply Time Format
 | |
| 		if (Hour < 12) {
 | |
| 			ti = 1;
 | |
| 		}
 | |
| 		if (Hour >= 12) {
 | |
| 			ti = 2;
 | |
| 		}
 | |
| 		hr = hr % 12;
 | |
| 		if (hr == 0) {
 | |
| 			hr = 12;
 | |
| 		}
 | |
| 	}
 | |
| 	if (Year >= 2000) {
 | |
| 		Year -= 2000;
 | |
| 	}
 | |
| 
 | |
| 	if (gUIDateSetFmt == DATEFMT_YMD) { //YMD
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%02ld %02ld:%02ld%s",
 | |
| 				 Year, Month, Day, hr, Minute, Time12HRNameTable[ti]);
 | |
| 	} else if (gUIDateSetFmt == DATEFMT_MDY) { //MDY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%02ld %02ld:%02ld%s",
 | |
| 				 Month, Day, Year, hr, Minute, Time12HRNameTable[ti]);
 | |
| 	} else { //if(gUIDateSetFmt == DATEFMT_DMY) //DMY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%02ld %02ld:%02ld%s",
 | |
| 				 Day, Month, Year, hr, Minute, Time12HRNameTable[ti]);
 | |
| 	}
 | |
| 
 | |
| 	return gUIDateTime_StrBuf;
 | |
| }
 | |
| 
 | |
| 
 | |
| //using by playback, using short year, ignore AM/PM!
 | |
| char *User_MakeYMDHM_short(UINT32 Year, UINT32 Month, UINT32 Day, UINT32 Hour, UINT32 Minute)
 | |
| {
 | |
| 	INT32 hr;
 | |
| 
 | |
| 	//load format
 | |
| 	gUIDateSetFmt = UI_GetData(FL_DateFormatIndex);
 | |
| 	gUITimeSetFmt = UI_GetData(FL_TimeFormatIndex);
 | |
| 
 | |
| 	hr = Hour;
 | |
| 	if (gUITimeSetFmt == TIMEFMT_12HR) { //apply Time Format
 | |
| 		hr = hr % 12;
 | |
| 		if (hr == 0) {
 | |
| 			hr = 12;
 | |
| 		}
 | |
| 	}
 | |
| 	if (Year >= 2000) {
 | |
| 		Year -= 2000;
 | |
| 	}
 | |
| 
 | |
| 	if (gUIDateSetFmt == DATEFMT_YMD) { //YMD
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%02ld %02ld:%02ld",
 | |
| 				 Year, Month, Day, hr, Minute);
 | |
| 	} else if (gUIDateSetFmt == DATEFMT_MDY) { //MDY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%02ld %02ld:%02ld",
 | |
| 				 Month, Day, Year, hr, Minute);
 | |
| 	} else { //if(gUIDateSetFmt == DATEFMT_DMY) //DMY
 | |
| 		snprintf((char *)gUIDateTime_StrBuf, sizeof(gUIDateTime_StrBuf) - 1, "%02ld/%02ld/%02ld %02ld:%02ld",
 | |
| 				 Day, Month, Year, hr, Minute);
 | |
| 	}
 | |
| 
 | |
| 	return gUIDateTime_StrBuf;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Home/Traval Time Zone
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| TIME_RECORD gTimeRecord[TIME_RECORD_CNT]; //index 0 is Home
 | |
| static INT32 g_iTid = 0;
 | |
| 
 | |
| static INT32 TimeZoneMapping[24] =
 | |
| {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
 | |
| 
 | |
| void _TimeRecord_Load(INT32 iTid)
 | |
| {
 | |
| 	TIME_RECORD *ti = &(gTimeRecord[iTid]);
 | |
| 	//load date-time
 | |
| 	ti->Curr_DateTime = hwclock_get_time(TIME_ID_CURRENT);
 | |
| }
 | |
| 
 | |
| void _TimeRecord_Save(INT32 iTid)
 | |
| {
 | |
| 	TIME_RECORD *ti = &(gTimeRecord[iTid]);
 | |
| 	//save date-time
 | |
| 	hwclock_set_time(TIME_ID_CURRENT, ti->Curr_DateTime, 0);
 | |
| }
 | |
| 
 | |
| INT32 _TimeRecord_CalcTimeDiff(INT32 iNewTid, INT32 iOldTid)
 | |
| {
 | |
| 	return (TimeZoneMapping[iNewTid] - TimeZoneMapping[iOldTid]);
 | |
| }
 | |
| void _TimeRecord_AddTimeDiff(INT32 iTid, INT32 TimeDiff)
 | |
| {
 | |
| 	TIME_RECORD *ti = &(gTimeRecord[iTid]);
 | |
| 	struct tm cUIDateTime = hwclock_get_time(TIME_ID_CURRENT);
 | |
| 	DbgMsg_UISetDate(("Old Date:Y=%ld,M=%ld,D=%ld\r\n", cUIDateTime.tm_year, cUIDateTime.tm_mon, cUIDateTime.tm_mday));
 | |
| 	DbgMsg_UISetDate(("Old Time:H=%ld,M=%ld\r\n", cUIDateTime.tm_hour, cUIDateTime.tm_min));
 | |
| 
 | |
| 	DbgMsg_UISetDate(("TimeDiff=%ld\r\n", TimeDiff));
 | |
| 	if (cUIDateTime.tm_hour + TimeDiff < 0) {
 | |
| 		INT32 TmpDays;
 | |
| 		if (cUIDateTime.tm_year >= 2000) {
 | |
| 			TmpDays = timeutil_tm_to_days(cUIDateTime);
 | |
| 			//DbgMsg_UISetDate(("Days=%ld\r\n",TmpDays));
 | |
| 			TmpDays--;
 | |
| 			//DbgMsg_UISetDate(("Days-1=%ld\r\n",TmpDays));
 | |
| 			ti->Curr_DateTime = timeutil_days_to_tm(TmpDays);
 | |
| 			//DbgMsg_UISetDate(("Convert Time:H=%ld,M=%ld\r\n",ti->Curr_DateTime.tm_hour,ti->Curr_DateTime.tm_min));
 | |
| 			ti->Curr_DateTime.tm_hour = cUIDateTime.tm_hour + TimeDiff + 24;
 | |
| 			//DbgMsg_UISetDate(("New H = %ld +%ld + 24 = %ld\r\n",cUIDateTime.tm_hour, TimeDiff, ti->Curr_DateTime.tm_hour));
 | |
| 		} else {
 | |
| 			DBG_ERR("^RZone Calc Error!! Date can not before 2000/1/1\r\n");
 | |
| 		}
 | |
| 	} else if (cUIDateTime.tm_hour + TimeDiff > 23) {
 | |
| 		INT32 TmpDays;
 | |
| 		if (cUIDateTime.tm_year < 2099) {
 | |
| 			TmpDays = timeutil_tm_to_days(cUIDateTime);
 | |
| 			//DbgMsg_UISetDate(("Days=%ld\r\n",TmpDays));
 | |
| 			TmpDays++;
 | |
| 			//DbgMsg_UISetDate(("Days+1=%ld\r\n",TmpDays));
 | |
| 			ti->Curr_DateTime = timeutil_days_to_tm(TmpDays);
 | |
| 			//DbgMsg_UISetDate(("Convert Time:H=%ld,M=%ld\r\n",ti->Curr_DateTime.tm_hour,ti->Curr_DateTime.tm_min));
 | |
| 			ti->Curr_DateTime.tm_hour = cUIDateTime.tm_hour + TimeDiff - 24;
 | |
| 			//DbgMsg_UISetDate(("New H = %ld +%ld - 24 = %ld\r\n",cUIDateTime.tm_hour, TimeDiff, ti->Curr_DateTime.tm_hour));
 | |
| 		} else {
 | |
| 			DBG_ERR("^RZone Calc Error!! Date can not after 2099/1/1\r\n");
 | |
| 		}
 | |
| 	} else {
 | |
| 		ti->Curr_DateTime.tm_hour = cUIDateTime.tm_hour + TimeDiff;
 | |
| 		//DbgMsg_UISetDate(("New H = %ld +%ld = %ld\r\n",cUIDateTime.tm_hour, TimeDiff, ti->Curr_DateTime.tm_hour));
 | |
| 	}
 | |
| 
 | |
| 	ti->Curr_DateTime.tm_min = cUIDateTime.tm_min;
 | |
| 	ti->Curr_DateTime.tm_sec = cUIDateTime.tm_sec;
 | |
| 	DbgMsg_UISetDate(("New Date:Y=%ld,M=%ld,D=%ld\r\n", ti->Curr_DateTime.tm_year, ti->Curr_DateTime.tm_mon, ti->Curr_DateTime.tm_mday));
 | |
| 	DbgMsg_UISetDate(("New Time:H=%ld,M=%ld\r\n", ti->Curr_DateTime.tm_hour, ti->Curr_DateTime.tm_min));
 | |
| }
 | |
| 
 | |
| void TimeRecord_BeginChange(INT32 iOldTid)
 | |
| {
 | |
| 	int i;
 | |
| 	for (i = 0; i < TIME_RECORD_CNT; i++) {
 | |
| 		gTimeRecord[i].new_TimeZone = gTimeRecord[i].TimeZone;
 | |
| 		_TimeRecord_Load(i);
 | |
| 	}
 | |
| 	g_iTid = iOldTid;
 | |
| }
 | |
| 
 | |
| void TimeRecord_SetZone(INT32 iTid, INT32 v)
 | |
| {
 | |
| 	gTimeRecord[iTid].TimeZone = v;
 | |
| }
 | |
| 
 | |
| void TimeRecord_SetNewZone(INT32 iTid, INT32 v)
 | |
| {
 | |
| 	gTimeRecord[iTid].new_TimeZone = v;
 | |
| }
 | |
| 
 | |
| void TimeRecord_EndChange(INT32 iNewTid)
 | |
| {
 | |
| 	INT32 TimeDiff = 0;
 | |
| 	INT32 iOldTid = g_iTid;
 | |
| 	if (iNewTid != iOldTid) {
 | |
| 		DbgMsg_UISetDate(("(OLD) LOCALE=%s, ZONE=%ld\r\n", (iOldTid == 0) ? "HOME" : "TRAVAL", gTimeRecord[iOldTid].TimeZone));
 | |
| 		DbgMsg_UISetDate(("(NEW) LOCALE=%s, ZONE=%ld\r\n", (iNewTid == 0) ? "HOME" : "TRAVAL", gTimeRecord[iNewTid].new_TimeZone));
 | |
| 		TimeDiff = _TimeRecord_CalcTimeDiff
 | |
| 				   (gTimeRecord[iNewTid].new_TimeZone, gTimeRecord[iOldTid].TimeZone);
 | |
| 	} else { //if equal tid
 | |
| 		DbgMsg_UISetDate(("(OLD) LOCALE=%s, ZONE=%ld\r\n", (iNewTid == 0) ? "HOME" : "TRAVAL", gTimeRecord[iNewTid].TimeZone));
 | |
| 		DbgMsg_UISetDate(("(NEW) LOCALE=%s, ZONE=%ld\r\n", (iNewTid == 0) ? "HOME" : "TRAVAL", gTimeRecord[iNewTid].new_TimeZone));
 | |
| 		TimeDiff = _TimeRecord_CalcTimeDiff
 | |
| 				   (gTimeRecord[iNewTid].new_TimeZone, gTimeRecord[iNewTid].TimeZone);
 | |
| 		if (iNewTid == 0) { //when chage Home Zone, but not change Locale
 | |
| 			TimeDiff = 0;    //the time date should be not change
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	DbgMsg_UISetDate((">>> DIFF=%ld\r\n", TimeDiff));
 | |
| 	_TimeRecord_AddTimeDiff(iNewTid, TimeDiff);
 | |
| 
 | |
| 	_TimeRecord_Save(iNewTid);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | 
