Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DebouncedEdgeIn I2cLCD_cursor Rtc8564 mbed beep
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 }
Generated on Wed Jul 13 2022 02:25:45 by
1.7.2