@@ -49,7 +49,7 @@ bool ModemClass::passthrough(const uint8_t *data, size_t size) {
49
49
/* -------------------------------------------------------------------------- */
50
50
_serial->write (data,size);
51
51
52
- std::string tmp, data_res; // FIXME I don't always have a command prompt provided
52
+ std::string tmp = DO_NOT_CHECK_CMD , data_res; // FIXME I don't always have a command prompt provided
53
53
auto res = buf_read (tmp, data_res);
54
54
55
55
if (_serial_debug && _debug_level >= 2 ) {
@@ -160,6 +160,7 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
160
160
unsigned int sized_read_size = 0 ;
161
161
unsigned int sized_read_count = 0 ;
162
162
unsigned int result_parse = 0 ;
163
+ bool restart = false ;
163
164
164
165
165
166
if (_serial_debug && _debug_level >= 1 ) {
@@ -208,6 +209,7 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
208
209
*/
209
210
210
211
if (c == ' +' ) {
212
+ commandName += c; // prompt includes also '+'
211
213
state = at_parse_state_t ::Cmd;
212
214
} else if (c == RESULT_OK[result_parse]) { // FIXME this should also account for following characters
213
215
state = at_parse_state_t ::Ok;
@@ -231,9 +233,16 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
231
233
*/
232
234
233
235
if (c == ' :' || c == ' =' ) {
234
- // TODO verify command is matching prompt
235
- state = at_parse_state_t ::Data;
236
- } else {
236
+ commandName += c; // prompt includes also ':'
237
+
238
+ if (commandName != DO_NOT_CHECK_CMD && commandName != prompt) {
239
+ // state = at_parse_state_t::Begin; // TODO decide whether to return ParseError or realign
240
+ restart = true ;
241
+ } else {
242
+ state = at_parse_state_t ::Data;
243
+ }
244
+ // state = at_parse_state_t::Data;
245
+ } else if (c != ' ' ) { // FIXME should we keep the space?
237
246
commandName += c;
238
247
}
239
248
@@ -318,7 +327,12 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
318
327
319
328
if (result_parse == strlen (RESULT_OK)) {
320
329
res = Ok;
321
- state = at_parse_state_t ::Completed;
330
+
331
+ if (restart) {
332
+ state = at_parse_state_t ::Begin;
333
+ } else {
334
+ state = at_parse_state_t ::Completed;
335
+ }
322
336
}
323
337
break ;
324
338
case at_parse_state_t ::Error:
@@ -332,12 +346,21 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
332
346
333
347
if (result_parse == strlen (RESULT_ERROR)) {
334
348
res = Error;
335
- state = at_parse_state_t ::Completed;
349
+
350
+ if (restart) {
351
+ state = at_parse_state_t ::Begin;
352
+ } else {
353
+ state = at_parse_state_t ::Completed;
354
+ }
336
355
}
337
356
break ;
338
357
case at_parse_state_t ::ParseError:
339
358
res = ParseError;
340
- state = at_parse_state_t ::Completed;
359
+ if (restart) {
360
+ state = at_parse_state_t ::Begin;
361
+ } else {
362
+ state = at_parse_state_t ::Completed;
363
+ }
341
364
break ;
342
365
case at_parse_state_t ::Completed:
343
366
break ;
0 commit comments