Skip to content

Commit 92b9b90

Browse files
authored
Merge pull request #58 from Zondax/timeutils
Timeutils
2 parents bb075d8 + 57126f2 commit 92b9b90

3 files changed

Lines changed: 46 additions & 69 deletions

File tree

include/timeutils.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,16 @@ typedef struct {
6262
uint16_t tm_day;
6363
uint8_t tm_mon;
6464
uint16_t tm_year;
65-
char *monthName;
65+
const char *monthName;
6666
} timedata_t;
6767

6868
zxerr_t printTime(char *out, uint16_t outLen, uint64_t t);
6969
zxerr_t printTimeSpecialFormat(char *out, uint16_t outLen, uint64_t t);
7070
zxerr_t decodeTime(timedata_t *timedata, uint64_t t);
7171

72+
// Convert seconds since epoch to UTC date
73+
zxerr_t extractTime(uint64_t time, timedata_t *date);
74+
7275
#ifdef __cplusplus
7376
}
7477
#endif

include/zxversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@
1717

1818
#define ZXLIB_MAJOR 16
1919
#define ZXLIB_MINOR 0
20-
#define ZXLIB_PATCH 8
20+
#define ZXLIB_PATCH 9

src/timeutils.c

Lines changed: 41 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -444,109 +444,83 @@ const uint32_t yearLookup[] = {
444444
// ARM does not implement gmtime. This is a simple alternative implementation
445445
// based on section 4.16
446446
// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html
447-
static zxerr_t extractTime(uint64_t t, uint8_t *sec, uint8_t *min, uint8_t *hour,
448-
uint16_t *day, uint8_t *month, uint16_t *year) {
449-
450-
uint8_t tm_sec;
451-
uint8_t tm_min;
452-
uint8_t tm_hour;
453-
uint16_t tm_day;
454-
uint8_t tm_mon;
455-
uint16_t tm_year;
447+
zxerr_t extractTime(uint64_t time, timedata_t *date) {
448+
if (date == NULL) {
449+
return zxerr_no_data;
450+
}
451+
MEMZERO(date, sizeof(timedata_t));
456452

457-
tm_sec = (uint8_t) (t % 60);
458-
t -= tm_sec;
459-
t /= 60;
453+
date->tm_sec = (uint8_t) (time % 60);
454+
time -= date->tm_sec;
455+
time /= 60;
460456

461-
tm_min = (uint8_t) (t % 60);
462-
t -= tm_min;
463-
t /= 60;
457+
date->tm_min = (uint8_t) (time % 60);
458+
time -= date->tm_min;
459+
time /= 60;
464460

465-
tm_hour = (uint8_t) (t % 24);
466-
t -= tm_hour;
467-
t /= 24;
461+
date->tm_hour = (uint8_t) (time % 24);
462+
time -= date->tm_hour;
463+
time /= 24;
468464

469465
// Look up tm_year
470-
tm_year = 0;
466+
date->tm_year = 0;
471467
const uint16_t yearLookupSize = sizeof(yearLookup)/sizeof(yearLookup[0]);
472-
while (tm_year < yearLookupSize && yearLookup[tm_year] <= t) tm_year++;
468+
while (date->tm_year < yearLookupSize && yearLookup[date->tm_year] <= time) date->tm_year++;
473469

474-
if (tm_year == 0 || tm_year == yearLookupSize) {
470+
if (date->tm_year == 0 || date->tm_year == yearLookupSize) {
475471
return zxerr_out_of_bounds;
476472
}
477-
tm_year--;
473+
date->tm_year--;
478474

479-
tm_day = (uint16_t) (t - yearLookup[tm_year] + 1);
480-
tm_year = (uint16_t) (1970 + tm_year);
475+
date->tm_day = (uint16_t) (time - yearLookup[date->tm_year] + 1);
476+
date->tm_year = (uint16_t) (1970 + date->tm_year);
481477

482478
// Get day/month
483-
uint8_t leap = (uint8_t) (tm_year % 4 == 0 && (tm_year % 100 != 0 || tm_year % 400 == 0) ? 1 : 0);
479+
uint8_t leap = (uint8_t) (date->tm_year % 4 == 0 && (date->tm_year % 100 != 0 || date->tm_year % 400 == 0) ? 1 : 0);
484480

485-
for (tm_mon = 0; tm_mon < 12; tm_mon++) {
486-
uint8_t tmp = monthDays[tm_mon];
487-
tmp += (tm_mon == 1 ? leap : 0);
488-
if (tm_day <= tmp) {
481+
for (date->tm_mon = 0; date->tm_mon < 12; date->tm_mon++) {
482+
uint8_t tmp = monthDays[date->tm_mon];
483+
tmp += (date->tm_mon == 1 ? leap : 0);
484+
if (date->tm_day <= tmp) {
489485
break;
490486
}
491-
tm_day -= tmp;
487+
date->tm_day -= tmp;
492488
}
493-
tm_mon++;
494-
495-
*sec = tm_sec;
496-
*min = tm_min;
497-
*hour = tm_hour;
498-
*day = tm_day;
499-
*month = tm_mon;
500-
*year = tm_year;
489+
date->tm_mon++;
490+
date->monthName = getMonth(date->tm_mon);
501491

502492
return zxerr_ok;
503493
}
504494

505495
zxerr_t decodeTime(timedata_t* td, uint64_t t) {
506-
CHECK_ZXERR(extractTime(t, &td->tm_sec, &td->tm_min, &td->tm_hour,
507-
&td->tm_day, &td->tm_mon, &td->tm_year))
508-
td->monthName = (char*) getMonth(td->tm_mon);
509-
return zxerr_ok;
496+
return extractTime(t, td);
510497
}
511498

512499
zxerr_t printTime(char *out, uint16_t outLen, uint64_t t) {
513-
uint8_t tm_sec;
514-
uint8_t tm_min;
515-
uint8_t tm_hour;
516-
uint16_t tm_day;
517-
uint8_t tm_mon;
518-
uint16_t tm_year;
519-
520-
CHECK_ZXERR(extractTime(t, &tm_sec, &tm_min, &tm_hour, &tm_day, &tm_mon, &tm_year))
521-
const char *monthName = getMonth(tm_mon);
500+
timedata_t date;
501+
CHECK_ZXERR(extractTime(t, &date))
522502

523503
// YYYYmmdd HH:MM:SS
524504
snprintf(out, outLen, "%02d%s%04d %02d:%02d:%02dUTC",
525-
tm_day,
526-
monthName,
527-
tm_year,
528-
tm_hour, tm_min, tm_sec
505+
date.tm_day,
506+
date.monthName,
507+
date.tm_year,
508+
date.tm_hour, date.tm_min, date.tm_sec
529509
);
530510

531511
return zxerr_ok;
532512
}
533513

534514
zxerr_t printTimeSpecialFormat(char *out, uint16_t outLen, uint64_t t) {
535-
uint8_t tm_sec;
536-
uint8_t tm_min;
537-
uint8_t tm_hour;
538-
uint16_t tm_day;
539-
uint8_t tm_mon;
540-
uint16_t tm_year;
541-
542-
CHECK_ZXERR(extractTime(t, &tm_sec, &tm_min, &tm_hour, &tm_day, &tm_mon, &tm_year))
515+
timedata_t date;
516+
CHECK_ZXERR(extractTime(t, &date))
543517

544518
// YYYYmmdd HH:MM:SS
545519
snprintf(out, outLen, "%d-%02d-%02dT%02d:%02d:%02dZ",
546-
tm_year,
547-
tm_mon,
548-
tm_day,
549-
tm_hour, tm_min, tm_sec
520+
date.tm_year,
521+
date.tm_mon,
522+
date.tm_day,
523+
date.tm_hour, date.tm_min, date.tm_sec
550524
);
551525

552526
return zxerr_ok;

0 commit comments

Comments
 (0)