#ifndef __STATES_H__ #define __STATES_H__ #include #include struct event; typedef void (*event_callback)(struct event *event, int old, int new); struct event_member_def { const char *name; int event_id; struct { int ms; int next; } timeout; }; struct event { const char *name; int max_state; const struct event_member_def *def; // Value atomic_t current_value; atomic_t pending_value; // Timeout related int timeout_setup; unsigned long timeout; // int raw_event_id; // Callback on value update event_callback callback; }; /* * Now include all events, which are basically states */ #define DEFINE_EVENT_STATE(_name, ...) \ enum _name##_values{ \ _name##_unknown = 0, \ __VA_ARGS__ \ _name##_invalid, \ }; \ extern struct event __event_##_name; \ static struct event *const _name = &__event_##_name; #define DEFINE_EVENT(_name, ...) _name, #define DEFINE_EVENT_RAW(_name, ...) \ extern struct event __event_##_name; \ static struct event *const _name = &__event_##_name; #include static inline int event_get_value(struct event *event) { return atomic_read(&event->current_value); } static inline void event_set_callback(struct event *event, event_callback cb) { event->callback = cb; } #endif