Fixed braindead style, added a 2038+ compatible timestamp
All checks were successful
Compile / Compile (push) Successful in 1m22s
All checks were successful
Compile / Compile (push) Successful in 1m22s
This commit is contained in:
parent
5993fda85e
commit
67ff091775
2 changed files with 521 additions and 444 deletions
|
@ -38,27 +38,27 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "Rtc_Pcf8563.h"
|
#include "Rtc_Pcf8563.h"
|
||||||
|
|
||||||
Rtc_Pcf8563::Rtc_Pcf8563(void)
|
Rtc_Pcf8563::Rtc_Pcf8563()
|
||||||
{
|
{
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
Rtcc_Addr = RTCC_R>>1;
|
Rtcc_Addr = RTCC_R >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rtc_Pcf8563::Rtc_Pcf8563(int sdaPin, int sdlPin)
|
Rtc_Pcf8563::Rtc_Pcf8563(int sdaPin, int sdlPin)
|
||||||
{
|
{
|
||||||
Wire.begin(sdaPin, sdlPin);
|
Wire.begin(sdaPin, sdlPin);
|
||||||
Rtcc_Addr = RTCC_R>>1;
|
Rtcc_Addr = RTCC_R >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Private internal functions, but useful to look at if you need a similar func. */
|
/* Private internal functions, but useful to look at if you need a similar func. */
|
||||||
byte Rtc_Pcf8563::decToBcd(byte val)
|
byte Rtc_Pcf8563::decToBcd(byte val)
|
||||||
{
|
{
|
||||||
return ( (val/10*16) + (val%10) );
|
return ((val / 10 * 16) + (val % 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::bcdToDec(byte val)
|
byte Rtc_Pcf8563::bcdToDec(byte val)
|
||||||
{
|
{
|
||||||
return ( (val/16*10) + (val%16) );
|
return ((val / 16 * 10) + (val % 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rtc_Pcf8563::zeroClock()
|
void Rtc_Pcf8563::zeroClock()
|
||||||
|
@ -102,7 +102,7 @@ byte Rtc_Pcf8563::readStatus2()
|
||||||
return getStatus2();
|
return getStatus2();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rtc_Pcf8563::clearVoltLow(void)
|
void Rtc_Pcf8563::clearVoltLow()
|
||||||
{
|
{
|
||||||
getDateTime();
|
getDateTime();
|
||||||
// Only clearing is possible on device (I tried)
|
// Only clearing is possible on device (I tried)
|
||||||
|
@ -114,7 +114,7 @@ void Rtc_Pcf8563::clearVoltLow(void)
|
||||||
/*
|
/*
|
||||||
* Atomicly read all device registers in one operation
|
* Atomicly read all device registers in one operation
|
||||||
*/
|
*/
|
||||||
void Rtc_Pcf8563::getDateTime(void)
|
void Rtc_Pcf8563::getDateTime()
|
||||||
{
|
{
|
||||||
/* Start at beginning, read entire memory in one go */
|
/* Start at beginning, read entire memory in one go */
|
||||||
Wire.beginTransmission(Rtcc_Addr);
|
Wire.beginTransmission(Rtcc_Addr);
|
||||||
|
@ -124,8 +124,9 @@ void Rtc_Pcf8563::getDateTime(void)
|
||||||
/* As per data sheet, have to read everything all in one operation */
|
/* As per data sheet, have to read everything all in one operation */
|
||||||
uint8_t readBuffer[16] = {0};
|
uint8_t readBuffer[16] = {0};
|
||||||
Wire.requestFrom(Rtcc_Addr, 16);
|
Wire.requestFrom(Rtcc_Addr, 16);
|
||||||
for (uint8_t i=0; i < 16; i++)
|
for (uint8_t i=0; i < 16; i++) {
|
||||||
readBuffer[i] = Wire.read();
|
readBuffer[i] = Wire.read();
|
||||||
|
}
|
||||||
|
|
||||||
// status bytes
|
// status bytes
|
||||||
status1 = readBuffer[0];
|
status1 = readBuffer[0];
|
||||||
|
@ -146,10 +147,12 @@ void Rtc_Pcf8563::getDateTime(void)
|
||||||
weekday = bcdToDec(readBuffer[6] & 0x07);
|
weekday = bcdToDec(readBuffer[6] & 0x07);
|
||||||
//get raw month data byte and set month and century with it.
|
//get raw month data byte and set month and century with it.
|
||||||
month = readBuffer[7];
|
month = readBuffer[7];
|
||||||
if (month & RTCC_CENTURY_MASK)
|
if (month & RTCC_CENTURY_MASK) {
|
||||||
century = true;
|
century = true;
|
||||||
else
|
} else {
|
||||||
century = false;
|
century = false;
|
||||||
|
}
|
||||||
|
|
||||||
//0x1f = 0b00011111
|
//0x1f = 0b00011111
|
||||||
month = month & 0x1f;
|
month = month & 0x1f;
|
||||||
month = bcdToDec(month);
|
month = bcdToDec(month);
|
||||||
|
@ -157,25 +160,31 @@ void Rtc_Pcf8563::getDateTime(void)
|
||||||
|
|
||||||
// alarm bytes
|
// alarm bytes
|
||||||
alarm_minute = readBuffer[9];
|
alarm_minute = readBuffer[9];
|
||||||
if(B10000000 & alarm_minute)
|
if(B10000000 & alarm_minute) {
|
||||||
alarm_minute = RTCC_NO_ALARM;
|
alarm_minute = RTCC_NO_ALARM;
|
||||||
else
|
} else {
|
||||||
alarm_minute = bcdToDec(alarm_minute & B01111111);
|
alarm_minute = bcdToDec(alarm_minute & B01111111);
|
||||||
|
}
|
||||||
|
|
||||||
alarm_hour = readBuffer[10];
|
alarm_hour = readBuffer[10];
|
||||||
if(B10000000 & alarm_hour)
|
if(B10000000 & alarm_hour) {
|
||||||
alarm_hour = RTCC_NO_ALARM;
|
alarm_hour = RTCC_NO_ALARM;
|
||||||
else
|
} else {
|
||||||
alarm_hour = bcdToDec(alarm_hour & B00111111);
|
alarm_hour = bcdToDec(alarm_hour & B00111111);
|
||||||
|
}
|
||||||
|
|
||||||
alarm_day = readBuffer[11];
|
alarm_day = readBuffer[11];
|
||||||
if(B10000000 & alarm_day)
|
if(B10000000 & alarm_day) {
|
||||||
alarm_day = RTCC_NO_ALARM;
|
alarm_day = RTCC_NO_ALARM;
|
||||||
else
|
} else {
|
||||||
alarm_day = bcdToDec(alarm_day & B00111111);
|
alarm_day = bcdToDec(alarm_day & B00111111);
|
||||||
|
}
|
||||||
alarm_weekday = readBuffer[12];
|
alarm_weekday = readBuffer[12];
|
||||||
if(B10000000 & alarm_weekday)
|
if(B10000000 & alarm_weekday) {
|
||||||
alarm_weekday = RTCC_NO_ALARM;
|
alarm_weekday = RTCC_NO_ALARM;
|
||||||
else
|
} else {
|
||||||
alarm_weekday = bcdToDec(alarm_weekday & B00000111);
|
alarm_weekday = bcdToDec(alarm_weekday & B00000111);
|
||||||
|
}
|
||||||
|
|
||||||
// CLKOUT_control 0x03 = 0b00000011
|
// CLKOUT_control 0x03 = 0b00000011
|
||||||
squareWave = readBuffer[13] & 0x03;
|
squareWave = readBuffer[13] & 0x03;
|
||||||
|
@ -196,10 +205,12 @@ void Rtc_Pcf8563::setDateTime(byte day, byte weekday, byte month,
|
||||||
1=19xx
|
1=19xx
|
||||||
*/
|
*/
|
||||||
month = decToBcd(month);
|
month = decToBcd(month);
|
||||||
if (century)
|
|
||||||
|
if (century) {
|
||||||
month |= RTCC_CENTURY_MASK;
|
month |= RTCC_CENTURY_MASK;
|
||||||
else
|
} else {
|
||||||
month &= ~RTCC_CENTURY_MASK;
|
month &= ~RTCC_CENTURY_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
/* As per data sheet, have to set everything all in one operation */
|
/* As per data sheet, have to set everything all in one operation */
|
||||||
Wire.beginTransmission(Rtcc_Addr); // Issue I2C start signal
|
Wire.beginTransmission(Rtcc_Addr); // Issue I2C start signal
|
||||||
|
@ -270,7 +281,7 @@ void Rtc_Pcf8563::enableAlarm()
|
||||||
void Rtc_Pcf8563::setAlarm(byte min, byte hour, byte day, byte weekday)
|
void Rtc_Pcf8563::setAlarm(byte min, byte hour, byte day, byte weekday)
|
||||||
{
|
{
|
||||||
getDateTime(); // operate on current values
|
getDateTime(); // operate on current values
|
||||||
if (min <99) {
|
if (min < 99) {
|
||||||
min = constrain(min, 0, 59);
|
min = constrain(min, 0, 59);
|
||||||
min = decToBcd(min);
|
min = decToBcd(min);
|
||||||
min &= ~RTCC_ALARM;
|
min &= ~RTCC_ALARM;
|
||||||
|
@ -352,9 +363,12 @@ void Rtc_Pcf8563::resetAlarm()
|
||||||
// true if timer interrupt and control is enabled
|
// true if timer interrupt and control is enabled
|
||||||
bool Rtc_Pcf8563::timerEnabled()
|
bool Rtc_Pcf8563::timerEnabled()
|
||||||
{
|
{
|
||||||
if (getStatus2() & RTCC_TIMER_TIE)
|
if (getStatus2() & RTCC_TIMER_TIE) {
|
||||||
if (timer_control & RTCC_TIMER_TE)
|
if (timer_control & RTCC_TIMER_TE) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,7 +381,7 @@ bool Rtc_Pcf8563::timerActive()
|
||||||
|
|
||||||
|
|
||||||
// enable timer and interrupt
|
// enable timer and interrupt
|
||||||
void Rtc_Pcf8563::enableTimer(void)
|
void Rtc_Pcf8563::enableTimer()
|
||||||
{
|
{
|
||||||
getDateTime();
|
getDateTime();
|
||||||
//set TE to 1
|
//set TE to 1
|
||||||
|
@ -396,10 +410,12 @@ void Rtc_Pcf8563::enableTimer(void)
|
||||||
void Rtc_Pcf8563::setTimer(byte value, byte frequency, bool is_pulsed)
|
void Rtc_Pcf8563::setTimer(byte value, byte frequency, bool is_pulsed)
|
||||||
{
|
{
|
||||||
getDateTime();
|
getDateTime();
|
||||||
if (is_pulsed)
|
if (is_pulsed) {
|
||||||
status2 |= 0x01 << 4;
|
status2 |= 0x01 << 4;
|
||||||
else
|
} else {
|
||||||
status2 &= ~(0x01 << 4);
|
status2 &= ~(0x01 << 4);
|
||||||
|
}
|
||||||
|
|
||||||
timer_value = value;
|
timer_value = value;
|
||||||
// TE set to 1 in enableTimer(), leave 0 for now
|
// TE set to 1 in enableTimer(), leave 0 for now
|
||||||
timer_control |= (frequency & RTCC_TIMER_TD10); // use only last 2 bits
|
timer_control |= (frequency & RTCC_TIMER_TD10); // use only last 2 bits
|
||||||
|
@ -420,7 +436,7 @@ void Rtc_Pcf8563::setTimer(byte value, byte frequency, bool is_pulsed)
|
||||||
|
|
||||||
|
|
||||||
// clear timer flag and interrupt
|
// clear timer flag and interrupt
|
||||||
void Rtc_Pcf8563::clearTimer(void)
|
void Rtc_Pcf8563::clearTimer()
|
||||||
{
|
{
|
||||||
getDateTime();
|
getDateTime();
|
||||||
//set status2 TF val to zero
|
//set status2 TF val to zero
|
||||||
|
@ -447,7 +463,7 @@ void Rtc_Pcf8563::clearTimer(void)
|
||||||
|
|
||||||
|
|
||||||
// clear timer flag but leave interrupt unchanged */
|
// clear timer flag but leave interrupt unchanged */
|
||||||
void Rtc_Pcf8563::resetTimer(void)
|
void Rtc_Pcf8563::resetTimer()
|
||||||
{
|
{
|
||||||
getDateTime();
|
getDateTime();
|
||||||
//set status2 TF val to zero to reset timer
|
//set status2 TF val to zero to reset timer
|
||||||
|
@ -511,17 +527,15 @@ const char *Rtc_Pcf8563::formatDate(byte style)
|
||||||
getDate();
|
getDate();
|
||||||
|
|
||||||
switch (style) {
|
switch (style) {
|
||||||
|
case RTCC_DATE_ISO8601:
|
||||||
case RTCC_DATE_ASIA:
|
if (century ) {
|
||||||
//do the asian style, yyyy-mm-dd
|
|
||||||
if (century ){
|
|
||||||
strDate[0] = '1';
|
strDate[0] = '1';
|
||||||
strDate[1] = '9';
|
strDate[1] = '9';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
strDate[0] = '2';
|
strDate[0] = '2';
|
||||||
strDate[1] = '0';
|
strDate[1] = '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
strDate[2] = '0' + (year / 10 );
|
strDate[2] = '0' + (year / 10 );
|
||||||
strDate[3] = '0' + (year % 10);
|
strDate[3] = '0' + (year % 10);
|
||||||
strDate[4] = '-';
|
strDate[4] = '-';
|
||||||
|
@ -533,21 +547,22 @@ const char *Rtc_Pcf8563::formatDate(byte style)
|
||||||
strDate[10] = '\0';
|
strDate[10] = '\0';
|
||||||
break;
|
break;
|
||||||
case RTCC_DATE_US:
|
case RTCC_DATE_US:
|
||||||
//the pitiful US style, mm/dd/yyyy
|
// the utterly bonkers US style, mm/dd/yyyy
|
||||||
strDate[0] = '0' + (month / 10);
|
strDate[0] = '0' + (month / 10);
|
||||||
strDate[1] = '0' + (month % 10);
|
strDate[1] = '0' + (month % 10);
|
||||||
strDate[2] = '/';
|
strDate[2] = '/';
|
||||||
strDate[3] = '0' + (day / 10);
|
strDate[3] = '0' + (day / 10);
|
||||||
strDate[4] = '0' + (day % 10);
|
strDate[4] = '0' + (day % 10);
|
||||||
strDate[5] = '/';
|
strDate[5] = '/';
|
||||||
if (century){
|
|
||||||
|
if (century) {
|
||||||
strDate[6] = '1';
|
strDate[6] = '1';
|
||||||
strDate[7] = '9';
|
strDate[7] = '9';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
strDate[6] = '2';
|
strDate[6] = '2';
|
||||||
strDate[7] = '0';
|
strDate[7] = '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
strDate[8] = '0' + (year / 10 );
|
strDate[8] = '0' + (year / 10 );
|
||||||
strDate[9] = '0' + (year % 10);
|
strDate[9] = '0' + (year % 10);
|
||||||
strDate[10] = '\0';
|
strDate[10] = '\0';
|
||||||
|
@ -562,20 +577,20 @@ const char *Rtc_Pcf8563::formatDate(byte style)
|
||||||
strDate[4] = '0' + (month % 10);
|
strDate[4] = '0' + (month % 10);
|
||||||
strDate[5] = '-';
|
strDate[5] = '-';
|
||||||
|
|
||||||
if (century){
|
if (century) {
|
||||||
strDate[6] = '1';
|
strDate[6] = '1';
|
||||||
strDate[7] = '9';
|
strDate[7] = '9';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
strDate[6] = '2';
|
strDate[6] = '2';
|
||||||
strDate[7] = '0';
|
strDate[7] = '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
strDate[8] = '0' + (year / 10 );
|
strDate[8] = '0' + (year / 10 );
|
||||||
strDate[9] = '0' + (year % 10);
|
strDate[9] = '0' + (year % 10);
|
||||||
strDate[10] = '\0';
|
strDate[10] = '\0';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return strDate;
|
return strDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,44 +641,53 @@ void Rtc_Pcf8563::getTime()
|
||||||
getDateTime();
|
getDateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Rtc_Pcf8563::getVoltLow(void)
|
bool Rtc_Pcf8563::getVoltLow()
|
||||||
{
|
{
|
||||||
return volt_low;
|
return volt_low;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getSecond() {
|
byte Rtc_Pcf8563::getSecond()
|
||||||
|
{
|
||||||
return sec;
|
return sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getMinute() {
|
byte Rtc_Pcf8563::getMinute()
|
||||||
|
{
|
||||||
return minute;
|
return minute;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getHour() {
|
byte Rtc_Pcf8563::getHour()
|
||||||
|
{
|
||||||
return hour;
|
return hour;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getAlarmMinute() {
|
byte Rtc_Pcf8563::getAlarmMinute()
|
||||||
|
{
|
||||||
return alarm_minute;
|
return alarm_minute;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getAlarmHour() {
|
byte Rtc_Pcf8563::getAlarmHour()
|
||||||
|
{
|
||||||
return alarm_hour;
|
return alarm_hour;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getAlarmDay() {
|
byte Rtc_Pcf8563::getAlarmDay()
|
||||||
|
{
|
||||||
return alarm_day;
|
return alarm_day;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getAlarmWeekday() {
|
byte Rtc_Pcf8563::getAlarmWeekday()
|
||||||
|
{
|
||||||
return alarm_weekday;
|
return alarm_weekday;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getTimerControl() {
|
byte Rtc_Pcf8563::getTimerControl()
|
||||||
|
{
|
||||||
return timer_control;
|
return timer_control;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getTimerValue() {
|
byte Rtc_Pcf8563::getTimerValue()
|
||||||
|
{
|
||||||
// Impossible to freeze this value, it could
|
// Impossible to freeze this value, it could
|
||||||
// be changing during read. Multiple reads
|
// be changing during read. Multiple reads
|
||||||
// required to check for consistency.
|
// required to check for consistency.
|
||||||
|
@ -672,52 +696,62 @@ byte Rtc_Pcf8563::getTimerValue() {
|
||||||
last_value = timer_value;
|
last_value = timer_value;
|
||||||
getDateTime();
|
getDateTime();
|
||||||
} while (timer_value != last_value);
|
} while (timer_value != last_value);
|
||||||
|
|
||||||
return timer_value;
|
return timer_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getDay() {
|
byte Rtc_Pcf8563::getDay()
|
||||||
|
{
|
||||||
return day;
|
return day;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getMonth() {
|
byte Rtc_Pcf8563::getMonth()
|
||||||
|
{
|
||||||
return month;
|
return month;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getYear() {
|
byte Rtc_Pcf8563::getYear()
|
||||||
|
{
|
||||||
return year;
|
return year;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Rtc_Pcf8563::getCentury() {
|
bool Rtc_Pcf8563::getCentury()
|
||||||
|
{
|
||||||
return century;
|
return century;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getWeekday() {
|
byte Rtc_Pcf8563::getWeekday()
|
||||||
|
{
|
||||||
return weekday;
|
return weekday;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getStatus1() {
|
byte Rtc_Pcf8563::getStatus1()
|
||||||
|
{
|
||||||
return status1;
|
return status1;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte Rtc_Pcf8563::getStatus2() {
|
byte Rtc_Pcf8563::getStatus2()
|
||||||
|
{
|
||||||
return status2;
|
return status2;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long Rtc_Pcf8563::getTimestamp(){
|
unsigned long Rtc_Pcf8563::getTimestamp()
|
||||||
|
{
|
||||||
getDateTime(); // update date and time
|
getDateTime(); // update date and time
|
||||||
unsigned long timestamp = 0;
|
unsigned long timestamp = 0;
|
||||||
|
|
||||||
// Convert years in days
|
// Convert years in days
|
||||||
timestamp = (year-epoch_year)*365; // convert years in days
|
timestamp = (year-epoch_year) * 365; // convert years in days
|
||||||
|
|
||||||
if((year-epoch_year)>1) // add a dy when it's a leap year
|
if((year-epoch_year)>1) { // add a dy when it's a leap year
|
||||||
{
|
for(unsigned char i = epoch_year; i<year;i++) {
|
||||||
for(unsigned char i = epoch_year; i<year;i++)
|
|
||||||
{
|
|
||||||
if(isLeapYear(century, i)) timestamp++; // add a day for each leap years
|
if(isLeapYear(century, i)) timestamp++; // add a day for each leap years
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(month>2&&isLeapYear(century, year)) timestamp++; // test for the year's febuary
|
|
||||||
|
if(month>2 && isLeapYear(century, year)) {
|
||||||
|
timestamp++; // test for the year's febuary
|
||||||
|
}
|
||||||
|
|
||||||
// add months converted in days
|
// add months converted in days
|
||||||
if(month>1) timestamp += months_days[month-2];
|
if(month>1) timestamp += months_days[month-2];
|
||||||
|
@ -725,11 +759,11 @@ unsigned long Rtc_Pcf8563::getTimestamp(){
|
||||||
// add days
|
// add days
|
||||||
timestamp += (day-epoch_day);
|
timestamp += (day-epoch_day);
|
||||||
|
|
||||||
timestamp*= 86400; // convert days in seconds
|
timestamp *= 86400; // convert days in seconds
|
||||||
|
|
||||||
// convert time to second and add it to timestamp
|
// convert time to second and add it to timestamp
|
||||||
unsigned long timeTemp = hour*60+ minute;
|
unsigned long timeTemp = hour*60+ minute;
|
||||||
timeTemp *=60;
|
timeTemp *= 60;
|
||||||
timeTemp += sec;
|
timeTemp += sec;
|
||||||
|
|
||||||
timestamp += timeTemp; // add hours +minutes + seconds
|
timestamp += timeTemp; // add hours +minutes + seconds
|
||||||
|
@ -738,3 +772,44 @@ unsigned long Rtc_Pcf8563::getTimestamp(){
|
||||||
|
|
||||||
return timestamp;
|
return timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t Rtc_Pcf8563::getTimestamp64()
|
||||||
|
{
|
||||||
|
getDateTime(); // update date and time
|
||||||
|
uint64_t timestamp = 0;
|
||||||
|
|
||||||
|
// Convert years in days
|
||||||
|
timestamp = (year - epoch_year) * 365; // convert years to days
|
||||||
|
|
||||||
|
if((year - epoch_year) > 1) { // add a day when it's a leap year
|
||||||
|
for(unsigned char i = epoch_year; i<year;i++) {
|
||||||
|
if(isLeapYear(century, i)) {
|
||||||
|
timestamp++; // add a day for each leap year
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(month > 2 && isLeapYear(century, year)) {
|
||||||
|
timestamp++; // test for the year's febuary
|
||||||
|
}
|
||||||
|
|
||||||
|
// add months converted in days
|
||||||
|
if(month > 1) {
|
||||||
|
timestamp += months_days[month-2];
|
||||||
|
}
|
||||||
|
|
||||||
|
// add days
|
||||||
|
timestamp += (day-epoch_day);
|
||||||
|
|
||||||
|
timestamp *= 86400; // convert days in seconds
|
||||||
|
|
||||||
|
// convert time to second and add it to timestamp
|
||||||
|
unsigned long timeTemp = hour * 60 + minute;
|
||||||
|
timeTemp *= 60;
|
||||||
|
timeTemp += sec;
|
||||||
|
|
||||||
|
timestamp += timeTemp; // add hours +minutes + seconds
|
||||||
|
timestamp += EPOCH_TIMESTAMP; // add epoch reference
|
||||||
|
|
||||||
|
return timestamp;
|
||||||
|
}
|
|
@ -102,7 +102,8 @@
|
||||||
|
|
||||||
/* date format flags */
|
/* date format flags */
|
||||||
#define RTCC_DATE_WORLD 0x01
|
#define RTCC_DATE_WORLD 0x01
|
||||||
#define RTCC_DATE_ASIA 0x02
|
#define RTCC_DATE_ISO8601 0x02
|
||||||
|
#define RTCC_DATE_ASIA 0x02 // It's not "asian", it's ISO8601, that anybody with any sense uses
|
||||||
#define RTCC_DATE_US 0x04
|
#define RTCC_DATE_US 0x04
|
||||||
/* time format flags */
|
/* time format flags */
|
||||||
#define RTCC_TIME_HMS 0x01
|
#define RTCC_TIME_HMS 0x01
|
||||||
|
@ -198,6 +199,7 @@ class Rtc_Pcf8563 {
|
||||||
byte getTimerValue();
|
byte getTimerValue();
|
||||||
|
|
||||||
unsigned long getTimestamp(); // return unix timestamp
|
unsigned long getTimestamp(); // return unix timestamp
|
||||||
|
uint64_t getTimestamp64(); // Fixed for 2038+
|
||||||
|
|
||||||
// Sets date/time to static fixed values, disable all alarms
|
// Sets date/time to static fixed values, disable all alarms
|
||||||
// use zeroClock() above to guarantee lowest possible values instead.
|
// use zeroClock() above to guarantee lowest possible values instead.
|
||||||
|
|
Loading…
Reference in a new issue