Merge pull request #4616 from mysterywolf/time
[libc][time] implement set_timeval
This commit is contained in:
commit
979ac3d8d4
|
@ -40,7 +40,7 @@ struct timeval {
|
||||||
#endif
|
#endif
|
||||||
#endif /* _TIMEVAL_DEFINED */
|
#endif /* _TIMEVAL_DEFINED */
|
||||||
|
|
||||||
#if !(defined(__GNUC__) && !defined(__ARMCC_VERSION)) && !defined (__ICCARM__) && !defined (_WIN32)
|
#if !(defined(__GNUC__) && !defined(__ARMCC_VERSION)/*GCC*/) && !defined (__ICCARM__) && !defined (_WIN32)
|
||||||
struct timespec {
|
struct timespec {
|
||||||
time_t tv_sec; /* seconds */
|
time_t tv_sec; /* seconds */
|
||||||
long tv_nsec; /* and nanoseconds */
|
long tv_nsec; /* and nanoseconds */
|
||||||
|
@ -56,6 +56,9 @@ int stime(const time_t *t);
|
||||||
time_t timegm(struct tm * const t);
|
time_t timegm(struct tm * const t);
|
||||||
int gettimeofday(struct timeval *tv, struct timezone *tz);
|
int gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||||
int settimeofday(const struct timeval *tv, const struct timezone *tz);
|
int settimeofday(const struct timeval *tv, const struct timezone *tz);
|
||||||
|
#if defined(__ARMCC_VERSION) || defined (__ICCARM__)
|
||||||
|
struct tm *gmtime_r(const time_t *timep, struct tm *r);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef RT_USING_POSIX
|
#ifdef RT_USING_POSIX
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
|
@ -68,6 +68,100 @@ static void num2str(char *c, int i)
|
||||||
c[1] = i % 10 + '0';
|
c[1] = i % 10 + '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get time from RTC device (without timezone)
|
||||||
|
* @param tv: struct timeval
|
||||||
|
* @return -1 failure; 1 success
|
||||||
|
*/
|
||||||
|
static int get_timeval(struct timeval *tv)
|
||||||
|
{
|
||||||
|
#ifdef RT_USING_RTC
|
||||||
|
static rt_device_t device = RT_NULL;
|
||||||
|
rt_err_t rst = -RT_ERROR;
|
||||||
|
|
||||||
|
if (tv == RT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* default is 0 */
|
||||||
|
tv->tv_sec = 0;
|
||||||
|
tv->tv_usec = 0;
|
||||||
|
|
||||||
|
/* optimization: find rtc device only first */
|
||||||
|
if (device == RT_NULL)
|
||||||
|
{
|
||||||
|
device = rt_device_find("rtc");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read timestamp from RTC device */
|
||||||
|
if (device != RT_NULL)
|
||||||
|
{
|
||||||
|
if (rt_device_open(device, 0) == RT_EOK)
|
||||||
|
{
|
||||||
|
rst = rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &tv->tv_sec);
|
||||||
|
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME_US, &tv->tv_usec);
|
||||||
|
rt_device_close(device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* LOG_W will cause a recursive printing if ulog timestamp function is turned on */
|
||||||
|
rt_kprintf("Cannot find a RTC device to provide time!\r\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rst < 0) ? -1 : 1;
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* LOG_W will cause a recursive printing if ulog timestamp function is turned on */
|
||||||
|
rt_kprintf("Cannot find a RTC device to provide time!\r\n");
|
||||||
|
return -1;
|
||||||
|
#endif /* RT_USING_RTC */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set time to RTC device (without timezone)
|
||||||
|
* @param tv: struct timeval
|
||||||
|
* @return -1 failure; 1 success
|
||||||
|
*/
|
||||||
|
static int set_timeval(struct timeval *tv)
|
||||||
|
{
|
||||||
|
#ifdef RT_USING_RTC
|
||||||
|
static rt_device_t device = RT_NULL;
|
||||||
|
rt_err_t rst = -RT_ERROR;
|
||||||
|
|
||||||
|
if (tv == RT_NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* optimization: find rtc device only first */
|
||||||
|
if (device == RT_NULL)
|
||||||
|
{
|
||||||
|
device = rt_device_find("rtc");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read timestamp from RTC device */
|
||||||
|
if (device != RT_NULL)
|
||||||
|
{
|
||||||
|
if (rt_device_open(device, 0) == RT_EOK)
|
||||||
|
{
|
||||||
|
rst = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &tv->tv_sec);
|
||||||
|
rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME_US, &tv->tv_usec);
|
||||||
|
rt_device_close(device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_W("Cannot find a RTC device to provide time!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rst < 0) ? -1 : 1;
|
||||||
|
|
||||||
|
#else
|
||||||
|
LOG_W("Cannot find a RTC device to provide time!");
|
||||||
|
return -1;
|
||||||
|
#endif /* RT_USING_RTC */
|
||||||
|
}
|
||||||
|
|
||||||
struct tm *gmtime_r(const time_t *timep, struct tm *r)
|
struct tm *gmtime_r(const time_t *timep, struct tm *r)
|
||||||
{
|
{
|
||||||
time_t i;
|
time_t i;
|
||||||
|
@ -136,7 +230,13 @@ RTM_EXPORT(localtime);
|
||||||
/* TODO: timezone */
|
/* TODO: timezone */
|
||||||
time_t mktime(struct tm * const t)
|
time_t mktime(struct tm * const t)
|
||||||
{
|
{
|
||||||
return timegm(t);
|
time_t timestamp;
|
||||||
|
int utc_plus;
|
||||||
|
|
||||||
|
utc_plus = 8; /* GMT: UTC+8 */
|
||||||
|
timestamp = timegm(t);
|
||||||
|
timestamp = timestamp - 3600 * utc_plus;
|
||||||
|
return timestamp;
|
||||||
}
|
}
|
||||||
RTM_EXPORT(mktime);
|
RTM_EXPORT(mktime);
|
||||||
|
|
||||||
|
@ -183,49 +283,6 @@ char* ctime(const time_t *tim_p)
|
||||||
}
|
}
|
||||||
RTM_EXPORT(ctime);
|
RTM_EXPORT(ctime);
|
||||||
|
|
||||||
/*-1 failure; 1 success*/
|
|
||||||
static int get_timeval(struct timeval *tv)
|
|
||||||
{
|
|
||||||
if (tv == RT_NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* default is not available */
|
|
||||||
tv->tv_sec = -1;
|
|
||||||
/* default is 0 */
|
|
||||||
tv->tv_usec = 0;
|
|
||||||
|
|
||||||
#ifdef RT_USING_RTC
|
|
||||||
static rt_device_t device = RT_NULL;
|
|
||||||
|
|
||||||
/* optimization: find rtc device only first */
|
|
||||||
if (device == RT_NULL)
|
|
||||||
{
|
|
||||||
device = rt_device_find("rtc");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read timestamp from RTC device */
|
|
||||||
if (device != RT_NULL)
|
|
||||||
{
|
|
||||||
if (rt_device_open(device, 0) == RT_EOK)
|
|
||||||
{
|
|
||||||
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &tv->tv_sec);
|
|
||||||
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME_US, &tv->tv_usec);
|
|
||||||
rt_device_close(device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* RT_USING_RTC */
|
|
||||||
|
|
||||||
if (tv->tv_sec == (time_t) -1)
|
|
||||||
{
|
|
||||||
/* LOG_W will cause a recursive printing if ulog timestamp function is turned on */
|
|
||||||
rt_kprintf("Cannot find a RTC device to provide time!\r\n");
|
|
||||||
tv->tv_sec = 0;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current time.
|
* Returns the current time.
|
||||||
*
|
*
|
||||||
|
@ -250,7 +307,7 @@ RT_WEAK time_t time(time_t *t)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errno = EFAULT;
|
errno = EFAULT;
|
||||||
return -1;
|
return ((time_t)-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RTM_EXPORT(time);
|
RTM_EXPORT(time);
|
||||||
|
@ -263,28 +320,24 @@ RTM_EXPORT(clock);
|
||||||
|
|
||||||
int stime(const time_t *t)
|
int stime(const time_t *t)
|
||||||
{
|
{
|
||||||
#ifdef RT_USING_RTC
|
struct timeval tv;
|
||||||
rt_device_t device;
|
|
||||||
|
|
||||||
/* read timestamp from RTC device. */
|
if (!t)
|
||||||
device = rt_device_find("rtc");
|
|
||||||
if (rt_device_open(device, 0) == RT_EOK)
|
|
||||||
{
|
{
|
||||||
rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, (void*)t);
|
errno = EFAULT;
|
||||||
rt_device_close(device);
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tv.tv_sec = *t;
|
||||||
|
if (set_timeval(&tv) > 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_W("Cannot find a RTC device to provide time!");
|
|
||||||
errno = EFAULT;
|
errno = EFAULT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
LOG_W("Cannot find a RTC device to provide time!");
|
|
||||||
errno = EFAULT;
|
|
||||||
return -1;
|
|
||||||
#endif /* RT_USING_RTC */
|
|
||||||
}
|
}
|
||||||
RTM_EXPORT(stime);
|
RTM_EXPORT(stime);
|
||||||
|
|
||||||
|
@ -385,7 +438,15 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
|
||||||
{
|
{
|
||||||
if(tv->tv_sec >= 0 && tv->tv_usec >= 0)
|
if(tv->tv_sec >= 0 && tv->tv_usec >= 0)
|
||||||
{
|
{
|
||||||
return stime((const time_t *)&tv->tv_sec);
|
if(set_timeval((struct timeval *)tv) > 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errno = EFAULT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -964,10 +964,10 @@ enum rt_device_class_type
|
||||||
#define RT_DEVICE_CTRL_MTD_FORMAT 0x10 /**< format a MTD device */
|
#define RT_DEVICE_CTRL_MTD_FORMAT 0x10 /**< format a MTD device */
|
||||||
#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10 /**< get second time */
|
#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10 /**< get second time */
|
||||||
#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11 /**< set second time */
|
#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11 /**< set second time */
|
||||||
#define RT_DEVICE_CTRL_RTC_GET_ALARM 0x12 /**< get alarm */
|
#define RT_DEVICE_CTRL_RTC_GET_TIME_US 0x12 /**< get microsecond time */
|
||||||
#define RT_DEVICE_CTRL_RTC_SET_ALARM 0x13 /**< set alarm */
|
#define RT_DEVICE_CTRL_RTC_SET_TIME_US 0x13 /**< set microsecond time */
|
||||||
#define RT_DEVICE_CTRL_RTC_GET_TIME_US 0x14 /**< get microsecond time */
|
#define RT_DEVICE_CTRL_RTC_GET_ALARM 0x14 /**< get alarm */
|
||||||
#define RT_DEVICE_CTRL_RTC_SET_TIME_US 0x15 /**< set microsecond time */
|
#define RT_DEVICE_CTRL_RTC_SET_ALARM 0x15 /**< set alarm */
|
||||||
|
|
||||||
typedef struct rt_device *rt_device_t;
|
typedef struct rt_device *rt_device_t;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue