diff options
Diffstat (limited to 'watch-library/simulator/watch/watch_rtc.c')
-rw-r--r-- | watch-library/simulator/watch/watch_rtc.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/watch-library/simulator/watch/watch_rtc.c b/watch-library/simulator/watch/watch_rtc.c index 573c0ff2..1fe6a78b 100644 --- a/watch-library/simulator/watch/watch_rtc.c +++ b/watch-library/simulator/watch/watch_rtc.c @@ -23,15 +23,16 @@ */ #include "watch_rtc.h" +#include "watch_main_loop.h" #include <emscripten.h> #include <emscripten/html5.h> static double time_offset = 0; -static long tick_callbacks[8]; +static long tick_callbacks[8] = { -1, -1, -1, -1, -1, -1, -1, -1 }; -static long alarm_interval_id; -static long alarm_timeout_id; +static long alarm_interval_id = -1; +static long alarm_timeout_id = -1; static double alarm_interval; ext_irq_cb_t alarm_callback; ext_irq_cb_t btn_alarm_callback; @@ -83,8 +84,6 @@ void watch_rtc_disable_tick_callback(void) { static void watch_invoke_periodic_callback(void *userData) { ext_irq_cb_t callback = userData; callback(); - - void resume_main_loop(void); resume_main_loop(); } @@ -100,32 +99,34 @@ void watch_rtc_register_periodic_callback(ext_irq_cb_t callback, uint8_t frequen // this also maps nicely to an index for our list of tick callbacks. double interval = 1000 / frequency; // in msec + + if (tick_callbacks[per_n] != -1) emscripten_clear_interval(tick_callbacks[per_n]); tick_callbacks[per_n] = emscripten_set_interval(watch_invoke_periodic_callback, interval, (void *)callback); } void watch_rtc_disable_periodic_callback(uint8_t frequency) { if (__builtin_popcount(frequency) != 1) return; uint8_t per_n = __builtin_clz(frequency << 24); - emscripten_clear_interval(tick_callbacks[per_n]); - tick_callbacks[per_n] = 0; + if (tick_callbacks[per_n] != -1) { + emscripten_clear_interval(tick_callbacks[per_n]); + tick_callbacks[per_n] = -1; + } } void watch_rtc_disable_all_periodic_callbacks(void) { for (int i = 0; i < 8; i++) { - if (tick_callbacks[i] != 0) { + if (tick_callbacks[i] != -1) { emscripten_clear_interval(tick_callbacks[i]); - tick_callbacks[i] = 0; + tick_callbacks[i] = -1; } } } static void watch_invoke_alarm_interval_callback(void *userData) { - (void)userData; if (alarm_callback) alarm_callback(); } static void watch_invoke_alarm_callback(void *userData) { - (void)userData; if (alarm_callback) alarm_callback(); alarm_interval_id = emscripten_set_interval(watch_invoke_alarm_interval_callback, alarm_interval, NULL); } @@ -182,14 +183,14 @@ void watch_rtc_disable_alarm_callback(void) { alarm_callback = NULL; alarm_interval = 0; - if (alarm_timeout_id) { + if (alarm_timeout_id != -1) { emscripten_clear_timeout(alarm_timeout_id); - alarm_timeout_id = 0; + alarm_timeout_id = -1; } - if (alarm_interval_id) { + if (alarm_interval_id != -1) { emscripten_clear_interval(alarm_interval_id); - alarm_interval_id = 0; + alarm_interval_id = -1; } } |