Several examples run on only mbed-os5.13.0 (not 5.14.0)
Dependencies: BD_SD_DISCO_F769NI BSP_DISCO_F769NI LCD_DISCO_F769NI TS_DISCO_F769NI USBHost_F769NI
Diff: z_example/1_rtc.cpp
- Revision:
- 3:35ac9ee7d2d6
- Child:
- 4:0f4affc00183
diff -r 2712267970df -r 35ac9ee7d2d6 z_example/1_rtc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/z_example/1_rtc.cpp Wed Aug 07 05:39:01 2019 +0000 @@ -0,0 +1,238 @@ +/* + * Mbed Application program / check RTC (Real Time Clock) + * + * Copyright (c) 2017,'18,'19 Kenji Arai / JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * https://os.mbed.com/users/kenjiArai/ + * Created: August 11th, 2017 + * Revised: July 30th, 2019 + */ + +#include "select_program.h" +//#define EXAMPLE_1_CHECK_RTC +#ifdef EXAMPLE_1_CHECK_RTC + +// Include -------------------------------------------------------------------- +#include "mbed.h" + +// Definition ----------------------------------------------------------------- + +// Constructor ---------------------------------------------------------------- +DigitalIn userSW(BUTTON1); +DigitalOut myled(LED1); // Indicate the sampling period +Serial pc(USBTX, USBRX, 115200); + +// RAM ------------------------------------------------------------------------ + +// ROM / Constant data -------------------------------------------------------- +const char * msg0 = "Is a time correct? If no, please hit any key. "; +const char * msg1 = "<Push USER SW then enter sleep mode> "; +const char * msg2 = "\r\nEnter Standby Mode, please push RESET to wake-up\r\n"; + +// Function prototypes -------------------------------------------------------- +extern void time_enter_mode(void); +static void goto_standby(void); +#if 0 +static void time_enter_mode(void); +static void chk_and_set_time(char *ptr); +static int xatoi (char **str, unsigned long *res); +static void get_line (char *buff, int len); +#endif +//------------------------------------------------------------------------------ +// Control Program +//------------------------------------------------------------------------------ +int main() +{ + char buf[64]; // data buffer for text + time_t seconds; + uint8_t wait_counter = 0; + + pc.printf("\x1b[2J\x1b[H %s\r\n %s %s (UTC)\r\n", + __FILE__, __DATE__, __TIME__); + myled = !myled; + ThisThread::sleep_for(1000); + myled = !myled; + ThisThread::sleep_for(1000); + while(1) { + seconds = time(NULL); + strftime(buf, 50, " %B %d,'%y, %H:%M:%S,", localtime(&seconds)); + pc.printf("[Time] %s", buf); + pc.printf(" sec=%d\r\n", seconds); + pc.printf("%s", msg0); + pc.printf("%s\r", msg1); + wait_counter = 0; + while (seconds == time(NULL)) { + if (pc.readable() == 1) { + buf[0] = pc.getc(); // dummy read + time_enter_mode(); + } + if (userSW == 1) { + pc.printf("%s", msg2); + ThisThread::sleep_for(1000); + myled = 0; + goto_standby(); + } + ThisThread::sleep_for(50); + if (++wait_counter > (2000 / 50)) { + break; + } + } + uint8_t n = strlen(msg0) + strlen(msg1); + for (uint8_t i = 0; i < n; i++) { + pc.putc(' '); + } + pc.printf(" \r"); // Not use '\n' + myled = !myled; + } +} + +void goto_standby(void) +{ + ThisThread::sleep_for(0x7fffffff); // sleep 24 days +} + +#if 0 +void time_enter_mode(void) +{ + char *ptr; + char linebuf[64]; + + pc.printf("\r\nSet time into RTC\r\n"); + pc.printf(" e.g. >19 7 15 10 11 12 -> July 15th,'19, 10:11:12\r\n"); + pc.printf(" If time is fine, just hit enter\r\n"); + pc.putc('>'); + ptr = linebuf; + get_line(ptr, sizeof(linebuf)); + pc.printf("\r"); + chk_and_set_time(ptr); +} + +// Get key input data +void get_line (char *buff, int len) +{ + char c; + int idx = 0; + + for (;;) { + c = pc.getc(); + if (c == '\r') { + buff[idx++] = c; + break; + } + if ((c == '\b') && idx) { + idx--; + pc.putc(c); + pc.putc(' '); + pc.putc(c); + } + if (((uint8_t)c >= ' ') && (idx < len - 1)) { + buff[idx++] = c; + pc.putc(c); + } + } + buff[idx] = 0; + pc.putc('\n'); +} + +void chk_and_set_time(char *ptr) +{ + unsigned long p1; + struct tm t; + time_t seconds; + + if (xatoi(&ptr, &p1)) { + t.tm_year = (uint8_t)p1 + 100; + pc.printf("Year:%d ",(int)p1); + xatoi( &ptr, &p1 ); + t.tm_mon = (uint8_t)p1 - 1; + pc.printf("Month:%d ",(int)p1); + xatoi( &ptr, &p1 ); + t.tm_mday = (uint8_t)p1; + pc.printf("Day:%d ",(int)p1); + xatoi( &ptr, &p1 ); + t.tm_hour = (uint8_t)p1; + pc.printf("Hour:%d ",(int)p1); + xatoi( &ptr, &p1 ); + t.tm_min = (uint8_t)p1; + pc.printf("Min:%d ",(int)p1); + xatoi( &ptr, &p1 ); + t.tm_sec = (uint8_t)p1; + pc.printf("Sec:%d \r\n",(int)p1); + } else { + return; + } + seconds = mktime(&t); + set_time(seconds); + pc.printf( + "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n", + t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec + ); +} + +// Change string -> integer +int xatoi (char **str, unsigned long *res) +{ + unsigned long val; + unsigned char c, radix, s = 0; + + while ((c = **str) == ' ') { + (*str)++; + } + if (c == '-') { + s = 1; + c = *(++(*str)); + } + if (c == '0') { + c = *(++(*str)); + if (c <= ' ') { + *res = 0; + return 1; + } + if (c == 'x') { + radix = 16; + c = *(++(*str)); + } else { + if (c == 'b') { + radix = 2; + c = *(++(*str)); + } else { + if ((c >= '0')&&(c <= '9')) { + radix = 8; + } else { + return 0; + } + } + } + } else { + if ((c < '1')||(c > '9')) { + return 0; + } + radix = 10; + } + val = 0; + while (c > ' ') { + if (c >= 'a') { + c -= 0x20; + } + c -= '0'; + if (c >= 17) { + c -= 7; + if (c <= 9) { + return 0; + } + } + if (c >= radix) { + return 0; + } + val = val * radix + c; + c = *(++(*str)); + } + if (s) { + val = -val; + } + *res = val; + return 1; +} +#endif + +#endif