UART Command Parser Time Manager Data Store for SD Card for stm32l476 [it's not Licensed as BSD/GPLx]
Dependencies: mbed SDFileSystem
common/TimeManager.cpp
- Committer:
- Inscape_ao
- Date:
- 2019-07-05
- Revision:
- 19:36072b9b79f3
- Parent:
- 16:602bc04e3cb5
File content as of revision 19:36072b9b79f3:
#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 = 1; current.tm_mon = 1; 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); dbgprintf("setCurrentTime:%d-%d(%d)\n", selector, set, daysInMonth); 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; }