|
|
@@ -1,3 +1,4 @@
|
|
|
+#include "luat_base.h"
|
|
|
#include "luat_rtc.h"
|
|
|
#include "luat_msgbus.h"
|
|
|
#include "wm_rtc.h"
|
|
|
@@ -6,6 +7,9 @@
|
|
|
#define LUAT_LOG_TAG "rtc"
|
|
|
#include "luat_log.h"
|
|
|
|
|
|
+int rtc_timezone;
|
|
|
+
|
|
|
+
|
|
|
static int luat_rtc_handler(lua_State *L, void* ptr) {
|
|
|
lua_getglobal(L, "sys_pub");
|
|
|
if (lua_isfunction(L, -1)) {
|
|
|
@@ -25,8 +29,12 @@ static void luat_rtc_cb(void *arg) {
|
|
|
int luat_rtc_set(struct tm *tblock) {
|
|
|
if (tblock == NULL)
|
|
|
return -1;
|
|
|
- tblock->tm_mon ++;
|
|
|
+ // TODO 防御非法的RTC值
|
|
|
tls_set_rtc(tblock);
|
|
|
+ struct tm tt;
|
|
|
+ tls_get_rtc(&tt);
|
|
|
+ // printf("set %d-%d-%d %d:%d:%d\n", tblock->tm_year + 1900, tblock->tm_mon + 1, tblock->tm_mday, tblock->tm_hour, tblock->tm_min, tblock->tm_sec);
|
|
|
+ // printf("get %d-%d-%d %d:%d:%d\n", tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday, tt.tm_hour, tt.tm_min, tt.tm_sec);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -34,7 +42,6 @@ int luat_rtc_get(struct tm *tblock) {
|
|
|
if (tblock == NULL)
|
|
|
return -1;
|
|
|
tls_get_rtc(tblock);
|
|
|
- tblock->tm_mon --;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -54,22 +61,26 @@ int luat_rtc_timer_stop(int id) {
|
|
|
}
|
|
|
|
|
|
int luat_rtc_timezone(int* timezone) {
|
|
|
- return 32; // 暂不支持
|
|
|
+ if (timezone)
|
|
|
+ rtc_timezone = *timezone;
|
|
|
+ return rtc_timezone;
|
|
|
}
|
|
|
|
|
|
void luat_rtc_set_tamp32(uint32_t tamp) {
|
|
|
time_t t;
|
|
|
- t = tamp + (8*3600); // 固定东八区
|
|
|
+ t = tamp;
|
|
|
struct tm *tblock = gmtime(&t);
|
|
|
luat_rtc_set(tblock);
|
|
|
}
|
|
|
|
|
|
time_t time(time_t* _tm)
|
|
|
{
|
|
|
- struct tm tmt = {0};
|
|
|
- tls_get_rtc(&tmt);
|
|
|
- tmt.tm_mon --;
|
|
|
- time_t t = mktime(&tmt);
|
|
|
+ struct tm tt = {0};
|
|
|
+ tls_get_rtc(&tt);
|
|
|
+// printf(">> %d-%d-%d %d:%d:%d\n", tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday, tt.tm_hour, tt.tm_min, tt.tm_sec);
|
|
|
+ time_t t = mktime(&tt);
|
|
|
+ if (rtc_timezone)
|
|
|
+ t += rtc_timezone * (3600 / 4);
|
|
|
if (_tm != NULL)
|
|
|
memcpy(_tm, &t, sizeof(time_t));
|
|
|
return t;
|
|
|
@@ -79,3 +90,95 @@ clock_t clock(void)
|
|
|
{
|
|
|
return (clock_t)time(NULL);
|
|
|
}
|
|
|
+
|
|
|
+//---------------------------------------
|
|
|
+#include "c_common.h"
|
|
|
+void RTC_GetDateTime(Date_UserDataStruct *Date, Time_UserDataStruct *Time);
|
|
|
+
|
|
|
+time_t __wrap_mktime(struct tm* tt) {
|
|
|
+ Time_UserDataStruct Time = {0};
|
|
|
+ Date_UserDataStruct Date = {0};
|
|
|
+
|
|
|
+ Time.Hour = tt->tm_hour;
|
|
|
+ Time.Min = tt->tm_min;
|
|
|
+ Time.Sec = tt->tm_sec;
|
|
|
+ Time.Week = tt->tm_wday;
|
|
|
+
|
|
|
+ Date.Day = tt->tm_mday;
|
|
|
+ Date.Mon = tt->tm_mon + 1;
|
|
|
+ Date.Year = tt->tm_year + 1900;
|
|
|
+ // printf("????\n");
|
|
|
+ uint64_t t = UTC2Tamp(&Date, &Time);
|
|
|
+ // printf("????2\n");
|
|
|
+ time_t tmp = (time_t) t & 0xFFFFFFFF;
|
|
|
+ return tmp;
|
|
|
+}
|
|
|
+
|
|
|
+void RTC_GetDateTime(Date_UserDataStruct *Date, Time_UserDataStruct *Time) {
|
|
|
+ struct tm tt = {0};
|
|
|
+ tls_get_rtc(&tt);
|
|
|
+ Time->Hour = tt.tm_hour;
|
|
|
+ Time->Min = tt.tm_min;
|
|
|
+ Time->Sec = tt.tm_sec;
|
|
|
+ Time->Week = tt.tm_wday;
|
|
|
+
|
|
|
+ Date->Day = tt.tm_mday;
|
|
|
+ Date->Mon = tt.tm_mon + 1;
|
|
|
+ Date->Year = tt.tm_year + 1900;
|
|
|
+}
|
|
|
+
|
|
|
+static struct tm prvTM;
|
|
|
+extern const uint32_t DayTable[2][12];
|
|
|
+
|
|
|
+struct tm *__wrap_localtime (const time_t *_timer)
|
|
|
+{
|
|
|
+ Time_UserDataStruct Time;
|
|
|
+ Date_UserDataStruct Date;
|
|
|
+ uint64_t Sec;
|
|
|
+ if (_timer)
|
|
|
+ {
|
|
|
+ Sec = *_timer;
|
|
|
+ Tamp2UTC(Sec, &Date, &Time, 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ RTC_GetDateTime(&Date, &Time);
|
|
|
+ }
|
|
|
+ prvTM.tm_year = Date.Year - 1900;
|
|
|
+ prvTM.tm_mon = Date.Mon - 1;
|
|
|
+ prvTM.tm_mday = Date.Day;
|
|
|
+ prvTM.tm_hour = Time.Hour;
|
|
|
+ prvTM.tm_min = Time.Min;
|
|
|
+ prvTM.tm_sec = Time.Sec;
|
|
|
+ prvTM.tm_wday = Time.Week;
|
|
|
+ prvTM.tm_yday = Date.Day - 1;
|
|
|
+ prvTM.tm_yday += DayTable[IsLeapYear(Date.Year)][Date.Mon - 1];
|
|
|
+ return &prvTM;
|
|
|
+}
|
|
|
+
|
|
|
+struct tm *__wrap_gmtime (const time_t *_timer)
|
|
|
+{
|
|
|
+ Time_UserDataStruct Time;
|
|
|
+ Date_UserDataStruct Date;
|
|
|
+ uint64_t Sec;
|
|
|
+ if (_timer)
|
|
|
+ {
|
|
|
+ Sec = *_timer;
|
|
|
+ Tamp2UTC(Sec, &Date, &Time, 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ RTC_GetDateTime(&Date, &Time);
|
|
|
+ }
|
|
|
+ prvTM.tm_year = Date.Year - 1900;
|
|
|
+ prvTM.tm_mon = Date.Mon - 1;
|
|
|
+ prvTM.tm_mday = Date.Day;
|
|
|
+ prvTM.tm_hour = Time.Hour;
|
|
|
+ prvTM.tm_min = Time.Min;
|
|
|
+ prvTM.tm_sec = Time.Sec;
|
|
|
+ prvTM.tm_wday = Time.Week;
|
|
|
+ prvTM.tm_yday = Date.Day - 1;
|
|
|
+ prvTM.tm_yday += DayTable[IsLeapYear(Date.Year)][Date.Mon - 1];
|
|
|
+ return &prvTM;
|
|
|
+}
|
|
|
+
|