diff --git a/application.c b/application.c index d0a583f..807f28b 100644 --- a/application.c +++ b/application.c @@ -22,6 +22,7 @@ #include // standard integer types #include // standard utilities #include // string utilities +#include // date/time utilities /* STM32 (including CM3) libraries */ #include // Cortex M3 utilities @@ -49,6 +50,8 @@ volatile bool rtc_internal_tick_flag = false; /**< flag set when internal RTC ticked */ /** @} */ +time_t time_rtc = 0; /**< time (seconds since Unix Epoch) */ +struct tm* time_tm; /**< time in tm format (time zones are not handled for non-POSIX environments) */ size_t putc(char c) { @@ -117,6 +120,42 @@ static void process_command(char* str) } else { goto error; } + } else if (0==strcmp(word,"time")) { + word = strtok(NULL,delimiter); + if (!word) { + time_rtc = rtc_get_counter_val(); // get time from internal RTC + time_tm = localtime(&time_rtc); // convert time + printf("time: %02d:%02d:%02d\n", time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec); + } else if (strlen(word)!=8 || word[0]<'0' || word[0]>'2' || word[1]<'0' || word[1]>'9' || word[3]<'0' || word[3]>'5' || word[4]<'0' || word[4]>'9' || word[6]<'0' || word[6]>'5' || word[7]<'0' || word[7]>'9') { // time format is incorrect + goto error; + } else { + time_rtc = rtc_get_counter_val(); // get time from internal RTC + time_tm = localtime(&time_rtc); // convert time + time_tm->tm_hour = (word[0]-'0')*10+(word[1]-'0')*1; // set hours + time_tm->tm_min = (word[3]-'0')*10+(word[4]-'0')*1; // set minutes + time_tm->tm_sec = (word[6]-'0')*10+(word[7]-'0')*1; // set seconds + time_rtc = mktime(time_tm); // get back seconds + rtc_set_counter_val(time_rtc); // save time to internal RTC + printf("time set\n"); + } + } else if (0==strcmp(word,"date")) { + word = strtok(NULL,delimiter); + if (!word) { + time_rtc = rtc_get_counter_val(); // get time from internal RTC + time_tm = localtime(&time_rtc); // convert time + printf("date: %d-%02d-%02d\n", 1900+time_tm->tm_year, time_tm->tm_mon, time_tm->tm_mday); + } else if (strlen(word)!=10 || word[0]!='2' || word[1]!='0' || word[2]<'0' || word[2]>'9' || word[3]<'0' || word[3]>'9' || word[5]<'0' || word[5]>'1' || word[6]<'0' || word[6]>'9' || word[8]<'0' || word[8]>'3' || word[9]<'0' || word[9]>'9') { + goto error; + } else { + time_rtc = rtc_get_counter_val(); // get time from internal RTC + time_tm = localtime(&time_rtc); // convert time + time_tm->tm_year = ((word[0]-'0')*1000+(word[1]-'0')*100+(word[2]-'0')*10+(word[3]-'0')*1)-1900; // set year + time_tm->tm_mon = (word[5]-'0')*10+(word[6]-'0')*1; // set month + time_tm->tm_mday = (word[8]-'0')*10+(word[9]-'0')*1; // set day + time_rtc = mktime(time_tm); // get back seconds + rtc_set_counter_val(time_rtc); // save time to internal RTC + printf("date set\n"); + } } else { goto error; } @@ -173,8 +212,9 @@ void main(void) nvic_enable_irq(NVIC_RTC_IRQ); // allow the RTC to interrupt printf("OK\n"); - uint32_t ticks_time = rtc_get_counter_val(); // get time from internal RTC (since first start/power up) - printf("uptime: %lu.%02lu:%02lu:%02lu\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60)); // display uptime + time_rtc= rtc_get_counter_val(); // get time from internal RTC + time_tm = localtime(&time_rtc); // convert time + printf("date: %d-%02d-%02d %02d:%02d:%02d\n", 1900+time_tm->tm_year, time_tm->tm_mon, time_tm->tm_mday, time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec); // main loop printf("command input: ready\n"); @@ -224,13 +264,14 @@ void main(void) } while (rtc_internal_tick_flag) { // the internal RTC ticked rtc_internal_tick_flag = false; // reset flag + action = true; // action has been performed #if !defined(BLUE_PILL) // on the blue pill the LED is close to the 32.768 kHz oscillator and heavily influences it led_toggle(); // toggle LED (good to indicate if main function is stuck) #endif - ticks_time = rtc_get_counter_val(); // copy time from internal RTC for processing - action = true; // action has been performed - if ((ticks_time%(60))==0) { // one minute passed - printf("uptime: %lu.%02lu:%02lu:%02lu\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60)); // display uptime + time_rtc = rtc_get_counter_val(); // get time from internal RTC (seconds since Unix Epoch) + time_tm = localtime(&time_rtc); // get time in tm format from Epoch (time zones are not handled for non-POSIX environments) + if (0==time_tm->tm_sec) { // new minute + printf("time: %02d:%02d:%02d\n", time_tm->tm_hour, time_tm->tm_min, time_tm->tm_sec); } } if (action) { // go to sleep if nothing had to be done, else recheck for activity