gusimplewhiteboard
wb_vision_lines.c
Go to the documentation of this file.
1/*
2 * file wb_vision_lines.c
3 *
4 * This file was generated by classgenerator from vision_lines.gen.
5 * DO NOT CHANGE MANUALLY!
6 *
7 * Copyright © 2021 Eugene Gilmore. All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer in the documentation and/or other materials
19 * provided with the distribution.
20 *
21 * 3. All advertising materials mentioning features or use of this
22 * software must display the following acknowledgement:
23 *
24 * This product includes software developed by Eugene Gilmore.
25 *
26 * 4. Neither the name of the author nor the names of contributors
27 * may be used to endorse or promote products derived from this
28 * software without specific prior written permission.
29 *
30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
33 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
34 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
35 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
36 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
37 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
38 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
39 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
40 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 *
42 * -----------------------------------------------------------------------
43 * This program is free software; you can redistribute it and/or
44 * modify it under the above terms or under the terms of the GNU
45 * General Public License as published by the Free Software Foundation;
46 * either version 2 of the License, or (at your option) any later version.
47 *
48 * This program is distributed in the hope that it will be useful,
49 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
51 * GNU General Public License for more details.
52 *
53 * You should have received a copy of the GNU General Public License
54 * along with this program; if not, see http://www.gnu.org/licenses/
55 * or write to the Free Software Foundation, Inc., 51 Franklin Street,
56 * Fifth Floor, Boston, MA 02110-1301, USA.
57 *
58 */
59
60#ifndef WHITEBOARD_POSTER_STRING_CONVERSION
61#define WHITEBOARD_POSTER_STRING_CONVERSION
62#endif // WHITEBOARD_POSTER_STRING_CONVERSION
63
64#include "wb_vision_lines.h"
65#include <stdio.h>
66#include <string.h>
67#include <stdlib.h>
68#include <ctype.h>
69#include <limits.h>
70
71/* Network byte order functions */
72#pragma clang diagnostic push
73#pragma clang diagnostic ignored "-Wunused-macros"
74#if defined(__linux)
75# include <endian.h>
76# include <byteswap.h>
77#elif defined(__APPLE__)
78# include <machine/endian.h> //Needed for __BYTE_ORDER
79# include <architecture/byte_order.h> //Needed for byte swap functions
80# define bswap_16(x) NXSwapShort(x)
81# define bswap_32(x) NXSwapInt(x)
82# define bswap_64(x) NXSwapLongLong(x)
83#elif defined(ESP8266)
84# define bswap_16(x) __builtin_bswap16(x)
85# define bswap_32(x) __builtin_bswap32(x)
86# define bswap_64(x) __builtin_bswap64(x)
87#else
88 //Manually define swap macros?
89#endif
90
91#if (!defined(__BYTE_ORDER) && !defined(__LITTLE_ENDIAN)) || (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN)
92# if !defined(htonll) && !defined(ntohll)
93# define htonll(x) bswap_64(x)
94# define ntohll(x) bswap_64(x)
95# endif
96# if !defined(htonl) && !defined(ntohl)
97# define htonl(x) bswap_32(x)
98# define ntohl(x) bswap_32(x)
99# endif
100# if !defined(htons) && !defined(ntohs)
101# define htons(x) bswap_16(x)
102# define ntohs(x) bswap_16(x)
103# endif
104#else
105# if !defined(htonll) && !defined(ntohll)
106# define htonll(x) (x)
107# define ntohll(x) (x)
108# endif
109# if !defined(htonl) && !defined(ntohl)
110# define htonl(x) (x)
111# define ntohl(x) (x)
112# endif
113# if !defined(htons) && !defined(ntohs)
114# define htons(x) (x)
115# define ntohs(x) (x)
116# endif
117#endif
118#pragma clang diagnostic pop
119
120
121
125const char* wb_vision_lines_description(const struct wb_vision_lines* self, char* descString, size_t bufferSize)
126{
127#pragma clang diagnostic push
128#pragma clang diagnostic ignored "-Wunused-variable"
129 size_t len = 0;
130 if (len >= bufferSize) {
131 return descString;
132 }
133 len = gu_strlcat(descString, "lines={", bufferSize);
134 for (int lines_index = 0; lines_index < VISION_LINES_LINES_ARRAY_SIZE; lines_index++) {
135 if (len >= bufferSize) {
136 return descString;
137 }
138 if (lines_index > 0) {
139 len = gu_strlcat(descString, ", ", bufferSize);
140 }
141 len = gu_strlcat(descString, "{", bufferSize);
142 if (len >= bufferSize) {
143 return descString;
144 }
145 char lines_1_buffer[VISION_LINE_DESC_BUFFER_SIZE];
146 char* lines_1_p = lines_1_buffer;
147 const char* lines_1_description = wb_vision_line_description(&self->lines[lines_index], lines_1_p, VISION_LINE_DESC_BUFFER_SIZE);
148 len = gu_strlcat(descString, lines_1_p, bufferSize);
149 if (len >= bufferSize) {
150 return descString;
151 }
152 len = gu_strlcat(descString, "}", bufferSize);
153 }
154 if (len >= bufferSize) {
155 return descString;
156 }
157 len = gu_strlcat(descString, "}", bufferSize);
158 if (len >= bufferSize) {
159 return descString;
160 }
161 len = gu_strlcat(descString, ", ", bufferSize);
162 if (len >= bufferSize) {
163 return descString;
164 }
165 len += snprintf(descString + len, bufferSize - len, "numLines=%u", self->numLines);
166 if (len >= bufferSize) {
167 return descString;
168 }
169 len = gu_strlcat(descString, ", ", bufferSize);
170 if (len >= bufferSize) {
171 return descString;
172 }
173#ifdef __APPLE__
174 len += snprintf(descString + len, bufferSize - len, "frameNumber=%llu", self->frameNumber);
175#else
176 len += snprintf(descString + len, bufferSize - len, "frameNumber=%lu", self->frameNumber);
177#endif
178 if (len >= bufferSize) {
179 return descString;
180 }
181 len = gu_strlcat(descString, ", ", bufferSize);
182 if (len >= bufferSize) {
183 return descString;
184 }
185 len += snprintf(descString + len, bufferSize - len, "res_width=%u", self->res_width);
186 if (len >= bufferSize) {
187 return descString;
188 }
189 len = gu_strlcat(descString, ", ", bufferSize);
190 if (len >= bufferSize) {
191 return descString;
192 }
193 len += snprintf(descString + len, bufferSize - len, "res_height=%u", self->res_height);
194 return descString;
195#pragma clang diagnostic pop
196}
197
201const char* wb_vision_lines_to_string(const struct wb_vision_lines* self, char* toString, size_t bufferSize)
202{
203#pragma clang diagnostic push
204#pragma clang diagnostic ignored "-Wunused-variable"
205 size_t len = 0;
206 if (len >= bufferSize) {
207 return toString;
208 }
209 len = gu_strlcat(toString, "{", bufferSize);
210 for (int lines_index = 0; lines_index < VISION_LINES_LINES_ARRAY_SIZE; lines_index++) {
211 if (len >= bufferSize) {
212 return toString;
213 }
214 if (lines_index > 0) {
215 len = gu_strlcat(toString, ", ", bufferSize);
216 }
217 len = gu_strlcat(toString, "{", bufferSize);
218 if (len >= bufferSize) {
219 return toString;
220 }
221 char lines_1_buffer[VISION_LINE_TO_STRING_BUFFER_SIZE];
222 char* lines_1_p = lines_1_buffer;
223 const char* lines_1_to_string = wb_vision_line_to_string(&self->lines[lines_index], lines_1_p, VISION_LINE_TO_STRING_BUFFER_SIZE);
224 len = gu_strlcat(toString, lines_1_p, bufferSize);
225 if (len >= bufferSize) {
226 return toString;
227 }
228 len = gu_strlcat(toString, "}", bufferSize);
229 }
230 if (len >= bufferSize) {
231 return toString;
232 }
233 len = gu_strlcat(toString, "}", bufferSize);
234 if (len >= bufferSize) {
235 return toString;
236 }
237 len = gu_strlcat(toString, ", ", bufferSize);
238 if (len >= bufferSize) {
239 return toString;
240 }
241 len += snprintf(toString + len, bufferSize - len, "%u", self->numLines);
242 if (len >= bufferSize) {
243 return toString;
244 }
245 len = gu_strlcat(toString, ", ", bufferSize);
246 if (len >= bufferSize) {
247 return toString;
248 }
249#ifdef __APPLE__
250 len += snprintf(toString + len, bufferSize - len, "%llu", self->frameNumber);
251#else
252 len += snprintf(toString + len, bufferSize - len, "%lu", self->frameNumber);
253#endif
254 if (len >= bufferSize) {
255 return toString;
256 }
257 len = gu_strlcat(toString, ", ", bufferSize);
258 if (len >= bufferSize) {
259 return toString;
260 }
261 len += snprintf(toString + len, bufferSize - len, "%u", self->res_width);
262 if (len >= bufferSize) {
263 return toString;
264 }
265 len = gu_strlcat(toString, ", ", bufferSize);
266 if (len >= bufferSize) {
267 return toString;
268 }
269 len += snprintf(toString + len, bufferSize - len, "%u", self->res_height);
270 return toString;
271#pragma clang diagnostic pop
272}
273
277struct wb_vision_lines* wb_vision_lines_from_string(struct wb_vision_lines* self, const char* str)
278{
279 size_t temp_length = strlen(str);
280 int length = (temp_length <= INT_MAX) ? ((int)((ssize_t)temp_length)) : -1;
281 if (length < 1 || length > VISION_LINES_DESC_BUFFER_SIZE) {
282 return self;
283 }
284 char var_str_buffer[VISION_LINES_DESC_BUFFER_SIZE + 1];
285 char* var_str = &var_str_buffer[0];
286 char key_buffer[12];
287 char* key = &key_buffer[0];
288 int bracecount = 0;
289 int lastBrace = -1;
290 int startVar = 0;
291 int index = 0;
292 int startKey = 0;
293 int endKey = -1;
294 int varIndex = 0;
295 if (index == 0 && str[0] == '{') {
296 index = 1;
297 }
298 startVar = index;
299 startKey = startVar;
300 do {
301 for (int i = index; i < length; i++) {
302 index = i + 1;
303 if (bracecount == 0 && str[i] == '=') {
304 endKey = i - 1;
305 startVar = index;
306 continue;
307 }
308 if (bracecount == 0 && isspace(str[i])) {
309 startVar = index;
310 if (endKey == -1) {
311 startKey = index;
312 }
313 continue;
314 }
315 if (bracecount == 0 && str[i] == ',') {
316 index = i - 1;
317 break;
318 }
319 if (str[i] == '{') {
320 bracecount++;
321 if (bracecount == 1) {
322 lastBrace = i;
323 }
324 continue;
325 }
326 if (str[i] == '}') {
327 bracecount--;
328 if (bracecount < 0) {
329 index = i - 1;
330 break;
331 }
332 }
333 if (i == length - 1) {
334 index = i;
335 }
336 }
337 if (endKey >= startKey && endKey - startKey < length) {
338 strncpy(key, str + startKey, ((size_t)(endKey - startKey) + 1));
339 key[(endKey - startKey) + 1] = 0;
340 } else {
341 key[0] = 0;
342 }
343 strncpy(var_str, str + startVar, ((size_t)(index - startVar) + 1));
344 var_str[(index - startVar) + 1] = 0;
345 bracecount = 0;
346 index += 2;
347 startVar = index;
348 startKey = startVar;
349 endKey = -1;
350 if (strlen(key) > 0) {
351 if (0 == strcmp("lines", key)) {
352 varIndex = 0;
353 } else if (0 == strcmp("numLines", key)) {
354 varIndex = 1;
355 } else if (0 == strcmp("frameNumber", key)) {
356 varIndex = 2;
357 } else if (0 == strcmp("res_width", key)) {
358 varIndex = 3;
359 } else if (0 == strcmp("res_height", key)) {
360 varIndex = 4;
361 } else {
362 varIndex = -1;
363 }
364 }
365 switch (varIndex) {
366 case -1: { break; }
367 case 0:
368 {
369 int restartIndex = index;
370 index = lastBrace + 1;
371 startVar = index;
372 startKey = startVar;
373 endKey = -1;
374 bracecount = 0;
375 for (int lines_0_index = 0; lines_0_index < VISION_LINES_LINES_ARRAY_SIZE; lines_0_index++) {
376 for (int i = index; i < length; i++) {
377 index = i + 1;
378 if (bracecount == 0 && str[i] == '=') {
379 endKey = i - 1;
380 startVar = index;
381 continue;
382 }
383 if (bracecount == 0 && isspace(str[i])) {
384 startVar = index;
385 if (endKey == -1) {
386 startKey = index;
387 }
388 continue;
389 }
390 if (bracecount == 0 && str[i] == ',') {
391 index = i - 1;
392 break;
393 }
394 if (str[i] == '{') {
395 bracecount++;
396 continue;
397 }
398 if (str[i] == '}') {
399 bracecount--;
400 if (bracecount < 0) {
401 index = i - 1;
402 break;
403 }
404 }
405 if (i == length - 1) {
406 index = i;
407 }
408 }
409 if (endKey >= startKey && endKey - startKey < length) {
410 strncpy(key, str + startKey, ((size_t)(endKey - startKey) + 1));
411 key[(endKey - startKey) + 1] = 0;
412 } else {
413 key[0] = 0;
414 }
415 strncpy(var_str, str + startVar, ((size_t)(index - startVar) + 1));
416 var_str[(index - startVar) + 1] = 0;
417 bracecount = 0;
418 index += 2;
419 startVar = index;
420 startKey = startVar;
421 endKey = -1;
422 struct wb_vision_line lines_0 = {};
423 wb_vision_line_from_string(&lines_0, var_str);
424 self->lines[lines_0_index] = lines_0;
425 }
426 index = restartIndex;
427 break;
428 }
429 case 1:
430 {
431 self->numLines = ((uint8_t)atoi(var_str));
432 break;
433 }
434 case 2:
435 {
436#ifdef __APPLE__
437 self->frameNumber = ((uint64_t)atoll(var_str));
438#else
439 self->frameNumber = ((uint64_t)atol(var_str));
440#endif
441 break;
442 }
443 case 3:
444 {
445 self->res_width = ((uint16_t)atoi(var_str));
446 break;
447 }
448 case 4:
449 {
450 self->res_height = ((uint16_t)atoi(var_str));
451 break;
452 }
453 }
454 if (varIndex >= 0) {
455 varIndex++;
456 }
457 } while(index < length);
458 return self;
459}
460
461/*#ifdef WHITEBOARD_SERIALISATION*/
462
466size_t wb_vision_lines_to_network_serialised(const struct wb_vision_lines *self, char *dst)
467{
468 uint16_t bit_offset = 0;
469 //Class generator does not support array network compression.
470 //Copying into the buffer, uncompressed
471 do { //limit declaration scope
472 uint32_t len = 7;
473 uint32_t bytes = len * sizeof(struct wb_vision_line);
474 const char *buf = (const char *)&self->lines[0];
475 uint32_t c;
476 int8_t b;
477 for (c = 0; c < bytes; c++) {
478 for (b = 7; b >= 0; b--) {
479 do {
480 uint16_t byte = bit_offset / 8;
481 uint16_t bit = 7 - (bit_offset % 8);
482 unsigned long newbit = !!((buf[c] >> b) & 1U);
483 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
484 bit_offset = bit_offset + 1;
485 } while(false);
486 }
487 }
488 } while(false);
489
490 uint8_t numLines_nbo = (self->numLines);
491 do {
492 int8_t b;
493 for (b = (8 - 1); b >= 0; b--) {
494 do {
495 uint16_t byte = bit_offset / 8;
496 uint16_t bit = 7 - (bit_offset % 8);
497 unsigned long newbit = !!((numLines_nbo >> b) & 1U);
498 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
499 bit_offset = bit_offset + 1;
500 } while(false);
501 }
502 } while(false);
503
504 uint64_t frameNumber_nbo = htonll(self->frameNumber);
505 do {
506 int8_t b;
507 for (b = (64 - 1); b >= 0; b--) {
508 do {
509 uint16_t byte = bit_offset / 8;
510 uint16_t bit = 7 - (bit_offset % 8);
511 unsigned long newbit = !!((frameNumber_nbo >> b) & 1U);
512 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
513 bit_offset = bit_offset + 1;
514 } while(false);
515 }
516 } while(false);
517
518 uint16_t res_width_nbo = htons(self->res_width);
519 do {
520 int8_t b;
521 for (b = (16 - 1); b >= 0; b--) {
522 do {
523 uint16_t byte = bit_offset / 8;
524 uint16_t bit = 7 - (bit_offset % 8);
525 unsigned long newbit = !!((res_width_nbo >> b) & 1U);
526 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
527 bit_offset = bit_offset + 1;
528 } while(false);
529 }
530 } while(false);
531
532 uint16_t res_height_nbo = htons(self->res_height);
533 do {
534 int8_t b;
535 for (b = (16 - 1); b >= 0; b--) {
536 do {
537 uint16_t byte = bit_offset / 8;
538 uint16_t bit = 7 - (bit_offset % 8);
539 unsigned long newbit = !!((res_height_nbo >> b) & 1U);
540 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
541 bit_offset = bit_offset + 1;
542 } while(false);
543 }
544 } while(false);
545 //avoid unused variable warnings when you try to use an empty gen file or a gen file with no supported serialisation types.
546 (void)self;
547 (void)dst;
548 return bit_offset;
549}
550
555{
556 uint16_t bit_offset = 0;
557 //Class generator does not support array network compression.
558 //Copying into the buffer, uncompressed
559 do { //limit declaration scope
560 uint32_t len = 7;
561 uint32_t bytes = len * sizeof(struct wb_vision_line);
562 char *buf = (char *)malloc(bytes);
563 uint32_t c;
564 int8_t b;
565 for (c = 0; c < bytes; c++) {
566 for (b = 7; b >= 0; b--) {
567 do {
568 uint16_t byte = bit_offset / 8;
569 uint16_t bit = 7 - (bit_offset % 8);
570 char dataByte = src[byte];
571 unsigned char bitValue = (dataByte >> bit) & 1U;
572 buf[c] ^= (-bitValue ^ buf[c]) & (1UL << b);
573 bit_offset = bit_offset + 1;
574 } while(false);
575 }
576 }
577 memcpy(&dst->lines[0], &buf[0], bytes);
578 free(buf);
579 } while(false);
580
581 do {
582 int8_t b;
583 for (b = (8 - 1); b >= 0; b--) {
584 do {
585 uint16_t byte = bit_offset / 8;
586 uint16_t bit = 7 - (bit_offset % 8);
587 char dataByte = src[byte];
588 unsigned char bitValue = (dataByte >> bit) & 1U;
589 dst->numLines ^= (-bitValue ^ dst->numLines) & (1UL << b);
590 bit_offset = bit_offset + 1;
591 } while(false);
592 }
593 } while(false);
594 dst->numLines = (dst->numLines);
595
596 do {
597 int8_t b;
598 for (b = (64 - 1); b >= 0; b--) {
599 do {
600 uint16_t byte = bit_offset / 8;
601 uint16_t bit = 7 - (bit_offset % 8);
602 char dataByte = src[byte];
603 unsigned char bitValue = (dataByte >> bit) & 1U;
604 dst->frameNumber ^= (-bitValue ^ dst->frameNumber) & (1UL << b);
605 bit_offset = bit_offset + 1;
606 } while(false);
607 }
608 } while(false);
609 dst->frameNumber = ntohll(dst->frameNumber);
610
611 do {
612 int8_t b;
613 for (b = (16 - 1); b >= 0; b--) {
614 do {
615 uint16_t byte = bit_offset / 8;
616 uint16_t bit = 7 - (bit_offset % 8);
617 char dataByte = src[byte];
618 unsigned char bitValue = (dataByte >> bit) & 1U;
619 dst->res_width ^= (-bitValue ^ dst->res_width) & (1UL << b);
620 bit_offset = bit_offset + 1;
621 } while(false);
622 }
623 } while(false);
624 dst->res_width = ntohs(dst->res_width);
625
626 do {
627 int8_t b;
628 for (b = (16 - 1); b >= 0; b--) {
629 do {
630 uint16_t byte = bit_offset / 8;
631 uint16_t bit = 7 - (bit_offset % 8);
632 char dataByte = src[byte];
633 unsigned char bitValue = (dataByte >> bit) & 1U;
634 dst->res_height ^= (-bitValue ^ dst->res_height) & (1UL << b);
635 bit_offset = bit_offset + 1;
636 } while(false);
637 }
638 } while(false);
639 dst->res_height = ntohs(dst->res_height);
640 //avoid unused variable warnings when you try to use an empty gen file or a gen file with no supported serialisation types.
641 (void)src;
642 (void)dst;
643 return bit_offset;
644}
645
646/*#endif // WHITEBOARD_SERIALISATION*/
WHITEBOARD_POSTER_STRING_CONVERSION.
Class use to represent lines detected by vision for a single camera and posted to the whiteboard.
uint8_t numLines
The number of lines reported on the camera.
uint16_t res_width
The resolution width.
uint64_t frameNumber
The frame number that these lines were seen in.
struct wb_vision_line lines[7]
Lines reported from the camera.
uint16_t res_height
The resolution height.
const char * wb_vision_line_description(const struct wb_vision_line *self, char *descString, size_t bufferSize)
Convert to a description string.
const char * wb_vision_line_to_string(const struct wb_vision_line *self, char *toString, size_t bufferSize)
Convert to a string.
struct wb_vision_line * wb_vision_line_from_string(struct wb_vision_line *self, const char *str)
Convert from a string.
#define VISION_LINE_DESC_BUFFER_SIZE
#define VISION_LINE_TO_STRING_BUFFER_SIZE
const char * wb_vision_lines_description(const struct wb_vision_lines *self, char *descString, size_t bufferSize)
Convert to a description string.
struct wb_vision_lines * wb_vision_lines_from_string(struct wb_vision_lines *self, const char *str)
Convert from a string.
#define ntohll(x)
#define htons(x)
#define htonll(x)
const char * wb_vision_lines_to_string(const struct wb_vision_lines *self, char *toString, size_t bufferSize)
Convert to a string.
size_t wb_vision_lines_to_network_serialised(const struct wb_vision_lines *self, char *dst)
Convert to a compressed, serialised, network byte order byte stream.
#define ntohs(x)
size_t wb_vision_lines_from_network_serialised(const char *src, struct wb_vision_lines *dst)
Convert from a compressed, serialised, network byte order byte stream.
#define VISION_LINES_DESC_BUFFER_SIZE
#define VISION_LINES_LINES_ARRAY_SIZE
WHITEBOARD_POSTER_STRING_CONVERSION.