Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
set_RTC.cpp@1:271991ff8004, 2019-06-29 (annotated)
- Committer:
- kenjiArai
- Date:
- Sat Jun 29 23:54:50 2019 +0000
- Revision:
- 1:271991ff8004
- Parent:
- 0:c0e0a185358d
combined latest mbed-os5 revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:c0e0a185358d | 1 | /* |
kenjiArai | 0:c0e0a185358d | 2 | * Set time into RTC |
kenjiArai | 0:c0e0a185358d | 3 | * |
kenjiArai | 0:c0e0a185358d | 4 | * Copyright (c) 2019 Kenji Arai / JH1PJL |
kenjiArai | 0:c0e0a185358d | 5 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:c0e0a185358d | 6 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:c0e0a185358d | 7 | * Created: April 27th, 2019 |
kenjiArai | 1:271991ff8004 | 8 | * Revised: June 29th, 2019 |
kenjiArai | 0:c0e0a185358d | 9 | */ |
kenjiArai | 0:c0e0a185358d | 10 | |
kenjiArai | 0:c0e0a185358d | 11 | #include "mbed.h" |
kenjiArai | 0:c0e0a185358d | 12 | |
kenjiArai | 0:c0e0a185358d | 13 | extern Serial pc; |
kenjiArai | 0:c0e0a185358d | 14 | |
kenjiArai | 0:c0e0a185358d | 15 | static void chk_and_set_time(char *ptr); |
kenjiArai | 0:c0e0a185358d | 16 | static int32_t xatoi (char **str, int32_t *res); |
kenjiArai | 0:c0e0a185358d | 17 | static void get_line (char *buff, int len); |
kenjiArai | 0:c0e0a185358d | 18 | |
kenjiArai | 0:c0e0a185358d | 19 | void time_enter_mode(void) |
kenjiArai | 0:c0e0a185358d | 20 | { |
kenjiArai | 0:c0e0a185358d | 21 | char *ptr; |
kenjiArai | 0:c0e0a185358d | 22 | char linebuf[64]; |
kenjiArai | 0:c0e0a185358d | 23 | |
kenjiArai | 0:c0e0a185358d | 24 | pc.printf("\r\nSet time into RTC\r\n"); |
kenjiArai | 1:271991ff8004 | 25 | pc.printf(" e.g. >19 6 29 10 11 12 -> June 29th,'19, 10:11:12\r\n"); |
kenjiArai | 0:c0e0a185358d | 26 | pc.printf(" If time is fine, just hit enter\r\n"); |
kenjiArai | 0:c0e0a185358d | 27 | pc.putc('>'); |
kenjiArai | 0:c0e0a185358d | 28 | ptr = linebuf; |
kenjiArai | 0:c0e0a185358d | 29 | get_line(ptr, sizeof(linebuf)); |
kenjiArai | 0:c0e0a185358d | 30 | pc.printf("\r"); |
kenjiArai | 0:c0e0a185358d | 31 | chk_and_set_time(ptr); |
kenjiArai | 0:c0e0a185358d | 32 | } |
kenjiArai | 0:c0e0a185358d | 33 | |
kenjiArai | 0:c0e0a185358d | 34 | static void get_line (char *buff, int len) |
kenjiArai | 0:c0e0a185358d | 35 | { |
kenjiArai | 0:c0e0a185358d | 36 | char c; |
kenjiArai | 0:c0e0a185358d | 37 | uint32_t idx = 0; |
kenjiArai | 0:c0e0a185358d | 38 | |
kenjiArai | 0:c0e0a185358d | 39 | while(true) { |
kenjiArai | 0:c0e0a185358d | 40 | c = pc.getc(); |
kenjiArai | 0:c0e0a185358d | 41 | if (c == '\r') { |
kenjiArai | 0:c0e0a185358d | 42 | buff[idx++] = c; |
kenjiArai | 0:c0e0a185358d | 43 | break; |
kenjiArai | 0:c0e0a185358d | 44 | } |
kenjiArai | 0:c0e0a185358d | 45 | if ((c == '\b') && idx) { |
kenjiArai | 0:c0e0a185358d | 46 | idx--; |
kenjiArai | 0:c0e0a185358d | 47 | pc.putc(c); |
kenjiArai | 0:c0e0a185358d | 48 | pc.putc(' '); |
kenjiArai | 0:c0e0a185358d | 49 | pc.putc(c); |
kenjiArai | 0:c0e0a185358d | 50 | } |
kenjiArai | 0:c0e0a185358d | 51 | if (((uint8_t)c >= ' ') && (idx < len - 1)) { |
kenjiArai | 0:c0e0a185358d | 52 | buff[idx++] = c; |
kenjiArai | 0:c0e0a185358d | 53 | pc.putc(c); |
kenjiArai | 0:c0e0a185358d | 54 | } |
kenjiArai | 0:c0e0a185358d | 55 | } |
kenjiArai | 0:c0e0a185358d | 56 | buff[idx] = 0; |
kenjiArai | 0:c0e0a185358d | 57 | pc.puts("\r\n"); |
kenjiArai | 0:c0e0a185358d | 58 | } |
kenjiArai | 0:c0e0a185358d | 59 | |
kenjiArai | 0:c0e0a185358d | 60 | static void chk_and_set_time(char *ptr) |
kenjiArai | 0:c0e0a185358d | 61 | { |
kenjiArai | 0:c0e0a185358d | 62 | int32_t p1; |
kenjiArai | 0:c0e0a185358d | 63 | struct tm t; |
kenjiArai | 0:c0e0a185358d | 64 | time_t seconds; |
kenjiArai | 0:c0e0a185358d | 65 | |
kenjiArai | 0:c0e0a185358d | 66 | if (xatoi(&ptr, &p1)) { |
kenjiArai | 0:c0e0a185358d | 67 | t.tm_year = (uint8_t)p1 + 100; |
kenjiArai | 0:c0e0a185358d | 68 | pc.printf("Year:%d ",p1); |
kenjiArai | 0:c0e0a185358d | 69 | xatoi( &ptr, &p1 ); |
kenjiArai | 0:c0e0a185358d | 70 | t.tm_mon = (uint8_t)p1 - 1; |
kenjiArai | 0:c0e0a185358d | 71 | pc.printf("Month:%d ",p1); |
kenjiArai | 0:c0e0a185358d | 72 | xatoi( &ptr, &p1 ); |
kenjiArai | 0:c0e0a185358d | 73 | t.tm_mday = (uint8_t)p1; |
kenjiArai | 0:c0e0a185358d | 74 | pc.printf("Day:%d ",p1); |
kenjiArai | 0:c0e0a185358d | 75 | xatoi( &ptr, &p1 ); |
kenjiArai | 0:c0e0a185358d | 76 | t.tm_hour = (uint8_t)p1; |
kenjiArai | 0:c0e0a185358d | 77 | pc.printf("Hour:%d ",p1); |
kenjiArai | 0:c0e0a185358d | 78 | xatoi( &ptr, &p1 ); |
kenjiArai | 0:c0e0a185358d | 79 | t.tm_min = (uint8_t)p1; |
kenjiArai | 0:c0e0a185358d | 80 | pc.printf("Min:%d ",p1); |
kenjiArai | 0:c0e0a185358d | 81 | xatoi( &ptr, &p1 ); |
kenjiArai | 0:c0e0a185358d | 82 | t.tm_sec = (uint8_t)p1; |
kenjiArai | 0:c0e0a185358d | 83 | pc.printf("Sec: %d \r\n",p1); |
kenjiArai | 0:c0e0a185358d | 84 | } else { |
kenjiArai | 0:c0e0a185358d | 85 | return; |
kenjiArai | 0:c0e0a185358d | 86 | } |
kenjiArai | 0:c0e0a185358d | 87 | seconds = mktime(&t); |
kenjiArai | 0:c0e0a185358d | 88 | set_time(seconds); |
kenjiArai | 0:c0e0a185358d | 89 | pc.printf( |
kenjiArai | 0:c0e0a185358d | 90 | "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n", |
kenjiArai | 0:c0e0a185358d | 91 | t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec |
kenjiArai | 0:c0e0a185358d | 92 | ); |
kenjiArai | 0:c0e0a185358d | 93 | } |
kenjiArai | 0:c0e0a185358d | 94 | |
kenjiArai | 0:c0e0a185358d | 95 | static int32_t xatoi (char **str, int32_t *res) |
kenjiArai | 0:c0e0a185358d | 96 | { |
kenjiArai | 0:c0e0a185358d | 97 | int32_t val; |
kenjiArai | 0:c0e0a185358d | 98 | uint8_t c, radix, s = 0; |
kenjiArai | 0:c0e0a185358d | 99 | |
kenjiArai | 0:c0e0a185358d | 100 | while ((c = **str) == ' ') { |
kenjiArai | 0:c0e0a185358d | 101 | (*str)++; |
kenjiArai | 0:c0e0a185358d | 102 | } |
kenjiArai | 0:c0e0a185358d | 103 | if (c == '-') { |
kenjiArai | 0:c0e0a185358d | 104 | s = 1; |
kenjiArai | 0:c0e0a185358d | 105 | c = *(++(*str)); |
kenjiArai | 0:c0e0a185358d | 106 | } |
kenjiArai | 0:c0e0a185358d | 107 | if (c == '0') { |
kenjiArai | 0:c0e0a185358d | 108 | c = *(++(*str)); |
kenjiArai | 0:c0e0a185358d | 109 | if (c <= ' ') { |
kenjiArai | 0:c0e0a185358d | 110 | *res = 0; |
kenjiArai | 0:c0e0a185358d | 111 | return 1; |
kenjiArai | 0:c0e0a185358d | 112 | } |
kenjiArai | 0:c0e0a185358d | 113 | if (c == 'x') { |
kenjiArai | 0:c0e0a185358d | 114 | radix = 16; |
kenjiArai | 0:c0e0a185358d | 115 | c = *(++(*str)); |
kenjiArai | 0:c0e0a185358d | 116 | } else { |
kenjiArai | 0:c0e0a185358d | 117 | if (c == 'b') { |
kenjiArai | 0:c0e0a185358d | 118 | radix = 2; |
kenjiArai | 0:c0e0a185358d | 119 | c = *(++(*str)); |
kenjiArai | 0:c0e0a185358d | 120 | } else { |
kenjiArai | 0:c0e0a185358d | 121 | if ((c >= '0')&&(c <= '9')) { |
kenjiArai | 0:c0e0a185358d | 122 | radix = 8; |
kenjiArai | 0:c0e0a185358d | 123 | } else { |
kenjiArai | 0:c0e0a185358d | 124 | return 0; |
kenjiArai | 0:c0e0a185358d | 125 | } |
kenjiArai | 0:c0e0a185358d | 126 | } |
kenjiArai | 0:c0e0a185358d | 127 | } |
kenjiArai | 0:c0e0a185358d | 128 | } else { |
kenjiArai | 0:c0e0a185358d | 129 | if ((c < '1')||(c > '9')) { |
kenjiArai | 0:c0e0a185358d | 130 | return 0; |
kenjiArai | 0:c0e0a185358d | 131 | } |
kenjiArai | 0:c0e0a185358d | 132 | radix = 10; |
kenjiArai | 0:c0e0a185358d | 133 | } |
kenjiArai | 0:c0e0a185358d | 134 | val = 0; |
kenjiArai | 0:c0e0a185358d | 135 | while (c > ' ') { |
kenjiArai | 0:c0e0a185358d | 136 | if (c >= 'a') { |
kenjiArai | 0:c0e0a185358d | 137 | c -= 0x20; |
kenjiArai | 0:c0e0a185358d | 138 | } |
kenjiArai | 0:c0e0a185358d | 139 | c -= '0'; |
kenjiArai | 0:c0e0a185358d | 140 | if (c >= 17) { |
kenjiArai | 0:c0e0a185358d | 141 | c -= 7; |
kenjiArai | 0:c0e0a185358d | 142 | if (c <= 9) { |
kenjiArai | 0:c0e0a185358d | 143 | return 0; |
kenjiArai | 0:c0e0a185358d | 144 | } |
kenjiArai | 0:c0e0a185358d | 145 | } |
kenjiArai | 0:c0e0a185358d | 146 | if (c >= radix) { |
kenjiArai | 0:c0e0a185358d | 147 | return 0; |
kenjiArai | 0:c0e0a185358d | 148 | } |
kenjiArai | 0:c0e0a185358d | 149 | val = val * radix + c; |
kenjiArai | 0:c0e0a185358d | 150 | c = *(++(*str)); |
kenjiArai | 0:c0e0a185358d | 151 | } |
kenjiArai | 0:c0e0a185358d | 152 | if (s) { |
kenjiArai | 0:c0e0a185358d | 153 | val = -val; |
kenjiArai | 0:c0e0a185358d | 154 | } |
kenjiArai | 0:c0e0a185358d | 155 | *res = val; |
kenjiArai | 0:c0e0a185358d | 156 | return 1; |
kenjiArai | 0:c0e0a185358d | 157 | } |