BERG Cloud / BERGCloud

Dependents:   LittleCounter-Example

Committer:
nickludlam
Date:
Wed Apr 16 14:38:12 2014 +0000
Revision:
6:79100379d4b4
Parent:
5:2e04a8b3fc25
Updated to support the Berg V2 API. Please see http://bergcloud.com/devcenter/api/v2/device-v2 for more details.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nickludlam 0:b4ccb530b9eb 1 /*
nickludlam 0:b4ccb530b9eb 2
nickludlam 0:b4ccb530b9eb 3 BERGCloud message pack/unpack
nickludlam 0:b4ccb530b9eb 4
nickludlam 0:b4ccb530b9eb 5 Based on MessagePack http://msgpack.org/
nickludlam 0:b4ccb530b9eb 6
nickludlam 0:b4ccb530b9eb 7 Copyright (c) 2013 BERG Cloud Ltd. http://bergcloud.com/
nickludlam 0:b4ccb530b9eb 8
nickludlam 0:b4ccb530b9eb 9 Permission is hereby granted, free of charge, to any person obtaining a copy
nickludlam 0:b4ccb530b9eb 10 of this software and associated documentation files (the "Software"), to deal
nickludlam 0:b4ccb530b9eb 11 in the Software without restriction, including without limitation the rights
nickludlam 0:b4ccb530b9eb 12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
nickludlam 0:b4ccb530b9eb 13 copies of the Software, and to permit persons to whom the Software is
nickludlam 0:b4ccb530b9eb 14 furnished to do so, subject to the following conditions:
nickludlam 0:b4ccb530b9eb 15
nickludlam 0:b4ccb530b9eb 16 The above copyright notice and this permission notice shall be included in
nickludlam 0:b4ccb530b9eb 17 all copies or substantial portions of the Software.
nickludlam 0:b4ccb530b9eb 18
nickludlam 0:b4ccb530b9eb 19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
nickludlam 0:b4ccb530b9eb 20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
nickludlam 0:b4ccb530b9eb 21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
nickludlam 0:b4ccb530b9eb 22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
nickludlam 0:b4ccb530b9eb 23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
nickludlam 0:b4ccb530b9eb 24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
nickludlam 0:b4ccb530b9eb 25 THE SOFTWARE.
nickludlam 0:b4ccb530b9eb 26
nickludlam 0:b4ccb530b9eb 27 */
nickludlam 0:b4ccb530b9eb 28
nickludlam 5:2e04a8b3fc25 29 #define __STDC_LIMIT_MACROS /* Include C99 stdint defines in C++ code */
nickludlam 5:2e04a8b3fc25 30 #include <stdint.h>
nickludlam 0:b4ccb530b9eb 31 #include <stddef.h> /* For NULL */
nickludlam 0:b4ccb530b9eb 32 #include <string.h> /* For memcpy() */
nickludlam 0:b4ccb530b9eb 33 #include "BERGCloudMessageBase.h"
nickludlam 0:b4ccb530b9eb 34
nickludlam 0:b4ccb530b9eb 35 BERGCloudMessageBase::BERGCloudMessageBase(void)
nickludlam 0:b4ccb530b9eb 36 {
nickludlam 0:b4ccb530b9eb 37 }
nickludlam 0:b4ccb530b9eb 38
nickludlam 0:b4ccb530b9eb 39 BERGCloudMessageBase::~BERGCloudMessageBase(void)
nickludlam 0:b4ccb530b9eb 40 {
nickludlam 0:b4ccb530b9eb 41 }
nickludlam 0:b4ccb530b9eb 42
nickludlam 0:b4ccb530b9eb 43 #define _MP_FIXNUM_POS_MIN 0x00
nickludlam 0:b4ccb530b9eb 44 #define _MP_FIXNUM_POS_MAX 0x7f
nickludlam 0:b4ccb530b9eb 45 #define _MP_FIXMAP_MIN 0x80
nickludlam 0:b4ccb530b9eb 46 #define _MP_FIXMAP_MAX 0x8f
nickludlam 0:b4ccb530b9eb 47 #define _MP_FIXARRAY_MIN 0x90
nickludlam 0:b4ccb530b9eb 48 #define _MP_FIXARRAY_MAX 0x9f
nickludlam 0:b4ccb530b9eb 49 #define _MP_FIXRAW_MIN 0xa0
nickludlam 0:b4ccb530b9eb 50 #define _MP_FIXRAW_MAX 0xbf
nickludlam 0:b4ccb530b9eb 51 #define _MP_NIL 0xc0
nickludlam 0:b4ccb530b9eb 52 #define _MP_BOOL_FALSE 0xc2
nickludlam 0:b4ccb530b9eb 53 #define _MP_BOOL_TRUE 0xc3
nickludlam 0:b4ccb530b9eb 54 #define _MP_FLOAT 0xca
nickludlam 0:b4ccb530b9eb 55 #define _MP_DOUBLE 0xcb
nickludlam 0:b4ccb530b9eb 56 #define _MP_UINT8 0xcc
nickludlam 0:b4ccb530b9eb 57 #define _MP_UINT16 0xcd
nickludlam 0:b4ccb530b9eb 58 #define _MP_UINT32 0xce
nickludlam 0:b4ccb530b9eb 59 #define _MP_UINT64 0xcf
nickludlam 0:b4ccb530b9eb 60 #define _MP_INT8 0xd0
nickludlam 0:b4ccb530b9eb 61 #define _MP_INT16 0xd1
nickludlam 0:b4ccb530b9eb 62 #define _MP_INT32 0xd2
nickludlam 0:b4ccb530b9eb 63 #define _MP_INT64 0xd3
nickludlam 0:b4ccb530b9eb 64 #define _MP_RAW16 0xda
nickludlam 0:b4ccb530b9eb 65 #define _MP_RAW32 0xdb
nickludlam 0:b4ccb530b9eb 66 #define _MP_ARRAY16 0xdc
nickludlam 0:b4ccb530b9eb 67 #define _MP_ARRAY32 0xdd
nickludlam 0:b4ccb530b9eb 68 #define _MP_MAP16 0xde
nickludlam 0:b4ccb530b9eb 69 #define _MP_MAP32 0xdf
nickludlam 0:b4ccb530b9eb 70 #define _MP_FIXNUM_NEG_MIN 0xe0
nickludlam 0:b4ccb530b9eb 71 #define _MP_FIXNUM_NEG_MAX 0xff
nickludlam 0:b4ccb530b9eb 72
nickludlam 0:b4ccb530b9eb 73 #define _MAX_FIXRAW (_MP_FIXRAW_MAX - _MP_FIXRAW_MIN)
nickludlam 0:b4ccb530b9eb 74 #define _MAX_FIXARRAY (_MP_FIXARRAY_MAX - _MP_FIXARRAY_MIN)
nickludlam 0:b4ccb530b9eb 75 #define _MAX_FIXMAP (_MP_FIXMAP_MAX - _MP_FIXMAP_MIN)
nickludlam 0:b4ccb530b9eb 76
nickludlam 0:b4ccb530b9eb 77 uint16_t BERGCloudMessageBase::strlen(const char *string)
nickludlam 0:b4ccb530b9eb 78 {
nickludlam 0:b4ccb530b9eb 79 uint16_t strLen = 0;
nickludlam 0:b4ccb530b9eb 80
nickludlam 0:b4ccb530b9eb 81 /* Find string length */
nickludlam 0:b4ccb530b9eb 82 if (string != NULL)
nickludlam 0:b4ccb530b9eb 83 {
nickludlam 0:b4ccb530b9eb 84 while ((strLen < UINT16_MAX) && (*string != '\0'))
nickludlam 0:b4ccb530b9eb 85 {
nickludlam 0:b4ccb530b9eb 86 string++;
nickludlam 0:b4ccb530b9eb 87 strLen++;
nickludlam 0:b4ccb530b9eb 88 }
nickludlam 0:b4ccb530b9eb 89 }
nickludlam 0:b4ccb530b9eb 90
nickludlam 0:b4ccb530b9eb 91 return strLen;
nickludlam 0:b4ccb530b9eb 92 }
nickludlam 0:b4ccb530b9eb 93
nickludlam 0:b4ccb530b9eb 94 bool BERGCloudMessageBase::strcompare(const char *s1, const char *s2)
nickludlam 0:b4ccb530b9eb 95 {
nickludlam 0:b4ccb530b9eb 96 uint16_t count = 0;
nickludlam 0:b4ccb530b9eb 97
nickludlam 0:b4ccb530b9eb 98 if ((s1 == NULL) || (s2==NULL))
nickludlam 0:b4ccb530b9eb 99 {
nickludlam 0:b4ccb530b9eb 100 return false;
nickludlam 0:b4ccb530b9eb 101 }
nickludlam 0:b4ccb530b9eb 102
nickludlam 0:b4ccb530b9eb 103 while ((*s1 != '\0') && (*s2 != '\0'))
nickludlam 0:b4ccb530b9eb 104 {
nickludlam 0:b4ccb530b9eb 105 if (*s1++ != *s2++)
nickludlam 0:b4ccb530b9eb 106 {
nickludlam 0:b4ccb530b9eb 107 return false;
nickludlam 0:b4ccb530b9eb 108 }
nickludlam 0:b4ccb530b9eb 109
nickludlam 0:b4ccb530b9eb 110 if (count++ == UINT16_MAX)
nickludlam 0:b4ccb530b9eb 111 {
nickludlam 0:b4ccb530b9eb 112 return false;
nickludlam 0:b4ccb530b9eb 113 }
nickludlam 0:b4ccb530b9eb 114 }
nickludlam 0:b4ccb530b9eb 115
nickludlam 0:b4ccb530b9eb 116 /* identical */
nickludlam 0:b4ccb530b9eb 117 return true;
nickludlam 0:b4ccb530b9eb 118 }
nickludlam 0:b4ccb530b9eb 119
nickludlam 0:b4ccb530b9eb 120
nickludlam 0:b4ccb530b9eb 121 /*
nickludlam 0:b4ccb530b9eb 122 Pack methods
nickludlam 0:b4ccb530b9eb 123 */
nickludlam 0:b4ccb530b9eb 124
nickludlam 0:b4ccb530b9eb 125 bool BERGCloudMessageBase::pack(uint8_t n)
nickludlam 0:b4ccb530b9eb 126 {
nickludlam 0:b4ccb530b9eb 127 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 128 {
nickludlam 0:b4ccb530b9eb 129 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 130 return false;
nickludlam 0:b4ccb530b9eb 131 }
nickludlam 0:b4ccb530b9eb 132
nickludlam 0:b4ccb530b9eb 133 add(_MP_UINT8);
nickludlam 0:b4ccb530b9eb 134 add(n);
nickludlam 0:b4ccb530b9eb 135 return true;
nickludlam 0:b4ccb530b9eb 136 }
nickludlam 0:b4ccb530b9eb 137
nickludlam 0:b4ccb530b9eb 138 bool BERGCloudMessageBase::pack(uint16_t n)
nickludlam 0:b4ccb530b9eb 139 {
nickludlam 0:b4ccb530b9eb 140 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 141 {
nickludlam 0:b4ccb530b9eb 142 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 143 return false;
nickludlam 0:b4ccb530b9eb 144 }
nickludlam 0:b4ccb530b9eb 145
nickludlam 0:b4ccb530b9eb 146 add(_MP_UINT16);
nickludlam 0:b4ccb530b9eb 147 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 148 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 149 return true;
nickludlam 0:b4ccb530b9eb 150 }
nickludlam 0:b4ccb530b9eb 151
nickludlam 0:b4ccb530b9eb 152 bool BERGCloudMessageBase::pack(uint32_t n)
nickludlam 0:b4ccb530b9eb 153 {
nickludlam 0:b4ccb530b9eb 154 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 155 {
nickludlam 0:b4ccb530b9eb 156 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 157 return false;
nickludlam 0:b4ccb530b9eb 158 }
nickludlam 0:b4ccb530b9eb 159
nickludlam 0:b4ccb530b9eb 160 add(_MP_UINT32);
nickludlam 0:b4ccb530b9eb 161 add((uint8_t)(n >> 24));
nickludlam 0:b4ccb530b9eb 162 add((uint8_t)(n >> 16));
nickludlam 0:b4ccb530b9eb 163 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 164 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 165 return true;
nickludlam 0:b4ccb530b9eb 166 }
nickludlam 0:b4ccb530b9eb 167
nickludlam 0:b4ccb530b9eb 168 bool BERGCloudMessageBase::pack(int8_t n)
nickludlam 0:b4ccb530b9eb 169 {
nickludlam 0:b4ccb530b9eb 170 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 171 {
nickludlam 0:b4ccb530b9eb 172 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 173 return false;
nickludlam 0:b4ccb530b9eb 174 }
nickludlam 0:b4ccb530b9eb 175
nickludlam 0:b4ccb530b9eb 176 add(_MP_INT8);
nickludlam 0:b4ccb530b9eb 177 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 178 return true;
nickludlam 0:b4ccb530b9eb 179 }
nickludlam 0:b4ccb530b9eb 180
nickludlam 0:b4ccb530b9eb 181 bool BERGCloudMessageBase::pack(int16_t n)
nickludlam 0:b4ccb530b9eb 182 {
nickludlam 0:b4ccb530b9eb 183 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 184 {
nickludlam 0:b4ccb530b9eb 185 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 186 return false;
nickludlam 0:b4ccb530b9eb 187 }
nickludlam 0:b4ccb530b9eb 188
nickludlam 0:b4ccb530b9eb 189 add(_MP_INT16);
nickludlam 0:b4ccb530b9eb 190 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 191 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 192 return true;
nickludlam 0:b4ccb530b9eb 193 }
nickludlam 0:b4ccb530b9eb 194
nickludlam 0:b4ccb530b9eb 195 bool BERGCloudMessageBase::pack(int32_t n)
nickludlam 0:b4ccb530b9eb 196 {
nickludlam 0:b4ccb530b9eb 197 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 198 {
nickludlam 0:b4ccb530b9eb 199 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 200 return false;
nickludlam 0:b4ccb530b9eb 201 }
nickludlam 0:b4ccb530b9eb 202
nickludlam 0:b4ccb530b9eb 203 add(_MP_INT32);
nickludlam 0:b4ccb530b9eb 204 add((uint8_t)(n >> 24));
nickludlam 0:b4ccb530b9eb 205 add((uint8_t)(n >> 16));
nickludlam 0:b4ccb530b9eb 206 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 207 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 208 return true;
nickludlam 0:b4ccb530b9eb 209 }
nickludlam 0:b4ccb530b9eb 210
nickludlam 0:b4ccb530b9eb 211 bool BERGCloudMessageBase::pack(float n)
nickludlam 0:b4ccb530b9eb 212 {
nickludlam 0:b4ccb530b9eb 213 uint32_t data;
nickludlam 0:b4ccb530b9eb 214
nickludlam 0:b4ccb530b9eb 215 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 216 {
nickludlam 0:b4ccb530b9eb 217 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 218 return false;
nickludlam 0:b4ccb530b9eb 219 }
nickludlam 0:b4ccb530b9eb 220
nickludlam 0:b4ccb530b9eb 221 /* Convert to data */
nickludlam 0:b4ccb530b9eb 222 memcpy(&data, &n, sizeof(float));
nickludlam 0:b4ccb530b9eb 223
nickludlam 0:b4ccb530b9eb 224 add(_MP_FLOAT);
nickludlam 0:b4ccb530b9eb 225 add((uint8_t)(data >> 24));
nickludlam 0:b4ccb530b9eb 226 add((uint8_t)(data >> 16));
nickludlam 0:b4ccb530b9eb 227 add((uint8_t)(data >> 8));
nickludlam 0:b4ccb530b9eb 228 add((uint8_t)data);
nickludlam 0:b4ccb530b9eb 229 return true;
nickludlam 0:b4ccb530b9eb 230 }
nickludlam 0:b4ccb530b9eb 231
nickludlam 0:b4ccb530b9eb 232 bool BERGCloudMessageBase::pack(bool n)
nickludlam 0:b4ccb530b9eb 233 {
nickludlam 0:b4ccb530b9eb 234 /*
nickludlam 0:b4ccb530b9eb 235 Note that Arduino redefines 'true' and 'false' in Arduino.h.
nickludlam 0:b4ccb530b9eb 236 You can undefine them in your code to make them type 'bool' again:
nickludlam 0:b4ccb530b9eb 237 #undef true
nickludlam 0:b4ccb530b9eb 238 #undef false
nickludlam 0:b4ccb530b9eb 239 */
nickludlam 0:b4ccb530b9eb 240
nickludlam 0:b4ccb530b9eb 241 if (!available(1))
nickludlam 0:b4ccb530b9eb 242 {
nickludlam 0:b4ccb530b9eb 243 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 244 return false;
nickludlam 0:b4ccb530b9eb 245 }
nickludlam 0:b4ccb530b9eb 246
nickludlam 0:b4ccb530b9eb 247 add(n ? _MP_BOOL_TRUE : _MP_BOOL_FALSE);
nickludlam 0:b4ccb530b9eb 248 return true;
nickludlam 0:b4ccb530b9eb 249 }
nickludlam 0:b4ccb530b9eb 250
nickludlam 0:b4ccb530b9eb 251 bool BERGCloudMessageBase::pack_nil(void)
nickludlam 0:b4ccb530b9eb 252 {
nickludlam 0:b4ccb530b9eb 253 if (!available(1))
nickludlam 0:b4ccb530b9eb 254 {
nickludlam 0:b4ccb530b9eb 255 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 256 return false;
nickludlam 0:b4ccb530b9eb 257 }
nickludlam 0:b4ccb530b9eb 258
nickludlam 0:b4ccb530b9eb 259 add(_MP_NIL);
nickludlam 0:b4ccb530b9eb 260 return true;
nickludlam 0:b4ccb530b9eb 261 }
nickludlam 0:b4ccb530b9eb 262
nickludlam 0:b4ccb530b9eb 263 bool BERGCloudMessageBase::pack_array(uint16_t items)
nickludlam 0:b4ccb530b9eb 264 {
nickludlam 0:b4ccb530b9eb 265 if (items <= _MAX_FIXARRAY)
nickludlam 0:b4ccb530b9eb 266 {
nickludlam 0:b4ccb530b9eb 267 /* Use fix array */
nickludlam 0:b4ccb530b9eb 268 if (!available(items + 1))
nickludlam 0:b4ccb530b9eb 269 {
nickludlam 0:b4ccb530b9eb 270 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 271 return false;
nickludlam 0:b4ccb530b9eb 272 }
nickludlam 0:b4ccb530b9eb 273
nickludlam 0:b4ccb530b9eb 274 add(_MP_FIXARRAY_MIN + items);
nickludlam 0:b4ccb530b9eb 275 }
nickludlam 0:b4ccb530b9eb 276 else
nickludlam 0:b4ccb530b9eb 277 {
nickludlam 0:b4ccb530b9eb 278 /* Use array 16 */
nickludlam 0:b4ccb530b9eb 279 if (!available(items + 1 + sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 280 {
nickludlam 0:b4ccb530b9eb 281 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 282 return false;
nickludlam 0:b4ccb530b9eb 283 }
nickludlam 0:b4ccb530b9eb 284
nickludlam 0:b4ccb530b9eb 285 add(_MP_ARRAY16);
nickludlam 0:b4ccb530b9eb 286 add((uint8_t)(items >> 8));
nickludlam 0:b4ccb530b9eb 287 add((uint8_t)items);
nickludlam 0:b4ccb530b9eb 288 }
nickludlam 0:b4ccb530b9eb 289
nickludlam 0:b4ccb530b9eb 290 return true;
nickludlam 0:b4ccb530b9eb 291 }
nickludlam 0:b4ccb530b9eb 292
nickludlam 0:b4ccb530b9eb 293 bool BERGCloudMessageBase::pack_map(uint16_t items)
nickludlam 0:b4ccb530b9eb 294 {
nickludlam 0:b4ccb530b9eb 295 if (items <= _MAX_FIXMAP)
nickludlam 0:b4ccb530b9eb 296 {
nickludlam 0:b4ccb530b9eb 297 /* Use fix map */
nickludlam 0:b4ccb530b9eb 298 if (!available(items + 1))
nickludlam 0:b4ccb530b9eb 299 {
nickludlam 0:b4ccb530b9eb 300 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 301 return false;
nickludlam 0:b4ccb530b9eb 302 }
nickludlam 0:b4ccb530b9eb 303
nickludlam 0:b4ccb530b9eb 304 add(_MP_FIXMAP_MIN + items);
nickludlam 0:b4ccb530b9eb 305 }
nickludlam 0:b4ccb530b9eb 306 else
nickludlam 0:b4ccb530b9eb 307 {
nickludlam 0:b4ccb530b9eb 308 /* Use map 16 */
nickludlam 0:b4ccb530b9eb 309 if (!available(items + 1 + sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 310 {
nickludlam 0:b4ccb530b9eb 311 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 312 return false;
nickludlam 0:b4ccb530b9eb 313 }
nickludlam 0:b4ccb530b9eb 314
nickludlam 0:b4ccb530b9eb 315 add(_MP_MAP16);
nickludlam 0:b4ccb530b9eb 316 add((uint8_t)(items >> 8));
nickludlam 0:b4ccb530b9eb 317 add((uint8_t)items);
nickludlam 0:b4ccb530b9eb 318 }
nickludlam 0:b4ccb530b9eb 319
nickludlam 0:b4ccb530b9eb 320 return true;
nickludlam 0:b4ccb530b9eb 321 }
nickludlam 0:b4ccb530b9eb 322
nickludlam 0:b4ccb530b9eb 323 bool BERGCloudMessageBase::pack(uint8_t *data, uint16_t sizeInBytes)
nickludlam 0:b4ccb530b9eb 324 {
nickludlam 0:b4ccb530b9eb 325 /* Pack data */
nickludlam 0:b4ccb530b9eb 326 if (!pack_raw_header(sizeInBytes))
nickludlam 0:b4ccb530b9eb 327 {
nickludlam 0:b4ccb530b9eb 328 return false;
nickludlam 0:b4ccb530b9eb 329 }
nickludlam 0:b4ccb530b9eb 330
nickludlam 0:b4ccb530b9eb 331 return pack_raw_data(data, sizeInBytes);
nickludlam 0:b4ccb530b9eb 332 }
nickludlam 0:b4ccb530b9eb 333
nickludlam 0:b4ccb530b9eb 334 bool BERGCloudMessageBase::pack(const char *string)
nickludlam 0:b4ccb530b9eb 335 {
nickludlam 0:b4ccb530b9eb 336 /* Pack a null-terminated C string */
nickludlam 0:b4ccb530b9eb 337 uint16_t strLen;
nickludlam 0:b4ccb530b9eb 338
nickludlam 0:b4ccb530b9eb 339 strLen = BERGCloudMessageBase::strlen(string);
nickludlam 0:b4ccb530b9eb 340
nickludlam 0:b4ccb530b9eb 341 return pack((uint8_t *)string, strLen);
nickludlam 0:b4ccb530b9eb 342 }
nickludlam 0:b4ccb530b9eb 343
nickludlam 0:b4ccb530b9eb 344 /* Separate header and data methods are provided for raw data*/
nickludlam 0:b4ccb530b9eb 345 /* so that Arduino strings may be packed without having to create */
nickludlam 0:b4ccb530b9eb 346 /* a temporary buffer first. */
nickludlam 0:b4ccb530b9eb 347
nickludlam 0:b4ccb530b9eb 348 bool BERGCloudMessageBase::pack_raw_header(uint16_t sizeInBytes)
nickludlam 0:b4ccb530b9eb 349 {
nickludlam 0:b4ccb530b9eb 350 if (sizeInBytes <= _MAX_FIXRAW)
nickludlam 0:b4ccb530b9eb 351 {
nickludlam 0:b4ccb530b9eb 352 /* Use fix raw */
nickludlam 0:b4ccb530b9eb 353 if (!available(sizeInBytes + 1))
nickludlam 0:b4ccb530b9eb 354 {
nickludlam 0:b4ccb530b9eb 355 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 356 return false;
nickludlam 0:b4ccb530b9eb 357 }
nickludlam 0:b4ccb530b9eb 358
nickludlam 0:b4ccb530b9eb 359 add(_MP_FIXRAW_MIN + sizeInBytes);
nickludlam 0:b4ccb530b9eb 360 }
nickludlam 0:b4ccb530b9eb 361 else
nickludlam 0:b4ccb530b9eb 362 {
nickludlam 0:b4ccb530b9eb 363 /* Use raw 16 */
nickludlam 0:b4ccb530b9eb 364 if (!available(sizeInBytes + 1 + sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 365 {
nickludlam 0:b4ccb530b9eb 366 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 367 return false;
nickludlam 0:b4ccb530b9eb 368 }
nickludlam 0:b4ccb530b9eb 369
nickludlam 0:b4ccb530b9eb 370 add(_MP_RAW16);
nickludlam 0:b4ccb530b9eb 371 add((uint8_t)(sizeInBytes >> 8));
nickludlam 0:b4ccb530b9eb 372 add((uint8_t)sizeInBytes);
nickludlam 0:b4ccb530b9eb 373 }
nickludlam 0:b4ccb530b9eb 374
nickludlam 0:b4ccb530b9eb 375 return true;
nickludlam 0:b4ccb530b9eb 376 }
nickludlam 0:b4ccb530b9eb 377
nickludlam 0:b4ccb530b9eb 378 bool BERGCloudMessageBase::pack_raw_data(uint8_t *data, uint16_t sizeInBytes)
nickludlam 0:b4ccb530b9eb 379 {
nickludlam 0:b4ccb530b9eb 380 /* Add data */
nickludlam 0:b4ccb530b9eb 381 while (sizeInBytes-- > 0)
nickludlam 0:b4ccb530b9eb 382 {
nickludlam 0:b4ccb530b9eb 383 add(*data++);
nickludlam 0:b4ccb530b9eb 384 }
nickludlam 0:b4ccb530b9eb 385
nickludlam 0:b4ccb530b9eb 386 return true;
nickludlam 0:b4ccb530b9eb 387 }
nickludlam 0:b4ccb530b9eb 388
nickludlam 0:b4ccb530b9eb 389 /*
nickludlam 0:b4ccb530b9eb 390 Unpack methods
nickludlam 0:b4ccb530b9eb 391 */
nickludlam 0:b4ccb530b9eb 392
nickludlam 0:b4ccb530b9eb 393 bool BERGCloudMessageBase::unpack_peek(uint8_t& messagePackType)
nickludlam 0:b4ccb530b9eb 394 {
nickludlam 0:b4ccb530b9eb 395 return peek(&messagePackType);
nickludlam 0:b4ccb530b9eb 396 }
nickludlam 0:b4ccb530b9eb 397
nickludlam 0:b4ccb530b9eb 398 #ifdef BERGCLOUD_LOG
nickludlam 0:b4ccb530b9eb 399 bool BERGCloudMessageBase::unpack_peek(void)
nickludlam 0:b4ccb530b9eb 400 {
nickludlam 0:b4ccb530b9eb 401 uint8_t type;
nickludlam 0:b4ccb530b9eb 402
nickludlam 0:b4ccb530b9eb 403 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 404 {
nickludlam 0:b4ccb530b9eb 405 return false;
nickludlam 0:b4ccb530b9eb 406 }
nickludlam 0:b4ccb530b9eb 407
nickludlam 0:b4ccb530b9eb 408 if (type <= _MP_FIXNUM_POS_MAX)
nickludlam 0:b4ccb530b9eb 409 {
nickludlam 0:b4ccb530b9eb 410 _LOG("Positive integer\r\n");
nickludlam 0:b4ccb530b9eb 411 return true;
nickludlam 0:b4ccb530b9eb 412 }
nickludlam 0:b4ccb530b9eb 413
nickludlam 0:b4ccb530b9eb 414 if (IN_RANGE(type, _MP_FIXNUM_NEG_MIN, _MP_FIXNUM_NEG_MAX))
nickludlam 0:b4ccb530b9eb 415 {
nickludlam 0:b4ccb530b9eb 416 _LOG("Negative integer\r\n");
nickludlam 0:b4ccb530b9eb 417 return true;
nickludlam 0:b4ccb530b9eb 418 }
nickludlam 0:b4ccb530b9eb 419
nickludlam 0:b4ccb530b9eb 420 if ((type == _MP_MAP16) || (type == _MP_MAP32) || IN_RANGE(type, _MP_FIXMAP_MIN, _MP_FIXMAP_MAX))
nickludlam 0:b4ccb530b9eb 421 {
nickludlam 0:b4ccb530b9eb 422 _LOG("Map\r\n");
nickludlam 0:b4ccb530b9eb 423 return true;
nickludlam 0:b4ccb530b9eb 424 }
nickludlam 0:b4ccb530b9eb 425
nickludlam 0:b4ccb530b9eb 426 if ((type == _MP_ARRAY16) || (type == _MP_ARRAY32) || IN_RANGE(type, _MP_FIXARRAY_MIN, _MP_FIXARRAY_MAX))
nickludlam 0:b4ccb530b9eb 427 {
nickludlam 0:b4ccb530b9eb 428 _LOG("Array\r\n");
nickludlam 0:b4ccb530b9eb 429 return true;
nickludlam 0:b4ccb530b9eb 430 }
nickludlam 0:b4ccb530b9eb 431
nickludlam 0:b4ccb530b9eb 432 if ((type == _MP_RAW16) || (type == _MP_RAW32) || IN_RANGE(type, _MP_FIXRAW_MIN, _MP_FIXRAW_MAX))
nickludlam 0:b4ccb530b9eb 433 {
nickludlam 0:b4ccb530b9eb 434 _LOG("Raw\r\n");
nickludlam 0:b4ccb530b9eb 435 return true;
nickludlam 0:b4ccb530b9eb 436 }
nickludlam 0:b4ccb530b9eb 437
nickludlam 0:b4ccb530b9eb 438 if ((type ==_MP_UINT8) || (type == _MP_UINT16) || (type == _MP_UINT32) || (type == _MP_UINT64))
nickludlam 0:b4ccb530b9eb 439 {
nickludlam 0:b4ccb530b9eb 440 _LOG("Unsigned integer\r\n");
nickludlam 0:b4ccb530b9eb 441 return true;
nickludlam 0:b4ccb530b9eb 442 }
nickludlam 0:b4ccb530b9eb 443
nickludlam 0:b4ccb530b9eb 444 if ((type ==_MP_INT8) || (type == _MP_INT16) || (type == _MP_INT32) || (type == _MP_INT64))
nickludlam 0:b4ccb530b9eb 445 {
nickludlam 0:b4ccb530b9eb 446 _LOG("Signed integer\r\n");
nickludlam 0:b4ccb530b9eb 447 return true;
nickludlam 0:b4ccb530b9eb 448 }
nickludlam 0:b4ccb530b9eb 449
nickludlam 0:b4ccb530b9eb 450 if (type == _MP_NIL)
nickludlam 0:b4ccb530b9eb 451 {
nickludlam 0:b4ccb530b9eb 452 _LOG("Nil\r\n");
nickludlam 0:b4ccb530b9eb 453 return true;
nickludlam 0:b4ccb530b9eb 454 }
nickludlam 0:b4ccb530b9eb 455
nickludlam 0:b4ccb530b9eb 456 if (type == _MP_BOOL_FALSE)
nickludlam 0:b4ccb530b9eb 457 {
nickludlam 0:b4ccb530b9eb 458 _LOG("Boolean false\r\n");
nickludlam 0:b4ccb530b9eb 459 return true;
nickludlam 0:b4ccb530b9eb 460 }
nickludlam 0:b4ccb530b9eb 461
nickludlam 0:b4ccb530b9eb 462 if (type == _MP_BOOL_TRUE)
nickludlam 0:b4ccb530b9eb 463 {
nickludlam 0:b4ccb530b9eb 464 _LOG("Boolean true\r\n");
nickludlam 0:b4ccb530b9eb 465 return true;
nickludlam 0:b4ccb530b9eb 466 }
nickludlam 0:b4ccb530b9eb 467
nickludlam 0:b4ccb530b9eb 468 if (type == _MP_FLOAT)
nickludlam 0:b4ccb530b9eb 469 {
nickludlam 0:b4ccb530b9eb 470 _LOG("Float\r\n");
nickludlam 0:b4ccb530b9eb 471 return true;
nickludlam 0:b4ccb530b9eb 472 }
nickludlam 0:b4ccb530b9eb 473
nickludlam 0:b4ccb530b9eb 474 if (type == _MP_DOUBLE)
nickludlam 0:b4ccb530b9eb 475 {
nickludlam 0:b4ccb530b9eb 476 _LOG("Double\r\n");
nickludlam 0:b4ccb530b9eb 477 return true;
nickludlam 0:b4ccb530b9eb 478 }
nickludlam 0:b4ccb530b9eb 479
nickludlam 0:b4ccb530b9eb 480 _LOG("Unknown\r\n");
nickludlam 0:b4ccb530b9eb 481 return false;
nickludlam 0:b4ccb530b9eb 482 }
nickludlam 0:b4ccb530b9eb 483
nickludlam 0:b4ccb530b9eb 484 void BERGCloudMessageBase::print(void)
nickludlam 0:b4ccb530b9eb 485 {
nickludlam 0:b4ccb530b9eb 486 uint16_t last_read;
nickludlam 0:b4ccb530b9eb 487
nickludlam 0:b4ccb530b9eb 488 /* Remember the current read position in the raw data */
nickludlam 0:b4ccb530b9eb 489 last_read = bytesRead;
nickludlam 0:b4ccb530b9eb 490
nickludlam 0:b4ccb530b9eb 491 /* Start reading from the beginning of the data */
nickludlam 0:b4ccb530b9eb 492 restart();
nickludlam 0:b4ccb530b9eb 493
nickludlam 0:b4ccb530b9eb 494 /* Print all items */
nickludlam 0:b4ccb530b9eb 495 while(unpack_peek())
nickludlam 0:b4ccb530b9eb 496 {
nickludlam 0:b4ccb530b9eb 497 unpack_skip();
nickludlam 0:b4ccb530b9eb 498 }
nickludlam 0:b4ccb530b9eb 499
nickludlam 0:b4ccb530b9eb 500 /* Return to the last position */
nickludlam 0:b4ccb530b9eb 501 bytesRead = last_read;
nickludlam 0:b4ccb530b9eb 502 }
nickludlam 0:b4ccb530b9eb 503
nickludlam 0:b4ccb530b9eb 504 void BERGCloudMessageBase::print_bytes(void)
nickludlam 0:b4ccb530b9eb 505 {
nickludlam 0:b4ccb530b9eb 506 uint16_t size = used();
nickludlam 0:b4ccb530b9eb 507 uint8_t *data = ptr();
nickludlam 0:b4ccb530b9eb 508
nickludlam 0:b4ccb530b9eb 509 while (size-- > 0)
nickludlam 0:b4ccb530b9eb 510 {
nickludlam 0:b4ccb530b9eb 511 _LOG_HEX(*data);
nickludlam 0:b4ccb530b9eb 512 _LOG(" ");
nickludlam 0:b4ccb530b9eb 513 data++;
nickludlam 0:b4ccb530b9eb 514 }
nickludlam 0:b4ccb530b9eb 515 _LOG("\r\n");
nickludlam 0:b4ccb530b9eb 516 }
nickludlam 0:b4ccb530b9eb 517 #endif
nickludlam 0:b4ccb530b9eb 518
nickludlam 5:2e04a8b3fc25 519 bool BERGCloudMessageBase::getInteger(void *value, bool valueIsSigned, int32_t min, uint32_t max)
nickludlam 0:b4ccb530b9eb 520 {
nickludlam 0:b4ccb530b9eb 521 uint8_t type;
nickludlam 5:2e04a8b3fc25 522 uint32_t unsignedValue;
nickludlam 5:2e04a8b3fc25 523 int32_t signedValue;
nickludlam 0:b4ccb530b9eb 524
nickludlam 0:b4ccb530b9eb 525 /* Look at next type */
nickludlam 0:b4ccb530b9eb 526 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 527 {
nickludlam 0:b4ccb530b9eb 528 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 529 return false;
nickludlam 0:b4ccb530b9eb 530 }
nickludlam 0:b4ccb530b9eb 531
nickludlam 5:2e04a8b3fc25 532 /*
nickludlam 5:2e04a8b3fc25 533 * Unsigned types
nickludlam 5:2e04a8b3fc25 534 */
nickludlam 5:2e04a8b3fc25 535
nickludlam 0:b4ccb530b9eb 536 if (type <= _MP_FIXNUM_POS_MAX)
nickludlam 0:b4ccb530b9eb 537 {
nickludlam 5:2e04a8b3fc25 538 /* Read positive fix num value */
nickludlam 5:2e04a8b3fc25 539 unsignedValue = read();
nickludlam 0:b4ccb530b9eb 540 }
nickludlam 5:2e04a8b3fc25 541 else if (type == _MP_UINT8)
nickludlam 0:b4ccb530b9eb 542 {
nickludlam 0:b4ccb530b9eb 543 if (!remaining(sizeof(uint8_t)))
nickludlam 0:b4ccb530b9eb 544 {
nickludlam 0:b4ccb530b9eb 545 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 546 return false;
nickludlam 0:b4ccb530b9eb 547 }
nickludlam 0:b4ccb530b9eb 548
nickludlam 0:b4ccb530b9eb 549 /* Read type */
nickludlam 0:b4ccb530b9eb 550 read();
nickludlam 0:b4ccb530b9eb 551
nickludlam 0:b4ccb530b9eb 552 /* Read 8-bit unsigned integer */
nickludlam 5:2e04a8b3fc25 553 unsignedValue = read();
nickludlam 0:b4ccb530b9eb 554 }
nickludlam 5:2e04a8b3fc25 555 else if (type == _MP_UINT16)
nickludlam 0:b4ccb530b9eb 556 {
nickludlam 0:b4ccb530b9eb 557 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 558 {
nickludlam 0:b4ccb530b9eb 559 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 560 return false;
nickludlam 0:b4ccb530b9eb 561 }
nickludlam 0:b4ccb530b9eb 562
nickludlam 0:b4ccb530b9eb 563 /* Read type */
nickludlam 0:b4ccb530b9eb 564 read();
nickludlam 0:b4ccb530b9eb 565
nickludlam 0:b4ccb530b9eb 566 /* Read 16-bit unsigned integer */
nickludlam 5:2e04a8b3fc25 567 unsignedValue = read();
nickludlam 5:2e04a8b3fc25 568 unsignedValue <<= 8;
nickludlam 5:2e04a8b3fc25 569 unsignedValue |= read();
nickludlam 0:b4ccb530b9eb 570 }
nickludlam 5:2e04a8b3fc25 571 else if (type == _MP_UINT32)
nickludlam 0:b4ccb530b9eb 572 {
nickludlam 0:b4ccb530b9eb 573 if (!remaining(sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 574 {
nickludlam 0:b4ccb530b9eb 575 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 576 return false;
nickludlam 0:b4ccb530b9eb 577 }
nickludlam 0:b4ccb530b9eb 578
nickludlam 0:b4ccb530b9eb 579 /* Read type */
nickludlam 0:b4ccb530b9eb 580 read();
nickludlam 0:b4ccb530b9eb 581
nickludlam 0:b4ccb530b9eb 582 /* Read 32-bit unsigned integer */
nickludlam 5:2e04a8b3fc25 583 unsignedValue = read();
nickludlam 5:2e04a8b3fc25 584 unsignedValue <<= 8;
nickludlam 5:2e04a8b3fc25 585 unsignedValue |= read();
nickludlam 5:2e04a8b3fc25 586 unsignedValue <<= 8;
nickludlam 5:2e04a8b3fc25 587 unsignedValue |= read();
nickludlam 5:2e04a8b3fc25 588 unsignedValue <<= 8;
nickludlam 5:2e04a8b3fc25 589 unsignedValue |= read();
nickludlam 0:b4ccb530b9eb 590 }
nickludlam 5:2e04a8b3fc25 591 else
nickludlam 5:2e04a8b3fc25 592 {
nickludlam 5:2e04a8b3fc25 593 /*
nickludlam 5:2e04a8b3fc25 594 * Signed values
nickludlam 5:2e04a8b3fc25 595 */
nickludlam 0:b4ccb530b9eb 596
nickludlam 5:2e04a8b3fc25 597 if (IN_RANGE(type, _MP_FIXNUM_NEG_MIN, _MP_FIXNUM_NEG_MAX))
nickludlam 5:2e04a8b3fc25 598 {
nickludlam 5:2e04a8b3fc25 599 /* Read negative fix num value */
nickludlam 5:2e04a8b3fc25 600 uint8_t temp;
nickludlam 5:2e04a8b3fc25 601 temp = read();
nickludlam 5:2e04a8b3fc25 602 signedValue = (int8_t)temp; /* Convert with sign extension */
nickludlam 5:2e04a8b3fc25 603 }
nickludlam 5:2e04a8b3fc25 604 else if (type == _MP_INT8)
nickludlam 5:2e04a8b3fc25 605 {
nickludlam 5:2e04a8b3fc25 606 if (!remaining(sizeof(int8_t)))
nickludlam 5:2e04a8b3fc25 607 {
nickludlam 5:2e04a8b3fc25 608 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 5:2e04a8b3fc25 609 return false;
nickludlam 5:2e04a8b3fc25 610 }
nickludlam 0:b4ccb530b9eb 611
nickludlam 5:2e04a8b3fc25 612 /* Read type */
nickludlam 5:2e04a8b3fc25 613 read();
nickludlam 0:b4ccb530b9eb 614
nickludlam 5:2e04a8b3fc25 615 /* Read 8-bit signed integer */
nickludlam 5:2e04a8b3fc25 616 uint8_t temp;
nickludlam 5:2e04a8b3fc25 617 temp = read();
nickludlam 5:2e04a8b3fc25 618 signedValue = (int8_t)temp; /* Convert with sign extension */
nickludlam 5:2e04a8b3fc25 619 }
nickludlam 5:2e04a8b3fc25 620 else if (type == _MP_INT16)
nickludlam 5:2e04a8b3fc25 621 {
nickludlam 5:2e04a8b3fc25 622 if (!remaining(sizeof(int16_t)))
nickludlam 5:2e04a8b3fc25 623 {
nickludlam 5:2e04a8b3fc25 624 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 5:2e04a8b3fc25 625 return false;
nickludlam 5:2e04a8b3fc25 626 }
nickludlam 5:2e04a8b3fc25 627
nickludlam 5:2e04a8b3fc25 628 /* Read type */
nickludlam 5:2e04a8b3fc25 629 read();
nickludlam 0:b4ccb530b9eb 630
nickludlam 5:2e04a8b3fc25 631 /* Read 16-bit signed integer */
nickludlam 5:2e04a8b3fc25 632 uint16_t temp;
nickludlam 5:2e04a8b3fc25 633 temp = read();
nickludlam 5:2e04a8b3fc25 634 temp <<= 8;
nickludlam 5:2e04a8b3fc25 635 temp |= read();
nickludlam 5:2e04a8b3fc25 636 signedValue = (int16_t)temp; /* Convert with sign extension */
nickludlam 5:2e04a8b3fc25 637 }
nickludlam 5:2e04a8b3fc25 638 else if (type == _MP_INT32)
nickludlam 5:2e04a8b3fc25 639 {
nickludlam 5:2e04a8b3fc25 640 if (!remaining(sizeof(int32_t)))
nickludlam 5:2e04a8b3fc25 641 {
nickludlam 5:2e04a8b3fc25 642 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 5:2e04a8b3fc25 643 return false;
nickludlam 5:2e04a8b3fc25 644 }
nickludlam 0:b4ccb530b9eb 645
nickludlam 5:2e04a8b3fc25 646 /* Read type */
nickludlam 5:2e04a8b3fc25 647 read();
nickludlam 0:b4ccb530b9eb 648
nickludlam 5:2e04a8b3fc25 649 /* Read 32-bit signed integer */
nickludlam 5:2e04a8b3fc25 650 uint32_t temp;
nickludlam 5:2e04a8b3fc25 651 temp = read();
nickludlam 5:2e04a8b3fc25 652 temp <<= 8;
nickludlam 5:2e04a8b3fc25 653 temp |= read();
nickludlam 5:2e04a8b3fc25 654 temp <<= 8;
nickludlam 5:2e04a8b3fc25 655 temp |= read();
nickludlam 5:2e04a8b3fc25 656 temp <<= 8;
nickludlam 5:2e04a8b3fc25 657 temp |= read();
nickludlam 5:2e04a8b3fc25 658 signedValue = (int32_t)temp; /* Convert */
nickludlam 5:2e04a8b3fc25 659 }
nickludlam 5:2e04a8b3fc25 660 else
nickludlam 5:2e04a8b3fc25 661 {
nickludlam 5:2e04a8b3fc25 662 /* Can't convert this type */
nickludlam 5:2e04a8b3fc25 663 _LOG_UNPACK_ERROR_TYPE;
nickludlam 5:2e04a8b3fc25 664 return false;
nickludlam 5:2e04a8b3fc25 665 }
nickludlam 0:b4ccb530b9eb 666
nickludlam 5:2e04a8b3fc25 667 /* Signed value decoded check range */
nickludlam 5:2e04a8b3fc25 668 if (signedValue > 0)
nickludlam 5:2e04a8b3fc25 669 {
nickludlam 5:2e04a8b3fc25 670 if ((uint32_t)signedValue > max)
nickludlam 5:2e04a8b3fc25 671 {
nickludlam 5:2e04a8b3fc25 672 _LOG_UNPACK_ERROR_RANGE;
nickludlam 5:2e04a8b3fc25 673 return false;
nickludlam 5:2e04a8b3fc25 674 }
nickludlam 5:2e04a8b3fc25 675 }
nickludlam 5:2e04a8b3fc25 676 else if (signedValue < min)
nickludlam 5:2e04a8b3fc25 677 {
nickludlam 5:2e04a8b3fc25 678 _LOG_UNPACK_ERROR_RANGE;
nickludlam 5:2e04a8b3fc25 679 return false;
nickludlam 5:2e04a8b3fc25 680 }
nickludlam 0:b4ccb530b9eb 681
nickludlam 5:2e04a8b3fc25 682 if (valueIsSigned)
nickludlam 5:2e04a8b3fc25 683 {
nickludlam 5:2e04a8b3fc25 684 *(int32_t *)value = signedValue;
nickludlam 5:2e04a8b3fc25 685 }
nickludlam 5:2e04a8b3fc25 686 else
nickludlam 5:2e04a8b3fc25 687 {
nickludlam 5:2e04a8b3fc25 688 /* Convert to unsigned */
nickludlam 5:2e04a8b3fc25 689 *(uint32_t *)value = (uint32_t)signedValue;
nickludlam 5:2e04a8b3fc25 690 }
nickludlam 0:b4ccb530b9eb 691
nickludlam 0:b4ccb530b9eb 692 /* Success */
nickludlam 0:b4ccb530b9eb 693 return true;
nickludlam 0:b4ccb530b9eb 694 }
nickludlam 0:b4ccb530b9eb 695
nickludlam 5:2e04a8b3fc25 696 /* Unsigned value decoded; check range */
nickludlam 5:2e04a8b3fc25 697 if (unsignedValue > max)
nickludlam 0:b4ccb530b9eb 698 {
nickludlam 5:2e04a8b3fc25 699 _LOG_UNPACK_ERROR_RANGE;
nickludlam 5:2e04a8b3fc25 700 return false;
nickludlam 0:b4ccb530b9eb 701 }
nickludlam 0:b4ccb530b9eb 702
nickludlam 5:2e04a8b3fc25 703 if (valueIsSigned)
nickludlam 0:b4ccb530b9eb 704 {
nickludlam 5:2e04a8b3fc25 705 /* Convert to signed */
nickludlam 5:2e04a8b3fc25 706 *(int32_t *)value = (int32_t)unsignedValue;
nickludlam 5:2e04a8b3fc25 707 }
nickludlam 5:2e04a8b3fc25 708 else
nickludlam 5:2e04a8b3fc25 709 {
nickludlam 5:2e04a8b3fc25 710 *(uint32_t *)value = unsignedValue;
nickludlam 0:b4ccb530b9eb 711 }
nickludlam 0:b4ccb530b9eb 712
nickludlam 5:2e04a8b3fc25 713 /* Success */
nickludlam 5:2e04a8b3fc25 714 return true;
nickludlam 0:b4ccb530b9eb 715 }
nickludlam 0:b4ccb530b9eb 716
nickludlam 0:b4ccb530b9eb 717 bool BERGCloudMessageBase::unpack_skip(void)
nickludlam 0:b4ccb530b9eb 718 {
nickludlam 0:b4ccb530b9eb 719 /* Skip next item */
nickludlam 0:b4ccb530b9eb 720
nickludlam 0:b4ccb530b9eb 721 uint8_t type;
nickludlam 0:b4ccb530b9eb 722 uint32_t bytesToSkip = 0;
nickludlam 0:b4ccb530b9eb 723
nickludlam 0:b4ccb530b9eb 724 /* Must be at least one byte of data */
nickludlam 0:b4ccb530b9eb 725 if (!remaining(sizeof(uint8_t)))
nickludlam 0:b4ccb530b9eb 726 {
nickludlam 0:b4ccb530b9eb 727 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 728 return false;
nickludlam 0:b4ccb530b9eb 729 }
nickludlam 0:b4ccb530b9eb 730
nickludlam 0:b4ccb530b9eb 731 /* Read type */
nickludlam 0:b4ccb530b9eb 732 type = read();
nickludlam 0:b4ccb530b9eb 733
nickludlam 0:b4ccb530b9eb 734 if ((type == _MP_UINT8) || (type == _MP_INT8))
nickludlam 0:b4ccb530b9eb 735 {
nickludlam 0:b4ccb530b9eb 736 bytesToSkip = 1;
nickludlam 0:b4ccb530b9eb 737 }
nickludlam 0:b4ccb530b9eb 738 else if ((type == _MP_UINT16) || (type == _MP_INT16))
nickludlam 0:b4ccb530b9eb 739 {
nickludlam 0:b4ccb530b9eb 740 bytesToSkip = 2;
nickludlam 0:b4ccb530b9eb 741 }
nickludlam 0:b4ccb530b9eb 742 else if ((type == _MP_UINT32) || (type == _MP_INT32) || (type == _MP_FLOAT))
nickludlam 0:b4ccb530b9eb 743 {
nickludlam 0:b4ccb530b9eb 744 bytesToSkip = 4;
nickludlam 0:b4ccb530b9eb 745 }
nickludlam 0:b4ccb530b9eb 746 else if ((type == _MP_UINT64) || (type == _MP_INT64) || (type == _MP_DOUBLE))
nickludlam 0:b4ccb530b9eb 747 {
nickludlam 0:b4ccb530b9eb 748 bytesToSkip = 8;
nickludlam 0:b4ccb530b9eb 749 }
nickludlam 0:b4ccb530b9eb 750 else if ((type == _MP_ARRAY16) || (type == _MP_MAP16))
nickludlam 0:b4ccb530b9eb 751 {
nickludlam 0:b4ccb530b9eb 752 /* TODO: This could skip all of the array/map elements too. */
nickludlam 0:b4ccb530b9eb 753 bytesToSkip = 2;
nickludlam 0:b4ccb530b9eb 754 }
nickludlam 0:b4ccb530b9eb 755 else if ((type == _MP_ARRAY32) || (type == _MP_MAP32))
nickludlam 0:b4ccb530b9eb 756 {
nickludlam 0:b4ccb530b9eb 757 /* TODO: This could skip all of the array/map elements too. */
nickludlam 0:b4ccb530b9eb 758 bytesToSkip = 4;
nickludlam 0:b4ccb530b9eb 759 }
nickludlam 0:b4ccb530b9eb 760 else if (type == _MP_RAW16)
nickludlam 0:b4ccb530b9eb 761 {
nickludlam 0:b4ccb530b9eb 762 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 763 {
nickludlam 0:b4ccb530b9eb 764 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 765 return false;
nickludlam 0:b4ccb530b9eb 766 }
nickludlam 0:b4ccb530b9eb 767
nickludlam 0:b4ccb530b9eb 768 /* Read 16-bit unsigned integer, data size */
nickludlam 0:b4ccb530b9eb 769 bytesToSkip = read();
nickludlam 0:b4ccb530b9eb 770 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 771 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 772 }
nickludlam 0:b4ccb530b9eb 773 else if (type == _MP_RAW32)
nickludlam 0:b4ccb530b9eb 774 {
nickludlam 0:b4ccb530b9eb 775 if (!remaining(sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 776 {
nickludlam 0:b4ccb530b9eb 777 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 778 return false;
nickludlam 0:b4ccb530b9eb 779 }
nickludlam 0:b4ccb530b9eb 780
nickludlam 0:b4ccb530b9eb 781 /* read 32-bit unsigned integer, data size */
nickludlam 0:b4ccb530b9eb 782 bytesToSkip = read();
nickludlam 0:b4ccb530b9eb 783 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 784 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 785 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 786 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 787 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 788 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 789 }
nickludlam 0:b4ccb530b9eb 790 else if (IN_RANGE(type, _MP_FIXRAW_MIN, _MP_FIXRAW_MAX))
nickludlam 0:b4ccb530b9eb 791 {
nickludlam 0:b4ccb530b9eb 792 bytesToSkip = type - _MP_FIXRAW_MIN;
nickludlam 0:b4ccb530b9eb 793 }
nickludlam 0:b4ccb530b9eb 794
nickludlam 0:b4ccb530b9eb 795 if (!remaining(bytesToSkip))
nickludlam 0:b4ccb530b9eb 796 {
nickludlam 0:b4ccb530b9eb 797 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 798 return false;
nickludlam 0:b4ccb530b9eb 799 }
nickludlam 0:b4ccb530b9eb 800
nickludlam 0:b4ccb530b9eb 801 while (bytesToSkip-- > 0)
nickludlam 0:b4ccb530b9eb 802 {
nickludlam 0:b4ccb530b9eb 803 /* Discard data */
nickludlam 0:b4ccb530b9eb 804 read();
nickludlam 0:b4ccb530b9eb 805 }
nickludlam 0:b4ccb530b9eb 806
nickludlam 0:b4ccb530b9eb 807 /* Success */
nickludlam 0:b4ccb530b9eb 808 return true;
nickludlam 0:b4ccb530b9eb 809 }
nickludlam 0:b4ccb530b9eb 810
nickludlam 0:b4ccb530b9eb 811 bool BERGCloudMessageBase::unpack(uint8_t& n)
nickludlam 0:b4ccb530b9eb 812 {
nickludlam 0:b4ccb530b9eb 813 uint32_t temp;
nickludlam 0:b4ccb530b9eb 814
nickludlam 5:2e04a8b3fc25 815 if (!getInteger(&temp, false, 0, UINT8_MAX))
nickludlam 0:b4ccb530b9eb 816 {
nickludlam 0:b4ccb530b9eb 817 return false;
nickludlam 0:b4ccb530b9eb 818 }
nickludlam 0:b4ccb530b9eb 819
nickludlam 0:b4ccb530b9eb 820 n = (uint8_t)temp;
nickludlam 0:b4ccb530b9eb 821 return true;
nickludlam 0:b4ccb530b9eb 822 }
nickludlam 0:b4ccb530b9eb 823
nickludlam 0:b4ccb530b9eb 824 bool BERGCloudMessageBase::unpack(uint16_t& n)
nickludlam 0:b4ccb530b9eb 825 {
nickludlam 0:b4ccb530b9eb 826 uint32_t temp;
nickludlam 0:b4ccb530b9eb 827
nickludlam 5:2e04a8b3fc25 828 if (!getInteger(&temp, false, 0, UINT16_MAX))
nickludlam 0:b4ccb530b9eb 829 {
nickludlam 0:b4ccb530b9eb 830 return false;
nickludlam 0:b4ccb530b9eb 831 }
nickludlam 0:b4ccb530b9eb 832
nickludlam 0:b4ccb530b9eb 833 n = (uint16_t)temp;
nickludlam 0:b4ccb530b9eb 834 return true;
nickludlam 0:b4ccb530b9eb 835 }
nickludlam 0:b4ccb530b9eb 836
nickludlam 0:b4ccb530b9eb 837 bool BERGCloudMessageBase::unpack(uint32_t& n)
nickludlam 0:b4ccb530b9eb 838 {
nickludlam 0:b4ccb530b9eb 839 uint32_t temp;
nickludlam 0:b4ccb530b9eb 840
nickludlam 5:2e04a8b3fc25 841 if (!getInteger(&temp, false, 0, UINT32_MAX))
nickludlam 0:b4ccb530b9eb 842 {
nickludlam 0:b4ccb530b9eb 843 return false;
nickludlam 0:b4ccb530b9eb 844 }
nickludlam 0:b4ccb530b9eb 845
nickludlam 0:b4ccb530b9eb 846 n = temp;
nickludlam 0:b4ccb530b9eb 847 return true;
nickludlam 0:b4ccb530b9eb 848 }
nickludlam 0:b4ccb530b9eb 849
nickludlam 0:b4ccb530b9eb 850 bool BERGCloudMessageBase::unpack(int8_t& n)
nickludlam 0:b4ccb530b9eb 851 {
nickludlam 0:b4ccb530b9eb 852 int32_t temp;
nickludlam 0:b4ccb530b9eb 853
nickludlam 5:2e04a8b3fc25 854 if (!getInteger(&temp, true, INT8_MIN, INT8_MAX))
nickludlam 0:b4ccb530b9eb 855 {
nickludlam 0:b4ccb530b9eb 856 return false;
nickludlam 0:b4ccb530b9eb 857 }
nickludlam 0:b4ccb530b9eb 858
nickludlam 0:b4ccb530b9eb 859 n = (int8_t)temp;
nickludlam 0:b4ccb530b9eb 860 return true;
nickludlam 0:b4ccb530b9eb 861 }
nickludlam 0:b4ccb530b9eb 862
nickludlam 0:b4ccb530b9eb 863 bool BERGCloudMessageBase::unpack(int16_t& n)
nickludlam 0:b4ccb530b9eb 864 {
nickludlam 0:b4ccb530b9eb 865 int32_t temp;
nickludlam 0:b4ccb530b9eb 866
nickludlam 5:2e04a8b3fc25 867 if (!getInteger(&temp, true, INT16_MIN, INT16_MAX))
nickludlam 0:b4ccb530b9eb 868 {
nickludlam 0:b4ccb530b9eb 869 return false;
nickludlam 0:b4ccb530b9eb 870 }
nickludlam 0:b4ccb530b9eb 871
nickludlam 0:b4ccb530b9eb 872 n = (uint16_t)temp;
nickludlam 0:b4ccb530b9eb 873 return true;
nickludlam 0:b4ccb530b9eb 874 }
nickludlam 0:b4ccb530b9eb 875
nickludlam 0:b4ccb530b9eb 876 bool BERGCloudMessageBase::unpack(int32_t& n)
nickludlam 0:b4ccb530b9eb 877 {
nickludlam 0:b4ccb530b9eb 878 int32_t temp;
nickludlam 0:b4ccb530b9eb 879
nickludlam 5:2e04a8b3fc25 880 if (!getInteger(&temp, true, INT32_MIN, INT32_MAX))
nickludlam 0:b4ccb530b9eb 881 {
nickludlam 0:b4ccb530b9eb 882 return false;
nickludlam 0:b4ccb530b9eb 883 }
nickludlam 0:b4ccb530b9eb 884
nickludlam 0:b4ccb530b9eb 885 n = temp;
nickludlam 0:b4ccb530b9eb 886 return true;
nickludlam 0:b4ccb530b9eb 887 }
nickludlam 0:b4ccb530b9eb 888
nickludlam 0:b4ccb530b9eb 889 bool BERGCloudMessageBase::unpack(float& n)
nickludlam 0:b4ccb530b9eb 890 {
nickludlam 0:b4ccb530b9eb 891 /* Try to decode the next messagePack item as an 4-byte float */
nickludlam 0:b4ccb530b9eb 892 uint32_t data;
nickludlam 0:b4ccb530b9eb 893 uint8_t type;
nickludlam 0:b4ccb530b9eb 894
nickludlam 0:b4ccb530b9eb 895 /* Look at next type */
nickludlam 0:b4ccb530b9eb 896 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 897 {
nickludlam 0:b4ccb530b9eb 898 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 899 return false;
nickludlam 0:b4ccb530b9eb 900 }
nickludlam 0:b4ccb530b9eb 901
nickludlam 0:b4ccb530b9eb 902 if (type == _MP_FLOAT)
nickludlam 0:b4ccb530b9eb 903 {
nickludlam 0:b4ccb530b9eb 904 if (!remaining(sizeof(float)))
nickludlam 0:b4ccb530b9eb 905 {
nickludlam 0:b4ccb530b9eb 906 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 907 return false;
nickludlam 0:b4ccb530b9eb 908 }
nickludlam 0:b4ccb530b9eb 909
nickludlam 0:b4ccb530b9eb 910 /* Read type */
nickludlam 0:b4ccb530b9eb 911 read();
nickludlam 0:b4ccb530b9eb 912
nickludlam 0:b4ccb530b9eb 913 /* Read 32-bit float */
nickludlam 0:b4ccb530b9eb 914 data = read();
nickludlam 0:b4ccb530b9eb 915 data = data << 8;
nickludlam 0:b4ccb530b9eb 916 data |= read();
nickludlam 0:b4ccb530b9eb 917 data = data << 8;
nickludlam 0:b4ccb530b9eb 918 data |= read();
nickludlam 0:b4ccb530b9eb 919 data = data << 8;
nickludlam 0:b4ccb530b9eb 920 data |= read();
nickludlam 0:b4ccb530b9eb 921
nickludlam 0:b4ccb530b9eb 922 /* Convert to float */
nickludlam 0:b4ccb530b9eb 923 memcpy(&n, &data, sizeof(float));
nickludlam 0:b4ccb530b9eb 924
nickludlam 0:b4ccb530b9eb 925 /* Success */
nickludlam 0:b4ccb530b9eb 926 return true;
nickludlam 0:b4ccb530b9eb 927 }
nickludlam 0:b4ccb530b9eb 928
nickludlam 0:b4ccb530b9eb 929 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 930 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 931 return false;
nickludlam 0:b4ccb530b9eb 932 }
nickludlam 0:b4ccb530b9eb 933
nickludlam 0:b4ccb530b9eb 934 bool BERGCloudMessageBase::unpack(bool& n)
nickludlam 0:b4ccb530b9eb 935 {
nickludlam 0:b4ccb530b9eb 936 /* Try to decode the next messagePack item as boolean */
nickludlam 0:b4ccb530b9eb 937 uint8_t type;
nickludlam 0:b4ccb530b9eb 938
nickludlam 0:b4ccb530b9eb 939 /* Look at next type */
nickludlam 0:b4ccb530b9eb 940 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 941 {
nickludlam 0:b4ccb530b9eb 942 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 943 return false;
nickludlam 0:b4ccb530b9eb 944 }
nickludlam 0:b4ccb530b9eb 945
nickludlam 0:b4ccb530b9eb 946 if ((type == _MP_BOOL_FALSE) || (type == _MP_BOOL_TRUE))
nickludlam 0:b4ccb530b9eb 947 {
nickludlam 0:b4ccb530b9eb 948 n = (read() == _MP_BOOL_TRUE);
nickludlam 0:b4ccb530b9eb 949
nickludlam 0:b4ccb530b9eb 950 /* Success */
nickludlam 0:b4ccb530b9eb 951 return true;
nickludlam 0:b4ccb530b9eb 952 }
nickludlam 0:b4ccb530b9eb 953
nickludlam 0:b4ccb530b9eb 954 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 955 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 956 return false;
nickludlam 0:b4ccb530b9eb 957 }
nickludlam 0:b4ccb530b9eb 958
nickludlam 0:b4ccb530b9eb 959 bool BERGCloudMessageBase::unpack_nil(void)
nickludlam 0:b4ccb530b9eb 960 {
nickludlam 0:b4ccb530b9eb 961 /* Try to decode the next messagePack item as nil */
nickludlam 0:b4ccb530b9eb 962 uint8_t type;
nickludlam 0:b4ccb530b9eb 963
nickludlam 0:b4ccb530b9eb 964 /* Look at next type */
nickludlam 0:b4ccb530b9eb 965 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 966 {
nickludlam 0:b4ccb530b9eb 967 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 968 return false;
nickludlam 0:b4ccb530b9eb 969 }
nickludlam 0:b4ccb530b9eb 970
nickludlam 0:b4ccb530b9eb 971 if (type == _MP_NIL)
nickludlam 0:b4ccb530b9eb 972 {
nickludlam 0:b4ccb530b9eb 973 /* Read type */
nickludlam 0:b4ccb530b9eb 974 read();
nickludlam 0:b4ccb530b9eb 975
nickludlam 0:b4ccb530b9eb 976 /* Success */
nickludlam 0:b4ccb530b9eb 977 return true;
nickludlam 0:b4ccb530b9eb 978 }
nickludlam 0:b4ccb530b9eb 979
nickludlam 0:b4ccb530b9eb 980 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 981 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 982 return false;
nickludlam 0:b4ccb530b9eb 983 }
nickludlam 0:b4ccb530b9eb 984
nickludlam 0:b4ccb530b9eb 985 bool BERGCloudMessageBase::unpack_array(uint16_t& items)
nickludlam 0:b4ccb530b9eb 986 {
nickludlam 0:b4ccb530b9eb 987 /* Try to decode the next messagePack item as array */
nickludlam 0:b4ccb530b9eb 988 uint8_t type;
nickludlam 0:b4ccb530b9eb 989
nickludlam 0:b4ccb530b9eb 990 /* Look at next type */
nickludlam 0:b4ccb530b9eb 991 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 992 {
nickludlam 0:b4ccb530b9eb 993 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 994 return false;
nickludlam 0:b4ccb530b9eb 995 }
nickludlam 0:b4ccb530b9eb 996
nickludlam 0:b4ccb530b9eb 997 if (IN_RANGE(type, _MP_FIXARRAY_MIN, _MP_FIXARRAY_MAX))
nickludlam 0:b4ccb530b9eb 998 {
nickludlam 0:b4ccb530b9eb 999 /* Read fix num value */
nickludlam 0:b4ccb530b9eb 1000 items = read() - _MP_FIXARRAY_MIN;
nickludlam 0:b4ccb530b9eb 1001
nickludlam 0:b4ccb530b9eb 1002 /* Success */
nickludlam 0:b4ccb530b9eb 1003 return true;
nickludlam 0:b4ccb530b9eb 1004 }
nickludlam 0:b4ccb530b9eb 1005
nickludlam 0:b4ccb530b9eb 1006 if (type == _MP_ARRAY16)
nickludlam 0:b4ccb530b9eb 1007 {
nickludlam 0:b4ccb530b9eb 1008 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 1009 {
nickludlam 0:b4ccb530b9eb 1010 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1011 return false;
nickludlam 0:b4ccb530b9eb 1012 }
nickludlam 0:b4ccb530b9eb 1013
nickludlam 0:b4ccb530b9eb 1014 /* Read type */
nickludlam 0:b4ccb530b9eb 1015 read();
nickludlam 0:b4ccb530b9eb 1016
nickludlam 0:b4ccb530b9eb 1017 /* Read 16-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1018 items = read();
nickludlam 0:b4ccb530b9eb 1019 items = items << 8;
nickludlam 0:b4ccb530b9eb 1020 items |= read();
nickludlam 0:b4ccb530b9eb 1021
nickludlam 0:b4ccb530b9eb 1022 /* Success */
nickludlam 0:b4ccb530b9eb 1023 return true;
nickludlam 0:b4ccb530b9eb 1024 }
nickludlam 0:b4ccb530b9eb 1025
nickludlam 0:b4ccb530b9eb 1026 if (type == _MP_ARRAY32)
nickludlam 0:b4ccb530b9eb 1027 {
nickludlam 0:b4ccb530b9eb 1028 /* Not yet supported */
nickludlam 0:b4ccb530b9eb 1029 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1030 return false;
nickludlam 0:b4ccb530b9eb 1031 }
nickludlam 0:b4ccb530b9eb 1032
nickludlam 0:b4ccb530b9eb 1033 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 1034 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1035 return false;
nickludlam 0:b4ccb530b9eb 1036 }
nickludlam 0:b4ccb530b9eb 1037
nickludlam 0:b4ccb530b9eb 1038 bool BERGCloudMessageBase::unpack_map(uint16_t& items)
nickludlam 0:b4ccb530b9eb 1039 {
nickludlam 0:b4ccb530b9eb 1040 /* Try to decode the next messagePack item as array */
nickludlam 0:b4ccb530b9eb 1041 uint8_t type;
nickludlam 0:b4ccb530b9eb 1042
nickludlam 0:b4ccb530b9eb 1043 /* Look at next type */
nickludlam 0:b4ccb530b9eb 1044 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 1045 {
nickludlam 0:b4ccb530b9eb 1046 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1047 return false;
nickludlam 0:b4ccb530b9eb 1048 }
nickludlam 0:b4ccb530b9eb 1049
nickludlam 0:b4ccb530b9eb 1050 if (IN_RANGE(type, _MP_FIXMAP_MIN, _MP_FIXMAP_MAX))
nickludlam 0:b4ccb530b9eb 1051 {
nickludlam 0:b4ccb530b9eb 1052 /* Read fix num value */
nickludlam 0:b4ccb530b9eb 1053 items = read() - _MP_FIXMAP_MIN;
nickludlam 0:b4ccb530b9eb 1054
nickludlam 0:b4ccb530b9eb 1055 /* Success */
nickludlam 0:b4ccb530b9eb 1056 return true;
nickludlam 0:b4ccb530b9eb 1057 }
nickludlam 0:b4ccb530b9eb 1058
nickludlam 0:b4ccb530b9eb 1059 if (type == _MP_MAP16)
nickludlam 0:b4ccb530b9eb 1060 {
nickludlam 0:b4ccb530b9eb 1061 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 1062 {
nickludlam 0:b4ccb530b9eb 1063 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1064 return false;
nickludlam 0:b4ccb530b9eb 1065 }
nickludlam 0:b4ccb530b9eb 1066
nickludlam 0:b4ccb530b9eb 1067 /* Read type */
nickludlam 0:b4ccb530b9eb 1068 read();
nickludlam 0:b4ccb530b9eb 1069
nickludlam 0:b4ccb530b9eb 1070 /* Read 16-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1071 items = read();
nickludlam 0:b4ccb530b9eb 1072 items = items << 8;
nickludlam 0:b4ccb530b9eb 1073 items |= read();
nickludlam 0:b4ccb530b9eb 1074
nickludlam 0:b4ccb530b9eb 1075 /* Success */
nickludlam 0:b4ccb530b9eb 1076 return true;
nickludlam 0:b4ccb530b9eb 1077 }
nickludlam 0:b4ccb530b9eb 1078
nickludlam 0:b4ccb530b9eb 1079 if (type == _MP_MAP32)
nickludlam 0:b4ccb530b9eb 1080 {
nickludlam 0:b4ccb530b9eb 1081 /* Not yet supported */
nickludlam 0:b4ccb530b9eb 1082 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1083 return true;
nickludlam 0:b4ccb530b9eb 1084 }
nickludlam 0:b4ccb530b9eb 1085
nickludlam 0:b4ccb530b9eb 1086 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 1087 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1088 return false;
nickludlam 0:b4ccb530b9eb 1089 }
nickludlam 0:b4ccb530b9eb 1090
nickludlam 0:b4ccb530b9eb 1091 /* Separate header and data methods are provided for raw data*/
nickludlam 0:b4ccb530b9eb 1092 /* so that Arduino strings may be unpacked without having to create */
nickludlam 0:b4ccb530b9eb 1093 /* a temporary buffer first. */
nickludlam 0:b4ccb530b9eb 1094
nickludlam 0:b4ccb530b9eb 1095 bool BERGCloudMessageBase::unpack_raw_header(uint16_t *sizeInBytes)
nickludlam 0:b4ccb530b9eb 1096 {
nickludlam 0:b4ccb530b9eb 1097 uint8_t type;
nickludlam 0:b4ccb530b9eb 1098
nickludlam 0:b4ccb530b9eb 1099 /* Look at next type */
nickludlam 0:b4ccb530b9eb 1100 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 1101 {
nickludlam 0:b4ccb530b9eb 1102 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1103 return false;
nickludlam 0:b4ccb530b9eb 1104 }
nickludlam 0:b4ccb530b9eb 1105
nickludlam 0:b4ccb530b9eb 1106 if (IN_RANGE(type, _MP_FIXRAW_MIN, _MP_FIXRAW_MAX))
nickludlam 0:b4ccb530b9eb 1107 {
nickludlam 0:b4ccb530b9eb 1108 /* Read fix raw value */
nickludlam 0:b4ccb530b9eb 1109 *sizeInBytes = read() - _MP_FIXRAW_MIN;
nickludlam 0:b4ccb530b9eb 1110
nickludlam 0:b4ccb530b9eb 1111 /* Success */
nickludlam 0:b4ccb530b9eb 1112 return true;
nickludlam 0:b4ccb530b9eb 1113 }
nickludlam 0:b4ccb530b9eb 1114
nickludlam 0:b4ccb530b9eb 1115 if (type == _MP_RAW16)
nickludlam 0:b4ccb530b9eb 1116 {
nickludlam 0:b4ccb530b9eb 1117 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 1118 {
nickludlam 0:b4ccb530b9eb 1119 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1120 return false;
nickludlam 0:b4ccb530b9eb 1121 }
nickludlam 0:b4ccb530b9eb 1122
nickludlam 0:b4ccb530b9eb 1123 /* Read type */
nickludlam 0:b4ccb530b9eb 1124 read();
nickludlam 0:b4ccb530b9eb 1125
nickludlam 0:b4ccb530b9eb 1126 /* Read 16-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1127 *sizeInBytes = read();
nickludlam 0:b4ccb530b9eb 1128 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1129 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1130
nickludlam 0:b4ccb530b9eb 1131 /* Success */
nickludlam 0:b4ccb530b9eb 1132 return true;
nickludlam 0:b4ccb530b9eb 1133 }
nickludlam 0:b4ccb530b9eb 1134
nickludlam 0:b4ccb530b9eb 1135 if (type == _MP_RAW32)
nickludlam 0:b4ccb530b9eb 1136 {
nickludlam 0:b4ccb530b9eb 1137 if (!remaining(sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 1138 {
nickludlam 0:b4ccb530b9eb 1139 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1140 return false;
nickludlam 0:b4ccb530b9eb 1141 }
nickludlam 0:b4ccb530b9eb 1142
nickludlam 0:b4ccb530b9eb 1143 /* Read type */
nickludlam 0:b4ccb530b9eb 1144 read();
nickludlam 0:b4ccb530b9eb 1145
nickludlam 0:b4ccb530b9eb 1146 /* read 32-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1147 *sizeInBytes = read();
nickludlam 0:b4ccb530b9eb 1148 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1149 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1150 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1151 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1152 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1153 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1154
nickludlam 0:b4ccb530b9eb 1155 /* Success */
nickludlam 0:b4ccb530b9eb 1156 return true;
nickludlam 0:b4ccb530b9eb 1157 }
nickludlam 0:b4ccb530b9eb 1158
nickludlam 0:b4ccb530b9eb 1159 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 1160 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1161 return false;
nickludlam 0:b4ccb530b9eb 1162 }
nickludlam 0:b4ccb530b9eb 1163
nickludlam 0:b4ccb530b9eb 1164 bool BERGCloudMessageBase::unpack_raw_data(uint8_t *pData, uint16_t packedSizeInBytes, uint16_t bufferSizeInBytes)
nickludlam 0:b4ccb530b9eb 1165 {
nickludlam 0:b4ccb530b9eb 1166 uint8_t data;
nickludlam 0:b4ccb530b9eb 1167
nickludlam 0:b4ccb530b9eb 1168 /* Unpack all bytes */
nickludlam 0:b4ccb530b9eb 1169 while (packedSizeInBytes-- > 0)
nickludlam 0:b4ccb530b9eb 1170 {
nickludlam 0:b4ccb530b9eb 1171 data = read();
nickludlam 0:b4ccb530b9eb 1172
nickludlam 0:b4ccb530b9eb 1173 /* Only write up to the buffer size */
nickludlam 0:b4ccb530b9eb 1174 if (bufferSizeInBytes-- > 0)
nickludlam 0:b4ccb530b9eb 1175 {
nickludlam 0:b4ccb530b9eb 1176 *pData++ = data;
nickludlam 0:b4ccb530b9eb 1177 }
nickludlam 0:b4ccb530b9eb 1178 }
nickludlam 0:b4ccb530b9eb 1179
nickludlam 0:b4ccb530b9eb 1180 return true;
nickludlam 0:b4ccb530b9eb 1181 }
nickludlam 0:b4ccb530b9eb 1182
nickludlam 0:b4ccb530b9eb 1183 bool BERGCloudMessageBase::unpack(char *pString, uint32_t maxSizeInBytes)
nickludlam 0:b4ccb530b9eb 1184 {
nickludlam 0:b4ccb530b9eb 1185 /* Try to decode a null-terminated C string */
nickludlam 0:b4ccb530b9eb 1186 uint16_t sizeInBytes;
nickludlam 0:b4ccb530b9eb 1187
nickludlam 0:b4ccb530b9eb 1188 if (!unpack_raw_header(&sizeInBytes))
nickludlam 0:b4ccb530b9eb 1189 {
nickludlam 0:b4ccb530b9eb 1190 return false;
nickludlam 0:b4ccb530b9eb 1191 }
nickludlam 0:b4ccb530b9eb 1192
nickludlam 0:b4ccb530b9eb 1193 if (!remaining(sizeInBytes))
nickludlam 0:b4ccb530b9eb 1194 {
nickludlam 0:b4ccb530b9eb 1195 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1196 return false;
nickludlam 0:b4ccb530b9eb 1197 }
nickludlam 0:b4ccb530b9eb 1198
nickludlam 0:b4ccb530b9eb 1199 if (!unpack_raw_data((uint8_t *)pString, sizeInBytes, maxSizeInBytes - 1)) /* -1 to allow space for null terminator */
nickludlam 0:b4ccb530b9eb 1200 {
nickludlam 0:b4ccb530b9eb 1201 return false;
nickludlam 0:b4ccb530b9eb 1202 }
nickludlam 0:b4ccb530b9eb 1203
nickludlam 0:b4ccb530b9eb 1204 /* Add null terminator */
nickludlam 0:b4ccb530b9eb 1205 pString[sizeInBytes] = '\0';
nickludlam 0:b4ccb530b9eb 1206
nickludlam 0:b4ccb530b9eb 1207 /* Success */
nickludlam 0:b4ccb530b9eb 1208 return true;
nickludlam 0:b4ccb530b9eb 1209 }
nickludlam 0:b4ccb530b9eb 1210
nickludlam 0:b4ccb530b9eb 1211 bool BERGCloudMessageBase::unpack(uint8_t *pData, uint32_t maxSizeInBytes, uint32_t *pSizeInBytes)
nickludlam 0:b4ccb530b9eb 1212 {
nickludlam 0:b4ccb530b9eb 1213 /* Try to decode a block of raw data */
nickludlam 0:b4ccb530b9eb 1214 uint16_t sizeInBytes;
nickludlam 0:b4ccb530b9eb 1215
nickludlam 0:b4ccb530b9eb 1216 if (!unpack_raw_header(&sizeInBytes))
nickludlam 0:b4ccb530b9eb 1217 {
nickludlam 0:b4ccb530b9eb 1218 return false;
nickludlam 0:b4ccb530b9eb 1219 }
nickludlam 0:b4ccb530b9eb 1220
nickludlam 0:b4ccb530b9eb 1221 if (!remaining(sizeInBytes))
nickludlam 0:b4ccb530b9eb 1222 {
nickludlam 0:b4ccb530b9eb 1223 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1224 return false;
nickludlam 0:b4ccb530b9eb 1225 }
nickludlam 0:b4ccb530b9eb 1226
nickludlam 0:b4ccb530b9eb 1227 if (pSizeInBytes != NULL)
nickludlam 0:b4ccb530b9eb 1228 {
nickludlam 0:b4ccb530b9eb 1229 *pSizeInBytes = sizeInBytes;
nickludlam 0:b4ccb530b9eb 1230 }
nickludlam 0:b4ccb530b9eb 1231
nickludlam 0:b4ccb530b9eb 1232 return unpack_raw_data(pData, sizeInBytes, maxSizeInBytes);
nickludlam 0:b4ccb530b9eb 1233 }
nickludlam 0:b4ccb530b9eb 1234
nickludlam 0:b4ccb530b9eb 1235 bool BERGCloudMessageBase::unpack_find(const char *key)
nickludlam 0:b4ccb530b9eb 1236 {
nickludlam 0:b4ccb530b9eb 1237 /* Search for a string key in a map; in this simple */
nickludlam 0:b4ccb530b9eb 1238 /* implementation maps cannot contain maps or arrays */
nickludlam 0:b4ccb530b9eb 1239 uint16_t last_read;
nickludlam 0:b4ccb530b9eb 1240 uint16_t map_items;
nickludlam 0:b4ccb530b9eb 1241 uint8_t type;
nickludlam 0:b4ccb530b9eb 1242 char keyString[MAX_MAP_KEY_STRING_LENGTH+1]; /* +1 for null terminator */
nickludlam 0:b4ccb530b9eb 1243
nickludlam 0:b4ccb530b9eb 1244 if (key == NULL)
nickludlam 0:b4ccb530b9eb 1245 {
nickludlam 0:b4ccb530b9eb 1246 return false;
nickludlam 0:b4ccb530b9eb 1247 }
nickludlam 0:b4ccb530b9eb 1248
nickludlam 0:b4ccb530b9eb 1249 if (strlen(key) > MAX_MAP_KEY_STRING_LENGTH)
nickludlam 0:b4ccb530b9eb 1250 {
nickludlam 0:b4ccb530b9eb 1251 _LOG("Unpack: Key name too long.\r\n");
nickludlam 0:b4ccb530b9eb 1252 return false;
nickludlam 0:b4ccb530b9eb 1253 }
nickludlam 0:b4ccb530b9eb 1254
nickludlam 0:b4ccb530b9eb 1255 /* Remember the current read position in the raw data */
nickludlam 0:b4ccb530b9eb 1256 last_read = bytesRead;
nickludlam 0:b4ccb530b9eb 1257
nickludlam 0:b4ccb530b9eb 1258 /* Start reading from the beginning of the data */
nickludlam 0:b4ccb530b9eb 1259 restart();
nickludlam 0:b4ccb530b9eb 1260
nickludlam 0:b4ccb530b9eb 1261 while(peek(&type))
nickludlam 0:b4ccb530b9eb 1262 {
nickludlam 0:b4ccb530b9eb 1263 if (IN_RANGE(type, _MP_FIXMAP_MIN, _MP_FIXMAP_MAX) || (type == _MP_MAP16)) /* _MP_MAP32 not yet supported */
nickludlam 0:b4ccb530b9eb 1264 {
nickludlam 0:b4ccb530b9eb 1265 /* Map found, get number of items */
nickludlam 0:b4ccb530b9eb 1266 unpack_map(map_items);
nickludlam 0:b4ccb530b9eb 1267
nickludlam 0:b4ccb530b9eb 1268 /* Iterate through the key-value pairs */
nickludlam 0:b4ccb530b9eb 1269 while (map_items-- > 0)
nickludlam 0:b4ccb530b9eb 1270 {
nickludlam 0:b4ccb530b9eb 1271 if (unpack(keyString, sizeof(keyString)))
nickludlam 0:b4ccb530b9eb 1272 {
nickludlam 0:b4ccb530b9eb 1273 /* String key found */
nickludlam 0:b4ccb530b9eb 1274 if (strcompare(keyString, key))
nickludlam 0:b4ccb530b9eb 1275 {
nickludlam 0:b4ccb530b9eb 1276 /* Match found */
nickludlam 0:b4ccb530b9eb 1277 return true;
nickludlam 0:b4ccb530b9eb 1278 }
nickludlam 0:b4ccb530b9eb 1279 else
nickludlam 0:b4ccb530b9eb 1280 {
nickludlam 0:b4ccb530b9eb 1281 /* No match, skip this value */
nickludlam 0:b4ccb530b9eb 1282 unpack_skip();
nickludlam 0:b4ccb530b9eb 1283 }
nickludlam 0:b4ccb530b9eb 1284 }
nickludlam 0:b4ccb530b9eb 1285 else
nickludlam 0:b4ccb530b9eb 1286 {
nickludlam 0:b4ccb530b9eb 1287 /* Not a suitable string key; skip this key and value */
nickludlam 0:b4ccb530b9eb 1288 unpack_skip();
nickludlam 0:b4ccb530b9eb 1289 unpack_skip();
nickludlam 0:b4ccb530b9eb 1290 }
nickludlam 0:b4ccb530b9eb 1291 }
nickludlam 0:b4ccb530b9eb 1292 }
nickludlam 0:b4ccb530b9eb 1293 else
nickludlam 0:b4ccb530b9eb 1294 {
nickludlam 0:b4ccb530b9eb 1295 /* Not a map */
nickludlam 0:b4ccb530b9eb 1296 unpack_skip();
nickludlam 0:b4ccb530b9eb 1297 }
nickludlam 0:b4ccb530b9eb 1298 }
nickludlam 0:b4ccb530b9eb 1299
nickludlam 0:b4ccb530b9eb 1300 /* Not found; return to last position */
nickludlam 0:b4ccb530b9eb 1301 bytesRead = last_read;
nickludlam 0:b4ccb530b9eb 1302 return false;
nickludlam 0:b4ccb530b9eb 1303 }
nickludlam 0:b4ccb530b9eb 1304
nickludlam 0:b4ccb530b9eb 1305 bool BERGCloudMessageBase::unpack_find(uint16_t i)
nickludlam 0:b4ccb530b9eb 1306 {
nickludlam 0:b4ccb530b9eb 1307 /* Search for an index in an array; in this simple */
nickludlam 0:b4ccb530b9eb 1308 /* implementation arrays cannot contain maps or arrays */
nickludlam 0:b4ccb530b9eb 1309 uint16_t last_read;
nickludlam 0:b4ccb530b9eb 1310 uint16_t array_items;
nickludlam 0:b4ccb530b9eb 1311 uint16_t item;
nickludlam 0:b4ccb530b9eb 1312 uint8_t type;
nickludlam 0:b4ccb530b9eb 1313
nickludlam 0:b4ccb530b9eb 1314 /* Remember the current read position in the raw data */
nickludlam 0:b4ccb530b9eb 1315 last_read = bytesRead;
nickludlam 0:b4ccb530b9eb 1316
nickludlam 0:b4ccb530b9eb 1317 /* Start reading from the beginning of the data */
nickludlam 0:b4ccb530b9eb 1318 restart();
nickludlam 0:b4ccb530b9eb 1319
nickludlam 0:b4ccb530b9eb 1320 while(peek(&type))
nickludlam 0:b4ccb530b9eb 1321 {
nickludlam 0:b4ccb530b9eb 1322 if (IN_RANGE(type, _MP_FIXARRAY_MIN, _MP_FIXARRAY_MAX) || (type == _MP_ARRAY16)) /* _MP_ARRAY32 not yet supported */
nickludlam 0:b4ccb530b9eb 1323 {
nickludlam 0:b4ccb530b9eb 1324 /* Array found, get number of items */
nickludlam 0:b4ccb530b9eb 1325 unpack_array(array_items);
nickludlam 0:b4ccb530b9eb 1326
nickludlam 0:b4ccb530b9eb 1327 /* Assume items are numbered starting from one */
nickludlam 0:b4ccb530b9eb 1328 item = 1;
nickludlam 0:b4ccb530b9eb 1329
nickludlam 0:b4ccb530b9eb 1330 if (i == 0)
nickludlam 0:b4ccb530b9eb 1331 {
nickludlam 0:b4ccb530b9eb 1332 _LOG("Unpack: Array indexes start from 1.\r\n");
nickludlam 0:b4ccb530b9eb 1333 return false;
nickludlam 0:b4ccb530b9eb 1334 }
nickludlam 0:b4ccb530b9eb 1335
nickludlam 0:b4ccb530b9eb 1336 /* Iterate through the values in the array */
nickludlam 0:b4ccb530b9eb 1337 while (array_items-- > 0)
nickludlam 0:b4ccb530b9eb 1338 {
nickludlam 0:b4ccb530b9eb 1339 if (item++ == i)
nickludlam 0:b4ccb530b9eb 1340 {
nickludlam 0:b4ccb530b9eb 1341 /* Found it */
nickludlam 0:b4ccb530b9eb 1342 return true;
nickludlam 0:b4ccb530b9eb 1343 }
nickludlam 0:b4ccb530b9eb 1344 else
nickludlam 0:b4ccb530b9eb 1345 {
nickludlam 0:b4ccb530b9eb 1346 /* Skip this item */
nickludlam 0:b4ccb530b9eb 1347 unpack_skip();
nickludlam 0:b4ccb530b9eb 1348 }
nickludlam 0:b4ccb530b9eb 1349 }
nickludlam 0:b4ccb530b9eb 1350 }
nickludlam 0:b4ccb530b9eb 1351 else
nickludlam 0:b4ccb530b9eb 1352 {
nickludlam 0:b4ccb530b9eb 1353 /* Not an array */
nickludlam 0:b4ccb530b9eb 1354 unpack_skip();
nickludlam 0:b4ccb530b9eb 1355 }
nickludlam 0:b4ccb530b9eb 1356 }
nickludlam 0:b4ccb530b9eb 1357
nickludlam 0:b4ccb530b9eb 1358 /* Not found; return to last position */
nickludlam 0:b4ccb530b9eb 1359 bytesRead = last_read;
nickludlam 0:b4ccb530b9eb 1360 return false;
nickludlam 0:b4ccb530b9eb 1361 }
nickludlam 0:b4ccb530b9eb 1362