Skip to content

Commit c0a6538

Browse files
feat: stop event loop on back button
1 parent b331f23 commit c0a6538

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

applications/system/js_app/modules/js_event_loop.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,18 @@ typedef struct {
3030

3131
ARRAY_DEF(SubscriptionArray, JsEventLoopSubscription*, M_PTR_OPLIST); //-V575
3232

33+
typedef struct {
34+
FuriEventLoop* loop;
35+
struct mjs* mjs;
36+
} JsEventLoopTickContext;
37+
3338
/**
3439
* @brief Per-module instance control structure
3540
*/
3641
typedef struct {
3742
FuriEventLoop* loop;
3843
SubscriptionArray_t subscriptions;
44+
JsEventLoopTickContext* tick_context;
3945
} JsEventLoop;
4046

4147
/**
@@ -166,7 +172,7 @@ static void js_event_loop_subscribe(struct mjs* mjs) {
166172
FuriEventLoopTimer* timer = furi_event_loop_timer_alloc(
167173
module->loop, js_event_loop_callback_generic, contract->timer_type, context);
168174
furi_event_loop_timer_start(timer, contract->interval_ticks);
169-
subscription->object = contract->object = timer;
175+
contract->object = timer;
170176
} break;
171177
case JsEventLoopObjectTypeSemaphore: {
172178
FuriSemaphore* semaphore = contract->object;
@@ -177,6 +183,7 @@ static void js_event_loop_subscribe(struct mjs* mjs) {
177183
furi_crash("unimplemented");
178184
}
179185

186+
subscription->object = contract->object;
180187
SubscriptionArray_push_back(module->subscriptions, subscription);
181188
mjs_return(mjs, subscription_obj);
182189
}
@@ -231,10 +238,27 @@ static void js_event_loop_timer(struct mjs* mjs) {
231238

232239
// TODO: integrate with other modules
233240

241+
static void js_event_loop_tick(void* param) {
242+
JsEventLoopTickContext* context = param;
243+
uint32_t flags = furi_thread_flags_wait(ThreadEventStop, FuriFlagWaitAny | FuriFlagNoClear, 0);
244+
if(flags & FuriFlagError) {
245+
return;
246+
}
247+
if(flags & ThreadEventStop) {
248+
furi_event_loop_stop(context->loop);
249+
mjs_exit(context->mjs);
250+
}
251+
}
252+
234253
static void* js_event_loop_create(struct mjs* mjs, mjs_val_t* object) {
235254
mjs_val_t event_loop_obj = mjs_mk_object(mjs);
236255
JsEventLoop* module = malloc(sizeof(JsEventLoop));
256+
JsEventLoopTickContext* tick_ctx = malloc(sizeof(JsEventLoopTickContext));
237257
module->loop = furi_event_loop_alloc();
258+
tick_ctx->loop = module->loop;
259+
tick_ctx->mjs = mjs;
260+
module->tick_context = tick_ctx;
261+
furi_event_loop_tick_set(module->loop, 10, js_event_loop_tick, tick_ctx);
238262
SubscriptionArray_init(module->subscriptions);
239263

240264
mjs_set(mjs, event_loop_obj, INST_PROP_NAME, ~0, mjs_mk_foreign(mjs, module));
@@ -260,6 +284,7 @@ static void js_event_loop_destroy(void* inst) {
260284

261285
furi_event_loop_free(module->loop);
262286
SubscriptionArray_clear(module->subscriptions);
287+
free(module->tick_context);
263288
free(module);
264289
}
265290

0 commit comments

Comments
 (0)