summaryrefslogtreecommitdiffstats
path: root/watch-library/simulator/main.c
diff options
context:
space:
mode:
authorJoey Castillo <joeycastillo@utexas.edu>2022-01-27 14:28:46 -0500
committerJoey Castillo <joeycastillo@utexas.edu>2022-01-27 14:28:46 -0500
commit5fb8dabdd2b557450886fa447c081209b2a3b74d (patch)
tree694472c653ff081233db69cdfdbc393938b48f5c /watch-library/simulator/main.c
parent45aa04f4acda9d4e67eedef84bb2b8e87994f999 (diff)
parentd3e484dc989a6e3a040b5b1092340973d9b4e22f (diff)
downloadSensor-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.c58
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) {