Simply Clock

Dependencies:   EthernetNetIf NTPClient_NetServices TextLCD mbed

main.cpp

Committer:
soramimi
Date:
2011-03-28
Revision:
1:7974d199ed39
Parent:
0:7e901efc73e7

File content as of revision 1:7974d199ed39:

#include "mbed.h"
#include "time.h"
#include "TextLCD.h"
#include "EthernetNetIf.h"
#include "NTPClient.h"

#define TIMEZONE (9 * 60 * 60)

TextLCD lcd(p21, p22, p23, p24, p25, p26);

EthernetNetIf eth;
NTPClient ntp;

unsigned long convert_gregorian_to_julian(int year, int month, int day)
{
    if (month < 3) {
        month += 9;
        year--;
    } else {
        month -= 3;
    }
    year += 4800;
    int c = year / 100;
    return c * 146097 / 4 + (year - c * 100) * 1461 / 4 + (153 * month + 2) / 5 + day - 32045;
}

void convert_julian_to_gregorian(unsigned long j, int *year, int *month, int *day)
{
    int y, m, d;
    y = (j * 4 + 128179) / 146097;
    d = (j * 4 - y * 146097 + 128179) / 4 * 4 + 3;
    j = d / 1461;
    d = (d - j * 1461) / 4 * 5 + 2;
    m = d / 153;
    d = (d - m * 153) / 5 + 1;
    y = (y - 48) * 100 + j;
    if (m < 10) {
        m += 3;
    } else {
        m -= 9;
        y++;
    }
    *year = y;
    *month = m;
    *day = d;
}

void display(int year, int month, int day, int hour, int minute, int second)
{
    lcd.cls();
    lcd.printf("%04u-%02u-%02u\n", year, month, day);
    lcd.printf("%02u:%02u:%02u\n", hour, minute, second);
}

int main()
{
    eth.setup();

    Host server(IpAddr(), 123, "ntp.jst.mfeed.ad.jp");

    bool adjust = true;

    double last = 0;

    while (1) {
        if (adjust) {
            ntp.setTime(server);
            adjust = false;
        } else {
            wait(0.1);
        }

        time_t t = time(0);
        double s = t + 2440588.0 * 24 * 60 * 60; // chronological julian second

        if (s > last) {
            last = s;

            s += TIMEZONE;

            unsigned long cjd = (unsigned long)(s / (24 * 60 * 60)); // chronological julian day
            int year, month, day, hour, minute, second;
            convert_julian_to_gregorian(cjd, &year, &month, &day);
            second = (int)fmod(s, 24 * 60 * 60);
            hour = second / (60 * 60);
            minute = second / 60 % 60;
            second %= 60;

            display(year, month, day, hour, minute, second);

            if (minute == 59 && second == 30) {
                adjust = true;
            }
        }
    }

    return 0;
}