mirror of
https://github.com/fsender/readguy.git
synced 2025-12-13 21:28:14 +08:00
Bump to 1.4.0 with many new feats
This commit is contained in:
104
extra/ctg_timelib/ctg_timelib.cpp
Normal file
104
extra/ctg_timelib/ctg_timelib.cpp
Normal file
@@ -0,0 +1,104 @@
|
||||
#include "ctg_timelib.hpp"
|
||||
|
||||
namespace CTG_TimeLib {
|
||||
|
||||
time_t tOffset = 0;
|
||||
struct tm m;
|
||||
|
||||
#if (defined ( CTG_USE_tmElements_t ) || defined (CTG_USE_ALL_TimeLib_features))
|
||||
|
||||
void setTime(int16_t hr,int16_t min,int16_t sec,int16_t dy, int16_t mnth, int16_t yr){
|
||||
// year can be given as full four digit year or two digts (2010 or 10 for 2010);
|
||||
//it is converted to years since 1970
|
||||
tmElements_t tem;
|
||||
if( yr >= 1900) yr -= 1970;
|
||||
else yr += 30;
|
||||
tem.Year = yr;
|
||||
tem.Month = mnth;
|
||||
tem.Day = dy;
|
||||
tem.Wday = 0;
|
||||
tem.Hour = hr;
|
||||
tem.Minute = min;
|
||||
tem.Second = sec;
|
||||
setTime(makeTime(tem));
|
||||
}
|
||||
|
||||
#define LEAP_YEAR(Y) ( ((1970+(Y))>0) && !((1970+(Y))%4) && ( ((1970+(Y))%100) || !((1970+(Y))%400) ) )
|
||||
static const uint8_t monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31};
|
||||
|
||||
void breakTime(time_t timeInput, tmElements_t &tm){
|
||||
// break the given time_t into time components
|
||||
// this is a more compact version of the C library localtime function
|
||||
// note that year is offset from 1970 !!!
|
||||
|
||||
uint8_t year;
|
||||
uint8_t month, monthLength;
|
||||
uint32_t time;
|
||||
unsigned long days;
|
||||
// API starts months from 1, this array starts from 0
|
||||
time = (uint32_t)timeInput;
|
||||
tm.Second = time % 60;
|
||||
time /= 60; // now it is minutes
|
||||
tm.Minute = time % 60;
|
||||
time /= 60; // now it is hours
|
||||
tm.Hour = time % 24;
|
||||
time /= 24; // now it is days
|
||||
tm.Wday = ((time + 4) % 7) + 1; // Sunday is day 1
|
||||
|
||||
year = 0;
|
||||
days = 0;
|
||||
while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) {
|
||||
year++;
|
||||
}
|
||||
tm.Year = year; // year is offset from 1970
|
||||
|
||||
days -= LEAP_YEAR(year) ? 366 : 365;
|
||||
time -= days; // now it is days in this year, starting at 0
|
||||
|
||||
days=0;
|
||||
month=0;
|
||||
monthLength=0;
|
||||
for (month=0; month<12; month++) {
|
||||
monthLength = monthDays[month];
|
||||
if(LEAP_YEAR(year) && month==1) monthLength++;// february
|
||||
if (time >= monthLength)
|
||||
time -= monthLength;
|
||||
else break;
|
||||
}
|
||||
tm.Month = month + 1; // jan is month 1
|
||||
tm.Day = time + 1; // day of month
|
||||
}
|
||||
|
||||
time_t makeTime(const tmElements_t &tm){
|
||||
// assemble time elements into time_t
|
||||
// note year argument is offset from 1970 (see macros in time.h to convert to other formats)
|
||||
// previous version used full four digit year (or digits since 2000),i.e. 2009 was 2009 or 9
|
||||
|
||||
int i;
|
||||
uint32_t seconds;
|
||||
|
||||
// seconds from 1970 till 1 jan 00:00:00 of the given year
|
||||
seconds= tm.Year*(86400 * 365);
|
||||
for (i = 0; i < tm.Year; i++) {
|
||||
if (LEAP_YEAR(i)) {
|
||||
seconds += 86400; // add extra days for leap years
|
||||
}
|
||||
}
|
||||
|
||||
// add days for this year, months start from 1
|
||||
for (i = 1; i < tm.Month; i++) {
|
||||
if ( (i == 2) && LEAP_YEAR(tm.Year)) {
|
||||
seconds += 86400 * 29;
|
||||
} else {
|
||||
seconds += 86400 * monthDays[i-1]; //monthDay array starts from 0
|
||||
}
|
||||
}
|
||||
seconds+= (tm.Day-1) * 86400;
|
||||
seconds+= tm.Hour * 3600;
|
||||
seconds+= tm.Minute * 60;
|
||||
seconds+= tm.Second;
|
||||
return (time_t)seconds;
|
||||
}
|
||||
#endif // CTG_USE_tmElements_t
|
||||
|
||||
} //namespace
|
||||
Reference in New Issue
Block a user