static uint32_t counter;
static uint32_t reference_timestamp;
static double next_tick_time;
-static double rtc_start_time;
#define WATCH_RTC_N_COMP_CB 8
}
rtc_counter_t watch_rtc_get_counter(void) {
- if (!counter_interval) {
- return counter; // RTC not running
- }
-
- // Calculate current counter from high-precision time
- double now = EM_ASM_DOUBLE({ return performance.now(); });
- double elapsed_ms = now - rtc_start_time;
-
- // Convert elapsed time to RTC ticks (RTC_CNT_HZ = 128 Hz)
- double elapsed_ticks = (elapsed_ms * RTC_CNT_HZ) / 1000.0;
-
- return (rtc_counter_t)elapsed_ticks;
+ return counter;
}
uint32_t watch_rtc_get_frequency(void) {
if (!counter_interval) return;
double now = EM_ASM_DOUBLE({ return performance.now(); });
- double drift = now - next_tick_time;
// Target interval in ms
double ms = 1000.0 / (double)RTC_CNT_HZ;
next_tick_time += ms;
double delay = next_tick_time - now;
- // Ensure we don't schedule negative or zero delays
- if (delay < 0.1) {
- delay = 0.1;
- next_tick_time = now + delay;
+ // If we're behind, schedule immediately
+ if (delay < 0) {
+ delay = 0;
}
- emscripten_async_call(_watch_increase_counter, NULL, (int)delay);
+ emscripten_async_call(_watch_increase_counter, NULL, delay);
}
static void _watch_increase_counter(void *userData) {
if (en) {
// Use drift-correcting timer instead of fixed setInterval
counter_interval = 1; // Non-zero to indicate enabled
- rtc_start_time = EM_ASM_DOUBLE({ return performance.now(); });
- next_tick_time = rtc_start_time;
- counter = 0;
+ next_tick_time = EM_ASM_DOUBLE({ return performance.now(); });
_watch_schedule_next_tick();
} else {
counter_interval = 0;