Skip to content

Commit ff214f8

Browse files
aentingermattiabertorello
authored andcommitted
In case of a unkown map key we now just advance to the next map key instead of cancelling the parse process
1 parent 350d61f commit ff214f8

File tree

2 files changed

+71
-38
lines changed

2 files changed

+71
-38
lines changed

ArduinoCloudThing.cpp

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -165,18 +165,20 @@ void ArduinoCloudThing::decode(uint8_t const * const payload, size_t const lengt
165165
while(current_state != MapParserState::Complete) {
166166

167167
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;
176178
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;
180182
}
181183

182184
current_state = next_state;
@@ -211,13 +213,15 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_MapKey(CborValue * v
211213
char * val = 0;
212214
size_t val_size = 0;
213215
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;
221225
free(val);
222226
}
223227
}
@@ -229,12 +233,14 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_MapKey(CborValue * v
229233
if(cbor_value_get_int(value_iter, &val) == CborNoError) {
230234
if(cbor_value_advance(value_iter) == CborNoError) {
231235
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;
232239
else if(val == static_cast<int>(CborIntegerMapKey::Value )) next_state = MapParserState::Value;
233240
else if(val == static_cast<int>(CborIntegerMapKey::StringValue )) next_state = MapParserState::StringValue;
234241
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;
237242
else if(val == static_cast<int>(CborIntegerMapKey::Time )) next_state = MapParserState::Time;
243+
else next_state = MapParserState::UndefinedKey;
238244
}
239245
}
240246
}
@@ -244,6 +250,28 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_MapKey(CborValue * v
244250
return next_state;
245251
}
246252

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+
247275
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseName(CborValue * value_iter, MapData * map_data) {
248276
MapParserState next_state = MapParserState::Error;
249277

@@ -276,22 +304,6 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BaseTime(CborValue *
276304
return next_state;
277305
}
278306

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-
295307
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_Name(CborValue * value_iter, MapData * map_data) {
296308
MapParserState next_state = MapParserState::Error;
297309

@@ -373,6 +385,22 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_BooleanValue(CborVal
373385
return next_state;
374386
}
375387

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+
376404
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_LeaveMap(CborValue * map_iter, CborValue * value_iter, MapData const * const map_data) {
377405
MapParserState next_state = MapParserState::Error;
378406

ArduinoCloudThing.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,15 @@ class ArduinoCloudThing {
5555
enum class MapParserState {
5656
EnterMap,
5757
MapKey,
58+
UndefinedKey,
59+
BaseVersion,
5860
BaseName,
5961
BaseTime,
60-
Time,
6162
Name,
6263
Value,
6364
StringValue,
6465
BooleanValue,
66+
Time,
6567
LeaveMap,
6668
Complete,
6769
Error
@@ -94,6 +96,7 @@ class ArduinoCloudThing {
9496
};
9597

9698
typedef struct {
99+
MapEntry<int> base_version;
97100
MapEntry<String> base_name;
98101
MapEntry<double> base_time;
99102
MapEntry<String> name;
@@ -106,13 +109,15 @@ class ArduinoCloudThing {
106109

107110
MapParserState handle_EnterMap (CborValue * map_iter, CborValue * value_iter);
108111
MapParserState handle_MapKey (CborValue * value_iter);
112+
MapParserState handle_UndefinedKey (CborValue * value_iter);
113+
MapParserState handle_BaseVersion (CborValue * value_iter, MapData * map_data);
109114
MapParserState handle_BaseName (CborValue * value_iter, MapData * map_data);
110115
MapParserState handle_BaseTime (CborValue * value_iter, MapData * map_data);
111-
MapParserState handle_Time (CborValue * value_iter, MapData * map_data);
112116
MapParserState handle_Name (CborValue * value_iter, MapData * map_data);
113117
MapParserState handle_Value (CborValue * value_iter, MapData * map_data);
114118
MapParserState handle_StringValue (CborValue * value_iter, MapData * map_data);
115119
MapParserState handle_BooleanValue (CborValue * value_iter, MapData * map_data);
120+
MapParserState handle_Time (CborValue * value_iter, MapData * map_data);
116121
MapParserState handle_LeaveMap (CborValue * map_iter, CborValue * value_iter, MapData const * const map_data);
117122

118123
static double convertCborHalfFloatToDouble(uint16_t const half_val);

0 commit comments

Comments
 (0)