Demo for the Clock library (real time clock driven by a Ticker).

Dependencies:   mbed Clock

main.cpp

Committer:
hudakz
Date:
2016-04-02
Revision:
4:abbab29cf5c1
Parent:
3:0a77d653f8a6
Child:
5:dee2286a6b76

File content as of revision 4:abbab29cf5c1:

/**
 * Demo for the Clock library <https://developer.mbed.org/users/hudakz/code/Clock/>
 * 
 * Note: Software implemented Real Time Clock driven by a Ticker. 
 *       No external hardware (like DS1307 or DS3231 or etc.) is needed.
 * 
 */
 
#include "mbed.h"
#include "Clock.h"

Serial pc(USBTX, USBRX);


Clock rtc;    // Create an instance of Clock class (set to 00:00:00 January 1, 1970)

// Create alarms as needed
time_t  alarm1 = Clock::asTime(2015, 3, 24, 11, 36, 15);  // year, month (1 stands for Jan etc.), day of month, hour, minute, second
time_t  alarm2 = Clock::asTime(2015, 3, 24, 11, 37, 30); 

volatile bool   ticked = false;  // tick flag

/**
 * @brief   Clock tick event handler (called once a second)
 * @note    Keep it as short as possible.
 * @param
 * @retval
 */
void onClockTick(void) {
    ticked = true;
}

/**
 * @brief   Main
 * @note    
 * @param
 * @retval
 */
int main() {
    rtc.attach(&onClockTick);  // attach a handler function to the rtc's tick event
    
    //
    // Set rtc for instance to 2015, March, 24th, 11 hours, 35 minutes, 45 seconds
    //
    rtc.set(2015, 3, 24, 11, 35, 45);

    while (true) {
        if(ticked == true) {
            ticked = false;  // clear the flag for next use
            
            // In your application you can
            // draw clock hands on a graphical display
            // or update digital display or etc.
            // ...
            // In this demo we just display some info on the connected PC's terminal ..
            //
            pc.printf("==================================================\n");
            //time_t time = time(NULL);   // you can call C library time function if you like
            time_t time = rtc.time();     // or Clock function
            pc.printf("Time as seconds since January 1, 1970 = %d\n", time);
            pc.printf("Time as a basic string = %s\n", ctime(&time));
        
            //
            // Use custom format:
            //
            char buffer[32];
            strftime(buffer, 32, "%I:%M %p", localtime(&time));
            pc.printf("Time as a custom formatted string = %s\n", buffer);
            
            //
            // Create your own format:
            //
            pc.printf("Date:  %.4d-%.2d-%.2d\n", rtc.year(), rtc.mon(), rtc.mday());
            pc.printf("Time:  %.2d:%.2d:%.2d\n", rtc.hour(), rtc.min(), rtc.sec());
            
            //
            // Perform periodical tasks:
            //
            if(rtc.sec() % 10 == 0) {
                pc.printf("Called once per 10 seconds\n");
            }
            
            if(rtc.sec() == 0) {
                pc.printf("Called once per minute.\n");
                
                if(rtc.min() % 5 == 0)
                    pc.printf("Called once per 5 minutes\n");
        
                if(rtc.min() == 0) {
                    pc.printf("\Called once per hour\n");
                    
                    if(rtc.hour() % 3 == 0)
                        pc.printf("Called once per 3 hours\n");
        
                    if(rtc.hour() == 0) {
                        pc.printf("Called at midnight\n");
                        
                        if(rtc.wday() == 3)
                            pc.printf("Called on Wednesday at midnight\n");
                    }
                }
            }
        
            //
            // Trigger the alarms:
            //
            if(rtc.time() == alarm1) {
                pc.printf("Alarm1 triggered!\n");
            }
        
            if(rtc.time() == alarm2) {
                pc.printf("Alarm2 triggered!\n");
            }
        }
    }
}