@ -22,6 +22,7 @@
# include <stdint.h> // standard integer types
# include <stdlib.h> // standard utilities
# include <string.h> // string utilities
# include <time.h> // date/time utilities
/* STM32 (including CM3) libraries */
# include <libopencmsis/core_cm3.h> // 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_ti me = rtc_get_counter_val ( ) ; // copy time from internal RTC for processing
action = true ; // action has been performed
if ( ( ticks_time % ( 60 ) ) = = 0 ) { // o ne 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