source: roaraudio/libroarlight/roardmx.c @ 6008:72b2c1c9fb71

Last change on this file since 6008:72b2c1c9fb71 was 6008:72b2c1c9fb71, checked in by phi, 10 years ago

added RoarDMX events NOTIFY[0-3]

File size: 22.9 KB
Line 
1//roardmx.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009-2014
5 *
6 *  This file is part of libroardsp a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroardsp is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 */
25
26#include "libroarlight.h"
27
28// base(ic) check
29#define BCHK(x) if ( (x) == NULL ) { roar_err_set(ROAR_ERROR_FAULT); return -1; }
30
31// database access:
32static const struct {
33 const int id;
34 const char * const name;
35} __eventnames[] = {
36//$ grep '^#define ROAR_ROARDMX_EVENT_' roardmx.h | cut -d ' ' -f2 | while read line; do name=`echo $line | cut -d_ -f4 | tr A-Z a-z`; for suffix in beat off on hold; do printf " {%-56s \"%s\"},\n" "$line|ROAR_ROARDMX_ETYPE_`tr a-z A-Z <<<$suffix`," $name-$suffix; done; printf " {%-56s \"%s\"},\n" $line, $name; done
37 {ROAR_ROARDMX_EVENT_NONE|ROAR_ROARDMX_ETYPE_BEAT,         "none-beat"},
38 {ROAR_ROARDMX_EVENT_NONE|ROAR_ROARDMX_ETYPE_OFF,          "none-off"},
39 {ROAR_ROARDMX_EVENT_NONE|ROAR_ROARDMX_ETYPE_ON,           "none-on"},
40 {ROAR_ROARDMX_EVENT_NONE|ROAR_ROARDMX_ETYPE_HOLD,         "none-hold"},
41 {ROAR_ROARDMX_EVENT_NONE,                                 "none"},
42 {ROAR_ROARDMX_EVENT_STEP|ROAR_ROARDMX_ETYPE_BEAT,         "step-beat"},
43 {ROAR_ROARDMX_EVENT_STEP|ROAR_ROARDMX_ETYPE_OFF,          "step-off"},
44 {ROAR_ROARDMX_EVENT_STEP|ROAR_ROARDMX_ETYPE_ON,           "step-on"},
45 {ROAR_ROARDMX_EVENT_STEP|ROAR_ROARDMX_ETYPE_HOLD,         "step-hold"},
46 {ROAR_ROARDMX_EVENT_STEP,                                 "step"},
47 {ROAR_ROARDMX_EVENT_TAP|ROAR_ROARDMX_ETYPE_BEAT,          "tap-beat"},
48 {ROAR_ROARDMX_EVENT_TAP|ROAR_ROARDMX_ETYPE_OFF,           "tap-off"},
49 {ROAR_ROARDMX_EVENT_TAP|ROAR_ROARDMX_ETYPE_ON,            "tap-on"},
50 {ROAR_ROARDMX_EVENT_TAP|ROAR_ROARDMX_ETYPE_HOLD,          "tap-hold"},
51 {ROAR_ROARDMX_EVENT_TAP,                                  "tap"},
52 {ROAR_ROARDMX_EVENT_BEAT|ROAR_ROARDMX_ETYPE_BEAT,         "beat-beat"},
53 {ROAR_ROARDMX_EVENT_BEAT|ROAR_ROARDMX_ETYPE_OFF,          "beat-off"},
54 {ROAR_ROARDMX_EVENT_BEAT|ROAR_ROARDMX_ETYPE_ON,           "beat-on"},
55 {ROAR_ROARDMX_EVENT_BEAT|ROAR_ROARDMX_ETYPE_HOLD,         "beat-hold"},
56 {ROAR_ROARDMX_EVENT_BEAT,                                 "beat"},
57 {ROAR_ROARDMX_EVENT_BLACKOUT|ROAR_ROARDMX_ETYPE_BEAT,     "blackout-beat"},
58 {ROAR_ROARDMX_EVENT_BLACKOUT|ROAR_ROARDMX_ETYPE_OFF,      "blackout-off"},
59 {ROAR_ROARDMX_EVENT_BLACKOUT|ROAR_ROARDMX_ETYPE_ON,       "blackout-on"},
60 {ROAR_ROARDMX_EVENT_BLACKOUT|ROAR_ROARDMX_ETYPE_HOLD,     "blackout-hold"},
61 {ROAR_ROARDMX_EVENT_BLACKOUT,                             "blackout"},
62 {ROAR_ROARDMX_EVENT_FULLON|ROAR_ROARDMX_ETYPE_BEAT,       "fullon-beat"},
63 {ROAR_ROARDMX_EVENT_FULLON|ROAR_ROARDMX_ETYPE_OFF,        "fullon-off"},
64 {ROAR_ROARDMX_EVENT_FULLON|ROAR_ROARDMX_ETYPE_ON,         "fullon-on"},
65 {ROAR_ROARDMX_EVENT_FULLON|ROAR_ROARDMX_ETYPE_HOLD,       "fullon-hold"},
66 {ROAR_ROARDMX_EVENT_FULLON,                               "fullon"},
67 {ROAR_ROARDMX_EVENT_FLASH|ROAR_ROARDMX_ETYPE_BEAT,        "flash-beat"},
68 {ROAR_ROARDMX_EVENT_FLASH|ROAR_ROARDMX_ETYPE_OFF,         "flash-off"},
69 {ROAR_ROARDMX_EVENT_FLASH|ROAR_ROARDMX_ETYPE_ON,          "flash-on"},
70 {ROAR_ROARDMX_EVENT_FLASH|ROAR_ROARDMX_ETYPE_HOLD,        "flash-hold"},
71 {ROAR_ROARDMX_EVENT_FLASH,                                "flash"},
72 {ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_BEAT,       "strobe-beat"},
73 {ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_OFF,        "strobe-off"},
74 {ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_ON,         "strobe-on"},
75 {ROAR_ROARDMX_EVENT_STROBE|ROAR_ROARDMX_ETYPE_HOLD,       "strobe-hold"},
76 {ROAR_ROARDMX_EVENT_STROBE,                               "strobe"},
77 {ROAR_ROARDMX_EVENT_STROBEREADY|ROAR_ROARDMX_ETYPE_BEAT,  "strobeready-beat"},
78 {ROAR_ROARDMX_EVENT_STROBEREADY|ROAR_ROARDMX_ETYPE_OFF,   "strobeready-off"},
79 {ROAR_ROARDMX_EVENT_STROBEREADY|ROAR_ROARDMX_ETYPE_ON,    "strobeready-on"},
80 {ROAR_ROARDMX_EVENT_STROBEREADY|ROAR_ROARDMX_ETYPE_HOLD,  "strobeready-hold"},
81 {ROAR_ROARDMX_EVENT_STROBEREADY,                          "strobeready"},
82 {ROAR_ROARDMX_EVENT_STROBELOAD|ROAR_ROARDMX_ETYPE_BEAT,   "strobeload-beat"},
83 {ROAR_ROARDMX_EVENT_STROBELOAD|ROAR_ROARDMX_ETYPE_OFF,    "strobeload-off"},
84 {ROAR_ROARDMX_EVENT_STROBELOAD|ROAR_ROARDMX_ETYPE_ON,     "strobeload-on"},
85 {ROAR_ROARDMX_EVENT_STROBELOAD|ROAR_ROARDMX_ETYPE_HOLD,   "strobeload-hold"},
86 {ROAR_ROARDMX_EVENT_STROBELOAD,                           "strobeload"},
87 {ROAR_ROARDMX_EVENT_FOG|ROAR_ROARDMX_ETYPE_BEAT,          "fog-beat"},
88 {ROAR_ROARDMX_EVENT_FOG|ROAR_ROARDMX_ETYPE_OFF,           "fog-off"},
89 {ROAR_ROARDMX_EVENT_FOG|ROAR_ROARDMX_ETYPE_ON,            "fog-on"},
90 {ROAR_ROARDMX_EVENT_FOG|ROAR_ROARDMX_ETYPE_HOLD,          "fog-hold"},
91 {ROAR_ROARDMX_EVENT_FOG,                                  "fog"},
92 {ROAR_ROARDMX_EVENT_FOGREADY|ROAR_ROARDMX_ETYPE_BEAT,     "fogready-beat"},
93 {ROAR_ROARDMX_EVENT_FOGREADY|ROAR_ROARDMX_ETYPE_OFF,      "fogready-off"},
94 {ROAR_ROARDMX_EVENT_FOGREADY|ROAR_ROARDMX_ETYPE_ON,       "fogready-on"},
95 {ROAR_ROARDMX_EVENT_FOGREADY|ROAR_ROARDMX_ETYPE_HOLD,     "fogready-hold"},
96 {ROAR_ROARDMX_EVENT_FOGREADY,                             "fogready"},
97 {ROAR_ROARDMX_EVENT_FOGHEAT|ROAR_ROARDMX_ETYPE_BEAT,      "fogheat-beat"},
98 {ROAR_ROARDMX_EVENT_FOGHEAT|ROAR_ROARDMX_ETYPE_OFF,       "fogheat-off"},
99 {ROAR_ROARDMX_EVENT_FOGHEAT|ROAR_ROARDMX_ETYPE_ON,        "fogheat-on"},
100 {ROAR_ROARDMX_EVENT_FOGHEAT|ROAR_ROARDMX_ETYPE_HOLD,      "fogheat-hold"},
101 {ROAR_ROARDMX_EVENT_FOGHEAT,                              "fogheat"},
102
103 {ROAR_ROARDMX_EVENT_NOTIFY0|ROAR_ROARDMX_ETYPE_BEAT,      "notify0-beat"},
104 {ROAR_ROARDMX_EVENT_NOTIFY0|ROAR_ROARDMX_ETYPE_OFF,       "notify0-off"},
105 {ROAR_ROARDMX_EVENT_NOTIFY0|ROAR_ROARDMX_ETYPE_ON,        "notify0-on"},
106 {ROAR_ROARDMX_EVENT_NOTIFY0|ROAR_ROARDMX_ETYPE_HOLD,      "notify0-hold"},
107 {ROAR_ROARDMX_EVENT_NOTIFY0,                              "notify0"},
108 {ROAR_ROARDMX_EVENT_NOTIFY1|ROAR_ROARDMX_ETYPE_BEAT,      "notify1-beat"},
109 {ROAR_ROARDMX_EVENT_NOTIFY1|ROAR_ROARDMX_ETYPE_OFF,       "notify1-off"},
110 {ROAR_ROARDMX_EVENT_NOTIFY1|ROAR_ROARDMX_ETYPE_ON,        "notify1-on"},
111 {ROAR_ROARDMX_EVENT_NOTIFY1|ROAR_ROARDMX_ETYPE_HOLD,      "notify1-hold"},
112 {ROAR_ROARDMX_EVENT_NOTIFY1,                              "notify1"},
113 {ROAR_ROARDMX_EVENT_NOTIFY2|ROAR_ROARDMX_ETYPE_BEAT,      "notify2-beat"},
114 {ROAR_ROARDMX_EVENT_NOTIFY2|ROAR_ROARDMX_ETYPE_OFF,       "notify2-off"},
115 {ROAR_ROARDMX_EVENT_NOTIFY2|ROAR_ROARDMX_ETYPE_ON,        "notify2-on"},
116 {ROAR_ROARDMX_EVENT_NOTIFY2|ROAR_ROARDMX_ETYPE_HOLD,      "notify2-hold"},
117 {ROAR_ROARDMX_EVENT_NOTIFY2,                              "notify2"},
118 {ROAR_ROARDMX_EVENT_NOTIFY3|ROAR_ROARDMX_ETYPE_BEAT,      "notify3-beat"},
119 {ROAR_ROARDMX_EVENT_NOTIFY3|ROAR_ROARDMX_ETYPE_OFF,       "notify3-off"},
120 {ROAR_ROARDMX_EVENT_NOTIFY3|ROAR_ROARDMX_ETYPE_ON,        "notify3-on"},
121 {ROAR_ROARDMX_EVENT_NOTIFY3|ROAR_ROARDMX_ETYPE_HOLD,      "notify3-hold"},
122 {ROAR_ROARDMX_EVENT_NOTIFY3,                              "notify3"},
123
124 // User Defined events:
125 {ROAR_ROARDMX_EVENT_USER0,                                "user0"},
126 {ROAR_ROARDMX_EVENT_USER1|ROAR_ROARDMX_ETYPE_BEAT,        "user1-beat"},
127 {ROAR_ROARDMX_EVENT_USER1|ROAR_ROARDMX_ETYPE_OFF,         "user1-off"},
128 {ROAR_ROARDMX_EVENT_USER1|ROAR_ROARDMX_ETYPE_ON,          "user1-on"},
129 {ROAR_ROARDMX_EVENT_USER1|ROAR_ROARDMX_ETYPE_HOLD,        "user1-hold"},
130 {ROAR_ROARDMX_EVENT_USER1,                                "user1"},
131 {ROAR_ROARDMX_EVENT_USER2|ROAR_ROARDMX_ETYPE_BEAT,        "user2-beat"},
132 {ROAR_ROARDMX_EVENT_USER2|ROAR_ROARDMX_ETYPE_OFF,         "user2-off"},
133 {ROAR_ROARDMX_EVENT_USER2|ROAR_ROARDMX_ETYPE_ON,          "user2-on"},
134 {ROAR_ROARDMX_EVENT_USER2|ROAR_ROARDMX_ETYPE_HOLD,        "user2-hold"},
135 {ROAR_ROARDMX_EVENT_USER2,                                "user2"},
136 {ROAR_ROARDMX_EVENT_USER3|ROAR_ROARDMX_ETYPE_BEAT,        "user3-beat"},
137 {ROAR_ROARDMX_EVENT_USER3|ROAR_ROARDMX_ETYPE_OFF,         "user3-off"},
138 {ROAR_ROARDMX_EVENT_USER3|ROAR_ROARDMX_ETYPE_ON,          "user3-on"},
139 {ROAR_ROARDMX_EVENT_USER3|ROAR_ROARDMX_ETYPE_HOLD,        "user3-hold"},
140 {ROAR_ROARDMX_EVENT_USER3,                                "user3"},
141 {ROAR_ROARDMX_EVENT_USER4|ROAR_ROARDMX_ETYPE_BEAT,        "user4-beat"},
142 {ROAR_ROARDMX_EVENT_USER4|ROAR_ROARDMX_ETYPE_OFF,         "user4-off"},
143 {ROAR_ROARDMX_EVENT_USER4|ROAR_ROARDMX_ETYPE_ON,          "user4-on"},
144 {ROAR_ROARDMX_EVENT_USER4|ROAR_ROARDMX_ETYPE_HOLD,        "user4-hold"},
145 {ROAR_ROARDMX_EVENT_USER4,                                "user4"},
146 {ROAR_ROARDMX_EVENT_USER5|ROAR_ROARDMX_ETYPE_BEAT,        "user5-beat"},
147 {ROAR_ROARDMX_EVENT_USER5|ROAR_ROARDMX_ETYPE_OFF,         "user5-off"},
148 {ROAR_ROARDMX_EVENT_USER5|ROAR_ROARDMX_ETYPE_ON,          "user5-on"},
149 {ROAR_ROARDMX_EVENT_USER5|ROAR_ROARDMX_ETYPE_HOLD,        "user5-hold"},
150 {ROAR_ROARDMX_EVENT_USER5,                                "user5"},
151 {ROAR_ROARDMX_EVENT_USER6|ROAR_ROARDMX_ETYPE_BEAT,        "user6-beat"},
152 {ROAR_ROARDMX_EVENT_USER6|ROAR_ROARDMX_ETYPE_OFF,         "user6-off"},
153 {ROAR_ROARDMX_EVENT_USER6|ROAR_ROARDMX_ETYPE_ON,          "user6-on"},
154 {ROAR_ROARDMX_EVENT_USER6|ROAR_ROARDMX_ETYPE_HOLD,        "user6-hold"},
155 {ROAR_ROARDMX_EVENT_USER6,                                "user6"},
156 {ROAR_ROARDMX_EVENT_USER7|ROAR_ROARDMX_ETYPE_BEAT,        "user7-beat"},
157 {ROAR_ROARDMX_EVENT_USER7|ROAR_ROARDMX_ETYPE_OFF,         "user7-off"},
158 {ROAR_ROARDMX_EVENT_USER7|ROAR_ROARDMX_ETYPE_ON,          "user7-on"},
159 {ROAR_ROARDMX_EVENT_USER7|ROAR_ROARDMX_ETYPE_HOLD,        "user7-hold"},
160 {ROAR_ROARDMX_EVENT_USER7,                                "user7"},
161 {ROAR_ROARDMX_EVENT_USER8|ROAR_ROARDMX_ETYPE_BEAT,        "user8-beat"},
162 {ROAR_ROARDMX_EVENT_USER8|ROAR_ROARDMX_ETYPE_OFF,         "user8-off"},
163 {ROAR_ROARDMX_EVENT_USER8|ROAR_ROARDMX_ETYPE_ON,          "user8-on"},
164 {ROAR_ROARDMX_EVENT_USER8|ROAR_ROARDMX_ETYPE_HOLD,        "user8-hold"},
165 {ROAR_ROARDMX_EVENT_USER8,                                "user8"},
166 {ROAR_ROARDMX_EVENT_USER9|ROAR_ROARDMX_ETYPE_BEAT,        "user9-beat"},
167 {ROAR_ROARDMX_EVENT_USER9|ROAR_ROARDMX_ETYPE_OFF,         "user9-off"},
168 {ROAR_ROARDMX_EVENT_USER9|ROAR_ROARDMX_ETYPE_ON,          "user9-on"},
169 {ROAR_ROARDMX_EVENT_USER9|ROAR_ROARDMX_ETYPE_HOLD,        "user9-hold"},
170 {ROAR_ROARDMX_EVENT_USER9,                                "user9"},
171 {ROAR_ROARDMX_EVENT_USER10|ROAR_ROARDMX_ETYPE_BEAT,       "user10-beat"},
172 {ROAR_ROARDMX_EVENT_USER10|ROAR_ROARDMX_ETYPE_OFF,        "user10-off"},
173 {ROAR_ROARDMX_EVENT_USER10|ROAR_ROARDMX_ETYPE_ON,         "user10-on"},
174 {ROAR_ROARDMX_EVENT_USER10|ROAR_ROARDMX_ETYPE_HOLD,       "user10-hold"},
175 {ROAR_ROARDMX_EVENT_USER10,                               "user10"},
176 {ROAR_ROARDMX_EVENT_USER11|ROAR_ROARDMX_ETYPE_BEAT,       "user11-beat"},
177 {ROAR_ROARDMX_EVENT_USER11|ROAR_ROARDMX_ETYPE_OFF,        "user11-off"},
178 {ROAR_ROARDMX_EVENT_USER11|ROAR_ROARDMX_ETYPE_ON,         "user11-on"},
179 {ROAR_ROARDMX_EVENT_USER11|ROAR_ROARDMX_ETYPE_HOLD,       "user11-hold"},
180 {ROAR_ROARDMX_EVENT_USER11,                               "user11"},
181 {ROAR_ROARDMX_EVENT_USER12|ROAR_ROARDMX_ETYPE_BEAT,       "user12-beat"},
182 {ROAR_ROARDMX_EVENT_USER12|ROAR_ROARDMX_ETYPE_OFF,        "user12-off"},
183 {ROAR_ROARDMX_EVENT_USER12|ROAR_ROARDMX_ETYPE_ON,         "user12-on"},
184 {ROAR_ROARDMX_EVENT_USER12|ROAR_ROARDMX_ETYPE_HOLD,       "user12-hold"},
185 {ROAR_ROARDMX_EVENT_USER12,                               "user12"},
186 {ROAR_ROARDMX_EVENT_USER13|ROAR_ROARDMX_ETYPE_BEAT,       "user13-beat"},
187 {ROAR_ROARDMX_EVENT_USER13|ROAR_ROARDMX_ETYPE_OFF,        "user13-off"},
188 {ROAR_ROARDMX_EVENT_USER13|ROAR_ROARDMX_ETYPE_ON,         "user13-on"},
189 {ROAR_ROARDMX_EVENT_USER13|ROAR_ROARDMX_ETYPE_HOLD,       "user13-hold"},
190 {ROAR_ROARDMX_EVENT_USER13,                               "user13"},
191 {ROAR_ROARDMX_EVENT_USER14|ROAR_ROARDMX_ETYPE_BEAT,       "user14-beat"},
192 {ROAR_ROARDMX_EVENT_USER14|ROAR_ROARDMX_ETYPE_OFF,        "user14-off"},
193 {ROAR_ROARDMX_EVENT_USER14|ROAR_ROARDMX_ETYPE_ON,         "user14-on"},
194 {ROAR_ROARDMX_EVENT_USER14|ROAR_ROARDMX_ETYPE_HOLD,       "user14-hold"},
195 {ROAR_ROARDMX_EVENT_USER14,                               "user14"},
196 {ROAR_ROARDMX_EVENT_USER15|ROAR_ROARDMX_ETYPE_BEAT,       "user15-beat"},
197 {ROAR_ROARDMX_EVENT_USER15|ROAR_ROARDMX_ETYPE_OFF,        "user15-off"},
198 {ROAR_ROARDMX_EVENT_USER15|ROAR_ROARDMX_ETYPE_ON,         "user15-on"},
199 {ROAR_ROARDMX_EVENT_USER15|ROAR_ROARDMX_ETYPE_HOLD,       "user15-hold"},
200 {ROAR_ROARDMX_EVENT_USER15,                               "user15"}
201};
202
203int roar_roardmx_str2event(const char * event) {
204 size_t i;
205
206 if ( event == NULL ) {
207  roar_err_set(ROAR_ERROR_FAULT);
208  return -1;
209 }
210
211 for (i = 0; i < (sizeof(__eventnames)/sizeof(*__eventnames)); i++)
212  if ( !strcasecmp(event, __eventnames[i].name) )
213   return __eventnames[i].id;
214
215 roar_err_set(ROAR_ERROR_NOENT);
216 return -1;
217}
218
219const char * roar_roardmx_event2str(const int event) {
220 size_t i;
221
222 for (i = 0; i < (sizeof(__eventnames)/sizeof(*__eventnames)); i++)
223  if ( __eventnames[i].id == event )
224   return __eventnames[i].name;
225
226 roar_err_set(ROAR_ERROR_NOENT);
227 return NULL;
228}
229
230// generic things:
231int roar_roardmx_message_new (struct roar_roardmx_message * mes) {
232 BCHK(mes);
233
234 memset(mes, 0, sizeof(struct roar_roardmx_message));
235
236 mes->version = ROAR_ROARDMX_VERSION;
237
238 return 0;
239}
240
241// low level:
242//int roar_roardmx_message_set_flag(struct roar_roardmx_message * mes, unsigned char   flag);
243//int roar_roardmx_message_set_len (struct roar_roardmx_message * mes, size_t          type);
244//int roar_roardmx_message_get_data(struct roar_roardmx_message * mes, unsigned char ** data);
245
246// medium level:
247int roar_roardmx_message_set_type(struct roar_roardmx_message * mes, unsigned char   type) {
248 BCHK(mes);
249
250 // check if type contains non-type bits.
251 if ( (type | ROAR_ROARDMX_MASK_TYPE) - ROAR_ROARDMX_MASK_TYPE ) {
252  roar_err_set(ROAR_ERROR_INVAL);
253  return -1;
254 }
255
256 mes->type = type;
257
258 return 0;
259}
260
261int roar_roardmx_message_get_flag(struct roar_roardmx_message * mes, unsigned char * flag) {
262 BCHK(mes);
263
264 *flag = mes->flags;
265
266 return 0;
267}
268
269int roar_roardmx_message_get_type(struct roar_roardmx_message * mes, unsigned char * type) {
270 BCHK(mes);
271
272 *type = mes->type;
273
274 return 0;
275}
276
277int roar_roardmx_message_get_len (struct roar_roardmx_message * mes, size_t        * length) {
278 BCHK(mes);
279
280 *length = mes->length;
281
282 return 0;
283}
284
285
286// IO:
287int roar_roardmx_message_send(struct roar_roardmx_message * mes, struct roar_vio_calls * vio) {
288 BCHK(mes);
289 BCHK(vio);
290
291 if ( mes->length > ROAR_ROARDMX_DATA_LENGTH ) { // this is very fatal!
292  roar_panic(ROAR_FATAL_ERROR_MEMORY_CORRUPTION, NULL);
293  roar_err_set(ROAR_ERROR_FAULT);
294  return -1;
295 }
296
297 mes->data[0] =  mes->version;
298 mes->data[1] = (mes->flags & ROAR_ROARDMX_MASK_FLAGS) |
299                (mes->type  & ROAR_ROARDMX_MASK_TYPE ) ;
300
301 mes->data[2] = mes->length;
302
303 return roar_vio_write(vio, mes->data, mes->length + 3) == (ssize_t)(mes->length + 3) ? 0 : -1;
304}
305
306int roar_roardmx_message_recv(struct roar_roardmx_message * mes, struct roar_vio_calls * vio) {
307 BCHK(mes);
308 BCHK(vio);
309
310 if ( roar_roardmx_message_new(mes) == -1 )
311  return -1;
312
313 if ( roar_vio_read(vio, mes->data, 3) != 3 )
314  return -1;
315
316 mes->version = mes->data[0];
317
318 if ( mes->version != ROAR_ROARDMX_VERSION ) {
319  roar_err_set(ROAR_ERROR_NSVERSION);
320  return -1;
321 }
322
323 mes->flags  = mes->data[1] & ROAR_ROARDMX_MASK_FLAGS;
324 mes->type   = mes->data[1] & ROAR_ROARDMX_MASK_TYPE;
325
326 mes->length = mes->data[2];
327
328 if ( roar_vio_read(vio, &(mes->data[3]), mes->length) != (ssize_t)mes->length )
329  return -1;
330
331 return 0;
332}
333
334// Data/high level:
335// * *:
336int roar_roardmx_message_add_chanval(struct roar_roardmx_message * mes, uint16_t channel, unsigned char val) {
337 register uint16_t * chan;
338
339 BCHK(mes);
340
341 switch (mes->type) {
342  case ROAR_ROARDMX_TYPE_SSET:
343  case ROAR_ROARDMX_TYPE_INC8S:
344   break;
345  default:
346    roar_err_set(ROAR_ERROR_TYPEMM);
347    return -1;
348   break;
349 }
350
351 if ( (mes->length + 3) > ROAR_ROARDMX_DATA_LENGTH ) { // message would be to long
352  roar_err_set(ROAR_ERROR_NOSPC);
353  return -1;
354 }
355
356 chan = (uint16_t *) &(mes->data[mes->length + 3]);
357
358 *chan = ROAR_HOST2NET16(channel);
359
360 mes->data[mes->length + 2 + 3] = val;
361
362 mes->length += 3;
363
364 return 0;
365}
366
367int roar_roardmx_message_get_chanval(struct roar_roardmx_message * mes, uint16_t * channel, unsigned char * val, int index) {
368 register uint16_t * chan;
369
370 BCHK(mes);
371
372 if ( index < 0 ) {
373  roar_err_set(ROAR_ERROR_INVAL);
374  return -1;
375 }
376
377 if ( mes->version != ROAR_ROARDMX_VERSION ) {
378  roar_err_set(ROAR_ERROR_NSVERSION);
379  return -1;
380 }
381
382 switch (mes->type) {
383  case ROAR_ROARDMX_TYPE_SSET:
384  case ROAR_ROARDMX_TYPE_INC8S:
385    if ( index >= (ROAR_ROARDMX_DATA_LENGTH/3) )
386     return -1;
387
388    *val     = mes->data[3 * index + 2 + 3];
389    chan     = (uint16_t *) &(mes->data[3 + 3 * index]);
390    *channel = ROAR_NET2HOST16(*chan);
391    return 0;
392   break;
393 }
394
395 roar_err_set(ROAR_ERROR_NSTYPE);
396 return -1;
397}
398
399int roar_roardmx_message_numchannels(struct roar_roardmx_message * mes) {
400 BCHK(mes);
401
402 if ( mes->version != ROAR_ROARDMX_VERSION ) {
403  roar_err_set(ROAR_ERROR_NSVERSION);
404  return -1;
405 }
406
407 switch (mes->type) {
408  case ROAR_ROARDMX_TYPE_SSET:
409  case ROAR_ROARDMX_TYPE_INC8S:
410    return mes->length /  3;
411   break;
412  case ROAR_ROARDMX_TYPE_IPO1:
413    return mes->length /  6;
414   break;
415  case ROAR_ROARDMX_TYPE_IPO4:
416    return mes->length / 12;
417   break;
418  case ROAR_ROARDMX_TYPE_RANGESET:
419    return mes->length /  5;
420   break;
421  case ROAR_ROARDMX_TYPE_EVENT:
422  case ROAR_ROARDMX_TYPE_CONTROL:
423    return 0;
424   break;
425 }
426
427 roar_err_set(ROAR_ERROR_NSTYPE);
428 return -1;
429}
430
431// * SSET:
432int roar_roardmx_message_new_sset   (struct roar_roardmx_message * mes) {
433 BCHK(mes);
434
435 if ( roar_roardmx_message_new(mes) == -1 )
436  return -1;
437
438 mes->type = ROAR_ROARDMX_TYPE_SSET;
439
440 return 0;
441}
442
443// * IPO1:
444// Not yet supported.
445// * IPO4:
446// Not yet supported.
447// * INC8S:
448// Not yet supported.
449// * RANGESET:
450int roar_roardmx_message_new_rangeset(struct roar_roardmx_message * mes) {
451 BCHK(mes);
452
453 if ( roar_roardmx_message_new(mes) == -1 )
454  return -1;
455
456 mes->type = ROAR_ROARDMX_TYPE_RANGESET;
457
458 return 0;
459}
460
461int roar_roardmx_message_add_rangeval(struct roar_roardmx_message * mes, uint16_t   start, uint16_t   end, unsigned char   val) {
462 register uint8_t * p;
463
464 BCHK(mes);
465
466 if ( mes->type != ROAR_ROARDMX_TYPE_RANGESET ) {
467  roar_err_set(ROAR_ERROR_TYPEMM);
468  return -1;
469 }
470
471 if ( (mes->length + 5) > ROAR_ROARDMX_DATA_LENGTH ) { // message would be to long
472  roar_err_set(ROAR_ERROR_NOSPC);
473  return -1;
474 }
475
476 if ( start > end ) {
477  roar_err_set(ROAR_ERROR_RANGE);
478  return -1;
479 }
480
481 p = mes->data + 3 + mes->length;
482
483 p[0] = (start & 0xFF00) >> 8;
484 p[1] = (start & 0x00FF);
485 p[2] = (end   & 0xFF00) >> 8;
486 p[3] = (end   & 0x00FF);
487 p[4] = val;
488
489 mes->length += 5;
490
491 return 0;
492}
493
494int roar_roardmx_message_get_rangeval(struct roar_roardmx_message * mes, uint16_t * start, uint16_t * end, unsigned char * val, int index) {
495 register uint8_t * p;
496 register uint16_t v;
497
498 BCHK(mes);
499
500 if ( index < 0 ) {
501  roar_err_set(ROAR_ERROR_INVAL);
502  return -1;
503 }
504
505 if ( mes->version != ROAR_ROARDMX_VERSION ) {
506  roar_err_set(ROAR_ERROR_NSVERSION);
507  return -1;
508 }
509
510 if ( mes->type != ROAR_ROARDMX_TYPE_RANGESET ) {
511  roar_err_set(ROAR_ERROR_TYPEMM);
512  return -1;
513 }
514
515 if ( (((size_t)index + 1) * 5) > mes->length ) {
516  ROAR_DBG("roar_roardmx_message_get_rangeval(mes=%p{.length=%i, ...}, start=%p, end=%p, val=%p, index=%i) = ?", mes, (int)mes->length, start, end, val, index);
517  roar_err_set(ROAR_ERROR_NOENT);
518  return -1;
519 }
520
521 p = mes->data + 3 + index * 5;
522
523 v   = *(p++);
524 v <<= 8;
525 v  += *(p++);
526 *start = v;
527
528 v   = *(p++);
529 v <<= 8;
530 v  += *(p++);
531 *end = v;
532
533 *val = *p;
534
535 return 0;
536}
537
538// * EVENT:
539int roar_roardmx_message_new_event(struct roar_roardmx_message * mes) {
540 BCHK(mes);
541
542 if ( roar_roardmx_message_new(mes) == -1 )
543  return -1;
544
545 mes->type = ROAR_ROARDMX_TYPE_EVENT;
546
547 return 0;
548}
549
550int roar_roardmx_message_add_events(struct roar_roardmx_message * mes, const uint8_t * events, size_t len) {
551 BCHK(mes);
552
553 if ( mes->type != ROAR_ROARDMX_TYPE_EVENT ) {
554  roar_err_set(ROAR_ERROR_TYPEMM);
555  return -1;
556 }
557
558 if ( (mes->length + len) > ROAR_ROARDMX_DATA_LENGTH ) { // message would be to long
559  roar_err_set(ROAR_ERROR_NOSPC);
560  return -1;
561 }
562
563 memcpy(mes->data + 3 + mes->length, events, len);
564 mes->length += len;
565
566 return 0;
567}
568
569int roar_roardmx_message_get_events(struct roar_roardmx_message * mes, const uint8_t ** events, size_t * len) {
570 BCHK(mes);
571
572 if ( mes->type != ROAR_ROARDMX_TYPE_EVENT ) {
573  roar_err_set(ROAR_ERROR_TYPEMM);
574  return -1;
575 }
576
577 *events = (const uint8_t *)(mes->data + 3);
578 *len    = mes->length;
579
580 return 0;
581}
582
583// * CONTROL:
584static inline int roar_roardmx_message_new_control(struct roar_roardmx_message * mes, uint8_t subcommand) {
585 BCHK(mes);
586
587 if ( roar_roardmx_message_new(mes) == -1 )
588  return -1;
589
590 mes->type = ROAR_ROARDMX_TYPE_CONTROL;
591 mes->data[3] = 0; // version
592 mes->data[4] = subcommand;
593 mes->length  = 2;
594
595 return 0;
596}
597
598int roar_roardmx_message_new_version(struct roar_roardmx_message * mes, uint8_t version) {
599 BCHK(mes);
600
601 if ( version != (uint8_t)0 ) {
602  roar_err_set(ROAR_ERROR_NSVERSION);
603  return -1;
604 }
605
606 if ( roar_roardmx_message_new_control(mes, ROAR_ROARDMX_CTL_VERSION) == -1 )
607  return -1;
608
609 mes->data[5] = version;
610 mes->length  = 3;
611
612 return 0;
613}
614
615int roar_roardmx_message_new_sync(struct roar_roardmx_message * mes, uint8_t flags) {
616 BCHK(mes);
617
618 if ( roar_roardmx_message_new_control(mes, ROAR_ROARDMX_CTL_VERSION) == -1 )
619  return -1;
620
621 mes->data[5] = flags;
622 mes->length  = 3;
623
624 return 0;
625}
626
627int roar_roardmx_message_get_subcommand(struct roar_roardmx_message * mes) {
628 BCHK(mes);
629
630 if ( mes->type != ROAR_ROARDMX_TYPE_CONTROL ) {
631  roar_err_set(ROAR_ERROR_TYPEMM);
632  return -1;
633 }
634
635 if ( mes->length < 2 ) {
636  roar_err_set(ROAR_ERROR_PROTO);
637  return -1;
638 }
639
640 if ( mes->data[3] != 0 ) {
641  roar_err_set(ROAR_ERROR_NSVERSION);
642  return -1;
643 }
644
645 return mes->data[4];
646}
647
648static inline int roar_roardmx_message_get_ctl_byte5(struct roar_roardmx_message * mes, uint8_t subtype) {
649 BCHK(mes);
650
651 if ( mes->type != ROAR_ROARDMX_TYPE_CONTROL ) {
652  roar_err_set(ROAR_ERROR_TYPEMM);
653  return -1;
654 }
655
656 if ( roar_roardmx_message_get_subcommand(mes) != (int)(unsigned)subtype ) {
657  roar_err_set(ROAR_ERROR_TYPEMM);
658  return -1;
659 }
660
661 return mes->data[5];
662}
663
664int roar_roardmx_message_get_ctl_version(struct roar_roardmx_message * mes) {
665 return roar_roardmx_message_get_ctl_byte5(mes, ROAR_ROARDMX_CTL_VERSION);
666}
667
668int roar_roardmx_message_get_ctl_flags(struct roar_roardmx_message * mes) {
669 return roar_roardmx_message_get_ctl_byte5(mes, ROAR_ROARDMX_CTL_SYNC);
670}
671
672//ll
Note: See TracBrowser for help on using the repository browser.