@@ -120,7 +120,15 @@ MessageDecoder::ArrayParserState MessageDecoder::handle_EnterArray(CborValue * m
120
120
return next_state;
121
121
}
122
122
123
- MessageDecoder::ArrayParserState MessageDecoder::decodeGetThingIdCommand (CborValue * param, Message * message) {
123
+ MessageDecoder::ArrayParserState MessageDecoder::handle_LeaveArray (CborValue * array_iter) {
124
+ return ArrayParserState::Complete;
125
+ }
126
+
127
+ /* *****************************************************************************
128
+ MESSAGE DECODE FUNCTIONS
129
+ ******************************************************************************/
130
+
131
+ MessageDecoder::ArrayParserState MessageDecoder::decodeThingGetIdCmdDown (CborValue * param, Message * message) {
124
132
ThingGetIdCmdDown * thingCommand = (ThingGetIdCmdDown *) message;
125
133
126
134
// Message is composed of a single parameter, a string (thing_id)
@@ -131,7 +139,7 @@ MessageDecoder::ArrayParserState MessageDecoder::decodeGetThingIdCommand(CborVal
131
139
}
132
140
}
133
141
134
- MessageDecoder::ArrayParserState MessageDecoder::decodeSetTimezoneCommand (CborValue * param, Message * message) {
142
+ MessageDecoder::ArrayParserState MessageDecoder::decodeTimezoneCommandDown (CborValue * param, Message * message) {
135
143
SetTimezoneCommand * setTz = (SetTimezoneCommand *) message;
136
144
137
145
// Message is composed of 2 parameters, offset and until 32-bit unsigned integer
@@ -159,16 +167,20 @@ MessageDecoder::ArrayParserState MessageDecoder::decodeSetTimezoneCommand(CborVa
159
167
return ArrayParserState::LeaveArray;
160
168
}
161
169
162
- MessageDecoder::ArrayParserState MessageDecoder::decodeSetLastValueCommand (CborValue * param, Message * message) {
170
+ MessageDecoder::ArrayParserState MessageDecoder::decodeThingGetLastValueCmdDown (CborValue * param, Message * message) {
163
171
ThingGetLastValueCmdDown * setLv = (ThingGetLastValueCmdDown *) message;
164
172
165
- // Message is composed TODO
166
-
173
+ // Message is composed by a single parameter, a variable lenght byte array.
174
+ if (cbor_value_is_byte_string (param)) {
175
+ if (cbor_value_dup_byte_string (param, &setLv->fields .params .last_values , &setLv->fields .params .length , NULL ) != CborNoError) {
176
+ return ArrayParserState::Error;
177
+ }
178
+ }
167
179
168
180
return ArrayParserState::LeaveArray;
169
181
}
170
182
171
- MessageDecoder::ArrayParserState MessageDecoder::decodeOTAAvailableCommand (CborValue * param, Message * message) {
183
+ MessageDecoder::ArrayParserState MessageDecoder::decodeOtaUpdateCmdDown (CborValue * param, Message * message) {
172
184
OtaUpdateCmdDown * ota = (OtaUpdateCmdDown *) message;
173
185
174
186
// Message is composed 4 parameters: id, url, initialSha, finalSha
@@ -217,70 +229,20 @@ MessageDecoder::ArrayParserState MessageDecoder::handle_Param(CborValue * param,
217
229
switch (message->id )
218
230
{
219
231
case CommandID::ThingGetIdCmdDownId:
220
- return MessageDecoder::decodeGetThingIdCommand (param, message);
232
+ return MessageDecoder::decodeThingGetIdCmdDown (param, message);
221
233
222
234
case CommandID::TimezoneCommandDownId:
223
- return MessageDecoder::decodeSetTimezoneCommand (param, message);
235
+ return MessageDecoder::decodeTimezoneCommandDown (param, message);
224
236
225
237
case CommandID::ThingGetLastValueCmdDownId:
226
- return MessageDecoder::decodeSetLastValueCommand (param, message);
238
+ return MessageDecoder::decodeThingGetLastValueCmdDown (param, message);
227
239
228
240
case CommandID::OtaUpdateCmdDownId:
229
- return MessageDecoder::decodeOTAAvailableCommand (param, message);
241
+ return MessageDecoder::decodeOtaUpdateCmdDown (param, message);
230
242
231
243
default :
232
244
return ArrayParserState::MessageNotSupported;
233
245
}
234
246
235
247
return ArrayParserState::LeaveArray;
236
248
}
237
-
238
- MessageDecoder::ArrayParserState MessageDecoder::handle_LeaveArray (CborValue * array_iter) {
239
- return ArrayParserState::Complete;
240
- }
241
-
242
- bool MessageDecoder::ifNumericConvertToDouble (CborValue * value_iter, double * numeric_val) {
243
-
244
- if (cbor_value_is_integer (value_iter)) {
245
- int64_t val = 0 ;
246
- if (cbor_value_get_int64 (value_iter, &val) == CborNoError) {
247
- *numeric_val = static_cast <double >(val);
248
- return true ;
249
- }
250
- } else if (cbor_value_is_double (value_iter)) {
251
- double val = 0.0 ;
252
- if (cbor_value_get_double (value_iter, &val) == CborNoError) {
253
- *numeric_val = val;
254
- return true ;
255
- }
256
- } else if (cbor_value_is_float (value_iter)) {
257
- float val = 0.0 ;
258
- if (cbor_value_get_float (value_iter, &val) == CborNoError) {
259
- *numeric_val = static_cast <double >(val);
260
- return true ;
261
- }
262
- } else if (cbor_value_is_half_float (value_iter)) {
263
- uint16_t val = 0 ;
264
- if (cbor_value_get_half_float (value_iter, &val) == CborNoError) {
265
- *numeric_val = static_cast <double >(convertCborHalfFloatToDouble (val));
266
- return true ;
267
- }
268
- }
269
-
270
- return false ;
271
- }
272
-
273
- /* Source Idea from https://tools.ietf.org/html/rfc7049 : Page: 50 */
274
- double MessageDecoder::convertCborHalfFloatToDouble (uint16_t const half_val) {
275
- int exp = (half_val >> 10 ) & 0x1f ;
276
- int mant = half_val & 0x3ff ;
277
- double val;
278
- if (exp == 0 ) {
279
- val = ldexp (mant, -24 );
280
- } else if (exp != 31 ) {
281
- val = ldexp (mant + 1024 , exp - 25 );
282
- } else {
283
- val = mant == 0 ? INFINITY : NAN;
284
- }
285
- return half_val & 0x8000 ? -val : val;
286
- }
0 commit comments