summaryrefslogtreecommitdiffstats
path: root/watch-library/simulator/watch/watch_rtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'watch-library/simulator/watch/watch_rtc.c')
-rw-r--r--watch-library/simulator/watch/watch_rtc.c31
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;
}
}