Skip to content

Commit 20c1f43

Browse files
aentingermattiabertorello
authored andcommitted
Bugfix - taking into account that the CBOR library might collapse any datatype into a smaller version
1 parent ef597e1 commit 20c1f43

File tree

2 files changed

+28
-20
lines changed

2 files changed

+28
-20
lines changed

ArduinoCloudThing.cpp

+27-18
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseTime(CborValue *
310310
}
311311
}
312312

313+
/* TODO: Check for half float / float */
314+
313315
if(cbor_value_advance(value_iter) == CborNoError) {
314316
next_state = MapParserState::MapKey;
315317
}
@@ -339,25 +341,25 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Value(CborValue * va
339341
if(value_iter->type == CborIntegerType) {
340342
int val = 0;
341343
if(cbor_value_get_int(value_iter, &val) == CborNoError) {
342-
map_data->int_val.set(val);
344+
map_data->val.set(static_cast<float>(val));
343345
}
344346
}
345347
else if(value_iter->type == CborDoubleType) {
346348
double val = 0.0;
347349
if(cbor_value_get_double(value_iter, &val) == CborNoError) {
348-
map_data->float_val.set(static_cast<float>(val));
350+
map_data->val.set(static_cast<float>(val));
349351
}
350352
}
351353
else if(value_iter->type == CborFloatType) {
352354
float val = 0.0f;
353355
if(cbor_value_get_float(value_iter, &val) == CborNoError) {
354-
map_data->float_val.set(val);
356+
map_data->val.set(val);
355357
}
356358
}
357359
else if(value_iter->type == CborHalfFloatType) {
358360
uint16_t val = 0;
359361
if(cbor_value_get_half_float(value_iter, &val) == CborNoError) {
360-
map_data->float_val.set(static_cast<float>(convertCborHalfFloatToDouble(val)));
362+
map_data->val.set(static_cast<float>(convertCborHalfFloatToDouble(val)));
361363
}
362364
}
363365

@@ -405,12 +407,22 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Time(CborValue * val
405407
double val = 0.0;
406408
if(cbor_value_get_double(value_iter, &val) == CborNoError) {
407409
map_data->time.set(val);
408-
if(cbor_value_advance(value_iter) == CborNoError) {
409-
next_state = MapParserState::MapKey;
410-
}
411410
}
412411
}
413412

413+
if(cbor_value_is_integer(value_iter)) {
414+
int val = 0;
415+
if(cbor_value_get_int(value_iter, &val) == CborNoError) {
416+
map_data->time.set(static_cast<double>(val));
417+
}
418+
}
419+
420+
/* TODO: Check for half float / float */
421+
422+
if(cbor_value_advance(value_iter) == CborNoError) {
423+
next_state = MapParserState::MapKey;
424+
}
425+
414426
return next_state;
415427
}
416428

@@ -421,20 +433,18 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_LeaveMap(CborValue *
421433

422434
if(map_data->name.isSet())
423435
{
424-
/* Value (Integer) */
425-
if(map_data->int_val.isSet()) {
426-
ArduinoCloudProperty<int>* int_property = _property_cont.getPropertyInt(map_data->name.get());
436+
/* Value (Integer/Float/Double/Half-Float) */
437+
if(map_data->val.isSet()) {
438+
ArduinoCloudProperty<int> * int_property = _property_cont.getPropertyInt (map_data->name.get());
439+
ArduinoCloudProperty<float> * float_property = _property_cont.getPropertyFloat(map_data->name.get());
440+
427441
if(int_property && int_property->isWriteableByCloud()) {
428-
int_property->writeByCloud(map_data->int_val.get());
442+
int_property->writeByCloud(static_cast<int>(map_data->val.get())); /* Val is internally stored as float */
429443
int_property->execCallbackOnChange();
430444
}
431-
}
432445

433-
/* Value (float) */
434-
if(map_data->float_val.isSet()) {
435-
ArduinoCloudProperty<float>* float_property = _property_cont.getPropertyFloat(map_data->name.get());
436446
if(float_property && float_property->isWriteableByCloud()) {
437-
float_property->writeByCloud(map_data->float_val.get());
447+
float_property->writeByCloud(map_data->val.get());
438448
float_property->execCallbackOnChange();
439449
}
440450
}
@@ -477,8 +487,7 @@ void ArduinoCloudThing::resetMapData(MapData * map_data) {
477487
map_data->base_name.reset ();
478488
map_data->base_time.reset ();
479489
map_data->name.reset ();
480-
map_data->int_val.reset ();
481-
map_data->float_val.reset ();
490+
map_data->val.reset ();
482491
map_data->str_val.reset ();
483492
map_data->bool_val.reset ();
484493
map_data->time.reset ();

ArduinoCloudThing.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ class ArduinoCloudThing {
9393
MapEntry<String> base_name;
9494
MapEntry<double> base_time;
9595
MapEntry<String> name;
96-
MapEntry<int> int_val;
97-
MapEntry<float> float_val;
96+
MapEntry<float> val;
9897
MapEntry<String> str_val;
9998
MapEntry<bool> bool_val;
10099
MapEntry<double> time;

0 commit comments

Comments
 (0)