@@ -30,12 +30,18 @@ typedef struct {
30
30
31
31
ARRAY_DEF (SubscriptionArray , JsEventLoopSubscription * , M_PTR_OPLIST ); //-V575
32
32
33
+ typedef struct {
34
+ FuriEventLoop * loop ;
35
+ struct mjs * mjs ;
36
+ } JsEventLoopTickContext ;
37
+
33
38
/**
34
39
* @brief Per-module instance control structure
35
40
*/
36
41
typedef struct {
37
42
FuriEventLoop * loop ;
38
43
SubscriptionArray_t subscriptions ;
44
+ JsEventLoopTickContext * tick_context ;
39
45
} JsEventLoop ;
40
46
41
47
/**
@@ -166,7 +172,7 @@ static void js_event_loop_subscribe(struct mjs* mjs) {
166
172
FuriEventLoopTimer * timer = furi_event_loop_timer_alloc (
167
173
module -> loop , js_event_loop_callback_generic , contract -> timer_type , context );
168
174
furi_event_loop_timer_start (timer , contract -> interval_ticks );
169
- subscription -> object = contract -> object = timer ;
175
+ contract -> object = timer ;
170
176
} break ;
171
177
case JsEventLoopObjectTypeSemaphore : {
172
178
FuriSemaphore * semaphore = contract -> object ;
@@ -177,6 +183,7 @@ static void js_event_loop_subscribe(struct mjs* mjs) {
177
183
furi_crash ("unimplemented" );
178
184
}
179
185
186
+ subscription -> object = contract -> object ;
180
187
SubscriptionArray_push_back (module -> subscriptions , subscription );
181
188
mjs_return (mjs , subscription_obj );
182
189
}
@@ -231,10 +238,27 @@ static void js_event_loop_timer(struct mjs* mjs) {
231
238
232
239
// TODO: integrate with other modules
233
240
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
+
234
253
static void * js_event_loop_create (struct mjs * mjs , mjs_val_t * object ) {
235
254
mjs_val_t event_loop_obj = mjs_mk_object (mjs );
236
255
JsEventLoop * module = malloc (sizeof (JsEventLoop ));
256
+ JsEventLoopTickContext * tick_ctx = malloc (sizeof (JsEventLoopTickContext ));
237
257
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 );
238
262
SubscriptionArray_init (module -> subscriptions );
239
263
240
264
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) {
260
284
261
285
furi_event_loop_free (module -> loop );
262
286
SubscriptionArray_clear (module -> subscriptions );
287
+ free (module -> tick_context );
263
288
free (module );
264
289
}
265
290
0 commit comments