Time adjustment and display. Adjustment via Com line and Display on LCD.

Dependencies:   mbed TextLCD CheckRTC

Committer:
kenjiArai
Date:
Fri Oct 03 10:58:59 2014 +0000
Revision:
2:0e3642d50dcc
Parent:
1:af3fc8a8eb57
Child:
3:aff4a05d7a03
added example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 1:af3fc8a8eb57 1 /*
kenjiArai 1:af3fc8a8eb57 2 * mbed Application program
kenjiArai 1:af3fc8a8eb57 3 *
kenjiArai 1:af3fc8a8eb57 4 * Copyright (c) 2010-2014 Kenji Arai / JH1PJL
kenjiArai 1:af3fc8a8eb57 5 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 1:af3fc8a8eb57 6 * http://mbed.org/users/kenjiArai/
kenjiArai 1:af3fc8a8eb57 7 * Created: March 27th, 2010
kenjiArai 1:af3fc8a8eb57 8 * Revised: October 3rd, 2014
kenjiArai 1:af3fc8a8eb57 9 *
kenjiArai 1:af3fc8a8eb57 10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 1:af3fc8a8eb57 11 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 1:af3fc8a8eb57 12 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 1:af3fc8a8eb57 13 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 1:af3fc8a8eb57 14 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 1:af3fc8a8eb57 15 */
kenjiArai 1:af3fc8a8eb57 16
kenjiArai 1:af3fc8a8eb57 17 // Include ---------------------------------------------------------------------------------------
kenjiArai 0:b3d6027d4ef2 18 #include "mbed.h"
kenjiArai 0:b3d6027d4ef2 19 #include "TextLCD.h"
kenjiArai 0:b3d6027d4ef2 20
kenjiArai 1:af3fc8a8eb57 21 // Object ----------------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 22 Serial pc(USBTX, USBRX);
kenjiArai 1:af3fc8a8eb57 23 DigitalOut myled1(LED1); // Assign LED1 output port
kenjiArai 1:af3fc8a8eb57 24 TextLCD lcd(p22, p21, p8, p7, p6, p5,TextLCD::LCD40x2); // rs, e, d4-d7
kenjiArai 1:af3fc8a8eb57 25
kenjiArai 1:af3fc8a8eb57 26 // RAM -------------------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 27
kenjiArai 1:af3fc8a8eb57 28 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 29
kenjiArai 1:af3fc8a8eb57 30 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 31
kenjiArai 1:af3fc8a8eb57 32 // Definition ------------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 33 #define BAUD(x) pc.baud(x)
kenjiArai 1:af3fc8a8eb57 34 #define GETC(x) pc.getc(x)
kenjiArai 1:af3fc8a8eb57 35 #define PUTC(x) pc.putc(x)
kenjiArai 1:af3fc8a8eb57 36 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 1:af3fc8a8eb57 37 #define READABLE(x) pc.readable(x)
kenjiArai 1:af3fc8a8eb57 38
kenjiArai 0:b3d6027d4ef2 39 //#define STYLE1
kenjiArai 0:b3d6027d4ef2 40 #define STYLE2
kenjiArai 1:af3fc8a8eb57 41 //#define STYLE_COM
kenjiArai 0:b3d6027d4ef2 42
kenjiArai 1:af3fc8a8eb57 43 //-------------------------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 44 // Control Program
kenjiArai 1:af3fc8a8eb57 45 //-------------------------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 46 // Put \r\n
kenjiArai 1:af3fc8a8eb57 47 void put_rn ( void )
kenjiArai 0:b3d6027d4ef2 48 {
kenjiArai 1:af3fc8a8eb57 49 PUTC('\r');
kenjiArai 1:af3fc8a8eb57 50 PUTC('\n');
kenjiArai 1:af3fc8a8eb57 51 }
kenjiArai 1:af3fc8a8eb57 52
kenjiArai 1:af3fc8a8eb57 53 // Put \r
kenjiArai 1:af3fc8a8eb57 54 void put_r ( void )
kenjiArai 1:af3fc8a8eb57 55 {
kenjiArai 1:af3fc8a8eb57 56 PUTC('\r');
kenjiArai 0:b3d6027d4ef2 57 }
kenjiArai 0:b3d6027d4ef2 58
kenjiArai 1:af3fc8a8eb57 59 // Change string -> number
kenjiArai 1:af3fc8a8eb57 60 int xatoi (char **str, int32_t *res)
kenjiArai 1:af3fc8a8eb57 61 {
kenjiArai 1:af3fc8a8eb57 62 unsigned long val;
kenjiArai 1:af3fc8a8eb57 63 unsigned char c, radix, s = 0;
kenjiArai 1:af3fc8a8eb57 64
kenjiArai 1:af3fc8a8eb57 65 while ((c = **str) == ' ') {
kenjiArai 1:af3fc8a8eb57 66 (*str)++;
kenjiArai 1:af3fc8a8eb57 67 }
kenjiArai 1:af3fc8a8eb57 68 if (c == '-') {
kenjiArai 1:af3fc8a8eb57 69 s = 1;
kenjiArai 1:af3fc8a8eb57 70 c = *(++(*str));
kenjiArai 1:af3fc8a8eb57 71 }
kenjiArai 1:af3fc8a8eb57 72 if (c == '0') {
kenjiArai 1:af3fc8a8eb57 73 c = *(++(*str));
kenjiArai 1:af3fc8a8eb57 74 if (c <= ' ') {
kenjiArai 1:af3fc8a8eb57 75 *res = 0;
kenjiArai 1:af3fc8a8eb57 76 return 1;
kenjiArai 1:af3fc8a8eb57 77 }
kenjiArai 1:af3fc8a8eb57 78 if (c == 'x') {
kenjiArai 1:af3fc8a8eb57 79 radix = 16;
kenjiArai 1:af3fc8a8eb57 80 c = *(++(*str));
kenjiArai 1:af3fc8a8eb57 81 } else {
kenjiArai 1:af3fc8a8eb57 82 if (c == 'b') {
kenjiArai 1:af3fc8a8eb57 83 radix = 2;
kenjiArai 1:af3fc8a8eb57 84 c = *(++(*str));
kenjiArai 1:af3fc8a8eb57 85 } else {
kenjiArai 1:af3fc8a8eb57 86 if ((c >= '0')&&(c <= '9')) {
kenjiArai 1:af3fc8a8eb57 87 radix = 8;
kenjiArai 1:af3fc8a8eb57 88 } else {
kenjiArai 1:af3fc8a8eb57 89 return 0;
kenjiArai 1:af3fc8a8eb57 90 }
kenjiArai 1:af3fc8a8eb57 91 }
kenjiArai 1:af3fc8a8eb57 92 }
kenjiArai 1:af3fc8a8eb57 93 } else {
kenjiArai 1:af3fc8a8eb57 94 if ((c < '1')||(c > '9')) {
kenjiArai 1:af3fc8a8eb57 95 return 0;
kenjiArai 1:af3fc8a8eb57 96 }
kenjiArai 1:af3fc8a8eb57 97 radix = 10;
kenjiArai 1:af3fc8a8eb57 98 }
kenjiArai 1:af3fc8a8eb57 99 val = 0;
kenjiArai 1:af3fc8a8eb57 100 while (c > ' ') {
kenjiArai 1:af3fc8a8eb57 101 if (c >= 'a') {
kenjiArai 1:af3fc8a8eb57 102 c -= 0x20;
kenjiArai 1:af3fc8a8eb57 103 }
kenjiArai 1:af3fc8a8eb57 104 c -= '0';
kenjiArai 1:af3fc8a8eb57 105 if (c >= 17) {
kenjiArai 1:af3fc8a8eb57 106 c -= 7;
kenjiArai 1:af3fc8a8eb57 107 if (c <= 9) {
kenjiArai 1:af3fc8a8eb57 108 return 0;
kenjiArai 1:af3fc8a8eb57 109 }
kenjiArai 1:af3fc8a8eb57 110 }
kenjiArai 1:af3fc8a8eb57 111 if (c >= radix) {
kenjiArai 1:af3fc8a8eb57 112 return 0;
kenjiArai 1:af3fc8a8eb57 113 }
kenjiArai 1:af3fc8a8eb57 114 val = val * radix + c;
kenjiArai 1:af3fc8a8eb57 115 c = *(++(*str));
kenjiArai 1:af3fc8a8eb57 116 }
kenjiArai 1:af3fc8a8eb57 117 if (s) {
kenjiArai 1:af3fc8a8eb57 118 val = -val;
kenjiArai 1:af3fc8a8eb57 119 }
kenjiArai 1:af3fc8a8eb57 120 *res = val;
kenjiArai 1:af3fc8a8eb57 121 return 1;
kenjiArai 1:af3fc8a8eb57 122 }
kenjiArai 1:af3fc8a8eb57 123
kenjiArai 1:af3fc8a8eb57 124 // Get key input data
kenjiArai 1:af3fc8a8eb57 125 void get_line (char *buff, int len)
kenjiArai 0:b3d6027d4ef2 126 {
kenjiArai 0:b3d6027d4ef2 127 char c;
kenjiArai 1:af3fc8a8eb57 128 int idx = 0;
kenjiArai 1:af3fc8a8eb57 129
kenjiArai 1:af3fc8a8eb57 130 for (;;) {
kenjiArai 1:af3fc8a8eb57 131 c = GETC();
kenjiArai 1:af3fc8a8eb57 132 if (c == '\r') {
kenjiArai 1:af3fc8a8eb57 133 buff[idx++] = c;
kenjiArai 1:af3fc8a8eb57 134 break;
kenjiArai 1:af3fc8a8eb57 135 }
kenjiArai 1:af3fc8a8eb57 136 if ((c == '\b') && idx) {
kenjiArai 1:af3fc8a8eb57 137 idx--;
kenjiArai 1:af3fc8a8eb57 138 PUTC(c);
kenjiArai 1:af3fc8a8eb57 139 PUTC(' ');
kenjiArai 1:af3fc8a8eb57 140 PUTC(c);
kenjiArai 1:af3fc8a8eb57 141 }
kenjiArai 1:af3fc8a8eb57 142 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 1:af3fc8a8eb57 143 buff[idx++] = c;
kenjiArai 1:af3fc8a8eb57 144 PUTC(c);
kenjiArai 1:af3fc8a8eb57 145 }
kenjiArai 1:af3fc8a8eb57 146 }
kenjiArai 1:af3fc8a8eb57 147 buff[idx] = 0;
kenjiArai 1:af3fc8a8eb57 148 PUTC('\n');
kenjiArai 0:b3d6027d4ef2 149 }
kenjiArai 0:b3d6027d4ef2 150
kenjiArai 1:af3fc8a8eb57 151 // RTC related subroutines
kenjiArai 1:af3fc8a8eb57 152 void chk_and_set_time(char *ptr)
kenjiArai 1:af3fc8a8eb57 153 {
kenjiArai 1:af3fc8a8eb57 154 int32_t p1;
kenjiArai 1:af3fc8a8eb57 155 struct tm t;
kenjiArai 1:af3fc8a8eb57 156 time_t seconds;
kenjiArai 1:af3fc8a8eb57 157 char buf[40];
kenjiArai 1:af3fc8a8eb57 158
kenjiArai 1:af3fc8a8eb57 159 if (xatoi(&ptr, &p1)) {
kenjiArai 1:af3fc8a8eb57 160 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 1:af3fc8a8eb57 161 PRINTF("Year:%d ",p1);
kenjiArai 1:af3fc8a8eb57 162 xatoi( &ptr, &p1 );
kenjiArai 1:af3fc8a8eb57 163 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 1:af3fc8a8eb57 164 PRINTF("Month:%d ",p1);
kenjiArai 1:af3fc8a8eb57 165 xatoi( &ptr, &p1 );
kenjiArai 1:af3fc8a8eb57 166 t.tm_mday = (uint8_t)p1;
kenjiArai 1:af3fc8a8eb57 167 PRINTF("Day:%d ",p1);
kenjiArai 1:af3fc8a8eb57 168 xatoi( &ptr, &p1 );
kenjiArai 1:af3fc8a8eb57 169 t.tm_hour = (uint8_t)p1;
kenjiArai 1:af3fc8a8eb57 170 PRINTF("Hour:%d ",p1);
kenjiArai 1:af3fc8a8eb57 171 xatoi( &ptr, &p1 );
kenjiArai 1:af3fc8a8eb57 172 t.tm_min = (uint8_t)p1;
kenjiArai 1:af3fc8a8eb57 173 PRINTF("Min:%d ",p1);
kenjiArai 1:af3fc8a8eb57 174 xatoi( &ptr, &p1 );
kenjiArai 1:af3fc8a8eb57 175 t.tm_sec = (uint8_t)p1;
kenjiArai 1:af3fc8a8eb57 176 PRINTF("Sec: %d",p1);
kenjiArai 1:af3fc8a8eb57 177 put_rn();
kenjiArai 1:af3fc8a8eb57 178 seconds = mktime(&t);
kenjiArai 1:af3fc8a8eb57 179 set_time(seconds);
kenjiArai 1:af3fc8a8eb57 180 }
kenjiArai 1:af3fc8a8eb57 181 seconds = time(NULL);
kenjiArai 1:af3fc8a8eb57 182 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 1:af3fc8a8eb57 183 PRINTF("Time: %s", buf);
kenjiArai 1:af3fc8a8eb57 184 put_rn();
kenjiArai 1:af3fc8a8eb57 185 }
kenjiArai 1:af3fc8a8eb57 186
kenjiArai 1:af3fc8a8eb57 187 // Help Massage
kenjiArai 1:af3fc8a8eb57 188 void msg_hlp (void)
kenjiArai 1:af3fc8a8eb57 189 {
kenjiArai 1:af3fc8a8eb57 190 PRINTF("t - Check and set RTC");
kenjiArai 1:af3fc8a8eb57 191 put_rn();
kenjiArai 1:af3fc8a8eb57 192 PRINTF("/ - Show time every second (Esc -> hit any key)");
kenjiArai 1:af3fc8a8eb57 193 put_rn();
kenjiArai 1:af3fc8a8eb57 194 PRINTF("? - Help");
kenjiArai 1:af3fc8a8eb57 195 put_rn();
kenjiArai 1:af3fc8a8eb57 196 }
kenjiArai 1:af3fc8a8eb57 197
kenjiArai 1:af3fc8a8eb57 198 int main()
kenjiArai 1:af3fc8a8eb57 199 {
kenjiArai 1:af3fc8a8eb57 200 char *ptr;
kenjiArai 1:af3fc8a8eb57 201 char linebuf[64];
kenjiArai 0:b3d6027d4ef2 202 char buf[40];
kenjiArai 0:b3d6027d4ef2 203 time_t seconds;
kenjiArai 0:b3d6027d4ef2 204
kenjiArai 0:b3d6027d4ef2 205 lcd.cls();
kenjiArai 0:b3d6027d4ef2 206 lcd.locate(0, 0);
kenjiArai 0:b3d6027d4ef2 207 lcd.locate(0, 0); // 1st line top
kenjiArai 1:af3fc8a8eb57 208 // 1234567890123456789012345678901234567890
kenjiArai 0:b3d6027d4ef2 209 lcd.printf(" Waiting for time adjustment via com ");
kenjiArai 1:af3fc8a8eb57 210 put_rn();
kenjiArai 1:af3fc8a8eb57 211 seconds = time(NULL);
kenjiArai 1:af3fc8a8eb57 212 PRINTF("Current time is");
kenjiArai 1:af3fc8a8eb57 213 put_rn();
kenjiArai 1:af3fc8a8eb57 214 #ifdef STYLE_COM
kenjiArai 1:af3fc8a8eb57 215 PRINTF("Time: %s", ctime(&seconds));
kenjiArai 1:af3fc8a8eb57 216 #else
kenjiArai 1:af3fc8a8eb57 217 strftime(buf,40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 1:af3fc8a8eb57 218 PRINTF("Time: %s", buf);
kenjiArai 1:af3fc8a8eb57 219 #endif
kenjiArai 1:af3fc8a8eb57 220 put_rn();
kenjiArai 1:af3fc8a8eb57 221 PRINTF("Is it correct time?");
kenjiArai 1:af3fc8a8eb57 222 put_rn();
kenjiArai 1:af3fc8a8eb57 223 PRINTF("YES -> please enter '/'");
kenjiArai 1:af3fc8a8eb57 224 put_rn();
kenjiArai 1:af3fc8a8eb57 225 PRINTF("NO -> please enter t yy mm dd hh mm ss <ret>");
kenjiArai 1:af3fc8a8eb57 226 put_rn();
kenjiArai 2:0e3642d50dcc 227 PRINTF("e.g. >t 14 10 3 20 5 15<ret>");
kenjiArai 2:0e3642d50dcc 228 put_rn();
kenjiArai 1:af3fc8a8eb57 229 for (;;) {
kenjiArai 1:af3fc8a8eb57 230 put_r();
kenjiArai 1:af3fc8a8eb57 231 PUTC('>');
kenjiArai 1:af3fc8a8eb57 232 ptr = linebuf;
kenjiArai 1:af3fc8a8eb57 233 get_line(ptr, sizeof(linebuf));
kenjiArai 1:af3fc8a8eb57 234 switch (*ptr++) {
kenjiArai 1:af3fc8a8eb57 235 //---------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 236 // check and set RTC
kenjiArai 1:af3fc8a8eb57 237 //---------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 238 case 't' :
kenjiArai 1:af3fc8a8eb57 239 put_r();
kenjiArai 1:af3fc8a8eb57 240 chk_and_set_time(ptr);
kenjiArai 1:af3fc8a8eb57 241 break;
kenjiArai 1:af3fc8a8eb57 242 //---------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 243 // check and set RTC
kenjiArai 1:af3fc8a8eb57 244 //---------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 245 case '/' :
kenjiArai 1:af3fc8a8eb57 246 put_r();
kenjiArai 1:af3fc8a8eb57 247 PRINTF("Current Time -> Plese see LCD also");
kenjiArai 1:af3fc8a8eb57 248 put_rn();
kenjiArai 1:af3fc8a8eb57 249 while (1) {
kenjiArai 1:af3fc8a8eb57 250 if (READABLE()) {
kenjiArai 1:af3fc8a8eb57 251 break;
kenjiArai 1:af3fc8a8eb57 252 }
kenjiArai 1:af3fc8a8eb57 253 while ( seconds == time(NULL)) ;
kenjiArai 1:af3fc8a8eb57 254 seconds = time(NULL);
kenjiArai 1:af3fc8a8eb57 255 myled1 = !myled1;
kenjiArai 1:af3fc8a8eb57 256 lcd.cls();
kenjiArai 1:af3fc8a8eb57 257 lcd.locate(0, 0); // 1st line top
kenjiArai 1:af3fc8a8eb57 258 lcd.printf("It is %d sec since Jan.1,1970\n", seconds);
kenjiArai 1:af3fc8a8eb57 259 lcd.locate(0, 1); // 2nd line top
kenjiArai 1:af3fc8a8eb57 260 #ifdef STYLE1
kenjiArai 1:af3fc8a8eb57 261 // 27 Mar 2010 13:24:00
kenjiArai 1:af3fc8a8eb57 262 strftime(buf,40, "%x %X ", localtime(&seconds));
kenjiArai 1:af3fc8a8eb57 263 #endif
kenjiArai 1:af3fc8a8eb57 264 #ifdef STYLE2
kenjiArai 1:af3fc8a8eb57 265 // 13:24:00 PM (2010/03/27)
kenjiArai 1:af3fc8a8eb57 266 strftime(buf,40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 1:af3fc8a8eb57 267 #endif
kenjiArai 1:af3fc8a8eb57 268 lcd.printf("Time = %s", buf);
kenjiArai 1:af3fc8a8eb57 269 #ifdef STYLE_COM
kenjiArai 1:af3fc8a8eb57 270 PRINTF("Time: %s", ctime(&seconds));
kenjiArai 1:af3fc8a8eb57 271 #else
kenjiArai 1:af3fc8a8eb57 272 PRINTF("Time: %s", buf);
kenjiArai 1:af3fc8a8eb57 273 #endif
kenjiArai 1:af3fc8a8eb57 274 put_rn();
kenjiArai 1:af3fc8a8eb57 275 }
kenjiArai 1:af3fc8a8eb57 276 break;
kenjiArai 1:af3fc8a8eb57 277 //---------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 278 // check and set RTC
kenjiArai 1:af3fc8a8eb57 279 //---------------------------------------------------------------------------------
kenjiArai 1:af3fc8a8eb57 280 case '?' :
kenjiArai 1:af3fc8a8eb57 281 default :
kenjiArai 1:af3fc8a8eb57 282 put_r();
kenjiArai 1:af3fc8a8eb57 283 msg_hlp();
kenjiArai 1:af3fc8a8eb57 284 break;
kenjiArai 0:b3d6027d4ef2 285 }
kenjiArai 0:b3d6027d4ef2 286 }
kenjiArai 0:b3d6027d4ef2 287 }