Simple example to set RTC interactively
Dependencies: mbed
Diff: main.cpp
- Revision:
- 0:d04730d28a80
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Jan 07 14:11:20 2016 +0000 @@ -0,0 +1,83 @@ +#include "mbed.h" +Serial pc(USBTX,USBRX); //UART0 via OpenSDA +DigitalOut myled(LED1); +Ticker myticker; +time_t mytime; +volatile uint8_t myflag =0; + +void processSerialCommand(); + +void setflag(void) +{ + myflag = 1; +} + +int main() +{ + + set_time(1451736661); + myticker.attach(&setflag,5); + while(1) { + if(pc.readable()) { + processSerialCommand(); + } + if(myflag) { + mytime = time(NULL); + pc.printf("RTC time: %s\r\n",ctime(&mytime)); + myflag = 0; + } + } +} + +void processSerialCommand() +{ + char c = pc.getc(); + switch(c) { + case 'T': + // Command to set RTC time + // Command format: TYYMMDDHHMMSS + // Example: 2012 Oct 21 1:23pm is T121021132300 + struct tm tme; + time_t newTime; + + // Parse incomming 12 ASCII charaters into time_t + // no error checking for numeric values in YYMDDHHMMSS fields, so be careful! + c = pc.getc(); + tme.tm_year = c - '0'; + c = pc.getc(); + tme.tm_year = 10*tme.tm_year; + tme.tm_year += c-'0'; + tme.tm_year += 100; //Years are counted from 1900! + c = pc.getc(); + tme.tm_mon = c - '0'; + c = pc.getc(); + tme.tm_mon = 10*tme.tm_mon; + tme.tm_mon += c-'0'-1; //corrected by -1 due to a stupid error + c = pc.getc(); + tme.tm_mday = c - '0'; + c = pc.getc(); + tme.tm_mday = 10*tme.tm_mday; + tme.tm_mday += c-'0'; + c = pc.getc(); + tme.tm_hour = c - '0'; + c = pc.getc(); + tme.tm_hour = 10*tme.tm_hour; + tme.tm_hour += c-'0'; + c = pc.getc(); + tme.tm_min = c - '0'; + c = pc.getc(); + tme.tm_min = 10*tme.tm_min; + tme.tm_min += c-'0'; + c = pc.getc(); + tme.tm_sec = c - '0'; + c = pc.getc(); + tme.tm_sec = 10*tme.tm_sec; + tme.tm_sec += c-'0'; + newTime = mktime(&tme); + set_time(newTime); + pc.printf("RTC set to: %s\r\n",ctime(&newTime)); + } + while(pc.readable()) { + pc.getc(); // clear serial buffer + } +}