Network clock using 7 segment.

Dependencies:   SNTPClient WIZnetInterface mbed

Fork of mbed_blinky by Mbed

main.cpp

Committer:
nanjsk
Date:
2016-03-02
Revision:
12:e60d3d6f24e8
Parent:
11:8a1ab8deea2b

File content as of revision 12:e60d3d6f24e8:

#include "mbed.h"
#include "segment.h"
#include "EthernetInterface.h"
#include "SNTPClient.h"

Serial pc(USBTX,USBRX);
EthernetInterface eth;
datetime ntptime;

InterruptIn SW1(PA_15);
DigitalOut ledR(LED1);
DigitalOut ledG(LED2);
DigitalOut ledB(LED3);

struct tm timeinfo;

uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x11, 0x22, 0xab};
uint8_t display_mode = 0;
uint8_t update_mode = 0;


void SW1_Interrupt(){
    ledG=!ledG;
    display_mode = display_mode + 1;
    if(display_mode == 2)    display_mode = 0;
    pc.printf("Display Mode : %d\n\r",display_mode);
}

void SNTP_Connect() {
    printf("Getting time information by using NTP...\r\n");
    
    SNTPClient sntp("time.nist.gov", 40);   // timezone: Korea, Republic of
    sntp.connect();
    if(sntp.getTime(&ntptime) == true) {
          printf("%d-%d-%d, %02d:%02d:%02d\r\n", ntptime.yy, ntptime.mo, ntptime.dd, ntptime.hh, ntptime.mm, ntptime.ss);
          printf("Completed Get and Set Time\r\n\r\n");
          ledR = 0;
    }
    else {
        while(sntp.getTime(&ntptime) == true) {
            printf("%d-%d-%d, %02d:%02d:%02d\r\n", ntptime.yy, ntptime.mo, ntptime.dd, ntptime.hh, ntptime.mm, ntptime.ss);
            printf("Completed Get and Set Time\r\n\r\n");
            ledR = 0;
            break;
        }
    }
}
void time_set() {
    timeinfo.tm_mon = ntptime.mo-1;
    timeinfo.tm_mday = ntptime.dd;
    timeinfo.tm_hour = ntptime.hh;
    timeinfo.tm_min = ntptime.mm;
    timeinfo.tm_sec = ntptime.ss;
    timeinfo.tm_year = ntptime.yy-1900;
    time_t t =mktime(&timeinfo);
    set_time(t);
    t = time(NULL);
}

void time_update(char buffer[]) {
    uint8_t h_buffer = ((buffer[0]-48)*10) + (buffer[1]-48);
    uint8_t m_buffer = ((buffer[2]-48)*10) + (buffer[3]-48);
    uint8_t s_buffer = ((buffer[4]-48)*10) + (buffer[5]-48);
    uint8_t time_update[3] = {10, 17, 00};   //Hour,Minute,Second

    if(update_mode == 0){
        if(h_buffer == time_update[0] && m_buffer == time_update[1] && s_buffer == time_update[2]){
            SNTP_Connect();
            time_set();
            update_mode = 1;
            printf("Time Update Completed.\n\r\n\r");
        }
    }
    else if(update_mode == 1){
        if(!(h_buffer == time_update[0] && m_buffer == time_update[1] && s_buffer == time_update[2])){
            update_mode = 0;
        }
    }
}

int main() {    
    pc.baud(115200);
    wait(0.1);
    printf("\n\rHello WIZwiki-W7500!\n\r");
    printf("===========================================\n\r");
    ledR = ledG = ledB = 1;
    
    Seg_Reset();
    SW1.fall(&SW1_Interrupt);
    
    eth.init(mac_addr); //Use DHCP
    printf("Check Ethernet Link\r\n");
    while(1) //Wait link up
    {
        if(eth.link() == true) 
            break;
    }
    printf("Link up\r\n");
    eth.connect();
    printf("My IP Address is %s\r\n", eth.getIPAddress());
    
    SNTP_Connect();
    time_set();
    //ymd_buffer[0]~[3] : Year
    //ymd_buffer[4]~[5] : Month
    //ymd_buffer[6]~[7] : Day
    char ymd_buffer[8];
    //hms_buffer[0]~[1] : Hour
    //hms_buffer[2]~[3] : Minute
    //hms_buffer[4]~[5] : Second
    char hms_buffer[6];
    
    while(1) {
        time_t seconds = time(NULL);
        
        strftime(hms_buffer, 6, "%H%M%S\n\r", localtime(&seconds));
        strftime(ymd_buffer, 8, "%Y%m%d%\n\r", localtime(&seconds));
        
        if(hms_buffer[4] == '0' && hms_buffer[5] == '0'){
            time_update(hms_buffer);
        }
        
        if(display_mode == 0) {
            display_hms(hms_buffer);
        }
        else if(display_mode == 1) {
            
            display_ymd(ymd_buffer);
        }
        else {
            display_hms(hms_buffer);
        }
    }
}