#include #include "FreeRTOS.h" #include "MetersIncludes.h" #include "task.h" #include "StackMacros.h" #define MASKSEC 0x3F // Second 00..59 00000000:00000000:00xxxxxx #define MASKMIN 0x3F00 // Minute 00..59 00000000:00xxxxxx:00000000 #define MASKHR 0x1F0000 // Hour 00..23 000xxxxx:00000000:00000000 extern xTickCount; /* tick counter (milliseconds) from FreeRTOS */ /* taken from Linux Kernel 2.6.30 */ portLONG mktime(const unsigned int year0, const unsigned int mon0, const unsigned int day, const unsigned int hour, const unsigned int min, const unsigned int sec); unsigned long long getEpochTimeWithMs(void) { /* get both registers while in critical section to eliminate the chance of inconsistencies when there are * overflows of the SECONDS value. */ unsigned int timeHour; unsigned int timeMin; unsigned int timeSec; unsigned int timeDay; unsigned int timeMonth; unsigned int timeYear; unsigned long long tempTickTime; portLONG cTIME0; portLONG cTIME1; // portENTER_CRITICAL(); cTIME0 = RTC_CTIME0; cTIME1 = RTC_CTIME1; // portEXIT_CRITICAL(); timeHour = (cTIME0 & MASKHR)>>16; // Hour timeMin = (cTIME0 & MASKMIN)>>8; // Minute timeSec = cTIME0 & MASKSEC; // Second timeDay = cTIME1 & 0xf; // Day timeMonth = (cTIME1 >> 8) & 0xF; // Month timeYear = (cTIME1 >> 16) & 0xFFF; // Year /* we get the epoch time, multiply it by 1000 and then add the milliseconds portion of the Tick timer. This returns a millisecond time since epoch. */ tempTickTime = mktime(timeYear, timeMonth, timeDay, timeHour, timeMin, timeSec); tempTickTime -= 3600 * 2; /* time zone adaptation (2 h) */ tempTickTime = (tempTickTime * 1000) + (xTickCount % 1000); return tempTickTime; } // mktime from linux kernel 2.6.30 kernel / time.c /* Converts Gregorian date to seconds since 1970-01-01 00:00:00. * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 * => year=1980, mon=12, day=31, hour=23, min=59, sec=59. * * [For the Julian calendar (which was used in Russia before 1917, * Britain & colonies before 1752, anywhere else before 1582, * and is still in use by some communities) leave out the * -year/100+year/400 terms, and add 10.] * * This algorithm was first published by Gauss (I think). * * WARNING: this function will overflow on 2106-02-07 06:28:16 on * machines where long is 32-bit! (However, as time_t is signed, we * will already get problems at other places on 2038-01-19 03:14:08) */ portLONG mktime(const unsigned int year0, const unsigned int mon0, const unsigned int day, const unsigned int hour, const unsigned int min, const unsigned int sec) { unsigned int mon = mon0, year = year0; /* 1..12 -> 11,12,1..10 */ if (0 >= (int) (mon -= 2)) { mon += 12; /* Puts Feb last since it has leap day */ year -= 1; } return ((((portLONG) (year/4 - year/100 + year/400 + 367*mon/12 + day) + year*365 - 719499 )*24 + hour /* now have hours */ )*60 + min /* now have minutes */ )*60 + sec; /* finally seconds */ }