|
20 | 20 | #include "PCF8563T.h" |
21 | 21 |
|
22 | 22 | #define PCF8563T_ADDRESS 0x51 |
| 23 | +#define PCF8563T_STATUS_2_REG 0X01 |
23 | 24 | #define PCF8563T_VL_SECONDS_REG 0X02 |
24 | 25 | #define PCF8563T_MINUTES_REG 0x03 |
25 | 26 | #define PCF8563T_HOURS_REG 0X04 |
26 | 27 | #define PCF8563T_DAYS_REG 0x05 |
27 | 28 | #define PCF8563T_MONTHS_REG 0x07 |
28 | 29 | #define PCF8563T_YEARS_REG 0x08 |
29 | 30 |
|
| 31 | +// allarm managemet |
| 32 | +#define PCF8563T_MINUTE_ALARM_REG 0x09 |
| 33 | +#define PCF8563T_MINUTE_ALARM_AE_M_MASK 0x80 |
| 34 | +#define PCF8563T_MINUTE_ALARM_ON 0x7F |
| 35 | + |
| 36 | +#define PCF8563T_HOUR_ALARM_REG 0x0A |
| 37 | +#define PCF8563T_HOUR_ALARM_AE_H_MASK 0x80 |
| 38 | +#define PCF8563T_HOUR_ALARM_ON 0x7F |
| 39 | + |
| 40 | +#define PCF8563T_DAY_ALARM_REG 0x0B |
| 41 | +#define PCF8563T_DAY_ALARM_AE_D_MASK 0x80 |
| 42 | +#define PCF8563T_DAY_ALARM_ON 0x7F |
| 43 | + |
| 44 | +#define PCF8563T_TIMER_CONTROL_REG 0X0E |
| 45 | +#define PCF8563T_TIMER_CONTROL_ON 0x80 |
| 46 | +#define PCF8563T_TIMER_CONTROL_OFF 0x7F |
| 47 | + |
| 48 | +#define PCF8563T_STATUS_2_AIE_MASK 0x02 |
| 49 | +#define PCF8563T_STATUS_2_CLEAR_INT 0xF7 |
| 50 | +#define PCF8563T_STATUS_2_INT_OFF 0x7d |
| 51 | + |
30 | 52 | PCF8563TClass::PCF8563TClass() |
31 | 53 | { |
32 | 54 | } |
@@ -114,6 +136,109 @@ uint8_t PCF8563TClass::getSeconds() { |
114 | 136 | return (seconds & 0x0F) + ((seconds >> 4)*10); |
115 | 137 | } |
116 | 138 |
|
| 139 | + |
| 140 | +void PCF8563TClass::setEpoch() { |
| 141 | + struct tm time; |
| 142 | + time.tm_sec = getSeconds(); |
| 143 | + time.tm_min = getMinutes(); |
| 144 | + time.tm_hour = getHours(); |
| 145 | + time.tm_mday = getDays(); |
| 146 | + time.tm_mon = getMonths() - 1; |
| 147 | + time.tm_year = getYears() + 100; |
| 148 | + time_t seconds; |
| 149 | + _rtc_maketime(&time, &seconds, RTC_FULL_LEAP_YEAR_SUPPORT); |
| 150 | + set_time(seconds); |
| 151 | +} |
| 152 | + |
| 153 | +void PCF8563TClass::setEpoch(time_t seconds) { |
| 154 | + struct tm time; |
| 155 | + _rtc_localtime(seconds, &time, RTC_FULL_LEAP_YEAR_SUPPORT); |
| 156 | + |
| 157 | + setSeconds(time.tm_sec); |
| 158 | + setMinutes(time.tm_min); |
| 159 | + setHours( time.tm_hour); |
| 160 | + setDays(time.tm_mday); |
| 161 | + setMonths(time.tm_mon + 1); |
| 162 | + setYears((time.tm_year - 100)); |
| 163 | + set_time(seconds); |
| 164 | +} |
| 165 | + |
| 166 | + |
| 167 | +void PCF8563TClass::setEpoch(uint8_t years, uint8_t months, uint8_t days, uint8_t hours, uint8_t minutes, uint8_t seconds) { |
| 168 | + struct tm time; |
| 169 | + time_t utcsec; |
| 170 | + |
| 171 | + time.tm_sec = seconds; |
| 172 | + time.tm_min = minutes; |
| 173 | + time.tm_hour = hours; |
| 174 | + time.tm_mday = days; |
| 175 | + time.tm_mon = months - 1; |
| 176 | + time.tm_year = years + 100; // year since 1900 |
| 177 | + |
| 178 | + _rtc_maketime(&time, &utcsec,RTC_FULL_LEAP_YEAR_SUPPORT); |
| 179 | + set_time(utcsec); |
| 180 | +} |
| 181 | + |
| 182 | +time_t PCF8563TClass::getEpoch() { |
| 183 | + struct tm time; |
| 184 | + time_t seconds; |
| 185 | + |
| 186 | + time.tm_sec = getSeconds(); |
| 187 | + time.tm_min = getMinutes(); |
| 188 | + time.tm_hour = getHours(); |
| 189 | + time.tm_mday = getDays(); |
| 190 | + time.tm_mon = getMonths() - 1; |
| 191 | + time.tm_year = getYears() + 100; // year since 1900 |
| 192 | + |
| 193 | + _rtc_maketime(&time, &seconds, RTC_FULL_LEAP_YEAR_SUPPORT); |
| 194 | + return seconds; |
| 195 | +} |
| 196 | + |
| 197 | +void PCF8563TClass::enableAlarm() { |
| 198 | + writeByte(PCF8563T_STATUS_2_REG, (readByte(PCF8563T_STATUS_2_REG) & PCF8563T_STATUS_2_CLEAR_INT) | PCF8563T_STATUS_2_AIE_MASK); |
| 199 | +} |
| 200 | + |
| 201 | +void PCF8563TClass::disableAlarm() { |
| 202 | + writeByte(PCF8563T_STATUS_2_REG, (readByte(PCF8563T_STATUS_2_REG) & PCF8563T_STATUS_2_INT_OFF)); |
| 203 | +} |
| 204 | + |
| 205 | +void PCF8563TClass::clearAlarm() { |
| 206 | + writeByte(PCF8563T_STATUS_2_REG, (readByte(PCF8563T_STATUS_2_REG) & PCF8563T_STATUS_2_CLEAR_INT) | PCF8563T_STATUS_2_AIE_MASK); |
| 207 | +} |
| 208 | + |
| 209 | +void PCF8563TClass::setMinuteAlarm(uint8_t minutes) { |
| 210 | + uint8_t dec = minutes / 10; |
| 211 | + uint8_t unit = minutes - (dec * 10); |
| 212 | + uint8_t min_alarm = PCF8563T_MINUTE_ALARM_ON & ((dec << 4) + unit); |
| 213 | + writeByte(PCF8563T_MINUTE_ALARM_REG , min_alarm); |
| 214 | +} |
| 215 | + |
| 216 | +void PCF8563TClass::disableMinuteAlarm() { |
| 217 | + writeByte(PCF8563T_MINUTE_ALARM_REG, readByte(PCF8563T_MINUTE_ALARM_REG) | PCF8563T_MINUTE_ALARM_AE_M_MASK); |
| 218 | +} |
| 219 | + |
| 220 | +void PCF8563TClass::setHourAlarm(uint8_t hours) { |
| 221 | + uint8_t dec = hours / 10; |
| 222 | + uint8_t unit = hours - (dec * 10); |
| 223 | + uint8_t hour_alarm = PCF8563T_HOUR_ALARM_AE_H_MASK & ((dec << 4) + unit); |
| 224 | + writeByte(PCF8563T_HOURS_REG, hour_alarm); //check formula on datasheet val + 6 * (val / 10) |
| 225 | +} |
| 226 | + |
| 227 | +void PCF8563TClass::disableHourAlarm() { |
| 228 | + writeByte(PCF8563T_HOUR_ALARM_REG, readByte(PCF8563T_HOUR_ALARM_REG) | PCF8563T_HOUR_ALARM_AE_H_MASK); |
| 229 | +} |
| 230 | + |
| 231 | +void PCF8563TClass::setDayAlarm(uint8_t days) { |
| 232 | + uint8_t dec = days / 10; |
| 233 | + uint8_t unit = days - (dec * 10); |
| 234 | + uint8_t day_alarm = PCF8563T_DAY_ALARM_ON & ((dec << 4) + unit); |
| 235 | + writeByte(PCF8563T_DAY_ALARM_REG, day_alarm); |
| 236 | +} |
| 237 | + |
| 238 | +void PCF8563TClass::disableDayAlarm() { |
| 239 | + writeByte(PCF8563T_DAY_ALARM_REG, readByte(PCF8563T_DAY_ALARM_REG) | PCF8563T_DAY_ALARM_AE_D_MASK ); |
| 240 | +} |
| 241 | + |
117 | 242 | void PCF8563TClass::writeByte(uint8_t regAddres, uint8_t data) { |
118 | 243 | Wire1.beginTransmission(PCF8563T_ADDRESS); |
119 | 244 | Wire1.write(regAddres); |
|
0 commit comments