| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- #include "luat_base.h"
- #include "luat_rtc.h"
- #include "luat_msgbus.h"
- #include "wm_rtc.h"
- #include "time.h"
- #define LUAT_LOG_TAG "rtc"
- #include "luat_log.h"
- int rtc_timezone = 32;
- static int luat_rtc_handler(lua_State *L, void* ptr) {
- lua_getglobal(L, "sys_pub");
- if (lua_isfunction(L, -1)) {
- lua_pushstring(L, "RTC_IRQ");
- lua_call(L, 1, 0);
- }
- return 0;
- }
- static void luat_rtc_cb(void *arg) {
- //LLOGI("rtc irq");
- rtos_msg_t msg;
- msg.handler = luat_rtc_handler;
- luat_msgbus_put(&msg, 0);
- }
- int luat_rtc_set(struct tm *tblock) {
- if (tblock == NULL)
- return -1;
- // 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;
- }
- int luat_rtc_get(struct tm *tblock) {
- if (tblock == NULL)
- return -1;
- tls_get_rtc(tblock);
- return 0;
- }
- int luat_rtc_timer_start(int id, struct tm *tblock) {
- if (id || tblock == NULL)
- return -1;
- tls_rtc_isr_register(luat_rtc_cb, NULL);
- tls_rtc_timer_start(tblock);
- return 0;
- }
- int luat_rtc_timer_stop(int id) {
- if (id)
- return -1;
- tls_rtc_timer_stop();
- return 0;
- }
- int luat_rtc_timezone(int* timezone) {
- if (timezone)
- rtc_timezone = *timezone;
- return rtc_timezone;
- }
- void luat_rtc_set_tamp32(uint32_t tamp) {
- time_t t;
- t = tamp;
- struct tm *tblock = gmtime(&t);
- luat_rtc_set(tblock);
- }
- time_t time(time_t* _tm)
- {
- struct tm tt = {0};
- tls_get_rtc(&tt);
- time_t t = mktime(&tt);
- // printf("time %d\n", t);
- if (_tm != NULL)
- memcpy(_tm, &t, sizeof(time_t));
- return t;
- }
- 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;
- }
|