deferred_callback.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2025 ML!PA Consulting GmbH
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
9 #pragma once
10 
27 #include <assert.h>
28 #include "event/callback.h"
29 #include "ztimer.h"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
38 typedef struct {
43 
48 static inline void _event_deferred_post(void *arg)
49 {
50  event_deferred_callback_t *event_timeout = arg;
51 
52  event_post(event_timeout->queue, arg);
53 }
54 
68  event_queue_t *queue,
69  ztimer_clock_t *clock, uint32_t timeout,
70  void (*callback)(void *), void *arg)
71 {
72  /* cancel the event if it has already been queued */
73  ztimer_remove(clock, &event->timer);
74  event_cancel(queue, &event->event.super);
75 
76  event->event = (event_callback_t) {
77  .super.handler = _event_callback_handler,
78  .callback = callback,
79  .arg = arg,
80  };
81  event->timer = (ztimer_t) {
82  .callback = _event_deferred_post,
83  .arg = event,
84  };
85  event->queue = queue;
86 
87  ztimer_set(clock, &event->timer, timeout);
88 }
89 
97  ztimer_clock_t *clock)
98 {
99  ztimer_remove(clock, &event->timer);
100  event_cancel(event->queue, (event_t *)event);
101 }
102 
103 #ifdef __cplusplus
104 }
105 #endif
POSIX.1-2008 compliant version of the assert macro.
Provides a callback-with-argument event type.
void _event_callback_handler(event_t *event)
event callback handler function (used internally)
static void _event_deferred_post(void *arg)
Internal helper function for ztimer callback.
static void event_deferred_callback_cancel(event_deferred_callback_t *event, ztimer_clock_t *clock)
Cancel a callback function if it has not been executed yet.
static void event_deferred_callback_post(event_deferred_callback_t *event, event_queue_t *queue, ztimer_clock_t *clock, uint32_t timeout, void(*callback)(void *), void *arg)
Execute a callback function in the event thread after a timeout.
void event_post(event_queue_t *queue, event_t *event)
Queue an event.
void event_cancel(event_queue_t *queue, event_t *event)
Cancel a queued event.
uint32_t ztimer_set(ztimer_clock_t *clock, ztimer_t *timer, uint32_t val)
Set a timer on a clock.
bool ztimer_remove(ztimer_clock_t *clock, ztimer_t *timer)
Remove a timer from a clock.
event queue structure
Definition: event.h:153
Callback Event structure definition.
Definition: callback.h:48
Deferred Callback Event structure.
ztimer_t timer
ztimer object used for timeout
event_callback_t event
callback event portion
event_queue_t * queue
event queue to post event to
event structure
Definition: event.h:145
ztimer device structure
Definition: ztimer.h:370
ztimer structure
Definition: ztimer.h:319
ztimer API