diff options
author | Joey Castillo <joeycastillo@utexas.edu> | 2022-01-27 14:28:46 -0500 |
---|---|---|
committer | Joey Castillo <joeycastillo@utexas.edu> | 2022-01-27 14:28:46 -0500 |
commit | 5fb8dabdd2b557450886fa447c081209b2a3b74d (patch) | |
tree | 694472c653ff081233db69cdfdbc393938b48f5c /watch-library/simulator/main.c | |
parent | 45aa04f4acda9d4e67eedef84bb2b8e87994f999 (diff) | |
parent | d3e484dc989a6e3a040b5b1092340973d9b4e22f (diff) | |
download | Sensor-Watch-5fb8dabdd2b557450886fa447c081209b2a3b74d.tar.gz Sensor-Watch-5fb8dabdd2b557450886fa447c081209b2a3b74d.tar.bz2 Sensor-Watch-5fb8dabdd2b557450886fa447c081209b2a3b74d.zip |
Merge branch 'main' of github.com:joeycastillo/Sensor-Watch into main
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) { |