diff options
author | joeycastillo <joeycastillo@utexas.edu> | 2022-01-27 12:02:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-27 12:02:51 -0500 |
commit | d3e484dc989a6e3a040b5b1092340973d9b4e22f (patch) | |
tree | 0897cde67b16c6c3e33345b98381164499416c1a /watch-library/simulator/main.c | |
parent | 14e4562b7a44ab6882180b69145665d4920769ac (diff) | |
parent | cb8223217b9fbcb705677dad890b35a467a44e75 (diff) | |
download | Sensor-Watch-d3e484dc989a6e3a040b5b1092340973d9b4e22f.tar.gz Sensor-Watch-d3e484dc989a6e3a040b5b1092340973d9b4e22f.tar.bz2 Sensor-Watch-d3e484dc989a6e3a040b5b1092340973d9b4e22f.zip |
Merge pull request #45 from a2/simulator-buzzer
Implement buzzer methods with AudioContext API
Diffstat (limited to 'watch-library/simulator/main.c')
-rw-r--r-- | watch-library/simulator/main.c | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/watch-library/simulator/main.c b/watch-library/simulator/main.c index 5596bf82..14bf44e6 100644 --- a/watch-library/simulator/main.c +++ b/watch-library/simulator/main.c @@ -24,37 +24,81 @@ #include <stdio.h> #include "watch.h" +#include "watch_main_loop.h" #include <emscripten.h> #include <emscripten/html5.h> +#define ANIMATION_FRAME_ID_IS_VALID(id) ((id) >= 0) +#define ANIMATION_FRAME_ID_INVALID (-1) +#define ANIMATION_FRAME_ID_SUSPENDED (-2) + static bool sleeping = true; +static volatile long animation_frame_id = ANIMATION_FRAME_ID_INVALID; + +// make compiler happy +static void main_loop_set_sleeping(bool sleeping); +static EM_BOOL main_loop(double time, void *userData); + +static inline void request_next_frame(void) { + if (animation_frame_id == ANIMATION_FRAME_ID_INVALID) { + animation_frame_id = emscripten_request_animation_frame(main_loop, NULL); + } +} static EM_BOOL main_loop(double time, void *userData) { + if (main_loop_is_sleeping()) { + request_next_frame(); + return EM_FALSE; + } + if (sleeping) { sleeping = false; app_wake_from_standby(); } + animation_frame_id = ANIMATION_FRAME_ID_INVALID; bool can_sleep = app_loop(); if (can_sleep) { app_prepare_for_standby(); sleeping = true; + animation_frame_id = ANIMATION_FRAME_ID_INVALID; return EM_FALSE; } - return EM_TRUE; + request_next_frame(); + return EM_FALSE; } -// make compiler happy -void resume_main_loop(void); - -EMSCRIPTEN_KEEPALIVE void resume_main_loop(void) { - if (sleeping) { - emscripten_request_animation_frame_loop(main_loop, NULL); + if (!ANIMATION_FRAME_ID_IS_VALID(animation_frame_id)) { + animation_frame_id = emscripten_request_animation_frame(main_loop, NULL); + } +} + +void suspend_main_loop(void) { + if (ANIMATION_FRAME_ID_IS_VALID(animation_frame_id)) { + emscripten_cancel_animation_frame(animation_frame_id); } + + animation_frame_id = ANIMATION_FRAME_ID_SUSPENDED; +} + +void main_loop_sleep(uint32_t ms) { + main_loop_set_sleeping(true); + emscripten_sleep(ms); + main_loop_set_sleeping(false); +} + +bool main_loop_is_sleeping(void) { + return EM_ASM_INT({ return Module['suspended']; }) != 0; +} + +static void main_loop_set_sleeping(bool sleeping) { + EM_ASM({ + Module['suspended'] = $0; + }, sleeping); } int main(void) { |