Clock with Real-Time Clock (RTC-8564) and I2C LCD module(SB1062B).
Dependencies: DebouncedEdgeIn I2cLCD_cursor Rtc8564 mbed beep
Model/Clock.cpp@3:061cccf4093a, 2014-02-22 (annotated)
- Committer:
- togayan
- Date:
- Sat Feb 22 09:24:27 2014 +0000
- Revision:
- 3:061cccf4093a
- Parent:
- 2:6f0158399eff
- Child:
- 4:75ed86b78045
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
togayan | 1:f8713c387a68 | 1 | #include "Clock.h" |
togayan | 1:f8713c387a68 | 2 | |
togayan | 1:f8713c387a68 | 3 | using Model::Clock; |
togayan | 1:f8713c387a68 | 4 | |
togayan | 1:f8713c387a68 | 5 | Clock::Clock(I_NotifyUpdate* notifyUpdate, I_SetPresentTime* setPresentTime) |
togayan | 1:f8713c387a68 | 6 | :m_notifyUpdate(notifyUpdate), |
togayan | 2:6f0158399eff | 7 | m_setPresentTime(setPresentTime), |
togayan | 2:6f0158399eff | 8 | m_mode(CLOCK) |
togayan | 1:f8713c387a68 | 9 | { |
togayan | 1:f8713c387a68 | 10 | } |
togayan | 1:f8713c387a68 | 11 | |
togayan | 3:061cccf4093a | 12 | void Clock::addSetMode(I_SetMode* setMode) |
togayan | 3:061cccf4093a | 13 | { |
togayan | 3:061cccf4093a | 14 | m_setModes.push_back(setMode); |
togayan | 3:061cccf4093a | 15 | } |
togayan | 3:061cccf4093a | 16 | |
togayan | 1:f8713c387a68 | 17 | void Clock::initialize() |
togayan | 1:f8713c387a68 | 18 | { |
togayan | 2:6f0158399eff | 19 | m_dateTime.tm_year = 100; // 2000-01-01 |
togayan | 2:6f0158399eff | 20 | m_dateTime.tm_mon = 0; |
togayan | 2:6f0158399eff | 21 | m_dateTime.tm_mday = 1; |
togayan | 2:6f0158399eff | 22 | m_dateTime.tm_wday = 6; // Saturday |
togayan | 2:6f0158399eff | 23 | m_dateTime.tm_hour = 0; // 00:00:00 |
togayan | 2:6f0158399eff | 24 | m_dateTime.tm_min = 0; |
togayan | 2:6f0158399eff | 25 | m_dateTime.tm_sec = 0; |
togayan | 2:6f0158399eff | 26 | m_dateTime.tm_isdst = -1; |
togayan | 1:f8713c387a68 | 27 | } |
togayan | 1:f8713c387a68 | 28 | |
togayan | 1:f8713c387a68 | 29 | void Clock::renew() |
togayan | 1:f8713c387a68 | 30 | { |
togayan | 2:6f0158399eff | 31 | if(m_mode != CLOCK) return; |
togayan | 2:6f0158399eff | 32 | |
togayan | 1:f8713c387a68 | 33 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 1:f8713c387a68 | 34 | } |
togayan | 1:f8713c387a68 | 35 | |
togayan | 2:6f0158399eff | 36 | struct tm* Clock::getDateTime() |
togayan | 1:f8713c387a68 | 37 | { |
togayan | 1:f8713c387a68 | 38 | return &m_dateTime; |
togayan | 1:f8713c387a68 | 39 | } |
togayan | 1:f8713c387a68 | 40 | |
togayan | 1:f8713c387a68 | 41 | void Clock::informHalfSec() |
togayan | 1:f8713c387a68 | 42 | { |
togayan | 1:f8713c387a68 | 43 | //m_i2clcd.clearicon( I2cLCD::Antenna ); |
togayan | 1:f8713c387a68 | 44 | } |
togayan | 2:6f0158399eff | 45 | |
togayan | 2:6f0158399eff | 46 | void Clock::requestModeChange() |
togayan | 2:6f0158399eff | 47 | { |
togayan | 2:6f0158399eff | 48 | switch(m_mode) { |
togayan | 2:6f0158399eff | 49 | case CLOCK: |
togayan | 2:6f0158399eff | 50 | m_mode = SET_YEAR; |
togayan | 2:6f0158399eff | 51 | break; |
togayan | 2:6f0158399eff | 52 | case SET_YEAR: |
togayan | 2:6f0158399eff | 53 | m_mode = SET_MONTH; |
togayan | 2:6f0158399eff | 54 | break; |
togayan | 2:6f0158399eff | 55 | case SET_MONTH: |
togayan | 2:6f0158399eff | 56 | m_mode = SET_DAY; |
togayan | 2:6f0158399eff | 57 | break; |
togayan | 2:6f0158399eff | 58 | case SET_DAY: |
togayan | 2:6f0158399eff | 59 | m_mode = SET_HOUR; |
togayan | 2:6f0158399eff | 60 | break; |
togayan | 2:6f0158399eff | 61 | case SET_HOUR: |
togayan | 2:6f0158399eff | 62 | m_mode = SET_MINUTE; |
togayan | 2:6f0158399eff | 63 | break; |
togayan | 2:6f0158399eff | 64 | case SET_MINUTE: |
togayan | 2:6f0158399eff | 65 | m_mode = SET_SECOND; |
togayan | 2:6f0158399eff | 66 | break; |
togayan | 2:6f0158399eff | 67 | case SET_SECOND: |
togayan | 2:6f0158399eff | 68 | m_mode = CLOCK; |
togayan | 2:6f0158399eff | 69 | m_setPresentTime->setPresentTime(); |
togayan | 2:6f0158399eff | 70 | break; |
togayan | 2:6f0158399eff | 71 | default: |
togayan | 2:6f0158399eff | 72 | break; |
togayan | 2:6f0158399eff | 73 | } |
togayan | 2:6f0158399eff | 74 | notifyMode(); |
togayan | 2:6f0158399eff | 75 | } |
togayan | 2:6f0158399eff | 76 | |
togayan | 2:6f0158399eff | 77 | void Clock::requestIncrementValue() |
togayan | 2:6f0158399eff | 78 | { |
togayan | 2:6f0158399eff | 79 | switch(m_mode) { |
togayan | 2:6f0158399eff | 80 | case SET_YEAR: |
togayan | 2:6f0158399eff | 81 | m_dateTime.tm_year++; |
togayan | 2:6f0158399eff | 82 | if(m_dateTime.tm_year >= 200) { |
togayan | 2:6f0158399eff | 83 | m_dateTime.tm_year = 100; |
togayan | 2:6f0158399eff | 84 | } |
togayan | 2:6f0158399eff | 85 | decideDayOfMonth(); |
togayan | 2:6f0158399eff | 86 | decideDayOfWeek(); |
togayan | 2:6f0158399eff | 87 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 88 | break; |
togayan | 2:6f0158399eff | 89 | case SET_MONTH: |
togayan | 2:6f0158399eff | 90 | m_dateTime.tm_mon++; |
togayan | 2:6f0158399eff | 91 | if(m_dateTime.tm_mon >= 12) { |
togayan | 2:6f0158399eff | 92 | m_dateTime.tm_mon = 0; |
togayan | 2:6f0158399eff | 93 | } |
togayan | 2:6f0158399eff | 94 | decideDayOfMonth(); |
togayan | 2:6f0158399eff | 95 | decideDayOfWeek(); |
togayan | 2:6f0158399eff | 96 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 97 | break; |
togayan | 2:6f0158399eff | 98 | case SET_DAY: |
togayan | 2:6f0158399eff | 99 | m_dateTime.tm_mday++; |
togayan | 2:6f0158399eff | 100 | if(m_dateTime.tm_mday > getDays()) { |
togayan | 2:6f0158399eff | 101 | m_dateTime.tm_mday = 1; |
togayan | 2:6f0158399eff | 102 | } |
togayan | 2:6f0158399eff | 103 | decideDayOfWeek(); |
togayan | 2:6f0158399eff | 104 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 105 | break; |
togayan | 2:6f0158399eff | 106 | case SET_HOUR: |
togayan | 2:6f0158399eff | 107 | m_dateTime.tm_hour++; |
togayan | 2:6f0158399eff | 108 | if(m_dateTime.tm_hour >= 24) { |
togayan | 2:6f0158399eff | 109 | m_dateTime.tm_hour = 0; |
togayan | 2:6f0158399eff | 110 | } |
togayan | 2:6f0158399eff | 111 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 112 | break; |
togayan | 2:6f0158399eff | 113 | case SET_MINUTE: |
togayan | 2:6f0158399eff | 114 | m_dateTime.tm_min++; |
togayan | 2:6f0158399eff | 115 | if(m_dateTime.tm_min >= 60) { |
togayan | 2:6f0158399eff | 116 | m_dateTime.tm_min = 0; |
togayan | 2:6f0158399eff | 117 | } |
togayan | 2:6f0158399eff | 118 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 119 | break; |
togayan | 2:6f0158399eff | 120 | case SET_SECOND: |
togayan | 2:6f0158399eff | 121 | m_dateTime.tm_sec++; |
togayan | 2:6f0158399eff | 122 | if(m_dateTime.tm_sec >= 60) { |
togayan | 2:6f0158399eff | 123 | m_dateTime.tm_sec = 0; |
togayan | 2:6f0158399eff | 124 | } |
togayan | 2:6f0158399eff | 125 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 126 | break; |
togayan | 2:6f0158399eff | 127 | default: |
togayan | 2:6f0158399eff | 128 | break; |
togayan | 2:6f0158399eff | 129 | } |
togayan | 2:6f0158399eff | 130 | } |
togayan | 2:6f0158399eff | 131 | |
togayan | 2:6f0158399eff | 132 | void Clock::requestDecrementValue() |
togayan | 2:6f0158399eff | 133 | { |
togayan | 2:6f0158399eff | 134 | switch(m_mode) { |
togayan | 2:6f0158399eff | 135 | case SET_YEAR: |
togayan | 2:6f0158399eff | 136 | if(m_dateTime.tm_year <= 100) { |
togayan | 2:6f0158399eff | 137 | m_dateTime.tm_year = 200; |
togayan | 2:6f0158399eff | 138 | } |
togayan | 2:6f0158399eff | 139 | m_dateTime.tm_year--; |
togayan | 2:6f0158399eff | 140 | decideDayOfMonth(); |
togayan | 2:6f0158399eff | 141 | decideDayOfWeek(); |
togayan | 2:6f0158399eff | 142 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 143 | break; |
togayan | 2:6f0158399eff | 144 | case SET_MONTH: |
togayan | 2:6f0158399eff | 145 | if(m_dateTime.tm_mon < 0) { |
togayan | 2:6f0158399eff | 146 | m_dateTime.tm_mon = 12; |
togayan | 2:6f0158399eff | 147 | } |
togayan | 2:6f0158399eff | 148 | m_dateTime.tm_mon--; |
togayan | 2:6f0158399eff | 149 | decideDayOfMonth(); |
togayan | 2:6f0158399eff | 150 | decideDayOfWeek(); |
togayan | 2:6f0158399eff | 151 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 152 | break; |
togayan | 2:6f0158399eff | 153 | case SET_DAY: |
togayan | 2:6f0158399eff | 154 | if(m_dateTime.tm_mday <= 1) { |
togayan | 2:6f0158399eff | 155 | m_dateTime.tm_mday = getDays() + 1; |
togayan | 2:6f0158399eff | 156 | } |
togayan | 2:6f0158399eff | 157 | m_dateTime.tm_mday--; |
togayan | 2:6f0158399eff | 158 | decideDayOfWeek(); |
togayan | 2:6f0158399eff | 159 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 160 | break; |
togayan | 2:6f0158399eff | 161 | case SET_HOUR: |
togayan | 2:6f0158399eff | 162 | if(m_dateTime.tm_hour <= 0) { |
togayan | 2:6f0158399eff | 163 | m_dateTime.tm_hour = 24; |
togayan | 2:6f0158399eff | 164 | } |
togayan | 2:6f0158399eff | 165 | m_dateTime.tm_hour--; |
togayan | 2:6f0158399eff | 166 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 167 | break; |
togayan | 2:6f0158399eff | 168 | case SET_MINUTE: |
togayan | 2:6f0158399eff | 169 | if(m_dateTime.tm_min <= 0) { |
togayan | 2:6f0158399eff | 170 | m_dateTime.tm_min = 60; |
togayan | 2:6f0158399eff | 171 | } |
togayan | 2:6f0158399eff | 172 | m_dateTime.tm_min--; |
togayan | 2:6f0158399eff | 173 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 174 | break; |
togayan | 2:6f0158399eff | 175 | case SET_SECOND: |
togayan | 2:6f0158399eff | 176 | if(m_dateTime.tm_sec <= 0) { |
togayan | 2:6f0158399eff | 177 | m_dateTime.tm_sec = 60; |
togayan | 2:6f0158399eff | 178 | } |
togayan | 2:6f0158399eff | 179 | m_dateTime.tm_sec--; |
togayan | 2:6f0158399eff | 180 | m_notifyUpdate->dateTimeUpdated(); |
togayan | 2:6f0158399eff | 181 | break; |
togayan | 2:6f0158399eff | 182 | default: |
togayan | 2:6f0158399eff | 183 | break; |
togayan | 2:6f0158399eff | 184 | } |
togayan | 2:6f0158399eff | 185 | } |
togayan | 2:6f0158399eff | 186 | |
togayan | 2:6f0158399eff | 187 | void Clock::notifyMode() |
togayan | 2:6f0158399eff | 188 | { |
togayan | 3:061cccf4093a | 189 | for(std::vector<I_SetMode*>::iterator it = m_setModes.begin(); it != m_setModes.end(); ++it) |
togayan | 3:061cccf4093a | 190 | { |
togayan | 3:061cccf4093a | 191 | (*it)->mode(m_mode); |
togayan | 3:061cccf4093a | 192 | } |
togayan | 2:6f0158399eff | 193 | } |
togayan | 2:6f0158399eff | 194 | |
togayan | 2:6f0158399eff | 195 | int Clock::getDays() |
togayan | 2:6f0158399eff | 196 | { |
togayan | 2:6f0158399eff | 197 | const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
togayan | 2:6f0158399eff | 198 | int year = m_dateTime.tm_year + 1900; |
togayan | 2:6f0158399eff | 199 | int month = m_dateTime.tm_mon + 1; |
togayan | 2:6f0158399eff | 200 | |
togayan | 2:6f0158399eff | 201 | int lastd = days[month - 1]; |
togayan | 2:6f0158399eff | 202 | if( month == 2 ) { |
togayan | 2:6f0158399eff | 203 | if( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ) |
togayan | 2:6f0158399eff | 204 | lastd = 29; // うるう年なら末日は29 |
togayan | 2:6f0158399eff | 205 | } |
togayan | 2:6f0158399eff | 206 | return lastd; |
togayan | 2:6f0158399eff | 207 | } |
togayan | 2:6f0158399eff | 208 | |
togayan | 2:6f0158399eff | 209 | void Clock::decideDayOfMonth() |
togayan | 2:6f0158399eff | 210 | { |
togayan | 2:6f0158399eff | 211 | if(m_dateTime.tm_mday > getDays()) |
togayan | 2:6f0158399eff | 212 | { |
togayan | 2:6f0158399eff | 213 | m_dateTime.tm_mday = getDays(); |
togayan | 2:6f0158399eff | 214 | } |
togayan | 2:6f0158399eff | 215 | } |
togayan | 2:6f0158399eff | 216 | |
togayan | 2:6f0158399eff | 217 | void Clock::decideDayOfWeek() |
togayan | 2:6f0158399eff | 218 | { |
togayan | 2:6f0158399eff | 219 | if (mktime(&m_dateTime) == (time_t)(-1)) { |
togayan | 2:6f0158399eff | 220 | m_dateTime.tm_wday = 7; |
togayan | 2:6f0158399eff | 221 | } |
togayan | 2:6f0158399eff | 222 | return; |
togayan | 2:6f0158399eff | 223 | } |