Mbed Clock application using an NTP connection to get internet time and a terminal interface to send commands

Dependencies:   4DGL-uLCD-SE EthernetInterface NTPClient mbed-rtos mbed SDFileSystem wavfile

Committer:
dudanian
Date:
Tue Dec 09 16:28:38 2014 +0000
Revision:
6:23c3adb0470d
Parent:
2:c939d0501184
changed server to txt file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudanian 0:4e6ae21cbd31 1 #include "Clock.h"
dudanian 0:4e6ae21cbd31 2
dudanian 0:4e6ae21cbd31 3
dudanian 0:4e6ae21cbd31 4 Clock::Clock() : timezone(UTC) {
dudanian 2:c939d0501184 5 set_time(1388534400);
dudanian 2:c939d0501184 6 }
dudanian 2:c939d0501184 7
dudanian 2:c939d0501184 8 void Clock::setAlarmThread(Thread *aThread) {
dudanian 2:c939d0501184 9 alarmThread = aThread;
dudanian 0:4e6ae21cbd31 10 }
dudanian 0:4e6ae21cbd31 11
dudanian 0:4e6ae21cbd31 12 /**
dudanian 0:4e6ae21cbd31 13 * Sets the time and stores it in UTC time
dudanian 0:4e6ae21cbd31 14 */
dudanian 0:4e6ae21cbd31 15 void Clock::setTime(int hour, int minute, int period) {
dudanian 0:4e6ae21cbd31 16 time_t rawtime = time(NULL);
dudanian 0:4e6ae21cbd31 17 struct tm *timeinfo = localtime(&rawtime);
dudanian 0:4e6ae21cbd31 18 if (hour == 12)
dudanian 0:4e6ae21cbd31 19 hour = 0;
dudanian 0:4e6ae21cbd31 20 timeinfo->tm_hour = (((period == AM) ? hour : (hour + 12)) - timezone) % 24;
dudanian 0:4e6ae21cbd31 21 timeinfo->tm_min = minute;
dudanian 0:4e6ae21cbd31 22 timeinfo->tm_sec = 0;
dudanian 0:4e6ae21cbd31 23 set_time(mktime(timeinfo));
dudanian 0:4e6ae21cbd31 24 }
dudanian 0:4e6ae21cbd31 25
dudanian 0:4e6ae21cbd31 26 /**
dudanian 0:4e6ae21cbd31 27 * Sets the timezone. Since the time is stored in UTC, the system time
dudanian 0:4e6ae21cbd31 28 * is not modified
dudanian 0:4e6ae21cbd31 29 */
dudanian 0:4e6ae21cbd31 30 void Clock::setTimezone(int timezone) {
dudanian 0:4e6ae21cbd31 31
dudanian 0:4e6ae21cbd31 32 this->timezone = timezone;
dudanian 0:4e6ae21cbd31 33 }
dudanian 0:4e6ae21cbd31 34
dudanian 0:4e6ae21cbd31 35 /**
dudanian 0:4e6ae21cbd31 36 * Uses an NTP Client to set the time to UTC
dudanian 0:4e6ae21cbd31 37 */
dudanian 0:4e6ae21cbd31 38 int Clock::syncTime() {
dudanian 0:4e6ae21cbd31 39 NTPClient ntp;
dudanian 0:4e6ae21cbd31 40 return ntp.setTime("0.pool.ntp.org");
dudanian 0:4e6ae21cbd31 41 }
dudanian 0:4e6ae21cbd31 42
dudanian 2:c939d0501184 43 void Clock::setAlarm(int hour, int minute, int period) {
dudanian 2:c939d0501184 44 time_t currentTime = getTime();
dudanian 2:c939d0501184 45 struct tm *timeinfo = localtime(&currentTime);
dudanian 2:c939d0501184 46 if (hour == 12)
dudanian 2:c939d0501184 47 hour = 0;
dudanian 2:c939d0501184 48 hour = ((period == AM) ? hour : (hour + 12)) % 24;
dudanian 2:c939d0501184 49 if (hour <= timeinfo->tm_hour && minute <= timeinfo->tm_hour) {
dudanian 2:c939d0501184 50 (timeinfo->tm_mday)++;
dudanian 2:c939d0501184 51 }
dudanian 2:c939d0501184 52 timeinfo->tm_hour = hour;
dudanian 2:c939d0501184 53 timeinfo->tm_min = minute;
dudanian 2:c939d0501184 54 timeinfo->tm_sec = 0;
dudanian 2:c939d0501184 55 time_t alarmTime = mktime(timeinfo);
dudanian 2:c939d0501184 56 alarmTicker.attach(this, &Clock::signalAlarm, difftime(alarmTime, currentTime));
dudanian 2:c939d0501184 57 aSet = true;
dudanian 2:c939d0501184 58 }
dudanian 2:c939d0501184 59
dudanian 2:c939d0501184 60 bool Clock::alarmSet() {
dudanian 2:c939d0501184 61 return aSet;
dudanian 2:c939d0501184 62 }
dudanian 2:c939d0501184 63
dudanian 2:c939d0501184 64 void Clock::setTimer(int hours, int minutes) {
dudanian 2:c939d0501184 65 alarmTicker.attach(this, &Clock::signalAlarm, hours * 3600 + minutes * 60);
dudanian 2:c939d0501184 66 aSet = true;
dudanian 2:c939d0501184 67 }
dudanian 2:c939d0501184 68
dudanian 2:c939d0501184 69 void Clock::deleteAlarm() {
dudanian 2:c939d0501184 70 alarmTicker.detach();
dudanian 2:c939d0501184 71 aSet = false;
dudanian 2:c939d0501184 72 }
dudanian 2:c939d0501184 73
dudanian 0:4e6ae21cbd31 74 /**
dudanian 0:4e6ae21cbd31 75 * Gets the system time in UTC and converts it according to the given timezone
dudanian 0:4e6ae21cbd31 76 */
dudanian 0:4e6ae21cbd31 77 time_t Clock::getTime() {
dudanian 0:4e6ae21cbd31 78 time_t rawtime = time(NULL);
dudanian 0:4e6ae21cbd31 79 struct tm *timeinfo = localtime(&rawtime);
dudanian 0:4e6ae21cbd31 80 timeinfo->tm_hour = (timeinfo->tm_hour + timezone) % 24;
dudanian 0:4e6ae21cbd31 81 return mktime(timeinfo);
dudanian 0:4e6ae21cbd31 82 }
dudanian 0:4e6ae21cbd31 83
dudanian 0:4e6ae21cbd31 84 int Clock::getTimezone() {
dudanian 0:4e6ae21cbd31 85 return timezone;
dudanian 0:4e6ae21cbd31 86 }
dudanian 2:c939d0501184 87
dudanian 2:c939d0501184 88 void Clock::signalAlarm() {
dudanian 2:c939d0501184 89 alarmThread->signal_set(0x1);
dudanian 2:c939d0501184 90 alarmTicker.detach();
dudanian 2:c939d0501184 91 aSet = false;
dudanian 2:c939d0501184 92 }
dudanian 2:c939d0501184 93
dudanian 2:c939d0501184 94