Satoshi Togawa / Mbed 2 deprecated LcdClock

Dependencies:   DebouncedEdgeIn I2cLCD_cursor Rtc8564 mbed beep

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Clock.cpp Source File

Clock.cpp

00001 #include "Clock.h"
00002 
00003 using Model::Clock;
00004 
00005 Clock::Clock(I_NotifyUpdate* notifyUpdate, I_SetPresentTime* setPresentTime)
00006     :m_notifyUpdate(notifyUpdate),
00007      m_setPresentTime(setPresentTime),
00008      m_mode(CLOCK)
00009 {
00010 }
00011 
00012 void Clock::addSetMode(I_SetMode* setMode)
00013 {
00014     m_setModes.push_back(setMode);
00015 }
00016 
00017 void Clock::initialize()
00018 {
00019     m_dateTime.tm_year   = 100; // 2000-01-01
00020     m_dateTime.tm_mon    = 0;
00021     m_dateTime.tm_mday   = 1;
00022     m_dateTime.tm_wday   = 6; // Saturday
00023     m_dateTime.tm_hour   = 0; // 00:00:00
00024     m_dateTime.tm_min    = 0;
00025     m_dateTime.tm_sec    = 0;
00026     m_dateTime.tm_isdst  = -1;
00027 }
00028 
00029 void Clock::renew()
00030 {
00031     if(m_mode != CLOCK) return;
00032 
00033     m_notifyUpdate->dateTimeUpdated();
00034 }
00035 
00036 struct tm* Clock::getDateTime() {
00037     return &m_dateTime;
00038 }
00039 
00040 void Clock::requestModeChange()
00041 {
00042     switch(m_mode) {
00043         case CLOCK:
00044             m_mode = SET_YEAR;
00045             break;
00046         case SET_YEAR:
00047             m_mode = SET_MONTH;
00048             break;
00049         case SET_MONTH:
00050             m_mode = SET_DAY;
00051             break;
00052         case SET_DAY:
00053             m_mode = SET_HOUR;
00054             break;
00055         case SET_HOUR:
00056             m_mode = SET_MINUTE;
00057             break;
00058         case SET_MINUTE:
00059             m_mode = SET_SECOND;
00060             break;
00061         case SET_SECOND:
00062             m_mode = CLOCK;
00063             m_setPresentTime->setPresentTime();
00064             break;
00065         default:
00066             break;
00067     }
00068     notifyMode();
00069 }
00070 
00071 void Clock::requestIncrementValue()
00072 {
00073     switch(m_mode) {
00074         case SET_YEAR:
00075             m_dateTime.tm_year++;
00076             if(m_dateTime.tm_year >= 200) {
00077                 m_dateTime.tm_year = 100;
00078             }
00079             decideDayOfMonth();
00080             decideDayOfWeek();
00081             m_notifyUpdate->dateTimeUpdated();
00082             break;
00083         case SET_MONTH:
00084             m_dateTime.tm_mon++;
00085             if(m_dateTime.tm_mon >= 12) {
00086                 m_dateTime.tm_mon = 0;
00087             }
00088             decideDayOfMonth();
00089             decideDayOfWeek();
00090             m_notifyUpdate->dateTimeUpdated();
00091             break;
00092         case SET_DAY:
00093             m_dateTime.tm_mday++;
00094             if(m_dateTime.tm_mday > getDays()) {
00095                 m_dateTime.tm_mday = 1;
00096             }
00097             decideDayOfWeek();
00098             m_notifyUpdate->dateTimeUpdated();
00099             break;
00100         case SET_HOUR:
00101             m_dateTime.tm_hour++;
00102             if(m_dateTime.tm_hour >= 24) {
00103                 m_dateTime.tm_hour = 0;
00104             }
00105             m_notifyUpdate->dateTimeUpdated();
00106             break;
00107         case SET_MINUTE:
00108             m_dateTime.tm_min++;
00109             if(m_dateTime.tm_min >= 60) {
00110                 m_dateTime.tm_min = 0;
00111             }
00112             m_notifyUpdate->dateTimeUpdated();
00113             break;
00114         case SET_SECOND:
00115             m_dateTime.tm_sec++;
00116             if(m_dateTime.tm_sec >= 60) {
00117                 m_dateTime.tm_sec = 0;
00118             }
00119             m_notifyUpdate->dateTimeUpdated();
00120             break;
00121         default:
00122             break;
00123     }
00124 }
00125 
00126 void Clock::requestDecrementValue()
00127 {
00128     switch(m_mode) {
00129         case SET_YEAR:
00130             if(m_dateTime.tm_year <= 100) {
00131                 m_dateTime.tm_year = 200;
00132             }
00133             m_dateTime.tm_year--;
00134             decideDayOfMonth();
00135             decideDayOfWeek();
00136             m_notifyUpdate->dateTimeUpdated();
00137             break;
00138         case SET_MONTH:
00139             if(m_dateTime.tm_mon < 0) {
00140                 m_dateTime.tm_mon = 12;
00141             }
00142             m_dateTime.tm_mon--;
00143             decideDayOfMonth();
00144             decideDayOfWeek();
00145             m_notifyUpdate->dateTimeUpdated();
00146             break;
00147         case SET_DAY:
00148             if(m_dateTime.tm_mday <= 1) {
00149                 m_dateTime.tm_mday = getDays() + 1;
00150             }
00151             m_dateTime.tm_mday--;
00152             decideDayOfWeek();
00153             m_notifyUpdate->dateTimeUpdated();
00154             break;
00155         case SET_HOUR:
00156             if(m_dateTime.tm_hour <= 0) {
00157                 m_dateTime.tm_hour = 24;
00158             }
00159             m_dateTime.tm_hour--;
00160             m_notifyUpdate->dateTimeUpdated();
00161             break;
00162         case SET_MINUTE:
00163             if(m_dateTime.tm_min <= 0) {
00164                 m_dateTime.tm_min = 60;
00165             }
00166             m_dateTime.tm_min--;
00167             m_notifyUpdate->dateTimeUpdated();
00168             break;
00169         case SET_SECOND:
00170             if(m_dateTime.tm_sec <= 0) {
00171                 m_dateTime.tm_sec = 60;
00172             }
00173             m_dateTime.tm_sec--;
00174             m_notifyUpdate->dateTimeUpdated();
00175             break;
00176         default:
00177             break;
00178     }
00179 }
00180 
00181 void Clock::notifyMode()
00182 {
00183     for(std::vector<I_SetMode*>::iterator it = m_setModes.begin(); it != m_setModes.end(); ++it) {
00184         (*it)->mode(m_mode);
00185     }
00186 }
00187 
00188 int Clock::getDays()
00189 {
00190     const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
00191     int year = m_dateTime.tm_year + 1900;
00192     int month = m_dateTime.tm_mon + 1;
00193 
00194     int lastd = days[month - 1];
00195     if( month == 2 ) {
00196         if( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 )
00197             lastd = 29;
00198     }
00199     return lastd;
00200 }
00201 
00202 void Clock::decideDayOfMonth()
00203 {
00204     if(m_dateTime.tm_mday > getDays()) {
00205         m_dateTime.tm_mday = getDays();
00206     }
00207 }
00208 
00209 void Clock::decideDayOfWeek()
00210 {
00211     if (mktime(&m_dateTime) == (time_t)(-1)) {
00212         m_dateTime.tm_wday = 7;
00213     }
00214     return;
00215 }