Sequencer
Loading...
Searching...
No Matches
sequencer.h
Go to the documentation of this file.
1
30#ifndef SEQUENCER_HEADER_GUARD
31#define SEQUENCER_HEADER_GUARD
32
33#include <assert.h>
34#include <stdbool.h>
35#include <stddef.h>
36#include <stdint.h>
37
45
48 uint16_t timer_ms;
49 uint16_t event;
50};
51
53struct sequencer {
54 struct sequencer_entry *_entries;
55 size_t _capacity;
56 size_t _len;
57
58 size_t _iter;
59
60 uint16_t _timer_ms;
61
62 uint8_t _mode;
63};
64
65/*--------------------------------------------------------------- PUBLIC API */
67void sequencer_init(struct sequencer *self, struct sequencer_entry *entries,
68 size_t capacity);
69
71void sequencer_set_mode(struct sequencer *self, uint8_t mode);
72
74bool sequencer_add_entry(struct sequencer *self, uint16_t timer_ms,
75 uint8_t event);
76
79
81void sequencer_reset(struct sequencer *self);
82
84void sequencer_clean(struct sequencer *self);
85
89uint16_t sequencer_update(struct sequencer *self, uint16_t delta_time_ms);
90/*---------------------------------------------------------------------------*/
91
92#ifdef SEQUENCER_IMPLEMENTATION
93void sequencer_init(struct sequencer *self, struct sequencer_entry *entries,
94 size_t capacity)
95{
96 assert(self && entries && (capacity > 0u));
97
98 self->_entries = entries;
99 self->_capacity = capacity;
100 self->_len = 0u;
101
102 self->_iter = 0u;
103
104 self->_timer_ms = 0u;
105
106 self->_mode = SEQUENCER_MODE_SINGLE;
107}
108
109void sequencer_set_mode(struct sequencer *self, uint8_t mode)
110{
111 assert(self && (mode < (uint8_t)SEQUENCER_MODES));
112
113 self->_mode = mode;
114}
115
116bool sequencer_add_entry(struct sequencer *self, uint16_t timer_ms,
117 uint8_t event)
118{
119 bool has_capacity = true;
120
121 assert(self);
122
123 if (self->_len >= self->_capacity) {
124 has_capacity = false;
125 } else {
126 struct sequencer_entry *entry = &self->_entries[self->_len];
127
128 entry->timer_ms = timer_ms;
129 entry->event = event;
130 self->_len += 1u;
131 }
132
133 return has_capacity;
134}
135
136size_t sequencer_get_entry_count(struct sequencer *self)
137{
138 assert(self);
139
140 return self->_len;
141}
142
143void sequencer_reset(struct sequencer *self)
144{
145 assert(self);
146
147 self->_iter = 0u;
148 self->_timer_ms = 0u;
149}
150
151void sequencer_clean(struct sequencer *self)
152{
153 assert(self);
154
155 sequencer_reset(self);
156
157 self->_len = 0u;
158}
159
160uint16_t sequencer_update(struct sequencer *self, uint16_t delta_time_ms)
161{
162 uint8_t event = 0u;
163
164 assert(self);
165
166 /* If last element */
167 if (self->_iter >= self->_len) {
168 /* And mode is REPEAT*/
169 if (self->_mode == (uint8_t)SEQUENCER_MODE_REPEAT) {
170 /* Repeat the sequence */
171 self->_iter = 0u;
172 } else {
173 /* Else cleanup */
174 sequencer_clean(self);
175 }
176 }
177
178 /* If we have elements in sequence */
179 if (self->_iter < self->_len) {
180 struct sequencer_entry *entry = &self->_entries[self->_iter];
181
182 self->_timer_ms += delta_time_ms;
183
184 /* Wait for timer to exceed */
185 if (self->_timer_ms >= entry->timer_ms) {
186 self->_timer_ms -= entry->timer_ms;
187 self->_iter += 1u;
188
189 /* and emit event */
190 event = entry->event;
191 }
192 }
193
194 return event;
195}
196#endif /* SEQUENCER_IMPLEMENTATION */
197
198#endif /* SEQUENCER_HEADER_GUARD */
void sequencer_set_mode(struct sequencer *self, uint8_t mode)
void sequencer_reset(struct sequencer *self)
void sequencer_init(struct sequencer *self, struct sequencer_entry *entries, size_t capacity)
uint16_t sequencer_update(struct sequencer *self, uint16_t delta_time_ms)
void sequencer_clean(struct sequencer *self)
bool sequencer_add_entry(struct sequencer *self, uint16_t timer_ms, uint8_t event)
sequencer_mode
Definition sequencer.h:39
@ SEQUENCER_MODES
Definition sequencer.h:43
@ SEQUENCER_MODE_SINGLE
Definition sequencer.h:40
@ SEQUENCER_MODE_REPEAT
Definition sequencer.h:41
size_t sequencer_get_entry_count(struct sequencer *self)
Definition sequencer.h:47
uint16_t event
Definition sequencer.h:49
uint16_t timer_ms
Definition sequencer.h:48
Definition sequencer.h:53