Skip to content

File syn_event.h

File List > src > syntropic > util > syn_event.h

Go to the documentation of this file

#ifndef SYN_EVENT_H
#define SYN_EVENT_H

#include "../common/syn_defs.h"
#include "../pt/syn_pt.h"
#include "../sched/syn_event_flags.h"
#include "../util/syn_bits.h"

#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef SYN_EventFlags SYN_EventGroup;

static inline void syn_event_init(SYN_EventGroup *grp)
{
    syn_event_flags_init(grp);
}

static inline void syn_event_set(SYN_EventGroup *grp, uint32_t mask)
{
    syn_event_flags_set(grp, mask);
}

static inline void syn_event_clear(SYN_EventGroup *grp, uint32_t mask)
{
    syn_event_flags_clear(grp, mask);
}

static inline uint32_t syn_event_get(const SYN_EventGroup *grp)
{
    return syn_event_flags_get(grp);
}

static inline bool syn_event_check_all(const SYN_EventGroup *grp, uint32_t mask)
{
    return (syn_event_flags_get(grp) & mask) == mask;
}

static inline bool syn_event_check_any(const SYN_EventGroup *grp, uint32_t mask)
{
    return (syn_event_flags_get(grp) & mask) != 0;
}

/* ── Protothread integration ────────────────────────────────────────────── */

#define PT_WAIT_EVENT(pt, grp, mask)                       \
    do {                                                   \
        PT_WAIT_UNTIL(pt, syn_event_check_all(grp, mask)); \
        syn_event_clear(grp, mask);                        \
    } while (0)

#define PT_WAIT_EVENT_ANY(pt, grp, mask)                   \
    do {                                                   \
        PT_WAIT_UNTIL(pt, syn_event_check_any(grp, mask)); \
        syn_event_clear(grp, syn_event_get(grp) & (mask)); \
    } while (0)

#ifdef __cplusplus
}
#endif

#endif /* SYN_EVENT_H */