Zoltan Hudak
/
Clock_Hello
Demo for the Clock library (real time clock driven by a Ticker).
main.cpp@5:dee2286a6b76, 2019-01-15 (annotated)
- Committer:
- hudakz
- Date:
- Tue Jan 15 14:47:50 2019 +0000
- Revision:
- 5:dee2286a6b76
- Parent:
- 4:abbab29cf5c1
updated
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 0:81acb52fed21 | 1 | /** |
hudakz | 4:abbab29cf5c1 | 2 | * Demo for the Clock library <https://developer.mbed.org/users/hudakz/code/Clock/> |
hudakz | 5:dee2286a6b76 | 3 | * |
hudakz | 5:dee2286a6b76 | 4 | * Note: Software implemented Real Time Clock driven by a Ticker. |
hudakz | 2:0fcd1b86588b | 5 | * No external hardware (like DS1307 or DS3231 or etc.) is needed. |
hudakz | 5:dee2286a6b76 | 6 | * |
hudakz | 0:81acb52fed21 | 7 | */ |
hudakz | 5:dee2286a6b76 | 8 | |
hudakz | 0:81acb52fed21 | 9 | #include "mbed.h" |
hudakz | 0:81acb52fed21 | 10 | #include "Clock.h" |
hudakz | 0:81acb52fed21 | 11 | |
hudakz | 2:0fcd1b86588b | 12 | Serial pc(USBTX, USBRX); |
hudakz | 0:81acb52fed21 | 13 | |
hudakz | 0:81acb52fed21 | 14 | |
hudakz | 4:abbab29cf5c1 | 15 | Clock rtc; // Create an instance of Clock class (set to 00:00:00 January 1, 1970) |
hudakz | 0:81acb52fed21 | 16 | |
hudakz | 4:abbab29cf5c1 | 17 | // Create alarms as needed |
hudakz | 1:0e2956eaae94 | 18 | time_t alarm1 = Clock::asTime(2015, 3, 24, 11, 36, 15); // year, month (1 stands for Jan etc.), day of month, hour, minute, second |
hudakz | 5:dee2286a6b76 | 19 | time_t alarm2 = Clock::asTime(2015, 3, 24, 11, 37, 30); |
hudakz | 0:81acb52fed21 | 20 | |
hudakz | 1:0e2956eaae94 | 21 | volatile bool ticked = false; // tick flag |
hudakz | 0:81acb52fed21 | 22 | |
hudakz | 0:81acb52fed21 | 23 | /** |
hudakz | 5:dee2286a6b76 | 24 | * @brief Clock tick ISR - event handler (called once a second) |
hudakz | 1:0e2956eaae94 | 25 | * @note Keep it as short as possible. |
hudakz | 0:81acb52fed21 | 26 | * @param |
hudakz | 0:81acb52fed21 | 27 | * @retval |
hudakz | 0:81acb52fed21 | 28 | */ |
hudakz | 1:0e2956eaae94 | 29 | void onClockTick(void) { |
hudakz | 1:0e2956eaae94 | 30 | ticked = true; |
hudakz | 0:81acb52fed21 | 31 | } |
hudakz | 0:81acb52fed21 | 32 | |
hudakz | 3:0a77d653f8a6 | 33 | /** |
hudakz | 3:0a77d653f8a6 | 34 | * @brief Main |
hudakz | 5:dee2286a6b76 | 35 | * @note |
hudakz | 3:0a77d653f8a6 | 36 | * @param |
hudakz | 3:0a77d653f8a6 | 37 | * @retval |
hudakz | 3:0a77d653f8a6 | 38 | */ |
hudakz | 0:81acb52fed21 | 39 | int main() { |
hudakz | 5:dee2286a6b76 | 40 | time_t rawtime; |
hudakz | 5:dee2286a6b76 | 41 | struct tm* p_tm; |
hudakz | 0:81acb52fed21 | 42 | |
hudakz | 5:dee2286a6b76 | 43 | rtc.attach(onClockTick); // attach a handler function to the rtc's tick event |
hudakz | 5:dee2286a6b76 | 44 | |
hudakz | 0:81acb52fed21 | 45 | // |
hudakz | 1:0e2956eaae94 | 46 | // Set rtc for instance to 2015, March, 24th, 11 hours, 35 minutes, 45 seconds |
hudakz | 0:81acb52fed21 | 47 | // |
hudakz | 2:0fcd1b86588b | 48 | rtc.set(2015, 3, 24, 11, 35, 45); |
hudakz | 5:dee2286a6b76 | 49 | //rawtime = time(NULL); // if you like to call C library time function |
hudakz | 5:dee2286a6b76 | 50 | rawtime = rtc.time(); // if you like to call Clock function |
hudakz | 5:dee2286a6b76 | 51 | |
hudakz | 5:dee2286a6b76 | 52 | p_tm = gmtime(&rawtime); |
hudakz | 5:dee2286a6b76 | 53 | printf("Current time around the World:\r\n"); |
hudakz | 5:dee2286a6b76 | 54 | printf("Phoenix, AZ (U.S.) : %d:%d\r\n", (p_tm->tm_hour -7) % 24, p_tm->tm_min); |
hudakz | 5:dee2286a6b76 | 55 | printf("Reykjavik (Iceland) : %d:%d\r\n", (p_tm->tm_hour + 0) % 24, p_tm->tm_min); |
hudakz | 5:dee2286a6b76 | 56 | printf("Beijing (China) : %d:%d\r\n", (p_tm->tm_hour + 8) % 24, p_tm->tm_min); |
hudakz | 5:dee2286a6b76 | 57 | |
hudakz | 5:dee2286a6b76 | 58 | |
hudakz | 0:81acb52fed21 | 59 | |
hudakz | 0:81acb52fed21 | 60 | while (true) { |
hudakz | 1:0e2956eaae94 | 61 | if(ticked == true) { |
hudakz | 5:dee2286a6b76 | 62 | ticked = false; // clear the flag for next use in ISR |
hudakz | 5:dee2286a6b76 | 63 | |
hudakz | 5:dee2286a6b76 | 64 | // You draw clock hands on a graphical display |
hudakz | 5:dee2286a6b76 | 65 | // or update/refresh digital display or etc. |
hudakz | 2:0fcd1b86588b | 66 | // ... |
hudakz | 5:dee2286a6b76 | 67 | // In this demo we just display some info on the PC's serial terminal .. |
hudakz | 1:0e2956eaae94 | 68 | // |
hudakz | 5:dee2286a6b76 | 69 | pc.printf("==================================================\r\n"); |
hudakz | 5:dee2286a6b76 | 70 | //rawtime = time(NULL); // if you like you can call C library time function |
hudakz | 5:dee2286a6b76 | 71 | rawtime = rtc.time(); // or Clock's function |
hudakz | 5:dee2286a6b76 | 72 | pc.printf("Time as seconds since January 1, 1970 = %d\r\n", rawtime); |
hudakz | 5:dee2286a6b76 | 73 | pc.printf("Time as a basic string = %s", ctime(&rawtime)); |
hudakz | 5:dee2286a6b76 | 74 | |
hudakz | 1:0e2956eaae94 | 75 | // |
hudakz | 1:0e2956eaae94 | 76 | // Use custom format: |
hudakz | 1:0e2956eaae94 | 77 | // |
hudakz | 1:0e2956eaae94 | 78 | char buffer[32]; |
hudakz | 5:dee2286a6b76 | 79 | strftime(buffer, 32, "%I:%M %p", localtime(&rawtime)); |
hudakz | 5:dee2286a6b76 | 80 | pc.printf("Time as a custom formatted string = %s\r\n", buffer); |
hudakz | 5:dee2286a6b76 | 81 | |
hudakz | 1:0e2956eaae94 | 82 | // |
hudakz | 3:0a77d653f8a6 | 83 | // Create your own format: |
hudakz | 1:0e2956eaae94 | 84 | // |
hudakz | 5:dee2286a6b76 | 85 | pc.printf("Date: %.4d-%.2d-%.2d\r\n", rtc.year(), rtc.mon(), rtc.mday()); |
hudakz | 5:dee2286a6b76 | 86 | pc.printf("Time: %.2d:%.2d:%.2d\r\n", rtc.hour(), rtc.min(), rtc.sec()); |
hudakz | 1:0e2956eaae94 | 87 | |
hudakz | 5:dee2286a6b76 | 88 | pc.printf("------------------------------------\r\n"); |
hudakz | 5:dee2286a6b76 | 89 | |
hudakz | 1:0e2956eaae94 | 90 | // |
hudakz | 1:0e2956eaae94 | 91 | // Perform periodical tasks: |
hudakz | 1:0e2956eaae94 | 92 | // |
hudakz | 1:0e2956eaae94 | 93 | if(rtc.sec() % 10 == 0) { |
hudakz | 5:dee2286a6b76 | 94 | pc.printf("Called once a 10 seconds\r\n"); |
hudakz | 1:0e2956eaae94 | 95 | } |
hudakz | 5:dee2286a6b76 | 96 | |
hudakz | 1:0e2956eaae94 | 97 | if(rtc.sec() == 0) { |
hudakz | 5:dee2286a6b76 | 98 | pc.printf("Called once a minute.\r\n"); |
hudakz | 5:dee2286a6b76 | 99 | |
hudakz | 1:0e2956eaae94 | 100 | if(rtc.min() % 5 == 0) |
hudakz | 5:dee2286a6b76 | 101 | pc.printf("Called once a 5 minutes\r\n"); |
hudakz | 5:dee2286a6b76 | 102 | |
hudakz | 3:0a77d653f8a6 | 103 | if(rtc.min() == 0) { |
hudakz | 5:dee2286a6b76 | 104 | pc.printf("Called once an hour\r\n"); |
hudakz | 5:dee2286a6b76 | 105 | |
hudakz | 3:0a77d653f8a6 | 106 | if(rtc.hour() % 3 == 0) |
hudakz | 5:dee2286a6b76 | 107 | pc.printf("Called once a 3 hours\r\n"); |
hudakz | 5:dee2286a6b76 | 108 | |
hudakz | 3:0a77d653f8a6 | 109 | if(rtc.hour() == 0) { |
hudakz | 5:dee2286a6b76 | 110 | pc.printf("Called at midnight\r\n"); |
hudakz | 5:dee2286a6b76 | 111 | |
hudakz | 3:0a77d653f8a6 | 112 | if(rtc.wday() == 3) |
hudakz | 5:dee2286a6b76 | 113 | pc.printf("Called on Wednesday at midnight\r\n"); |
hudakz | 3:0a77d653f8a6 | 114 | } |
hudakz | 3:0a77d653f8a6 | 115 | } |
hudakz | 1:0e2956eaae94 | 116 | } |
hudakz | 5:dee2286a6b76 | 117 | |
hudakz | 1:0e2956eaae94 | 118 | // |
hudakz | 4:abbab29cf5c1 | 119 | // Trigger the alarms: |
hudakz | 1:0e2956eaae94 | 120 | // |
hudakz | 1:0e2956eaae94 | 121 | if(rtc.time() == alarm1) { |
hudakz | 5:dee2286a6b76 | 122 | pc.printf("Alarm1 triggered!\r\n"); |
hudakz | 1:0e2956eaae94 | 123 | } |
hudakz | 5:dee2286a6b76 | 124 | |
hudakz | 1:0e2956eaae94 | 125 | if(rtc.time() == alarm2) { |
hudakz | 5:dee2286a6b76 | 126 | pc.printf("Alarm2 triggered!\r\n"); |
hudakz | 1:0e2956eaae94 | 127 | } |
hudakz | 5:dee2286a6b76 | 128 | |
hudakz | 5:dee2286a6b76 | 129 | pc.printf("------------------------------------\r\n"); |
hudakz | 0:81acb52fed21 | 130 | } |
hudakz | 0:81acb52fed21 | 131 | } |
hudakz | 5:dee2286a6b76 | 132 | } |