Skip to content

Commit 3374ec1

Browse files
aentingermattiabertorello
authored andcommitted
Making sure the map data is reset when entering a new map
1 parent 41fb58c commit 3374ec1

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

ArduinoCloudThing.cpp

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,17 +165,17 @@ 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::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;
178-
case MapParserState::BooleanValue : next_state = handle_BooleanValue (&value_iter, &map_data ); break;
168+
case MapParserState::EnterMap : next_state = handle_EnterMap (&map_iter, &value_iter, &map_data); 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;
178+
case MapParserState::BooleanValue : next_state = handle_BooleanValue (&value_iter, &map_data ); break;
179179
case MapParserState::LeaveMap : next_state = handle_LeaveMap (&map_iter, &value_iter, &map_data); break;
180180
case MapParserState::Complete : /* Nothing to do */ break;
181181
case MapParserState::Error : return; break;
@@ -189,11 +189,12 @@ void ArduinoCloudThing::decode(uint8_t const * const payload, size_t const lengt
189189
* PRIVATE MEMBER FUNCTIONS
190190
******************************************************************************/
191191

192-
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_EnterMap(CborValue * map_iter, CborValue * value_iter) {
192+
ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_EnterMap(CborValue * map_iter, CborValue * value_iter, MapData * map_data) {
193193
MapParserState next_state = MapParserState::Error;
194194

195195
if(cbor_value_get_type(map_iter) == CborMapType) {
196196
if(cbor_value_enter_container(map_iter, value_iter) == CborNoError) {
197+
resetMapData(map_data);
197198
next_state = MapParserState::MapKey;
198199
}
199200
}
@@ -463,6 +464,18 @@ ArduinoCloudThing::MapParserState ArduinoCloudThing::handle_LeaveMap(CborValue *
463464
return next_state;
464465
}
465466

467+
void ArduinoCloudThing::resetMapData(MapData * map_data) {
468+
map_data->base_version.reset();
469+
map_data->base_name.reset ();
470+
map_data->base_time.reset ();
471+
map_data->name.reset ();
472+
map_data->int_val.reset ();
473+
map_data->float_val.reset ();
474+
map_data->str_val.reset ();
475+
map_data->bool_val.reset ();
476+
map_data->time.reset ();
477+
}
478+
466479
/* Source Idea from https://tools.ietf.org/html/rfc7049 : Page: 50 */
467480
double ArduinoCloudThing::convertCborHalfFloatToDouble(uint16_t const half_val) {
468481
int exp = (half_val >> 10) & 0x1f;

ArduinoCloudThing.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,10 @@ class ArduinoCloudThing {
7676
MapEntry() : _is_set(false) { }
7777

7878
inline void set (T const & entry) { _entry = entry; _is_set = true; }
79+
inline T const get () const { return _entry; }
80+
7981
inline bool isSet() const { return _is_set; }
80-
inline T const get () const { return _entry; }
82+
inline bool reset() { _is_set = false; }
8183

8284
private:
8385

@@ -98,7 +100,7 @@ class ArduinoCloudThing {
98100
MapEntry<double> time;
99101
} MapData;
100102

101-
MapParserState handle_EnterMap (CborValue * map_iter, CborValue * value_iter);
103+
MapParserState handle_EnterMap (CborValue * map_iter, CborValue * value_iter, MapData * map_data);
102104
MapParserState handle_MapKey (CborValue * value_iter);
103105
MapParserState handle_UndefinedKey (CborValue * value_iter);
104106
MapParserState handle_BaseVersion (CborValue * value_iter, MapData * map_data);
@@ -111,6 +113,7 @@ class ArduinoCloudThing {
111113
MapParserState handle_Time (CborValue * value_iter, MapData * map_data);
112114
MapParserState handle_LeaveMap (CborValue * map_iter, CborValue * value_iter, MapData const * const map_data);
113115

116+
static void resetMapData (MapData * map_data);
114117
static double convertCborHalfFloatToDouble(uint16_t const half_val);
115118

116119
};

0 commit comments

Comments
 (0)