60#ifndef WHITEBOARD_POSTER_STRING_CONVERSION
61#define WHITEBOARD_POSTER_STRING_CONVERSION
72#pragma clang diagnostic push
73#pragma clang diagnostic ignored "-Wunused-macros"
77#elif defined(__APPLE__)
78# include <machine/endian.h>
79# include <architecture/byte_order.h>
80# define bswap_16(x) NXSwapShort(x)
81# define bswap_32(x) NXSwapInt(x)
82# define bswap_64(x) NXSwapLongLong(x)
84# define bswap_16(x) __builtin_bswap16(x)
85# define bswap_32(x) __builtin_bswap32(x)
86# define bswap_64(x) __builtin_bswap64(x)
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)
96# if !defined(htonl) && !defined(ntohl)
97# define htonl(x) bswap_32(x)
98# define ntohl(x) bswap_32(x)
100# if !defined(htons) && !defined(ntohs)
101# define htons(x) bswap_16(x)
102# define ntohs(x) bswap_16(x)
105# if !defined(htonll) && !defined(ntohll)
106# define htonll(x) (x)
107# define ntohll(x) (x)
109# if !defined(htonl) && !defined(ntohl)
113# if !defined(htons) && !defined(ntohs)
118#pragma clang diagnostic pop
127#pragma clang diagnostic push
128#pragma clang diagnostic ignored "-Wunused-variable"
130 if (len >= bufferSize) {
133 len = gu_strlcat(descString,
"fieldCorner={", bufferSize);
135 if (len >= bufferSize) {
138 if (fieldCorner_index > 0) {
139 len = gu_strlcat(descString,
", ", bufferSize);
141 len = gu_strlcat(descString,
"{", bufferSize);
142 if (len >= bufferSize) {
146 char* fieldCorner_1_p = fieldCorner_1_buffer;
148 len = gu_strlcat(descString, fieldCorner_1_p, bufferSize);
149 if (len >= bufferSize) {
152 len = gu_strlcat(descString,
"}", bufferSize);
154 if (len >= bufferSize) {
157 len = gu_strlcat(descString,
"}", bufferSize);
158 if (len >= bufferSize) {
161 len = gu_strlcat(descString,
", ", bufferSize);
162 if (len >= bufferSize) {
165 len = gu_strlcat(descString,
"fieldIntersection={", bufferSize);
167 if (len >= bufferSize) {
170 if (fieldIntersection_index > 0) {
171 len = gu_strlcat(descString,
", ", bufferSize);
173 len = gu_strlcat(descString,
"{", bufferSize);
174 if (len >= bufferSize) {
178 char* fieldIntersection_1_p = fieldIntersection_1_buffer;
180 len = gu_strlcat(descString, fieldIntersection_1_p, bufferSize);
181 if (len >= bufferSize) {
184 len = gu_strlcat(descString,
"}", bufferSize);
186 if (len >= bufferSize) {
189 len = gu_strlcat(descString,
"}", bufferSize);
190 if (len >= bufferSize) {
193 len = gu_strlcat(descString,
", ", bufferSize);
194 if (len >= bufferSize) {
197 len = gu_strlcat(descString,
"fieldCrosses={", bufferSize);
199 if (len >= bufferSize) {
202 if (fieldCrosses_index > 0) {
203 len = gu_strlcat(descString,
", ", bufferSize);
205 len = gu_strlcat(descString,
"{", bufferSize);
206 if (len >= bufferSize) {
210 char* fieldCrosses_1_p = fieldCrosses_1_buffer;
212 len = gu_strlcat(descString, fieldCrosses_1_p, bufferSize);
213 if (len >= bufferSize) {
216 len = gu_strlcat(descString,
"}", bufferSize);
218 if (len >= bufferSize) {
221 len = gu_strlcat(descString,
"}", bufferSize);
222 if (len >= bufferSize) {
225 len = gu_strlcat(descString,
", ", bufferSize);
226 if (len >= bufferSize) {
229 len += snprintf(descString + len, bufferSize - len,
"numCorners=%u", self->numCorners);
230 if (len >= bufferSize) {
233 len = gu_strlcat(descString,
", ", bufferSize);
234 if (len >= bufferSize) {
237 len += snprintf(descString + len, bufferSize - len,
"numIntersections=%u", self->numIntersections);
238 if (len >= bufferSize) {
241 len = gu_strlcat(descString,
", ", bufferSize);
242 if (len >= bufferSize) {
245 len += snprintf(descString + len, bufferSize - len,
"numCrosses=%u", self->numCrosses);
246 if (len >= bufferSize) {
249 len = gu_strlcat(descString,
", ", bufferSize);
250 if (len >= bufferSize) {
253 len += snprintf(descString + len, bufferSize - len,
"res_width=%u", self->res_width);
254 if (len >= bufferSize) {
257 len = gu_strlcat(descString,
", ", bufferSize);
258 if (len >= bufferSize) {
261 len += snprintf(descString + len, bufferSize - len,
"res_height=%u", self->res_height);
263#pragma clang diagnostic pop
271#pragma clang diagnostic push
272#pragma clang diagnostic ignored "-Wunused-variable"
274 if (len >= bufferSize) {
277 len = gu_strlcat(toString,
"{", bufferSize);
279 if (len >= bufferSize) {
282 if (fieldCorner_index > 0) {
283 len = gu_strlcat(toString,
", ", bufferSize);
285 len = gu_strlcat(toString,
"{", bufferSize);
286 if (len >= bufferSize) {
290 char* fieldCorner_1_p = fieldCorner_1_buffer;
292 len = gu_strlcat(toString, fieldCorner_1_p, bufferSize);
293 if (len >= bufferSize) {
296 len = gu_strlcat(toString,
"}", bufferSize);
298 if (len >= bufferSize) {
301 len = gu_strlcat(toString,
"}", bufferSize);
302 if (len >= bufferSize) {
305 len = gu_strlcat(toString,
", ", bufferSize);
306 if (len >= bufferSize) {
309 len = gu_strlcat(toString,
"{", bufferSize);
311 if (len >= bufferSize) {
314 if (fieldIntersection_index > 0) {
315 len = gu_strlcat(toString,
", ", bufferSize);
317 len = gu_strlcat(toString,
"{", bufferSize);
318 if (len >= bufferSize) {
322 char* fieldIntersection_1_p = fieldIntersection_1_buffer;
324 len = gu_strlcat(toString, fieldIntersection_1_p, bufferSize);
325 if (len >= bufferSize) {
328 len = gu_strlcat(toString,
"}", bufferSize);
330 if (len >= bufferSize) {
333 len = gu_strlcat(toString,
"}", bufferSize);
334 if (len >= bufferSize) {
337 len = gu_strlcat(toString,
", ", bufferSize);
338 if (len >= bufferSize) {
341 len = gu_strlcat(toString,
"{", bufferSize);
343 if (len >= bufferSize) {
346 if (fieldCrosses_index > 0) {
347 len = gu_strlcat(toString,
", ", bufferSize);
349 len = gu_strlcat(toString,
"{", bufferSize);
350 if (len >= bufferSize) {
354 char* fieldCrosses_1_p = fieldCrosses_1_buffer;
356 len = gu_strlcat(toString, fieldCrosses_1_p, bufferSize);
357 if (len >= bufferSize) {
360 len = gu_strlcat(toString,
"}", bufferSize);
362 if (len >= bufferSize) {
365 len = gu_strlcat(toString,
"}", bufferSize);
366 if (len >= bufferSize) {
369 len = gu_strlcat(toString,
", ", bufferSize);
370 if (len >= bufferSize) {
373 len += snprintf(toString + len, bufferSize - len,
"%u", self->numCorners);
374 if (len >= bufferSize) {
377 len = gu_strlcat(toString,
", ", bufferSize);
378 if (len >= bufferSize) {
381 len += snprintf(toString + len, bufferSize - len,
"%u", self->numIntersections);
382 if (len >= bufferSize) {
385 len = gu_strlcat(toString,
", ", bufferSize);
386 if (len >= bufferSize) {
389 len += snprintf(toString + len, bufferSize - len,
"%u", self->numCrosses);
390 if (len >= bufferSize) {
393 len = gu_strlcat(toString,
", ", bufferSize);
394 if (len >= bufferSize) {
397 len += snprintf(toString + len, bufferSize - len,
"%u", self->res_width);
398 if (len >= bufferSize) {
401 len = gu_strlcat(toString,
", ", bufferSize);
402 if (len >= bufferSize) {
405 len += snprintf(toString + len, bufferSize - len,
"%u", self->res_height);
407#pragma clang diagnostic pop
415 size_t temp_length = strlen(str);
416 int length = (temp_length <= INT_MAX) ? ((
int)((ssize_t)temp_length)) : -1;
421 char* var_str = &var_str_buffer[0];
423 char* key = &key_buffer[0];
431 if (index == 0 && str[0] ==
'{') {
437 for (
int i = index; i < length; i++) {
439 if (bracecount == 0 && str[i] ==
'=') {
444 if (bracecount == 0 && isspace(str[i])) {
451 if (bracecount == 0 && str[i] ==
',') {
457 if (bracecount == 1) {
464 if (bracecount < 0) {
469 if (i == length - 1) {
473 if (endKey >= startKey && endKey - startKey < length) {
474 strncpy(key, str + startKey, ((
size_t)(endKey - startKey) + 1));
475 key[(endKey - startKey) + 1] = 0;
479 strncpy(var_str, str + startVar, ((
size_t)(index - startVar) + 1));
480 var_str[(index - startVar) + 1] = 0;
486 if (strlen(key) > 0) {
487 if (0 == strcmp(
"fieldCorner", key)) {
489 }
else if (0 == strcmp(
"fieldIntersection", key)) {
491 }
else if (0 == strcmp(
"fieldCrosses", key)) {
493 }
else if (0 == strcmp(
"numCorners", key)) {
495 }
else if (0 == strcmp(
"numIntersections", key)) {
497 }
else if (0 == strcmp(
"numCrosses", key)) {
499 }
else if (0 == strcmp(
"res_width", key)) {
501 }
else if (0 == strcmp(
"res_height", key)) {
511 int restartIndex = index;
512 index = lastBrace + 1;
518 for (
int i = index; i < length; i++) {
520 if (bracecount == 0 && str[i] ==
'=') {
525 if (bracecount == 0 && isspace(str[i])) {
532 if (bracecount == 0 && str[i] ==
',') {
542 if (bracecount < 0) {
547 if (i == length - 1) {
551 if (endKey >= startKey && endKey - startKey < length) {
552 strncpy(key, str + startKey, ((
size_t)(endKey - startKey) + 1));
553 key[(endKey - startKey) + 1] = 0;
557 strncpy(var_str, str + startVar, ((
size_t)(index - startVar) + 1));
558 var_str[(index - startVar) + 1] = 0;
566 self->fieldCorner[fieldCorner_0_index] = fieldCorner_0;
568 index = restartIndex;
573 int restartIndex = index;
574 index = lastBrace + 1;
580 for (
int i = index; i < length; i++) {
582 if (bracecount == 0 && str[i] ==
'=') {
587 if (bracecount == 0 && isspace(str[i])) {
594 if (bracecount == 0 && str[i] ==
',') {
604 if (bracecount < 0) {
609 if (i == length - 1) {
613 if (endKey >= startKey && endKey - startKey < length) {
614 strncpy(key, str + startKey, ((
size_t)(endKey - startKey) + 1));
615 key[(endKey - startKey) + 1] = 0;
619 strncpy(var_str, str + startVar, ((
size_t)(index - startVar) + 1));
620 var_str[(index - startVar) + 1] = 0;
628 self->fieldIntersection[fieldIntersection_0_index] = fieldIntersection_0;
630 index = restartIndex;
635 int restartIndex = index;
636 index = lastBrace + 1;
642 for (
int i = index; i < length; i++) {
644 if (bracecount == 0 && str[i] ==
'=') {
649 if (bracecount == 0 && isspace(str[i])) {
656 if (bracecount == 0 && str[i] ==
',') {
666 if (bracecount < 0) {
671 if (i == length - 1) {
675 if (endKey >= startKey && endKey - startKey < length) {
676 strncpy(key, str + startKey, ((
size_t)(endKey - startKey) + 1));
677 key[(endKey - startKey) + 1] = 0;
681 strncpy(var_str, str + startVar, ((
size_t)(index - startVar) + 1));
682 var_str[(index - startVar) + 1] = 0;
690 self->fieldCrosses[fieldCrosses_0_index] = fieldCrosses_0;
692 index = restartIndex;
697 self->numCorners = ((uint8_t)atoi(var_str));
702 self->numIntersections = ((uint8_t)atoi(var_str));
707 self->numCrosses = ((uint8_t)atoi(var_str));
712 self->res_width = ((uint16_t)atoi(var_str));
717 self->res_height = ((uint16_t)atoi(var_str));
724 }
while(index < length);
735 uint16_t bit_offset = 0;
741 const char *buf = (
const char *)&self->fieldCorner[0];
744 for (c = 0; c < bytes; c++) {
745 for (b = 7; b >= 0; b--) {
747 uint16_t
byte = bit_offset / 8;
748 uint16_t bit = 7 - (bit_offset % 8);
749 unsigned long newbit = !!((buf[c] >> b) & 1U);
750 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
751 bit_offset = bit_offset + 1;
762 const char *buf = (
const char *)&self->fieldIntersection[0];
765 for (c = 0; c < bytes; c++) {
766 for (b = 7; b >= 0; b--) {
768 uint16_t
byte = bit_offset / 8;
769 uint16_t bit = 7 - (bit_offset % 8);
770 unsigned long newbit = !!((buf[c] >> b) & 1U);
771 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
772 bit_offset = bit_offset + 1;
783 const char *buf = (
const char *)&self->fieldCrosses[0];
786 for (c = 0; c < bytes; c++) {
787 for (b = 7; b >= 0; b--) {
789 uint16_t
byte = bit_offset / 8;
790 uint16_t bit = 7 - (bit_offset % 8);
791 unsigned long newbit = !!((buf[c] >> b) & 1U);
792 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
793 bit_offset = bit_offset + 1;
799 uint8_t numCorners_nbo = (
self->numCorners);
802 for (b = (8 - 1); b >= 0; b--) {
804 uint16_t
byte = bit_offset / 8;
805 uint16_t bit = 7 - (bit_offset % 8);
806 unsigned long newbit = !!((numCorners_nbo >> b) & 1U);
807 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
808 bit_offset = bit_offset + 1;
813 uint8_t numIntersections_nbo = (
self->numIntersections);
816 for (b = (8 - 1); b >= 0; b--) {
818 uint16_t
byte = bit_offset / 8;
819 uint16_t bit = 7 - (bit_offset % 8);
820 unsigned long newbit = !!((numIntersections_nbo >> b) & 1U);
821 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
822 bit_offset = bit_offset + 1;
827 uint8_t numCrosses_nbo = (
self->numCrosses);
830 for (b = (8 - 1); b >= 0; b--) {
832 uint16_t
byte = bit_offset / 8;
833 uint16_t bit = 7 - (bit_offset % 8);
834 unsigned long newbit = !!((numCrosses_nbo >> b) & 1U);
835 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
836 bit_offset = bit_offset + 1;
841 uint16_t res_width_nbo =
htons(self->res_width);
844 for (b = (16 - 1); b >= 0; b--) {
846 uint16_t
byte = bit_offset / 8;
847 uint16_t bit = 7 - (bit_offset % 8);
848 unsigned long newbit = !!((res_width_nbo >> b) & 1U);
849 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
850 bit_offset = bit_offset + 1;
855 uint16_t res_height_nbo =
htons(self->res_height);
858 for (b = (16 - 1); b >= 0; b--) {
860 uint16_t
byte = bit_offset / 8;
861 uint16_t bit = 7 - (bit_offset % 8);
862 unsigned long newbit = !!((res_height_nbo >> b) & 1U);
863 dst[byte] ^= (-newbit ^ dst[byte]) & (1UL << bit);
864 bit_offset = bit_offset + 1;
879 uint16_t bit_offset = 0;
885 char *buf = (
char *)malloc(bytes);
888 for (c = 0; c < bytes; c++) {
889 for (b = 7; b >= 0; b--) {
891 uint16_t
byte = bit_offset / 8;
892 uint16_t bit = 7 - (bit_offset % 8);
893 char dataByte = src[byte];
894 unsigned char bitValue = (dataByte >> bit) & 1U;
895 buf[c] ^= (-bitValue ^ buf[c]) & (1UL << b);
896 bit_offset = bit_offset + 1;
909 char *buf = (
char *)malloc(bytes);
912 for (c = 0; c < bytes; c++) {
913 for (b = 7; b >= 0; b--) {
915 uint16_t
byte = bit_offset / 8;
916 uint16_t bit = 7 - (bit_offset % 8);
917 char dataByte = src[byte];
918 unsigned char bitValue = (dataByte >> bit) & 1U;
919 buf[c] ^= (-bitValue ^ buf[c]) & (1UL << b);
920 bit_offset = bit_offset + 1;
933 char *buf = (
char *)malloc(bytes);
936 for (c = 0; c < bytes; c++) {
937 for (b = 7; b >= 0; b--) {
939 uint16_t
byte = bit_offset / 8;
940 uint16_t bit = 7 - (bit_offset % 8);
941 char dataByte = src[byte];
942 unsigned char bitValue = (dataByte >> bit) & 1U;
943 buf[c] ^= (-bitValue ^ buf[c]) & (1UL << b);
944 bit_offset = bit_offset + 1;
954 for (b = (8 - 1); b >= 0; b--) {
956 uint16_t
byte = bit_offset / 8;
957 uint16_t bit = 7 - (bit_offset % 8);
958 char dataByte = src[byte];
959 unsigned char bitValue = (dataByte >> bit) & 1U;
961 bit_offset = bit_offset + 1;
969 for (b = (8 - 1); b >= 0; b--) {
971 uint16_t
byte = bit_offset / 8;
972 uint16_t bit = 7 - (bit_offset % 8);
973 char dataByte = src[byte];
974 unsigned char bitValue = (dataByte >> bit) & 1U;
976 bit_offset = bit_offset + 1;
984 for (b = (8 - 1); b >= 0; b--) {
986 uint16_t
byte = bit_offset / 8;
987 uint16_t bit = 7 - (bit_offset % 8);
988 char dataByte = src[byte];
989 unsigned char bitValue = (dataByte >> bit) & 1U;
991 bit_offset = bit_offset + 1;
999 for (b = (16 - 1); b >= 0; b--) {
1001 uint16_t
byte = bit_offset / 8;
1002 uint16_t bit = 7 - (bit_offset % 8);
1003 char dataByte = src[byte];
1004 unsigned char bitValue = (dataByte >> bit) & 1U;
1006 bit_offset = bit_offset + 1;
1014 for (b = (16 - 1); b >= 0; b--) {
1016 uint16_t
byte = bit_offset / 8;
1017 uint16_t bit = 7 - (bit_offset % 8);
1018 char dataByte = src[byte];
1019 unsigned char bitValue = (dataByte >> bit) & 1U;
1021 bit_offset = bit_offset + 1;
WHITEBOARD_POSTER_STRING_CONVERSION.
Posting by Vision of the field corners, T-Intersections and crosses that have been seen.
uint8_t numCrosses
Numer of Crosses in this message.
uint8_t numCorners
Number of corners in this message.
uint16_t res_width
The resolution width.
struct wb_vision_field_feature fieldIntersection[8]
Location of T-Intersections on the field.
uint8_t numIntersections
Number of T-Intersections in this message.
struct wb_vision_field_feature fieldCorner[8]
Location of corners on the field.
uint16_t res_height
The resolution height.
struct wb_vision_field_feature fieldCrosses[3]
Location of T-Intersections on the field.
const char * wb_vision_field_feature_to_string(const struct wb_vision_field_feature *self, char *toString, size_t bufferSize)
Convert to a string.
const char * wb_vision_field_feature_description(const struct wb_vision_field_feature *self, char *descString, size_t bufferSize)
Convert to a description string.
struct wb_vision_field_feature * wb_vision_field_feature_from_string(struct wb_vision_field_feature *self, const char *str)
Convert from a string.
#define VISION_FIELD_FEATURE_TO_STRING_BUFFER_SIZE
#define VISION_FIELD_FEATURE_DESC_BUFFER_SIZE
struct wb_vision_field_features * wb_vision_field_features_from_string(struct wb_vision_field_features *self, const char *str)
Convert from a string.
const char * wb_vision_field_features_to_string(const struct wb_vision_field_features *self, char *toString, size_t bufferSize)
Convert to a string.
size_t wb_vision_field_features_to_network_serialised(const struct wb_vision_field_features *self, char *dst)
Convert to a compressed, serialised, network byte order byte stream.
size_t wb_vision_field_features_from_network_serialised(const char *src, struct wb_vision_field_features *dst)
Convert from a compressed, serialised, network byte order byte stream.
const char * wb_vision_field_features_description(const struct wb_vision_field_features *self, char *descString, size_t bufferSize)
Convert to a description string.
#define VISION_FIELD_FEATURES_FIELDCORNER_ARRAY_SIZE
WHITEBOARD_POSTER_STRING_CONVERSION.
#define VISION_FIELD_FEATURES_DESC_BUFFER_SIZE
#define VISION_FIELD_FEATURES_FIELDCROSSES_ARRAY_SIZE
#define VISION_FIELD_FEATURES_FIELDINTERSECTION_ARRAY_SIZE