@@ -87,31 +87,30 @@ int ArduinoCloudThing::encode(uint8_t * data, size_t const size) {
87
87
// time interval may be elapsed or property may be changed
88
88
int const num_changed_properties = _property_cont.getNumOfChangedProperties ();
89
89
90
- if (num_changed_properties > 0 ) {
91
- CborError err;
92
- CborEncoder encoder, arrayEncoder;
93
-
94
- cbor_encoder_init (&encoder, data, size, 0 );
95
- // create a cbor array containing the property that should be updated.
96
- err = cbor_encoder_create_array (&encoder, &arrayEncoder, num_changed_properties);
97
- if (err) {
98
- // Serial.println(cbor_error_string(err));
99
- return -1 ;
100
- }
90
+ if (num_changed_properties > 0 ) {
91
+ CborEncoder encoder, arrayEncoder;
101
92
102
- _property_cont. appendChangedProperties (&arrayEncoder );
93
+ cbor_encoder_init (&encoder, data, size, 0 );
103
94
104
- err = cbor_encoder_close_container (&encoder, &arrayEncoder);
95
+ if (cbor_encoder_create_array (&encoder, &arrayEncoder, num_changed_properties) != CborNoError) {
96
+ return -1 ;
97
+ }
105
98
106
- // return the number of byte of the CBOR encoded array
107
- return cbor_encoder_get_buffer_size (&encoder, data);
108
- }
99
+ _property_cont.appendChangedProperties (&arrayEncoder);
100
+
101
+ if (cbor_encoder_close_container (&encoder, &arrayEncoder) != CborNoError) {
102
+ return -1 ;
103
+ }
109
104
110
105
#if defined(DEBUG_MEMORY) && defined(ARDUINO_ARCH_SAMD)
111
- PrintFreeRam ();
106
+ PrintFreeRam ();
112
107
#endif
113
- // If nothing has to be sent, return diff, that is 0 in this case
114
- return num_changed_properties;
108
+ int const bytes_encoded = cbor_encoder_get_buffer_size (&encoder, data);
109
+ return bytes_encoded;
110
+ }
111
+ else {
112
+ return num_changed_properties;
113
+ }
115
114
}
116
115
117
116
ArduinoCloudProperty<bool > & ArduinoCloudThing::addPropertyReal (bool & property, String const & name, Permission const permission) {
@@ -174,7 +173,7 @@ void ArduinoCloudThing::decode(uint8_t const * const payload, size_t const lengt
174
173
if (cbor_value_enter_container (&array_iter, &map_iter) != CborNoError)
175
174
return ;
176
175
177
- MapData map_data;
176
+ CborMapData map_data;
178
177
MapParserState current_state = MapParserState::EnterMap,
179
178
next_state;
180
179
@@ -205,12 +204,12 @@ void ArduinoCloudThing::decode(uint8_t const * const payload, size_t const lengt
205
204
* PRIVATE MEMBER FUNCTIONS
206
205
******************************************************************************/
207
206
208
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_EnterMap (CborValue * map_iter, CborValue * value_iter, MapData * map_data) {
207
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_EnterMap (CborValue * map_iter, CborValue * value_iter, CborMapData * map_data) {
209
208
MapParserState next_state = MapParserState::Error;
210
209
211
210
if (cbor_value_get_type (map_iter) == CborMapType) {
212
211
if (cbor_value_enter_container (map_iter, value_iter) == CborNoError) {
213
- resetMapData ( map_data);
212
+ map_data-> reset ( );
214
213
next_state = MapParserState::MapKey;
215
214
}
216
215
}
@@ -229,40 +228,41 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_MapKey(CborValue * v
229
228
* Example [{"n": "temperature", "v": 25}]
230
229
*/
231
230
else if (cbor_value_is_text_string (value_iter)) {
232
- char * val = 0 ;
233
- size_t val_size = 0 ;
234
- if (cbor_value_dup_text_string (value_iter, &val, &val_size, value_iter) == CborNoError) {
235
- if (strcmp (val, " n" ) == 0 ) next_state = MapParserState::Name;
236
- else if (strcmp (val, " bver" ) == 0 ) next_state = MapParserState::BaseVersion;
237
- else if (strcmp (val, " bn" ) == 0 ) next_state = MapParserState::BaseName;
238
- else if (strcmp (val, " bt" ) == 0 ) next_state = MapParserState::BaseTime;
239
- else if (strcmp (val, " v" ) == 0 ) next_state = MapParserState::Value;
240
- else if (strcmp (val, " vs" ) == 0 ) next_state = MapParserState::StringValue;
241
- else if (strcmp (val, " vb" ) == 0 ) next_state = MapParserState::BooleanValue;
242
- else if (strcmp (val, " t" ) == 0 ) next_state = MapParserState::Time;
243
- else next_state = MapParserState::UndefinedKey;
244
- free (val);
245
- }
231
+ char * val = 0 ;
232
+ size_t val_size = 0 ;
233
+ if (cbor_value_dup_text_string (value_iter, &val, &val_size, value_iter) == CborNoError) {
234
+ if (strcmp (val, " n" ) == 0 ) next_state = MapParserState::Name;
235
+ else if (strcmp (val, " bver" ) == 0 ) next_state = MapParserState::BaseVersion;
236
+ else if (strcmp (val, " bn" ) == 0 ) next_state = MapParserState::BaseName;
237
+ else if (strcmp (val, " bt" ) == 0 ) next_state = MapParserState::BaseTime;
238
+ else if (strcmp (val, " v" ) == 0 ) next_state = MapParserState::Value;
239
+ else if (strcmp (val, " vs" ) == 0 ) next_state = MapParserState::StringValue;
240
+ else if (strcmp (val, " vb" ) == 0 ) next_state = MapParserState::BooleanValue;
241
+ else if (strcmp (val, " t" ) == 0 ) next_state = MapParserState::Time;
242
+ else next_state = MapParserState::UndefinedKey;
243
+ free (val);
244
+ }
246
245
}
247
246
/* If the key is a number means that the Map use the CBOR Label (protocol V2)
248
247
* Example [{0: "temperature", 2: 25}]
249
248
*/
250
249
else if (cbor_value_is_integer (value_iter)) {
251
- int val = 0 ;
252
- if (cbor_value_get_int (value_iter, &val) == CborNoError) {
253
- if (cbor_value_advance (value_iter) == CborNoError) {
254
- if (val == static_cast <int >(CborIntegerMapKey::Name )) next_state = MapParserState::Name;
255
- else if (val == static_cast <int >(CborIntegerMapKey::BaseVersion )) next_state = MapParserState::BaseVersion;
256
- else if (val == static_cast <int >(CborIntegerMapKey::BaseName )) next_state = MapParserState::BaseName;
257
- else if (val == static_cast <int >(CborIntegerMapKey::BaseTime )) next_state = MapParserState::BaseTime;
258
- else if (val == static_cast <int >(CborIntegerMapKey::Value )) next_state = MapParserState::Value;
259
- else if (val == static_cast <int >(CborIntegerMapKey::StringValue )) next_state = MapParserState::StringValue;
260
- else if (val == static_cast <int >(CborIntegerMapKey::BooleanValue)) next_state = MapParserState::BooleanValue;
261
- else if (val == static_cast <int >(CborIntegerMapKey::Time )) next_state = MapParserState::Time;
262
- else next_state = MapParserState::UndefinedKey;
263
- }
264
- }
250
+ int val = 0 ;
251
+ if (cbor_value_get_int (value_iter, &val) == CborNoError) {
252
+ if (cbor_value_advance (value_iter) == CborNoError) {
253
+ if (val == static_cast <int >(CborIntegerMapKey::Name )) next_state = MapParserState::Name;
254
+ else if (val == static_cast <int >(CborIntegerMapKey::BaseVersion )) next_state = MapParserState::BaseVersion;
255
+ else if (val == static_cast <int >(CborIntegerMapKey::BaseName )) next_state = MapParserState::BaseName;
256
+ else if (val == static_cast <int >(CborIntegerMapKey::BaseTime )) next_state = MapParserState::BaseTime;
257
+ else if (val == static_cast <int >(CborIntegerMapKey::Value )) next_state = MapParserState::Value;
258
+ else if (val == static_cast <int >(CborIntegerMapKey::StringValue )) next_state = MapParserState::StringValue;
259
+ else if (val == static_cast <int >(CborIntegerMapKey::BooleanValue)) next_state = MapParserState::BooleanValue;
260
+ else if (val == static_cast <int >(CborIntegerMapKey::Time )) next_state = MapParserState::Time;
261
+ else next_state = MapParserState::UndefinedKey;
262
+ }
263
+ }
265
264
}
265
+
266
266
return next_state;
267
267
}
268
268
@@ -276,13 +276,14 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_UndefinedKey(CborVal
276
276
return next_state;
277
277
}
278
278
279
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseVersion (CborValue * value_iter, MapData * map_data) {
279
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseVersion (CborValue * value_iter, CborMapData * map_data) {
280
280
MapParserState next_state = MapParserState::Error;
281
281
282
282
if (cbor_value_is_integer (value_iter)) {
283
283
int val = 0 ;
284
284
if (cbor_value_get_int (value_iter, &val) == CborNoError) {
285
285
map_data->base_version .set (val);
286
+
286
287
if (cbor_value_advance (value_iter) == CborNoError) {
287
288
next_state = MapParserState::MapKey;
288
289
}
@@ -292,7 +293,7 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseVersion(CborValu
292
293
return next_state;
293
294
}
294
295
295
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseName (CborValue * value_iter, MapData * map_data) {
296
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseName (CborValue * value_iter, CborMapData * map_data) {
296
297
MapParserState next_state = MapParserState::Error;
297
298
298
299
if (cbor_value_is_text_string (value_iter)) {
@@ -308,45 +309,22 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseName(CborValue *
308
309
return next_state;
309
310
}
310
311
311
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseTime (CborValue * value_iter, MapData * map_data) {
312
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseTime (CborValue * value_iter, CborMapData * map_data) {
312
313
MapParserState next_state = MapParserState::Error;
313
314
314
- if (cbor_value_is_integer (value_iter)) {
315
- int val = 0 ;
316
- if (cbor_value_get_int (value_iter, &val) == CborNoError) {
317
- map_data->base_time .set (static_cast <double >(val));
318
- }
319
- }
320
-
321
- if (cbor_value_is_double (value_iter)) {
322
- double val = 0.0 ;
323
- if (cbor_value_get_double (value_iter, &val) == CborNoError) {
324
- map_data->base_time .set (val);
325
- }
326
- }
327
-
328
- if (cbor_value_is_float (value_iter)) {
329
- float val = 0.0 ;
330
- if (cbor_value_get_float (value_iter, &val) == CborNoError) {
331
- map_data->base_time .set (static_cast <double >(val));
332
- }
333
- }
315
+ double val = 0.0 ;
316
+ if (ifNumericConvertToDouble (value_iter, &val)) {
317
+ map_data->base_time .set (val);
334
318
335
- if (cbor_value_is_half_float (value_iter)) {
336
- uint16_t val = 0 ;
337
- if (cbor_value_get_half_float (value_iter, &val) == CborNoError) {
338
- map_data->base_time .set (static_cast <double >(convertCborHalfFloatToDouble (val)));
319
+ if (cbor_value_advance (value_iter) == CborNoError) {
320
+ next_state = MapParserState::MapKey;
339
321
}
340
322
}
341
323
342
- if (cbor_value_advance (value_iter) == CborNoError) {
343
- next_state = MapParserState::MapKey;
344
- }
345
-
346
324
return next_state;
347
325
}
348
326
349
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Name (CborValue * value_iter, MapData * map_data) {
327
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Name (CborValue * value_iter, CborMapData * map_data) {
350
328
MapParserState next_state = MapParserState::Error;
351
329
352
330
if (cbor_value_is_text_string (value_iter)) {
@@ -362,42 +340,22 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Name(CborValue * val
362
340
return next_state;
363
341
}
364
342
365
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Value (CborValue * value_iter, MapData * map_data) {
343
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Value (CborValue * value_iter, CborMapData * map_data) {
366
344
MapParserState next_state = MapParserState::Error;
367
345
368
- if (value_iter->type == CborIntegerType) {
369
- int val = 0 ;
370
- if (cbor_value_get_int (value_iter, &val) == CborNoError) {
371
- map_data->val .set (static_cast <float >(val));
372
- }
373
- }
374
- else if (value_iter->type == CborDoubleType) {
375
- double val = 0.0 ;
376
- if (cbor_value_get_double (value_iter, &val) == CborNoError) {
377
- map_data->val .set (static_cast <float >(val));
378
- }
379
- }
380
- else if (value_iter->type == CborFloatType) {
381
- float val = 0 .0f ;
382
- if (cbor_value_get_float (value_iter, &val) == CborNoError) {
383
- map_data->val .set (val);
384
- }
385
- }
386
- else if (value_iter->type == CborHalfFloatType) {
387
- uint16_t val = 0 ;
388
- if (cbor_value_get_half_float (value_iter, &val) == CborNoError) {
389
- map_data->val .set (static_cast <float >(convertCborHalfFloatToDouble (val)));
390
- }
391
- }
346
+ double val = 0.0 ;
347
+ if (ifNumericConvertToDouble (value_iter, &val)) {
348
+ map_data->val .set (val);
392
349
393
- if (cbor_value_advance (value_iter) == CborNoError) {
394
- next_state = MapParserState::MapKey;
350
+ if (cbor_value_advance (value_iter) == CborNoError) {
351
+ next_state = MapParserState::MapKey;
352
+ }
395
353
}
396
354
397
355
return next_state;
398
356
}
399
357
400
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_StringValue (CborValue * value_iter, MapData * map_data) {
358
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_StringValue (CborValue * value_iter, CborMapData * map_data) {
401
359
MapParserState next_state = MapParserState::Error;
402
360
403
361
if (cbor_value_is_text_string (value_iter)) {
@@ -413,12 +371,13 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_StringValue(CborValu
413
371
return next_state;
414
372
}
415
373
416
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BooleanValue (CborValue * value_iter, MapData * map_data) {
374
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BooleanValue (CborValue * value_iter, CborMapData * map_data) {
417
375
MapParserState next_state = MapParserState::Error;
418
376
419
377
bool val = false ;
420
378
if (cbor_value_get_boolean (value_iter, &val) == CborNoError) {
421
379
map_data->bool_val .set (val);
380
+
422
381
if (cbor_value_advance (value_iter) == CborNoError) {
423
382
next_state = MapParserState::MapKey;
424
383
}
@@ -427,45 +386,22 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BooleanValue(CborVal
427
386
return next_state;
428
387
}
429
388
430
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Time (CborValue * value_iter, MapData * map_data) {
389
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Time (CborValue * value_iter, CborMapData * map_data) {
431
390
MapParserState next_state = MapParserState::Error;
432
391
433
- if (cbor_value_is_integer (value_iter)) {
434
- int val = 0 ;
435
- if (cbor_value_get_int (value_iter, &val) == CborNoError) {
436
- map_data->time .set (static_cast <double >(val));
437
- }
438
- }
439
-
440
- if (cbor_value_is_double (value_iter)) {
441
- double val = 0.0 ;
442
- if (cbor_value_get_double (value_iter, &val) == CborNoError) {
443
- map_data->time .set (val);
444
- }
445
- }
446
-
447
- if (cbor_value_is_float (value_iter)) {
448
- float val = 0.0 ;
449
- if (cbor_value_get_float (value_iter, &val) == CborNoError) {
450
- map_data->time .set (static_cast <double >(val));
451
- }
452
- }
392
+ double val = 0.0 ;
393
+ if (ifNumericConvertToDouble (value_iter, &val)) {
394
+ map_data->time .set (val);
453
395
454
- if (cbor_value_is_half_float (value_iter)) {
455
- uint16_t val = 0 ;
456
- if (cbor_value_get_half_float (value_iter, &val) == CborNoError) {
457
- map_data->time .set (static_cast <double >(convertCborHalfFloatToDouble (val)));
396
+ if (cbor_value_advance (value_iter) == CborNoError) {
397
+ next_state = MapParserState::MapKey;
458
398
}
459
399
}
460
400
461
- if (cbor_value_advance (value_iter) == CborNoError) {
462
- next_state = MapParserState::MapKey;
463
- }
464
-
465
401
return next_state;
466
402
}
467
403
468
- ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_LeaveMap (CborValue * map_iter, CborValue * value_iter, MapData const * const map_data) {
404
+ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_LeaveMap (CborValue * map_iter, CborValue * value_iter, CborMapData const * const map_data) {
469
405
MapParserState next_state = MapParserState::Error;
470
406
471
407
/* Update the property containers depending on the parsed data */
@@ -521,15 +457,38 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_LeaveMap(CborValue *
521
457
return next_state;
522
458
}
523
459
524
- void ArduinoCloudThing::resetMapData (MapData * map_data) {
525
- map_data->base_version .reset ();
526
- map_data->base_name .reset ();
527
- map_data->base_time .reset ();
528
- map_data->name .reset ();
529
- map_data->val .reset ();
530
- map_data->str_val .reset ();
531
- map_data->bool_val .reset ();
532
- map_data->time .reset ();
460
+ bool ArduinoCloudThing::ifNumericConvertToDouble (CborValue * value_iter, double * numeric_val) {
461
+
462
+ if (cbor_value_is_integer (value_iter)) {
463
+ int val = 0 ;
464
+ if (cbor_value_get_int (value_iter, &val) == CborNoError) {
465
+ *numeric_val = static_cast <double >(val);
466
+ return true ;
467
+ }
468
+ }
469
+ else if (cbor_value_is_double (value_iter)) {
470
+ double val = 0.0 ;
471
+ if (cbor_value_get_double (value_iter, &val) == CborNoError) {
472
+ *numeric_val = val;
473
+ return true ;
474
+ }
475
+ }
476
+ else if (cbor_value_is_float (value_iter)) {
477
+ float val = 0.0 ;
478
+ if (cbor_value_get_float (value_iter, &val) == CborNoError) {
479
+ *numeric_val = static_cast <double >(val);
480
+ return true ;
481
+ }
482
+ }
483
+ else if (cbor_value_is_half_float (value_iter)) {
484
+ uint16_t val = 0 ;
485
+ if (cbor_value_get_half_float (value_iter, &val) == CborNoError) {
486
+ *numeric_val = static_cast <double >(convertCborHalfFloatToDouble (val));
487
+ return true ;
488
+ }
489
+ }
490
+
491
+ return false ;
533
492
}
534
493
535
494
/* Source Idea from https://tools.ietf.org/html/rfc7049 : Page: 50 */
0 commit comments