49 #include "co_string.h"
51 #include "co_time_msg.h"
60 #define assertAbs(p) \
62 pwr_Assert(p->tv_nsec >= 0 && p->tv_nsec < 1000000000); \
64 #define notATime(p) (p->tv_nsec < 0 || p->tv_nsec >= 1000000000)
66 #define assertDelta(p) \
68 pwr_Assert((p->tv_sec > 0) ? (p->tv_nsec >= 0 && p->tv_nsec < 1000000000) \
70 pwr_Assert((p->tv_sec < 0) ? (p->tv_nsec <= 0 && p->tv_nsec > -1000000000) \
73 #define notADeltaTime(p) \
74 (((p->tv_sec > 0) && (p->tv_nsec < 0 || p->tv_nsec >= 1000000000)) \
75 || ((p->tv_sec == 0) \
76 && (p->tv_nsec <= -1000000000 || p->tv_nsec >= 1000000000)) \
77 || ((p->tv_sec < 0) && (p->tv_nsec > 0 || p->tv_nsec <= -1000000000)))
83 static const char* monStr[] = {
"JAN",
"FEB",
"MAR",
"APR",
"MAY",
"JUN",
"JUL",
84 "AUG",
"SEP",
"OCT",
"NOV",
"DEC" };
87 int clock_gettime(clockid_t clockid,
struct timespec* pt)
89 if (clockid == CLOCK_REALTIME) {
94 pt->tv_sec = tv.tv_sec;
95 pt->tv_nsec = tv.tv_usec * 1000;
96 }
else if (clockid == CLOCK_MONOTONIC) {
100 gettimeofday(&tv, 0);
102 pt->tv_sec = tv.tv_sec;
103 pt->tv_nsec = tv.tv_usec * 1000;
121 if (69 > tms->tm_year )
123 else if (0 > tms->tm_mon || tms->tm_mon > 11)
125 else if (1 > tms->tm_mday || tms->tm_mday > 31)
127 else if (0 > tms->tm_hour || tms->tm_hour > 23)
129 else if (0 > tms->tm_min || tms->tm_min > 59)
131 else if (0 > tms->tm_sec
138 switch (tms->tm_mon) {
141 year = tms->tm_year + 1900;
142 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
143 if (tms->tm_mday > 29)
146 if (tms->tm_mday > 28)
155 if (tms->tm_mday > 30)
166 if (tms->tm_mday > 31)
173 return TIME__SUCCESS;
181 return (t1->tv_sec == pwr_cNTime.tv_sec)
182 && (t1->tv_nsec == pwr_cNTime.tv_nsec);
201 pwr_tInt64 tv_nsec = t->tv_nsec + a->tv_nsec;
202 pwr_tInt64 tv_sec = t->tv_sec + a->tv_sec;
203 pwr_tTime* r = result;
211 tv_sec += tv_nsec / 1000000000;
212 tv_nsec %= 1000000000;
213 if (tv_nsec < 0 && tv_sec > 0) {
215 tv_nsec += 1000000000;
216 }
else if (tv_sec < 0 && tv_nsec > 0) {
218 tv_nsec -= 1000000000;
222 r->tv_nsec = tv_nsec;
242 pwr_tInt64 tv_nsec = t->tv_nsec + a->tv_nsec;
243 pwr_tInt64 tv_sec = t->tv_sec + a->tv_sec;
244 pwr_tTime* r = result;
249 if (notATime(t) || notADeltaTime(a)) {
254 tv_sec += tv_nsec / 1000000000;
255 tv_nsec %= 1000000000;
256 if (tv_nsec < 0 && tv_sec > 0) {
258 tv_nsec += 1000000000;
259 }
else if (tv_sec < 0 && tv_nsec > 0) {
261 tv_nsec -= 1000000000;
265 r->tv_nsec = tv_nsec;
284 static pwr_tTime
null = { 0, 0 };
292 if (t1->tv_sec == t2->tv_sec) {
293 if (t1->tv_nsec == t2->tv_nsec)
295 return ((t1->tv_nsec > t2->tv_nsec) ? 1 : -1);
297 return ((t1->tv_sec > t2->tv_sec) ? 1 : -1);
314 static pwr_tTime
null = { 0, 0 };
319 if (notATime(t1) || notATime(t2))
322 if (t1->tv_sec == t2->tv_sec) {
323 if (t1->tv_nsec == t2->tv_nsec)
325 return ((t1->tv_nsec > t2->tv_nsec) ? 1 : -1);
327 return ((t1->tv_sec > t2->tv_sec) ? 1 : -1);
341 pwr_tInt64 tv_nsec = t->tv_nsec - s->tv_nsec;
342 pwr_tInt64 tv_sec = t->tv_sec - s->tv_sec;
344 pwr_Assert(r != NULL);
348 tv_sec = tv_sec + tv_nsec / 1000000000;
349 tv_nsec = tv_nsec % 1000000000;
350 if (tv_nsec < 0 && tv_sec > 0) {
352 tv_nsec += 1000000000;
353 }
else if (tv_sec < 0 && tv_nsec > 0) {
355 tv_nsec -= 1000000000;
359 r->tv_nsec = tv_nsec;
375 pwr_tInt64 tv_nsec = t->tv_nsec - s->tv_nsec;
376 pwr_tInt64 tv_sec = t->tv_sec - s->tv_sec;
378 if (r == NULL || notATime(t) || notATime(s)) {
379 *r = pwr_cNotADeltaTime;
383 tv_sec = tv_sec + tv_nsec / 1000000000;
384 tv_nsec = tv_nsec % 1000000000;
385 if (tv_nsec < 0 && tv_sec > 0) {
387 tv_nsec += 1000000000;
388 }
else if (tv_sec < 0 && tv_nsec > 0) {
390 tv_nsec -= 1000000000;
394 r->tv_nsec = tv_nsec;
410 pwr_tInt64 tv_nsec = t->tv_nsec - s->tv_nsec;
411 pwr_tInt64 tv_sec = t->tv_sec - s->tv_sec;
412 pwr_tTime* r = result;
420 tv_sec += tv_nsec / 1000000000;
421 tv_nsec %= 1000000000;
422 if (tv_nsec < 0 && tv_sec > 0) {
424 tv_nsec += 1000000000;
425 }
else if (tv_sec < 0 && tv_nsec > 0) {
427 tv_nsec -= 1000000000;
431 r->tv_nsec = tv_nsec;
446 pwr_tInt64 tv_nsec = t->tv_nsec - s->tv_nsec;
447 pwr_tInt64 tv_sec = t->tv_sec - s->tv_sec;
448 pwr_tTime* r = result;
453 if (notATime(t) || notADeltaTime(s)) {
458 tv_sec += tv_nsec / 1000000000;
459 tv_nsec %= 1000000000;
460 if (tv_nsec < 0 && tv_sec > 0) {
462 tv_nsec += 1000000000;
463 }
else if (tv_sec < 0 && tv_nsec > 0) {
465 tv_nsec -= 1000000000;
469 r->tv_nsec = tv_nsec;
493 r->tv_sec = t->tv_sec;
494 r->tv_nsec = t->tv_nsec;
498 r->tv_sec = -r->tv_sec;
500 r->tv_nsec = -r->tv_nsec;
523 r->tv_sec = t->tv_sec;
524 r->tv_nsec = t->tv_nsec;
527 if (notADeltaTime(t)) {
528 *r = pwr_cNotADeltaTime;
533 r->tv_sec = -r->tv_sec;
535 r->tv_nsec = -r->tv_nsec;
551 pwr_tInt64 tv_nsec, tv_sec;
559 tv_nsec = t->tv_nsec + a->tv_nsec;
560 tv_sec = t->tv_sec + a->tv_sec + (tv_nsec / 1000000000);
561 tv_nsec = tv_nsec % 1000000000;
563 if (tv_nsec < 0 && tv_sec > 0) {
565 tv_nsec += 1000000000;
566 }
else if (tv_sec < 0 && tv_nsec > 0) {
568 tv_nsec -= 1000000000;
572 r->tv_nsec = tv_nsec;
588 pwr_tInt64 tv_nsec, tv_sec;
593 if (notADeltaTime(t) || notADeltaTime(a)) {
594 *r = pwr_cNotADeltaTime;
598 tv_nsec = t->tv_nsec + a->tv_nsec;
599 tv_sec = t->tv_sec + a->tv_sec + (tv_nsec / 1000000000);
600 tv_nsec = tv_nsec % 1000000000;
602 if (tv_nsec < 0 && tv_sec > 0) {
604 tv_nsec += 1000000000;
605 }
else if (tv_sec < 0 && tv_nsec > 0) {
607 tv_nsec -= 1000000000;
611 r->tv_nsec = tv_nsec;
639 if (t1->tv_sec == t2->tv_sec) {
640 if (t1->tv_nsec == t2->tv_nsec)
642 return ((t1->tv_nsec > t2->tv_nsec) ? 1 : -1);
644 return ((t1->tv_sec > t2->tv_sec) ? 1 : -1);
667 if (notADeltaTime(t1) || notADeltaTime(t2))
670 if (t1->tv_sec == t2->tv_sec) {
671 if (t1->tv_nsec == t2->tv_nsec)
673 return ((t1->tv_nsec > t2->tv_nsec) ? 1 : -1);
675 return ((t1->tv_sec > t2->tv_sec) ? 1 : -1);
699 r->tv_sec = t->tv_sec;
700 r->tv_nsec = t->tv_nsec;
703 r->tv_sec = -r->tv_sec;
704 r->tv_nsec = -r->tv_nsec;
728 r->tv_sec = t->tv_sec;
729 r->tv_nsec = t->tv_nsec;
732 if (notADeltaTime(t)) {
733 *r = pwr_cNotADeltaTime;
737 r->tv_sec = -r->tv_sec;
738 r->tv_nsec = -r->tv_nsec;
753 pwr_tInt64 tv_nsec = t->tv_nsec - s->tv_nsec;
754 pwr_tInt64 tv_sec = t->tv_sec - s->tv_sec;
763 tv_sec = tv_sec + tv_nsec / 1000000000;
764 tv_nsec = tv_nsec % 1000000000;
765 if (tv_nsec < 0 && tv_sec > 0) {
767 tv_nsec += 1000000000;
768 }
else if (tv_sec < 0 && tv_nsec > 0) {
770 tv_nsec -= 1000000000;
774 r->tv_nsec = tv_nsec;
789 pwr_tInt64 tv_nsec = t->tv_nsec - s->tv_nsec;
790 pwr_tInt64 tv_sec = t->tv_sec - s->tv_sec;
796 if (notADeltaTime(t) || notADeltaTime(s)) {
797 *r = pwr_cNotADeltaTime;
801 tv_sec = tv_sec + tv_nsec / 1000000000;
802 tv_nsec = tv_nsec % 1000000000;
803 if (tv_nsec < 0 && tv_sec > 0) {
805 tv_nsec += 1000000000;
806 }
else if (tv_sec < 0 && tv_nsec > 0) {
808 tv_nsec -= 1000000000;
812 r->tv_nsec = tv_nsec;
823 div_t day, hour, min;
828 return TIME__IVDTIME;
830 if (notADeltaTime(dt)) {
831 strncpy(buf,
"NotADeltaTime", bufsize);
832 buf[bufsize - 1] =
'\0';
836 if (dt->tv_sec < 0 || dt->tv_nsec < 0) {
838 #if defined(HW_X86_64) || defined(HW_ARM64)
839 t.tv_sec = labs(dt->tv_sec);
840 t.tv_nsec = labs(dt->tv_nsec);
842 t.tv_sec = abs(dt->tv_sec);
843 t.tv_nsec = abs(dt->tv_nsec);
848 day = div(dt->tv_sec, 24 * 3600);
849 hour = div(day.rem, 3600);
850 min = div(hour.rem, 60);
854 long int nsec = dt->tv_nsec / 10000000;
855 sprintf(tmpStr,
"%s%d %d:%02d:%02d.%02ld", neg?
"-":
"", day.quot, hour.quot, min.quot,
859 tmpStr,
"%s%d %d:%02d:%02d", neg?
"-":
"", day.quot, hour.quot, min.quot, min.rem);
862 long int nsec = dt->tv_nsec / 10000000;
863 sprintf(tmpStr,
"%s%d:%02d:%02d.%02ld", neg?
"-":
"", hour.quot, min.quot, min.rem, nsec);
865 sprintf(tmpStr,
"%s%d:%02d:%02d", neg?
"-":
"", hour.quot, min.quot, min.rem);
868 strncpy(buf, tmpStr, bufsize);
869 buf[bufsize - 1] =
'\0';
871 return TIME__SUCCESS;
879 pwr_tTime* ts,
time_eFormat format,
char* buf,
int bufsize)
887 if (ts && notATime(ts)) {
888 strncpy(buf,
"NotATime", bufsize);
889 buf[bufsize - 1] =
'\0';
899 time_t sec = tp->tv_sec;
900 tmpTm = localtime(&sec);
904 buflen = strlen(buf);
911 sprintf(tmpStr,
".%02d", (
int)(tp->tv_nsec / 10000000));
912 if (strlen(tmpStr) + buflen < (
unsigned int)bufsize)
913 strcpy(&buf[buflen], tmpStr);
916 return TIME__SUCCESS;
932 int day, hour = 0, min, sec, hun = 0;
936 if ( streq( tstr,
"NotADeltaTime")) {
937 *ts = pwr_cNotADeltaTime;
938 return TIME__SUCCESS;
941 strncpy(buf, &tstr[1],
sizeof(buf) - 1);
945 strncpy(buf, tstr,
sizeof(buf) - 1);
946 buf[
sizeof(buf) - 1] =
'\0';
949 day = strtoul(sp, &dp, 10);
959 }
else if (*dp !=
' ')
966 hour = strtoul(sp, &dp, 10);
967 if (dp == NULL || *dp !=
':' || hour > 23)
972 min = strtoul(sp, &dp, 10);
973 if (dp == NULL || *dp !=
':' || min > 59)
977 sec = strtoul(sp, &dp, 10);
978 if ((dp && *dp && *dp !=
' ' && *dp !=
'.') || sec > 59)
981 if (dp && *dp ==
'.') {
982 hun = strtoul(dp + 1, &dp, 10);
983 if ((dp && *dp && *dp !=
' ') || hun > (10000000 - 1))
987 ts->tv_sec = day * 24 * 3600 + hour * 3600 + min * 60 + sec;
988 ts->tv_nsec = hun * 10000000;
990 ts->tv_sec = -ts->tv_sec;
991 ts->tv_nsec = -ts->tv_nsec;
994 return TIME__SUCCESS;
1007 if ( streq( tstr,
"NotATime")) {
1008 *ts = pwr_cNotATime;
1009 return TIME__SUCCESS;
1011 strncpy(buf, tstr,
sizeof(buf) - 1);
1012 buf[
sizeof(buf) - 1] =
'\0';
1014 if ((dotp = strchr(buf,
'.'))) {
1026 tmphs = strtoul(dotp, &cp, 0);
1037 ts->tv_sec = mktime(&tmpTm);
1038 if (ts->tv_sec == -1)
1040 ts->tv_nsec = tmphs * 10000000;
1041 return TIME__SUCCESS;
1047 struct tm* tmptr,
time_eFormat format,
char* buf,
int bufsize)
1052 if (
EVEN(sts = validateTm(tmptr)))
1056 strftime(buf, bufsize,
"%d-xxx-%Y %H:%M:%S", tmptr);
1057 strncpy(&buf[3], monStr[tmptr->tm_mon], 3);
1059 strftime(buf, bufsize,
"%d-%b-%Y %H:%M:%S", tmptr);
1061 strftime(buf, bufsize,
"%Y%m%d_%H%M%S", tmptr);
1063 strftime(buf, bufsize,
"%Y%m%d", tmptr);
1065 strftime(buf, bufsize,
"%y-%m-%d %H:%M:%S", tmptr);
1067 strftime(buf, bufsize,
"%Y-%m-%d %H:%M:%S", tmptr);
1069 strftime(buf, bufsize,
"%H:%M:%S %d/%m/%y", tmptr);
1071 strftime(buf, bufsize,
"%H:%M:%S", tmptr);
1074 return TIME__SUCCESS;
1088 if (tstr[5] ==
'-') {
1089 sscanf(tstr,
"%02d-%02d-%4d %02d:%02d:%02d", &tt.tm_mday, &tt.tm_mon,
1090 &tt.tm_year, &tt.tm_hour, &tt.tm_min, &tt.tm_sec);
1093 else if (tstr[4] ==
'-') {
1094 sscanf(tstr,
"%4d-%02d-%02d %02d:%02d:%02d", &tt.tm_year, &tt.tm_mon,
1095 &tt.tm_mday, &tt.tm_hour, &tt.tm_min, &tt.tm_sec);
1099 sscanf(tstr,
"%02d-%3c-%4d %02d:%02d:%02d", &tt.tm_mday, tmpMonStr,
1100 &tt.tm_year, &tt.tm_hour, &tt.tm_min, &tt.tm_sec);
1104 tmpMonStr[3] =
'\0';
1115 for (cp = tmpMonStr; *cp; cp++)
1119 for (i = 0; i < 12; i++) {
1120 if (streq(tmpMonStr, monStr[i])) {
1127 if (
EVEN(sts = validateTm(&tt)))
1132 return TIME__SUCCESS;
1138 const char* tstr,
short dissolution,
short formType, pwr_tTime* ts)
1149 char* cp = (
char*)tstr;
1152 while (*cp && isspace(*cp))
1156 for (i = 0; i < 4; i++, cp++) {
1157 if (*cp ==
'\0' || !isdigit(*cp))
1163 if (*cp ==
'\0' || *cp !=
'-')
1168 for (i = 0; i < 2; i++, cp++) {
1169 if (*cp ==
'\0' || !isdigit(*cp))
1174 month = atoi(buf) - 1;
1175 if (month < 0 || month > 11)
1177 if (*cp ==
'\0' || *cp !=
'-')
1182 for (i = 0; i < 2; i++, cp++) {
1183 if (*cp ==
'\0' || !isdigit(*cp))
1191 sprintf(buf,
"%02d-%s-%d%s", day, monStr[month], year, cp);
1193 if (dissolution == MINUTE) {
1195 }
else if (dissolution == HUNDRED) {
1196 if ((dotp = strchr(buf,
'.'))) {
1208 tmphs = strtoul(dotp, &cp, 0);
1220 ts->tv_sec = mktime(&tmpTm);
1221 ts->tv_nsec = tmphs * 10000000;
1222 return TIME__SUCCESS;
1227 void time_AtoFormAscii(
1228 pwr_tTime* ts,
short dissolution,
short formType,
char buf[],
int bufsize)
1233 pwr_tTime time, *tp;
1246 time_t sec = tp->tv_sec;
1247 tmpTm = localtime(&sec);
1249 switch (dissolution) {
1251 len = strftime(buf, bufsize,
"%Y-%m-%d %H:%M:%S", tmpTm);
1252 if (len != 0 && len + 4 <= bufsize) {
1253 sprintf(tmphs,
".%02d", (
int)(tp->tv_nsec / 10000000));
1259 strftime(buf, bufsize,
"%Y-%m-%d %H:%M", tmpTm);
1264 strftime(buf, bufsize,
"%Y-%m-%d %H:%M:%S", tmpTm);
1283 t->tv_sec = ms / 1000;
1284 t->tv_nsec = (ms % 1000) * 1000000;
1302 *t = pwr_cNotADeltaTime;
1307 t->tv_nsec = (f - t->tv_sec) * 1e9;
1325 *t = pwr_cNotADeltaTime;
1330 t->tv_nsec = (f - t->tv_sec) * 1e9;
1348 if (notADeltaTime(dt)) {
1353 *fp = 1e-9 * dt->tv_nsec + dt->tv_sec;
1368 if (notADeltaTime(dt)) {
1373 *fp = 1e-9 * dt->tv_nsec + dt->tv_sec;
1381 pwr_dStatus(sts, status, TIME__SUCCESS);
1383 return tp->tv_sec * 100 + tp->tv_nsec / 10000000;
1391 pwr_dStatus(sts, status, TIME__SUCCESS);
1396 tp->tv_sec = clock / 100;
1397 tp->tv_nsec = clock % 100 * 10000000;
1410 memset(tp, 0,
sizeof(*tp));
1415 void time_Sleep(
float time)
1421 ts.tv_sec = p_time.tv_sec;
1422 ts.tv_nsec = p_time.tv_nsec;
1423 nanosleep(&ts, NULL);
1432 sts = clock_gettime(CLOCK_REALTIME, &t);
1434 ts->tv_sec = t.tv_sec;
1435 ts->tv_nsec = t.tv_nsec;
1445 sts = clock_gettime(CLOCK_MONOTONIC, &t);
1447 ts->tv_sec = t.tv_sec;
1448 ts->tv_nsec = t.tv_nsec;
1454 pwr_tTime* time, pwr_tTime* from, pwr_tTime* to,
int previous)
1457 int days, month, year;
1459 time_t sec = time->tv_sec;
1461 tm = localtime(&sec);
1463 sec = time->tv_sec - (tm->tm_mday - 1) * ONEDAY;
1465 tm = localtime(&sec);
1474 year = tm->tm_year + 1900;
1476 if (tm->tm_mon == 0) {
1480 month = tm->tm_mon - 1;
1486 if ((year % 4 == 0 && year % 100 != 0) || (year + 1900) % 400 == 0)
1514 sec = t - (days - 1) * ONEDAY;
1516 sec = t + (days + 1) * ONEDAY;
1518 tm = localtime(&sec);
1543 static int time_PeriodYear(
1544 pwr_tTime* time, pwr_tTime* from, pwr_tTime* to,
int previous)
1549 time_t sec = time->tv_sec;
1551 tm = localtime(&sec);
1553 sec = time->tv_sec - (tm->tm_yday - 1) * ONEDAY;
1555 tm = localtime(&sec);
1565 year = tm->tm_year + 1900;
1569 if ((year % 4 == 0 && year % 100 != 0) || (year + 1900) % 400 == 0)
1587 sec = t - (days - 1) * ONEDAY;
1589 sec = t + (days + 1) * ONEDAY;
1591 tm = localtime(&sec);
1628 time_t sec = time->tv_sec;
1629 tm = localtime(&sec);
1630 if (tm->tm_wday == 0)
1633 days = tm->tm_wday + 6;
1638 t.tv_sec = mktime(tm);
1641 from->tv_sec = t.tv_sec - days * ONEDAY;
1645 to->tv_sec = t.tv_sec + (7 - days) * ONEDAY;
1657 time_t sec = time->tv_sec;
1658 tm = localtime(&sec);
1664 daybreak->tv_sec = mktime(tm);
1665 daybreak->tv_nsec = 0;
1668 static void time_PeriodSec(
1669 pwr_tTime* from, pwr_tTime* to, pwr_tTime* center,
int sec)
1675 to->tv_sec = center->tv_sec + sec / 2;
1676 to->tv_nsec = center->tv_nsec;
1679 from->tv_sec = to->tv_sec - sec;
1680 from->tv_nsec = to->tv_nsec;
1683 void time_Period(time_ePeriod period, pwr_tTime* from, pwr_tTime* to,
1684 pwr_tTime* center,
int daybreak)
1690 case time_ePeriod_OneSecond:
1692 time_Period(time_ePeriod_LastSecond, from, to, center, daybreak);
1695 time_PeriodSec(from, to, center, 1);
1697 case time_ePeriod_10Seconds:
1699 time_Period(time_ePeriod_10Seconds, from, to, center, daybreak);
1702 time_PeriodSec(from, to, center, 10);
1704 case time_ePeriod_OneMinute:
1706 time_Period(time_ePeriod_LastMinute, from, to, center, daybreak);
1709 time_PeriodSec(from, to, center, 60);
1711 case time_ePeriod_10Minutes:
1713 time_Period(time_ePeriod_Last10Minutes, from, to, center, daybreak);
1716 time_PeriodSec(from, to, center, 600);
1718 case time_ePeriod_OneHour:
1720 time_Period(time_ePeriod_LastHour, from, to, center, daybreak);
1723 time_PeriodSec(from, to, center, 3600);
1725 case time_ePeriod_OneDay:
1729 from->tv_sec -= ONEDAY;
1732 time_PeriodSec(from, to, center, ONEDAY);
1734 case time_ePeriod_OneWeek:
1736 time_Period(time_ePeriod_LastWeek, from, to, center, daybreak);
1739 time_PeriodSec(from, to, center, 7 * ONEDAY);
1741 case time_ePeriod_OneMonth:
1743 time_Period(time_ePeriod_LastMonth, from, to, center, daybreak);
1747 int middle = from->tv_sec + (to->tv_sec - from->tv_sec) / 2;
1748 int half = middle - from->tv_sec;
1749 if (center->tv_sec >= middle - ONEDAY / 2
1750 && center->tv_sec <= middle + ONEDAY / 2)
1753 if (center->tv_sec < middle) {
1756 middle = from->tv_sec + (to->tv_sec - from->tv_sec) / 2;
1757 half = middle - from->tv_sec;
1759 to->tv_sec = center->tv_sec + half;
1760 from->tv_sec = center->tv_sec - half;
1764 from->tv_sec = current.tv_sec - (to->tv_sec - from->tv_sec);
1765 from->tv_nsec = current.tv_sec;
1769 case time_ePeriod_LastSecond:
1771 from->tv_sec = to->tv_sec - 1;
1772 from->tv_nsec = to->tv_nsec;
1774 case time_ePeriod_Last10Seconds:
1776 from->tv_sec = to->tv_sec - 10;
1777 from->tv_nsec = to->tv_nsec;
1779 case time_ePeriod_LastMinute:
1781 from->tv_sec = to->tv_sec - 60;
1782 from->tv_nsec = to->tv_nsec;
1784 case time_ePeriod_Last10Minutes:
1786 from->tv_sec = to->tv_sec - 600;
1787 from->tv_nsec = to->tv_nsec;
1789 case time_ePeriod_LastHour:
1791 from->tv_sec = to->tv_sec - 3600;
1792 from->tv_nsec = to->tv_nsec;
1794 case time_ePeriod_Today:
1801 to->tv_sec += ONEDAY;
1805 case time_ePeriod_Yesterday:
1809 from->tv_sec = to->tv_sec - ONEDAY;
1812 case time_ePeriod_ThisWeek:
1819 to->tv_sec += ONEDAY;
1823 case time_ePeriod_LastWeek:
1828 case time_ePeriod_ThisMonth:
1835 to->tv_sec += ONEDAY;
1839 case time_ePeriod_LastMonth:
1844 case time_ePeriod_OneYear:
1845 case time_ePeriod_ThisYear:
1848 sts = time_PeriodYear(¤t, 0, from, 1);
1852 to->tv_sec += ONEDAY;
1862 to->tv_sec += ONEDAY;
1866 time_t sec = to->tv_sec;
1867 tm = localtime(&sec);
1874 from->tv_sec = mktime(tm);
1882 void time_PreviousPeriod(time_ePeriod period, pwr_tTime* prev_from,
1883 pwr_tTime* prev_to, pwr_tTime* from, pwr_tTime* to)
1886 case time_ePeriod_OneSecond:
1887 case time_ePeriod_LastSecond:
1888 *to = *from = *prev_from;
1890 if (from->tv_sec < 0) {
1895 case time_ePeriod_10Seconds:
1896 case time_ePeriod_Last10Seconds:
1897 *to = *from = *prev_from;
1899 if (from->tv_sec < 0) {
1904 case time_ePeriod_OneMinute:
1905 case time_ePeriod_LastMinute:
1906 *to = *from = *prev_from;
1908 if (from->tv_sec < 0) {
1913 case time_ePeriod_10Minutes:
1914 case time_ePeriod_Last10Minutes:
1915 *to = *from = *prev_from;
1916 from->tv_sec -= 600;
1917 if (from->tv_sec < 0) {
1922 case time_ePeriod_OneHour:
1923 case time_ePeriod_LastHour:
1924 *to = *from = *prev_from;
1925 from->tv_sec -= 3600;
1926 if (from->tv_sec < 0) {
1931 case time_ePeriod_OneDay:
1932 case time_ePeriod_Today:
1933 case time_ePeriod_Yesterday:
1934 *to = *from = *prev_from;
1935 from->tv_sec -= ONEDAY;
1936 if (from->tv_sec < 0) {
1938 to->tv_sec = ONEDAY;
1941 case time_ePeriod_OneWeek:
1942 case time_ePeriod_ThisWeek:
1943 case time_ePeriod_LastWeek:
1944 *to = *from = *prev_from;
1945 from->tv_sec -= ONEDAY * 7;
1946 if (from->tv_sec < 0) {
1948 to->tv_sec = ONEDAY * 7;
1951 case time_ePeriod_OneMonth:
1952 case time_ePeriod_ThisMonth:
1953 case time_ePeriod_LastMonth:
1955 from->tv_sec += prev_from->tv_sec - to->tv_sec;
1956 from->tv_nsec = prev_from->tv_nsec;
1958 if (from->tv_sec < 0) {
1960 to->tv_sec = ONEDAY * 30;
1963 case time_ePeriod_OneYear:
1964 case time_ePeriod_ThisYear:
1965 time_PeriodYear(prev_from, from, to, 1);
1966 from->tv_sec += prev_from->tv_sec - to->tv_sec;
1967 from->tv_nsec = prev_from->tv_nsec;
1969 if (from->tv_sec < 0) {
1971 to->tv_sec = ONEDAY * 365;
1974 case time_ePeriod_AllTime:
1975 time_Period(period, from, to, 0, 1);
1977 case time_ePeriod_UserDefined:
1979 *to = *from = *prev_from;
1980 from->tv_sec -= prev_to->tv_sec - prev_from->tv_sec;
1981 if (from->tv_sec < 0) {
1983 to->tv_sec = prev_to->tv_sec - prev_from->tv_sec;
1990 void time_NextPeriod(time_ePeriod period, pwr_tTime* prev_from,
1991 pwr_tTime* prev_to, pwr_tTime* from, pwr_tTime* to)
1999 case time_ePeriod_OneSecond:
2000 case time_ePeriod_LastSecond:
2001 *to = *from = *prev_to;
2005 from->tv_sec = current.tv_sec - 1;
2006 from->tv_nsec = current.tv_nsec;
2009 case time_ePeriod_10Seconds:
2010 case time_ePeriod_Last10Seconds:
2011 *to = *from = *prev_to;
2015 from->tv_sec = current.tv_sec - 10;
2016 from->tv_nsec = current.tv_nsec;
2019 case time_ePeriod_OneMinute:
2020 case time_ePeriod_LastMinute:
2021 *to = *from = *prev_to;
2025 from->tv_sec = current.tv_sec - 60;
2026 from->tv_nsec = current.tv_nsec;
2029 case time_ePeriod_10Minutes:
2030 case time_ePeriod_Last10Minutes:
2031 *to = *from = *prev_to;
2035 from->tv_sec = current.tv_sec - 600;
2036 from->tv_nsec = current.tv_nsec;
2039 case time_ePeriod_OneHour:
2040 case time_ePeriod_LastHour:
2041 *to = *from = *prev_to;
2045 from->tv_sec = current.tv_sec - 3600;
2046 from->tv_nsec = current.tv_nsec;
2049 case time_ePeriod_OneDay:
2050 case time_ePeriod_Today:
2051 case time_ePeriod_Yesterday:
2052 *to = *from = *prev_to;
2053 to->tv_sec += ONEDAY;
2056 from->tv_sec = current.tv_sec - ONEDAY;
2057 from->tv_nsec = current.tv_nsec;
2060 case time_ePeriod_OneWeek:
2061 case time_ePeriod_ThisWeek:
2062 case time_ePeriod_LastWeek:
2063 *to = *from = *prev_to;
2064 to->tv_sec += 7 * ONEDAY;
2067 from->tv_sec = current.tv_sec - 7 * ONEDAY;
2068 from->tv_nsec = current.tv_nsec;
2071 case time_ePeriod_OneMonth:
2072 case time_ePeriod_ThisMonth:
2073 case time_ePeriod_LastMonth:
2075 to->tv_sec += prev_to->tv_sec - from->tv_sec;
2079 from->tv_sec = current.tv_sec - 30 * ONEDAY;
2080 from->tv_nsec = current.tv_nsec;
2083 case time_ePeriod_OneYear:
2084 case time_ePeriod_ThisYear:
2085 time_PeriodYear(prev_to, from, to, 0);
2086 to->tv_sec += prev_to->tv_sec - from->tv_sec;
2090 from->tv_sec = current.tv_sec - 365 * ONEDAY;
2091 from->tv_nsec = current.tv_nsec;
2094 case time_ePeriod_AllTime:
2095 time_Period(period, from, to, 0, 1);
2097 case time_ePeriod_UserDefined:
2099 *to = *from = *prev_to;
2100 to->tv_sec += prev_to->tv_sec - prev_from->tv_sec;
2103 from->tv_sec = current.tv_sec - (prev_to->tv_sec - prev_from->tv_sec);
2104 from->tv_nsec = current.tv_nsec;
2111 int time_PeriodZoomIn(time_ePeriod* period)
2115 case time_ePeriod_Last10Seconds:
2116 case time_ePeriod_10Seconds:
2117 *period = time_ePeriod_OneSecond;
2119 case time_ePeriod_LastMinute:
2120 case time_ePeriod_OneMinute:
2121 *period = time_ePeriod_10Seconds;
2123 case time_ePeriod_Last10Minutes:
2124 case time_ePeriod_10Minutes:
2125 *period = time_ePeriod_OneMinute;
2127 case time_ePeriod_OneHour:
2128 case time_ePeriod_LastHour:
2129 *period = time_ePeriod_10Minutes;
2131 case time_ePeriod_Today:
2132 case time_ePeriod_Yesterday:
2133 case time_ePeriod_OneDay:
2134 *period = time_ePeriod_OneHour;
2136 case time_ePeriod_ThisWeek:
2137 case time_ePeriod_LastWeek:
2138 case time_ePeriod_OneWeek:
2139 *period = time_ePeriod_OneDay;
2141 case time_ePeriod_ThisMonth:
2142 case time_ePeriod_LastMonth:
2143 case time_ePeriod_OneMonth:
2144 *period = time_ePeriod_OneWeek;
2146 case time_ePeriod_ThisYear:
2147 case time_ePeriod_OneYear:
2148 *period = time_ePeriod_OneMonth;
2150 case time_ePeriod_AllTime:
2151 *period = time_ePeriod_OneYear;
2159 int time_PeriodZoomOut(time_ePeriod* period)
2164 case time_ePeriod_OneSecond:
2165 case time_ePeriod_LastSecond:
2166 *period = time_ePeriod_10Seconds;
2168 case time_ePeriod_Last10Seconds:
2169 case time_ePeriod_10Seconds:
2170 *period = time_ePeriod_OneMinute;
2172 case time_ePeriod_OneMinute:
2173 case time_ePeriod_LastMinute:
2174 *period = time_ePeriod_10Minutes;
2176 case time_ePeriod_Last10Minutes:
2177 case time_ePeriod_10Minutes:
2178 *period = time_ePeriod_OneHour;
2180 case time_ePeriod_OneHour:
2181 case time_ePeriod_LastHour:
2182 *period = time_ePeriod_OneDay;
2184 case time_ePeriod_Today:
2185 case time_ePeriod_Yesterday:
2186 case time_ePeriod_OneDay:
2187 *period = time_ePeriod_OneWeek;
2189 case time_ePeriod_ThisWeek:
2190 case time_ePeriod_LastWeek:
2191 case time_ePeriod_OneWeek:
2192 *period = time_ePeriod_OneMonth;
2194 case time_ePeriod_ThisMonth:
2195 case time_ePeriod_LastMonth:
2196 case time_ePeriod_OneMonth:
2197 *period = time_ePeriod_OneYear;
2199 case time_ePeriod_ThisYear:
2200 case time_ePeriod_OneYear:
2201 *period = time_ePeriod_AllTime;
2216 return printf(format, timstr);
int time_PeriodMonth(pwr_tTime *time, pwr_tTime *from, pwr_tTime *to, int previous)
Calculate start and end time for month.
Include file for Time management.
time_eFormat
Time string format.
@ time_eFormat_NumDateAndTime
Date and time format, 2005-01-01 00:00:00.
@ time_eFormat_ComprDateAndTime
Date and time compressed format, 70-01-01 00:00:00.
@ time_eFormat_TimeAndDate
Time and date format, 01:00:00 30/01/87.
@ time_eFormat_FileDateAndTime
Date and time format, 20050101_000000.
@ time_eFormat_DateAndTime
Display date and time, 01-JAN-1970 01:00:00.00.
@ time_eFormat_FileDate
Date format, 20050101.
@ time_eFormat_DateAndTimeLoc
Display date and time with local month.
pwr_tStatus time_AsciiToA(const char *tstr, pwr_tTime *ts)
Convert ascii time to timespec.
pwr_tDeltaTime * time_Float64ToD(pwr_tDeltaTime *dt, pwr_tFloat64 f)
Convert double to time.
int time_IsNull(pwr_tTime *t1)
Test if time is Null.
pwr_tDeltaTime * time_ClockToD(pwr_tStatus *status, pwr_tDeltaTime *tp, time_tClock clock)
Convert clock time to delta time.
pwr_tStatus time_AsciiToD(const char *tstr, pwr_tDeltaTime *ts)
Convert ascii to timespec.
pwr_tDeltaTime * time_Dneg(pwr_tDeltaTime *result, pwr_tDeltaTime *t)
Negate a delta time,.
pwr_tDeltaTime * time_FloatToD(pwr_tDeltaTime *dt, pwr_tFloat32 f)
Convert float to time.
pwr_tStatus time_DtoAscii(pwr_tDeltaTime *dt, int hundreds, char *buf, int bufsize)
Convert a delta time to ascii string.
int time_GetTimeMonotonic(pwr_tTime *ts)
Get current monotonic time.
pwr_tDeltaTime * time_Dadd(pwr_tDeltaTime *result, pwr_tDeltaTime *t, pwr_tDeltaTime *a)
Add two delta times, the result is also delta.
int time_GetTime(pwr_tTime *ts)
Get current time.
pwr_tDeltaTime * time_Dsub(pwr_tDeltaTime *result, pwr_tDeltaTime *t, pwr_tDeltaTime *s)
Subtract two delta times.
pwr_tTime * time_Aadd_NE(pwr_tTime *result, pwr_tTime *t, pwr_tDeltaTime *a)
Add an absolute time and a delta time.
pwr_tStatus time_AsciiToTm(const char *tstr, struct tm *tmptr)
Convert timestring to struct.
pwr_tDeltaTime * time_ZeroD(pwr_tDeltaTime *tp)
Zero a delta time.
int time_PeriodPreviousWeek(pwr_tTime *time, pwr_tTime *from, pwr_tTime *to)
Calculate start and end time for previous week.
time_tClock time_DtoClock(pwr_tStatus *status, pwr_tDeltaTime *tp)
Convert delta time to clock time.
int time_Dcomp(pwr_tDeltaTime *t1, pwr_tDeltaTime *t2)
Compare two delta times.
pwr_tDeltaTime * time_Dabs_NE(pwr_tDeltaTime *result, pwr_tDeltaTime *t)
Take the absolute walue of a delta time.
pwr_tDeltaTime * time_MsToD(pwr_tDeltaTime *dt, pwr_tInt32 ms)
Convert millisec to timespec.
pwr_tDeltaTime * time_Dadd_NE(pwr_tDeltaTime *result, pwr_tDeltaTime *t, pwr_tDeltaTime *a)
Add two delta times, the result is also delta.
int time_PrintA(const char *format, pwr_tTime *ts)
Print an absolute time. The format should contain s.
pwr_tTime * time_Asub(pwr_tTime *result, pwr_tTime *t, pwr_tDeltaTime *s)
Subtract a delta time from a time,.
void time_PreviousDayBreak(pwr_tTime *time, pwr_tTime *daybreak)
Calculate previous daybreak.
int time_Acomp_NE(pwr_tTime *t1, pwr_tTime *t2)
Compare two timespecs.
char * time_GetTimeAscii(time_eFormat format)
Get current time in ascii.
pwr_tDeltaTime * time_Adiff_NE(pwr_tDeltaTime *r, pwr_tTime *t, pwr_tTime *s)
Subtract a time from a time,.
pwr_tStatus time_AtoAscii(pwr_tTime *ts, time_eFormat format, char *buf, int bufsize)
Convert timespec to ascii.
pwr_tFloat64 time_DToFloat64(pwr_tFloat64 *f, pwr_tDeltaTime *dt)
Convert time to Float64.
pwr_tDeltaTime * time_Dabs(pwr_tDeltaTime *result, pwr_tDeltaTime *t)
Take the absolute walue of a delta time.
int time_Acomp(pwr_tTime *t1, pwr_tTime *t2)
Compare two timespecs.
int time_Dcomp_NE(pwr_tDeltaTime *t1, pwr_tDeltaTime *t2)
Compare two delta times.
pwr_tDeltaTime * time_Adiff(pwr_tDeltaTime *r, pwr_tTime *t, pwr_tTime *s)
Subtract a time from a time,.
pwr_tDeltaTime * time_Dsub_NE(pwr_tDeltaTime *result, pwr_tDeltaTime *t, pwr_tDeltaTime *s)
Subtract two delta times.
pwr_tFloat32 time_DToFloat(pwr_tFloat32 *f, pwr_tDeltaTime *dt)
Convert time to Float32.
pwr_tStatus time_TmToAscii(struct tm *tmptr, time_eFormat format, char *buf, int bufsize)
Convert time struct to string.
pwr_tFloat32 time_AdiffToFloat(pwr_tTime *t, pwr_tTime *s)
Subtract a time from a time and return the differens.
pwr_tTime * time_Asub_NE(pwr_tTime *result, pwr_tTime *t, pwr_tDeltaTime *s)
Subtract a delta time from a time,.
pwr_tTime * time_Aadd(pwr_tTime *result, pwr_tTime *t, pwr_tDeltaTime *a)
Add an absolute time and a delta time.
pwr_tDeltaTime * time_Dneg_NE(pwr_tDeltaTime *result, pwr_tDeltaTime *t)
Negate a delta time,.
#define EVEN(a)
Check if value is even.
double pwr_tFloat64
64-bit float.
int pwr_tInt32
32-bit integer type.
int pwr_tStatus
Status type.
float pwr_tFloat32
32-bit float.