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
Clock.cpp@6:23c3adb0470d, 2014-12-09 (annotated)
- 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?
User | Revision | Line number | New 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(¤tTime); |
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 |