@@ -165,18 +165,20 @@ void ArduinoCloudThing::decode(uint8_t const * const payload, size_t const lengt
165
165
while (current_state != MapParserState::Complete) {
166
166
167
167
switch (current_state) {
168
- case MapParserState::EnterMap : next_state = handle_EnterMap (&map_iter, &value_iter ); break ;
169
- case MapParserState::MapKey : next_state = handle_MapKey (&value_iter ); break ;
170
- case MapParserState::BaseName : next_state = handle_BaseName (&value_iter, &map_data ); break ;
171
- case MapParserState::BaseTime : next_state = handle_BaseTime (&value_iter, &map_data ); break ;
172
- case MapParserState::Time : next_state = handle_Time (&value_iter, &map_data ); break ;
173
- case MapParserState::Name : next_state = handle_Name (&value_iter, &map_data ); break ;
174
- case MapParserState::Value : next_state = handle_Value (&value_iter, &map_data); break ;
175
- case MapParserState::StringValue : next_state = handle_StringValue (&value_iter, &map_data ); break ;
168
+ case MapParserState::EnterMap : next_state = handle_EnterMap (&map_iter, &value_iter ); break ;
169
+ case MapParserState::MapKey : next_state = handle_MapKey (&value_iter ); break ;
170
+ case MapParserState::UndefinedKey : next_state = handle_UndefinedKey (&value_iter ); break ;
171
+ case MapParserState::BaseVersion : next_state = handle_BaseVersion (&value_iter, &map_data ); break ;
172
+ case MapParserState::BaseName : next_state = handle_BaseName (&value_iter, &map_data ); break ;
173
+ case MapParserState::BaseTime : next_state = handle_BaseTime (&value_iter, &map_data ); break ;
174
+ case MapParserState::Time : next_state = handle_Time (&value_iter, &map_data ); break ;
175
+ case MapParserState::Name : next_state = handle_Name (&value_iter, &map_data ); break ;
176
+ case MapParserState::Value : next_state = handle_Value (&value_iter, &map_data ); break ;
177
+ case MapParserState::StringValue : next_state = handle_StringValue (&value_iter, &map_data ); break ;
176
178
case MapParserState::BooleanValue : next_state = handle_BooleanValue (&value_iter, &map_data ); break ;
177
- case MapParserState::LeaveMap : next_state = handle_LeaveMap (&map_iter, &value_iter, &map_data ); break ;
178
- case MapParserState::Complete : /* Nothing to do */ break ;
179
- case MapParserState::Error : return ; break ;
179
+ case MapParserState::LeaveMap : next_state = handle_LeaveMap (&map_iter, &value_iter, &map_data); break ;
180
+ case MapParserState::Complete : /* Nothing to do */ break ;
181
+ case MapParserState::Error : return ; break ;
180
182
}
181
183
182
184
current_state = next_state;
@@ -211,13 +213,15 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_MapKey(CborValue * v
211
213
char * val = 0 ;
212
214
size_t val_size = 0 ;
213
215
if (cbor_value_dup_text_string (value_iter, &val, &val_size, value_iter) == CborNoError) {
214
- if (strcmp (val, " n" ) == 0 ) next_state = MapParserState::Name;
215
- else if (strcmp (val, " v" ) == 0 ) next_state = MapParserState::Value;
216
- else if (strcmp (val, " vs" ) == 0 ) next_state = MapParserState::StringValue;
217
- else if (strcmp (val, " vb" ) == 0 ) next_state = MapParserState::BooleanValue;
218
- else if (strcmp (val, " bn" ) == 0 ) next_state = MapParserState::BaseName;
219
- else if (strcmp (val, " bt" ) == 0 ) next_state = MapParserState::BaseTime;
220
- else if (strcmp (val, " t" ) == 0 ) next_state = MapParserState::Time;
216
+ if (strcmp (val, " n" ) == 0 ) next_state = MapParserState::Name;
217
+ else if (strcmp (val, " bver" ) == 0 ) next_state = MapParserState::BaseVersion;
218
+ else if (strcmp (val, " bn" ) == 0 ) next_state = MapParserState::BaseName;
219
+ else if (strcmp (val, " bt" ) == 0 ) next_state = MapParserState::BaseTime;
220
+ else if (strcmp (val, " v" ) == 0 ) next_state = MapParserState::Value;
221
+ else if (strcmp (val, " vs" ) == 0 ) next_state = MapParserState::StringValue;
222
+ else if (strcmp (val, " vb" ) == 0 ) next_state = MapParserState::BooleanValue;
223
+ else if (strcmp (val, " t" ) == 0 ) next_state = MapParserState::Time;
224
+ else next_state = MapParserState::UndefinedKey;
221
225
free (val);
222
226
}
223
227
}
@@ -229,12 +233,14 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_MapKey(CborValue * v
229
233
if (cbor_value_get_int (value_iter, &val) == CborNoError) {
230
234
if (cbor_value_advance (value_iter) == CborNoError) {
231
235
if (val == static_cast <int >(CborIntegerMapKey::Name )) next_state = MapParserState::Name;
236
+ else if (val == static_cast <int >(CborIntegerMapKey::BaseVersion )) next_state = MapParserState::BaseVersion;
237
+ else if (val == static_cast <int >(CborIntegerMapKey::BaseName )) next_state = MapParserState::BaseName;
238
+ else if (val == static_cast <int >(CborIntegerMapKey::BaseTime )) next_state = MapParserState::BaseTime;
232
239
else if (val == static_cast <int >(CborIntegerMapKey::Value )) next_state = MapParserState::Value;
233
240
else if (val == static_cast <int >(CborIntegerMapKey::StringValue )) next_state = MapParserState::StringValue;
234
241
else if (val == static_cast <int >(CborIntegerMapKey::BooleanValue)) next_state = MapParserState::BooleanValue;
235
- else if (val == static_cast <int >(CborIntegerMapKey::BaseName )) next_state = MapParserState::BaseName;
236
- else if (val == static_cast <int >(CborIntegerMapKey::BaseTime )) next_state = MapParserState::BaseTime;
237
242
else if (val == static_cast <int >(CborIntegerMapKey::Time )) next_state = MapParserState::Time;
243
+ else next_state = MapParserState::UndefinedKey;
238
244
}
239
245
}
240
246
}
@@ -244,6 +250,28 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_MapKey(CborValue * v
244
250
return next_state;
245
251
}
246
252
253
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_UndefinedKey (CborValue * value_iter) {
254
+ MapParserState next_state = MapParserState::Error;
255
+
256
+ if (cbor_value_advance (value_iter) == CborNoError) {
257
+ next_state = MapParserState::MapKey;
258
+ }
259
+
260
+ return next_state;
261
+ }
262
+
263
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseVersion (CborValue * value_iter, MapData * map_data) {
264
+ MapParserState next_state = MapParserState::Error;
265
+
266
+ /* TODO: Parse BaseVersion */
267
+
268
+ if (cbor_value_advance (value_iter) == CborNoError) {
269
+ next_state = MapParserState::MapKey;
270
+ }
271
+
272
+ return next_state;
273
+ }
274
+
247
275
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseName (CborValue * value_iter, MapData * map_data) {
248
276
MapParserState next_state = MapParserState::Error;
249
277
@@ -276,22 +304,6 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseTime(CborValue *
276
304
return next_state;
277
305
}
278
306
279
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Time (CborValue * value_iter, MapData * map_data) {
280
- MapParserState next_state = MapParserState::Error;
281
-
282
- if (cbor_value_is_double (value_iter)) {
283
- double val = 0.0 ;
284
- if (cbor_value_get_double (value_iter, &val) == CborNoError) {
285
- map_data->time .set (val);
286
- if (cbor_value_advance (value_iter) == CborNoError) {
287
- next_state = MapParserState::MapKey;
288
- }
289
- }
290
- }
291
-
292
- return next_state;
293
- }
294
-
295
307
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Name (CborValue * value_iter, MapData * map_data) {
296
308
MapParserState next_state = MapParserState::Error;
297
309
@@ -373,6 +385,22 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BooleanValue(CborVal
373
385
return next_state;
374
386
}
375
387
388
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Time (CborValue * value_iter, MapData * map_data) {
389
+ MapParserState next_state = MapParserState::Error;
390
+
391
+ if (cbor_value_is_double (value_iter)) {
392
+ double val = 0.0 ;
393
+ if (cbor_value_get_double (value_iter, &val) == CborNoError) {
394
+ map_data->time .set (val);
395
+ if (cbor_value_advance (value_iter) == CborNoError) {
396
+ next_state = MapParserState::MapKey;
397
+ }
398
+ }
399
+ }
400
+
401
+ return next_state;
402
+ }
403
+
376
404
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_LeaveMap (CborValue * map_iter, CborValue * value_iter, MapData const * const map_data) {
377
405
MapParserState next_state = MapParserState::Error;
378
406
0 commit comments