OpenModem/util/time.h

78 lines
1.6 KiB
C
Raw Normal View History

2014-12-02 19:10:06 -05:00
#ifndef UTIL_TIME_H
#define UTIL_TIME_H
2014-12-18 17:45:36 -05:00
#include <util/atomic.h>
#include "hardware/AFSK.h"
2019-01-27 14:25:11 -05:00
#include "hardware/LED.h"
#include "hardware/sdcard/diskio.h"
2014-12-02 19:10:06 -05:00
#define UNIX_EPOCH_OFFSET 946684800
2014-12-02 19:10:06 -05:00
#define DIV_ROUND(dividend, divisor) (((dividend) + (divisor) / 2) / (divisor))
2019-01-12 10:30:26 -05:00
typedef int32_t ticks_t;
typedef int32_t mtime_t;
volatile ticks_t _clock;
2014-12-02 19:10:06 -05:00
volatile uint32_t _rtc_seconds;
volatile uint16_t _rtc_seconds_accu;
2019-01-12 10:30:26 -05:00
static inline ticks_t timer_clock(void) {
ticks_t result;
2014-12-02 19:10:06 -05:00
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
result = _clock;
}
return result;
}
2019-01-12 10:30:26 -05:00
inline ticks_t ms_to_ticks(mtime_t ms) {
2014-12-02 19:10:06 -05:00
return ms * DIV_ROUND(CLOCK_TICKS_PER_SEC, 1000);
}
inline mtime_t ticks_to_ms(ticks_t ticks) {
return DIV_ROUND(ticks, DIV_ROUND(CLOCK_TICKS_PER_SEC, 1000));
}
static inline uint32_t rtc_seconds(void) {
uint32_t result;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
result = _rtc_seconds;
}
return result;
}
static inline uint32_t rtc_unix_timestamp(void) {
uint32_t result;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
result = _rtc_seconds;
}
return result+UNIX_EPOCH_OFFSET;
}
static inline mtime_t rtc_milliseconds(void) {
return ticks_to_ms(timer_clock() % CLOCK_TICKS_PER_SEC);
}
static inline void rtc_set_seconds(uint32_t seconds) {
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
_rtc_seconds = seconds;
}
}
2014-12-02 19:10:06 -05:00
inline void cpu_relax(void) {
// Do nothing!
}
2015-10-02 17:44:24 -04:00
static inline void delay_ms(unsigned long ms) {
2014-12-18 17:45:36 -05:00
ticks_t start = timer_clock();
unsigned long n_ticks = ms_to_ticks(ms);
while (timer_clock() - start < n_ticks) {
cpu_relax();
}
}
2019-01-12 10:30:26 -05:00
#endif