195 lines
6.4 KiB
C
195 lines
6.4 KiB
C
#include <string.h>
|
|
#include <assert.h>
|
|
#include "wm_include.h"
|
|
#include "wm_demo.h"
|
|
#include "wm_rtc.h"
|
|
|
|
#if 0
|
|
/**
|
|
NOTE: This demo shows a rtc irq occurs at 00:00:00 on everyday;
|
|
|
|
*/
|
|
|
|
#define NTP_UPDATE_PERIOD (360*HZ)
|
|
|
|
|
|
typedef struct{
|
|
bool alarm_triger_setting; //rtc irq enabled
|
|
bool ntp_time_updated; //ntp time updated
|
|
bool ntp_update_frequency; //ntp update high/low duty
|
|
uint32_t alarm_time; //rtc irq occurs time;
|
|
uint32_t alarm_setting_time; //rtc irq enable time;
|
|
tls_os_timer_t *ntp_update_timer;
|
|
} rtc_s;
|
|
|
|
static rtc_s * rtc_ptr = NULL;
|
|
|
|
static void rtc_alarm_irq(void *arg)
|
|
{
|
|
struct tm *time_tm = NULL;
|
|
struct tm rtc_time_tm;
|
|
rtc_s *rtc = (rtc_s *)arg;
|
|
|
|
rtc->alarm_triger_setting = false;
|
|
rtc->ntp_time_updated = false;
|
|
|
|
tls_get_rtc(&rtc_time_tm);
|
|
|
|
printf("ALARM INFO...........................\r\n");
|
|
printf("current rtc time: %04u/%02u/%02u %02u:%02u:%02u\n", rtc_time_tm.tm_year+1900, rtc_time_tm.tm_mon+1, rtc_time_tm.tm_mday, rtc_time_tm.tm_hour, rtc_time_tm.tm_min, rtc_time_tm.tm_sec);
|
|
|
|
time_tm = localtime((const time_t *)&rtc->alarm_time);
|
|
printf("alarm rtc time: %04u/%02u/%02u %02u:%02u:%02u\n", time_tm->tm_year+1900, time_tm->tm_mon+1, time_tm->tm_mday, time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
|
|
|
time_tm = localtime((const time_t *)&rtc->alarm_setting_time);
|
|
printf("alarm rtc setting time: %04u/%02u/%02u %02u:%02u:%02u\n", time_tm->tm_year+1900, time_tm->tm_mon+1, time_tm->tm_mday, time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
|
|
|
printf("ALARM INFO END...........................\r\n");
|
|
}
|
|
|
|
static void ntp_update_timer_cb(void *ptmr, void *parg)
|
|
{
|
|
int ret;
|
|
uint32_t time_now;
|
|
struct tm *time_tm = NULL;
|
|
struct tm rtc_time_tm;
|
|
|
|
rtc_s *rtc = (rtc_s *)parg;
|
|
time_now = tls_ntp_client();
|
|
|
|
if(time_now != 0)
|
|
{
|
|
time_tm = localtime((const time_t *)&time_now); //switch to local time format
|
|
if(!rtc->ntp_time_updated)
|
|
{
|
|
//rtc->ntp_time_updated = true;
|
|
tls_set_rtc(time_tm);
|
|
printf("update rtc time: %04u/%02u/%02u %02u:%02u:%02u\n", time_tm->tm_year+1900, time_tm->tm_mon+1, time_tm->tm_mday, time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
|
}else
|
|
{
|
|
printf("current ntp time: %04u/%02u/%02u %02u:%02u:%02u\n", time_tm->tm_year+1900, time_tm->tm_mon+1, time_tm->tm_mday, time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
|
}
|
|
|
|
if(!rtc->ntp_update_frequency){
|
|
tls_os_timer_change((tls_os_timer_t *)ptmr, NTP_UPDATE_PERIOD);
|
|
rtc->ntp_update_frequency = true; //indicate ntp update in low duty
|
|
printf("ntp timer update running low frequency\r\n");
|
|
}
|
|
|
|
if(!rtc->alarm_triger_setting)
|
|
{
|
|
//rtc->alarm_triger_setting = true;
|
|
rtc->alarm_setting_time = time_now;
|
|
|
|
//configure rtc irq occurs at next day on 00:00:00
|
|
rtc->alarm_time = time_now + 24*3600; //plus one day;
|
|
time_tm = localtime((const time_t *)&rtc->alarm_time); //switch to local time format
|
|
time_tm->tm_hour = 0; //overwritten to 0
|
|
time_tm->tm_min = 0; //overwritten to 0
|
|
time_tm->tm_sec = 0; //overwritten to 0
|
|
rtc->alarm_time = mktime(time_tm); //remember the alarm time
|
|
|
|
if(1)
|
|
{
|
|
tls_rtc_timer_start(time_tm);
|
|
printf("alarm time setting: %04u/%02u/%02u %02u:%02u:%02u\n", time_tm->tm_year+1900, time_tm->tm_mon+1, time_tm->tm_mday, time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec);
|
|
}
|
|
|
|
tls_get_rtc((struct tm *)&rtc_time_tm);
|
|
printf("current rtc time: %04u/%02u/%02u %02u:%02u:%02u\n", rtc_time_tm.tm_year+1900, rtc_time_tm.tm_mon+1, rtc_time_tm.tm_mday, rtc_time_tm.tm_hour, rtc_time_tm.tm_min, rtc_time_tm.tm_sec);
|
|
|
|
}
|
|
}else{
|
|
printf("ntp update failed...\r\n");
|
|
tls_os_timer_change((tls_os_timer_t *)ptmr, NTP_UPDATE_PERIOD/100);
|
|
rtc->ntp_update_frequency = false; //indicate ntp updating in high duty;
|
|
tls_get_rtc((struct tm *)&rtc_time_tm);
|
|
printf("old rtc time: %04u/%02u/%02u %02u:%02u:%02u\n", rtc_time_tm.tm_year+1900, rtc_time_tm.tm_mon+1, rtc_time_tm.tm_mday, rtc_time_tm.tm_hour, rtc_time_tm.tm_min, rtc_time_tm.tm_sec);
|
|
}
|
|
|
|
}
|
|
int rtc_demo(void)
|
|
{
|
|
int ret;
|
|
|
|
if(rtc_ptr) return 0;
|
|
|
|
rtc_ptr = tls_mem_alloc(sizeof(rtc_s));
|
|
assert(rtc_ptr != NULL);
|
|
|
|
memset(rtc_ptr, 0, sizeof(rtc_s));
|
|
tls_rtc_isr_register(rtc_alarm_irq, (void*)rtc_ptr);
|
|
ret = tls_os_timer_create(&rtc_ptr->ntp_update_timer,ntp_update_timer_cb,(void*)rtc_ptr, NTP_UPDATE_PERIOD/100, TRUE, (uint8_t *)"ntp_update_timer");
|
|
|
|
if(ret == TLS_OS_SUCCESS)
|
|
{
|
|
tls_os_timer_start(rtc_ptr->ntp_update_timer);
|
|
|
|
}else{
|
|
|
|
tls_mem_free(rtc_ptr);
|
|
rtc_ptr = NULL;
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
int rtc_demo_deinit()
|
|
{
|
|
if(rtc_ptr == NULL) return 0;
|
|
|
|
tls_os_timer_stop(rtc_ptr->ntp_update_timer);
|
|
tls_os_timer_delete(rtc_ptr->ntp_update_timer);
|
|
rtc_ptr->ntp_update_timer = NULL;
|
|
tls_rtc_timer_stop();
|
|
tls_mem_free(rtc_ptr);
|
|
rtc_ptr = NULL;
|
|
}
|
|
|
|
#else
|
|
|
|
|
|
static void demo_rtc_clock_irq(void *arg)
|
|
{
|
|
struct tm tblock;
|
|
tls_get_rtc(&tblock);
|
|
printf("rtc clock, sec=%d,min=%d,hour=%d,mon=%d,year=%d\n", tblock.tm_sec, tblock.tm_min, tblock.tm_hour, tblock.tm_mon, tblock.tm_year);
|
|
}
|
|
|
|
|
|
int rtc_demo(void)
|
|
{
|
|
struct tm tblock;
|
|
|
|
tblock.tm_year = 17;
|
|
tblock.tm_mon = 11;
|
|
tblock.tm_mday = 20;
|
|
tblock.tm_hour = 14;
|
|
tblock.tm_min = 30;
|
|
tblock.tm_sec = 0;
|
|
tls_set_rtc(&tblock);
|
|
|
|
tls_rtc_isr_register(demo_rtc_clock_irq, NULL);
|
|
tblock.tm_year = 17;
|
|
tblock.tm_mon = 11;
|
|
tblock.tm_mday = 20;
|
|
tblock.tm_hour = 14;
|
|
tblock.tm_min = 30;
|
|
tblock.tm_sec = 20;
|
|
tls_rtc_timer_start(&tblock);
|
|
|
|
while(1)
|
|
{
|
|
tls_os_time_delay(200);
|
|
tls_get_rtc(&tblock);
|
|
printf("rtc cnt, sec=%02d,min=%02d,hour=%02d,mon=%02d,year=%02d\n", tblock.tm_sec, tblock.tm_min, tblock.tm_hour, tblock.tm_mon, tblock.tm_year);
|
|
}
|
|
|
|
return WM_SUCCESS;
|
|
}
|
|
#endif
|
|
|
|
|
|
|