xrocusOS_ADXL355 version
Dependencies: mbed SDFileSystem
Diff: common/TimeManager.cpp
- Revision:
- 2:a694440145e9
- Child:
- 4:bec3f80dc49c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/TimeManager.cpp Tue Apr 23 08:47:11 2019 +0000 @@ -0,0 +1,136 @@ +#include "TimeManager.h" +#include "global.h" + + +/* Cyclic handler (for tick) */ +void flip() { + pTM->tick(); +} + +/* Constractor */ +TimeManager::TimeManager(void) +{ + current.tm_sec = 0; + current.tm_min = 0; + current.tm_hour = 0; + current.tm_mday = 0; + current.tm_mon = 0; + current.tm_year = 0; + baseclock.attach(flip, 1.0); +} + +/* tick (currenttime++) */ +void TimeManager::tick(void) +{ + int daysInMonth = getDaysInMonth(current.tm_mon, current.tm_year); + current.tm_sec++; + if (current.tm_sec >= 60) { + current.tm_sec = 0; + current.tm_min++; + } else { return; } + if (current.tm_min >= 60) { + current.tm_min = 0; + current.tm_hour++; + } else { return; } + if (current.tm_hour >= 24) { + current.tm_hour = 0; + current.tm_mday++; + } else { return; } + if (current.tm_mday > daysInMonth) { + current.tm_mday = 0; + current.tm_mon++; + } else { return; } + if (current.tm_mon > 12) { + current.tm_mon = 1; + current.tm_year++; + } else { return; } +} + +/* copy Struct Time to arg */ +void TimeManager::getCurrentTime(struct tm *ret) +{ + *ret = current; +} + +/* get string of timestamp */ +int TimeManager::getTimeStamp(char *dst) +{ + char dummy[TimeStampLength + 1]; + sprintf(dummy, "%04d-%02d-%02d_%02d:%02d:%02d", + current.tm_year + 1900, current.tm_mon, current.tm_mday, + current.tm_hour, current.tm_min, current.tm_sec); + memcpy(dst, dummy, TimeStampLength); + return TimeStampLength; +} + +/* set time parameters */ +bool TimeManager::setCurrentTime(int selector, int set) +{ + bool finish = false; + int daysInMonth = getDaysInMonth(current.tm_mon, current.tm_year); + switch (selector) { + case SetTimeMethod::Year: + if (set >= 0) { + current.tm_year = set; + finish = true; + } + break; + case SetTimeMethod::Month: + if (set > 0 && set <= 12) { + current.tm_mon = set; + finish = true; + } + break; + case SetTimeMethod::Day: + if (set > 0 && set <= daysInMonth) { + current.tm_mday = set; + finish = true; + } + break; + case SetTimeMethod::Hour: + if (set >= 0 && set < 24) { + current.tm_hour = set; + finish = true; + } + break; + case SetTimeMethod::Min: + if (set >= 0 && set < 60) { + current.tm_min = set; + finish = true; + } + break; + case SetTimeMethod::Sec: + if (set >= 0 && set < 60) { + current.tm_sec = set; + finish = true; + } + break; + }; + return finish; +} + +/* calcurate Number of Days in month */ +int TimeManager::getDaysInMonth(int month, int year) +{ + int daysInMonth; + bool leap; + year += 1900; + leap = (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))? true : false; + + if (((month % 2 == 1) && (month <= 7)) || + ((month % 2 == 0) && (month >= 8))) { + /* 31days/month */ + daysInMonth = 31; + } else if (month == 2) { + /* 28days OR 29days/month */ + if (leap) { + daysInMonth = 29; + } else { + daysInMonth = 28; + } + } else { + /* 30days/month */ + daysInMonth = 30; + } + return daysInMonth; +} \ No newline at end of file