|
#include "SP8890_gpubl.h"
#include "dvb_time.h"
/*
typedef struct {
u8_t sec;
u8_t minute;
u8_t hour;
u16_t year;
u8_t month;
u8_t day;
u16_t MJD_TIME;
} Time_t;
*/
void
get_hhmmss_from_utc(u8_t* pt,Time_t *ttime)
{
u8_t tmp = *pt++;
ttime->hour = 10 * (tmp >> 4) + (tmp & 0x0F); tmp = *pt++;
ttime->minute = 10 * (tmp >> 4) + (tmp & 0x0F); tmp = *pt++;
ttime->sec = 10 * (tmp >> 4) + (tmp & 0x0F);
}/******************************************************************************
* DESCRIPTION:
* convert Date (year/month/day) to long days
*****************************************************************************/
u32_t DateToLong(Time_t *ttime)
{
u8_t month,day;
u16_t year;
u32_t c,ya;
month = ttime->month;
day = ttime->day;
year = ttime->year;if(month > 2)
month -= 3;
else {
month += 9;
year--;
}
c = year / 100;
ya = year - 100 * c;
//return (146097 * c)/4 + (1461 * ya)/4 + (153 * month + 2)/5 + day + 1721119;
return (146097 * c)/4 + (1461 * ya)/4 + (153 * month + 2)/5 + day;
}
/******************************************************************************
* DESCRIPTION:
* convert to long days to Date (year/month/day)
*****************************************************************************/
void LongToDate(u32_t j,Time_t *ttime)
{
u32_t d,m,y;
// j -= 1721119;
y = (4*j-1) / 146097;
d = (4 * j - 1 - 146097 * y) / 4l;
j = (4 * d + 3) / 1461;
d = (4 * d + 7 - 1461 * j) / 4l;
m = (5 * d - 3) / 153;
d = (5 * d + 2 - 153 * m) / 5l;
y = 100 * y + j;
if (m < 10)
m += 3;
else {
m -= 9;
y++;
}ttime->month = m;
ttime->year = y;
ttime->day = d;
};/******************************************************************************
* DESCRIPTION:
* inc UTC time on X seconds;
*****************************************************************************/
u32_t
TimeToLong(Time_t *ttime)
{
return (ttime->hour*60l+ttime->minute)*60l+ttime->sec;
}void
LongToTime(u32_t t, Time_t *ttime)
{
u32_t h,m,s;
s=t%60l; t/=60l;
m=t%60l;
h=t/60l;
ttime->hour=h;
ttime->minute=m;
ttime->sec=s;
};
u8_t WDfromMJD(u16_t mjd)
{
return( (mjd + 2 ) % 7 + 1);}
void MJDtoYMD(Time_t * time)
{
float a;
u16_t Y,_Y;
u8_t M,_M,D,K;
a = time -> MJD_TIME;
_Y = (u16_t)((a - 15078.2)/365.25);
_M = (u8_t)((a - 14956.1 - (u32_t)((float)_Y * 365.25))/30.6001);
time->day = (u8_t)((u32_t)a - 14956 - (u32_t)((float)_Y * 365.25) - (u32_t)((float)_M * 30.6001));
if ((_M == 14) || (_M == 15))
K = 1;
else K = 0;
time->year = (_Y + K);
time->month = _M - 1 - K * 12;
}
void YMDtoMJD(Time_t * time)
{
u8_t L = 0;if ((time->month == 1) || (time->month == 2))
L = 1;
time->MJD_TIME =
(u16_t)(14956 + time->day + (u32_t)((time->year - 1900 - L)*365.25) + (u32_t)((time->month + 1 + L*12)*30.6001));
}u32_t mjd_to_long(u16_t mjd)
{
Time_t ttime;
ttime.MJD_TIME = mjd;MJDtoYMD(&ttime);
return DateToLong(&ttime);
}
void convert_utc(u8_t *ptr,Time_t * time,u32_t *lsec)
{
Time_t ttime;
u32_t l_sec,l_date;
ttime.MJD_TIME = GET_U16(ptr); ptr+=2;
MJDtoYMD(&ttime);
ttime.year +=1900;
get_hhmmss_from_utc(ptr,&ttime);
l_sec = DateTime_ToLong(&ttime);
if (time != NULL)
*time = ttime;
if (lsec != NULL)
*lsec = l_sec;
}/******************************************************************************
* DESCRIPTION:
* convert Date and Time to long seconds
*****************************************************************************/
u32_t DateTime_ToLong(Time_t *ttime)
{
u8_t month;
u16_t year;
u32_t c,ya;
u32_t res;
month = ttime->month;
year = ttime->year;if(month > 2)
month -= 3;
else {
month += 9;
year--;
}
c = year / 100;
ya = year - 100 * c;
res = (146097 * c)/4 + (1461 * ya)/4 + (153 * month + 2)/5 + ttime->day;
return (res - 720000) * 86400l + (ttime->hour * 60l + ttime->minute) * 60l + ttime->sec;
}
/******************************************************************************
* DESCRIPTION:
* convert long seconds to Date and Time
*****************************************************************************/
void LongTo_DateTime(u32_t j,Time_t *ttime)
{
u32_t d,m,y;
u32_t date,t;
date = j/86400l;
t = j - (date * 86400l);
date += 720000;
y = (4 * date - 1) / 146097;
d = (4 * date - 1 - 146097 * y) / 4l;
date = (4 * d + 3) / 1461;
d = (4 * d + 7 - 1461 * date) / 4l;
m = (5 * d - 3) / 153;
d = (5 * d + 2 - 153 * m) / 5l;
y = 100 * y + date;
if (m < 10)
m += 3;
else {
m -= 9;
y++;
}ttime->month = m;
ttime->year = y;
ttime->day = d;
ttime->sec = t % 60l; t /= 60l;
ttime->hour = t / 60l;
ttime->minute = t % 60l;
};/******************************************************************************
* DESCRIPTION:
* convert long seconds to Date and Time
*****************************************************************************/
void ExtractTime(u32_t j,Time_t *ttime)
{
u32_t date = j/86400l;
LongToTime(j - (date * 86400l),ttime);
};void Printf_Time(u8_t *str,Time_t *ttime)
{TrmPrintf(str,ttime->year,
ttime->month,
ttime->day,
ttime->hour,
ttime->minute,
ttime->sec);
}
E-mail: info@telesys.ru