main_ubi_sdk v 0.1.3
This is UBI4 documentation
event_dispatcher.h
Go to the documentation of this file.
1/*
2 ******************************************************************************
3 * @file event_dispatcher.h
4 * @author A.Alborov
5 ******************************************************************************
6*/
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12#ifdef TEMPLATE_EVENT_NAME
13 #ifdef TEMPLATE_BIND_BUFFER_SIZE
14
15 #include "stdint.h"
16 #include "stdbool.h"
17 #include "templates.h"
18
19 #ifdef TEMPLATE_EVENT_ARG_NUM
20
21 #if TEMPLATE_EVENT_ARG_NUM == 1
22
23 typedef void (*TEMPLATE(type,TEMPLATE_EVENT_NAME))(TEMPLATE_EVENT_ARG_1 a1);
24
25 TEMPLATE(type,TEMPLATE_EVENT_NAME)TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[TEMPLATE_BIND_BUFFER_SIZE];
26 uint8_t TEMPLATE(TEMPLATE_EVENT_NAME,num_events) = 0;
27
28 void TEMPLATE_EVENT_NAME(TEMPLATE_EVENT_ARG_1 a1)
29 {
30 uint8_t lcnt = 0;
31 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
32 {
33 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
34 {
35 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i](a1);
36 lcnt++;
37 if(lcnt >= num_events) return;
38 }
39 }
40 }
41
42 bool TEMPLATE(bind,TEMPLATE_EVENT_NAME)(void (*handler)(TEMPLATE_EVENT_ARG_1 a1))
43 {
44 uint8_t lcnt = 0;
45 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
46 {
47 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
48 lcnt++;
49
50 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== handler)
51 return true;
52
53 if(lcnt >= num_events) break;
54 }
55
56 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
57 {
58 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== 0)
59 {
60 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] = handler;
61 TEMPLATE(TEMPLATE_EVENT_NAME,num_events)++;
62 return true;
63 }
64 }
65 return false;
66 }
67
68 bool TEMPLATE(unbind,TEMPLATE_EVENT_NAME)(void (*handler)(TEMPLATE_EVENT_ARG_1 a1))
69 {
70 uint8_t lcnt = 0;
71 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
72 {
73 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
74 lcnt++;
75
76 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== handler)
77 {
78 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] = 0;
79 TEMPLATE(TEMPLATE_EVENT_NAME,num_events)--;
80 return true;
81 }
82 if(lcnt>=TEMPLATE(TEMPLATE_EVENT_NAME,num_events))return false;
83 }
84 return false;
85 }
86
87 #undef TEMPLATE_EVENT_ARG_1
88 #endif
89
90 #if TEMPLATE_EVENT_ARG_NUM == 2
91
92 typedef void (*TEMPLATE(type,TEMPLATE_EVENT_NAME))(TEMPLATE_EVENT_ARG_1 a1, TEMPLATE_EVENT_ARG_2 a2);
93
94 TEMPLATE(type,TEMPLATE_EVENT_NAME)TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[TEMPLATE_BIND_BUFFER_SIZE];
95 uint8_t TEMPLATE(TEMPLATE_EVENT_NAME,num_events) = 0;
96
97 void TEMPLATE_EVENT_NAME(TEMPLATE_EVENT_ARG_1 a1, TEMPLATE_EVENT_ARG_2 a2)
98 {
99 uint8_t lcnt = 0;
100 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
101 {
102 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
103 {
104 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i](a1,a2);
105 lcnt++;
106 if(lcnt >= TEMPLATE(TEMPLATE_EVENT_NAME,num_events)) return;
107 }
108 }
109 }
110
111 bool TEMPLATE(bind,TEMPLATE_EVENT_NAME)(void (*handler)(TEMPLATE_EVENT_ARG_1 a1, TEMPLATE_EVENT_ARG_2 a2))
112 {
113 uint8_t lcnt = 0;
114 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
115 {
116 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
117 lcnt++;
118
119 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== handler)
120 return true;
121
122 if(lcnt >= TEMPLATE(TEMPLATE_EVENT_NAME,num_events)) break;
123 }
124
125 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
126 {
127 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== 0)
128 {
129 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] = handler;
130 TEMPLATE(TEMPLATE_EVENT_NAME,num_events)++;
131 return true;
132 }
133 }
134 return false;
135 }
136
137 bool TEMPLATE(unbind,TEMPLATE_EVENT_NAME)(void (*handler)(TEMPLATE_EVENT_ARG_1 a1, TEMPLATE_EVENT_ARG_2 a2))
138 {
139 uint8_t lcnt = 0;
140 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
141 {
142 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
143 lcnt++;
144
145 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== handler)
146 {
147 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] = 0;
148 TEMPLATE(TEMPLATE_EVENT_NAME,num_events)--;
149 return true;
150 }
151 if(lcnt>=TEMPLATE(TEMPLATE_EVENT_NAME,num_events))return false;
152 }
153 return false;
154 }
155
156 #undef TEMPLATE_EVENT_ARG_1
157 #undef TEMPLATE_EVENT_ARG_2
158 #endif
159 #undef TEMPLATE_EVENT_ARG_NUM
160
161 #else
162 typedef void (*TEMPLATE(type,TEMPLATE_EVENT_NAME))();
163
164 TEMPLATE(type,TEMPLATE_EVENT_NAME)TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[TEMPLATE_BIND_BUFFER_SIZE];
165 uint8_t TEMPLATE(TEMPLATE_EVENT_NAME,num_events) = 0;
166
167 void TEMPLATE_EVENT_NAME()
168 {
169 uint8_t lcnt = 0;
170 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
171 {
172 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
173 {
174 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]();
175 lcnt++;
176 if(lcnt >= TEMPLATE(TEMPLATE_EVENT_NAME,num_events)) return;
177 }
178 }
179 }
180 bool TEMPLATE(bind,TEMPLATE_EVENT_NAME)(void (*handler)())
181 {
182 uint8_t lcnt = 0;
183 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
184 {
185 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
186 lcnt++;
187
188 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== handler)
189 return true;
190
191 if(lcnt >= TEMPLATE(TEMPLATE_EVENT_NAME,num_events)) break;
192 }
193
194 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
195 {
196 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== 0)
197 {
198 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] = handler;
199 TEMPLATE(TEMPLATE_EVENT_NAME,num_events)++;
200 return true;
201 }
202 }
203 return false;
204 }
205
206 bool TEMPLATE(unbind,TEMPLATE_EVENT_NAME)(void (*handler)())
207 {
208 uint8_t lcnt = 0;
209 for(uint8_t i = 0; i<TEMPLATE_BIND_BUFFER_SIZE; i++)
210 {
211 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] != 0)
212 lcnt++;
213
214 if(TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i]== handler)
215 {
216 TEMPLATE(TEMPLATE_EVENT_NAME,bind_events)[i] = 0;
217 TEMPLATE(TEMPLATE_EVENT_NAME,num_events)--;
218 return true;
219 }
220 if(lcnt>=TEMPLATE(TEMPLATE_EVENT_NAME,num_events))return false;
221 }
222 return false;
223 }
224 #endif
225
226
227 #undef TEMPLATE_BIND_BUFFER_SIZE
228 #endif
229#undef TEMPLATE_EVENT_NAME
230#endif
231
232#ifdef __cplusplus
233}
234#endif
#define TEMPLATE(X, Y)
Definition templates.h:14