@@ -32,6 +32,9 @@ static void initialize(const ticker_data_t *ticker)
32
32
if (ticker -> queue -> initialized ) {
33
33
return ;
34
34
}
35
+ if (ticker -> queue -> suspended ) {
36
+ return ;
37
+ }
35
38
36
39
ticker -> interface -> init ();
37
40
@@ -70,6 +73,7 @@ static void initialize(const ticker_data_t *ticker)
70
73
ticker -> queue -> max_delta_us = max_delta_us ;
71
74
ticker -> queue -> present_time = 0 ;
72
75
ticker -> queue -> dispatching = false;
76
+ ticker -> queue -> suspended = false;
73
77
ticker -> queue -> initialized = true;
74
78
75
79
update_present_time (ticker );
@@ -121,6 +125,9 @@ static us_timestamp_t convert_timestamp(us_timestamp_t ref, timestamp_t timestam
121
125
static void update_present_time (const ticker_data_t * const ticker )
122
126
{
123
127
ticker_event_queue_t * queue = ticker -> queue ;
128
+ if (queue -> suspended ) {
129
+ return ;
130
+ }
124
131
uint32_t ticker_time = ticker -> interface -> read ();
125
132
if (ticker_time == ticker -> queue -> tick_last_read ) {
126
133
// No work to do
@@ -230,7 +237,7 @@ int _ticker_match_interval_passed(timestamp_t prev_tick, timestamp_t cur_tick, t
230
237
static void schedule_interrupt (const ticker_data_t * const ticker )
231
238
{
232
239
ticker_event_queue_t * queue = ticker -> queue ;
233
- if (ticker -> queue -> dispatching ) {
240
+ if (queue -> suspended || ticker -> queue -> dispatching ) {
234
241
// Don't schedule the next interrupt until dispatching is
235
242
// finished. This prevents repeated calls to interface->set_interrupt
236
243
return ;
@@ -285,6 +292,10 @@ void ticker_irq_handler(const ticker_data_t *const ticker)
285
292
core_util_critical_section_enter ();
286
293
287
294
ticker -> interface -> clear_interrupt ();
295
+ if (ticker -> queue -> suspended ) {
296
+ core_util_critical_section_exit ();
297
+ return ;
298
+ }
288
299
289
300
/* Go through all the pending TimerEvents */
290
301
ticker -> queue -> dispatching = true;
@@ -430,3 +441,29 @@ int ticker_get_next_timestamp(const ticker_data_t *const data, timestamp_t *time
430
441
431
442
return ret ;
432
443
}
444
+
445
+ void ticker_suspend (const ticker_data_t * const ticker )
446
+ {
447
+ core_util_critical_section_enter ();
448
+
449
+ ticker -> queue -> suspended = true;
450
+
451
+ core_util_critical_section_exit ();
452
+ }
453
+
454
+ void ticker_resume (const ticker_data_t * const ticker )
455
+ {
456
+ core_util_critical_section_enter ();
457
+
458
+ ticker -> queue -> suspended = false;
459
+ if (ticker -> queue -> initialized ) {
460
+ ticker -> queue -> tick_last_read = ticker -> interface -> read ();
461
+
462
+ update_present_time (ticker );
463
+ schedule_interrupt (ticker );
464
+ } else {
465
+ initialize (ticker );
466
+ }
467
+
468
+ core_util_critical_section_exit ();
469
+ }
0 commit comments