@@ -49,7 +49,7 @@ bool ModemClass::passthrough(const uint8_t *data, size_t size) {
4949/* -------------------------------------------------------------------------- */
5050 _serial->write (data,size);
5151
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
5353 auto res = buf_read (tmp, data_res);
5454
5555 if (_serial_debug && _debug_level >= 2 ) {
@@ -160,6 +160,7 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
160160 unsigned int sized_read_size = 0 ;
161161 unsigned int sized_read_count = 0 ;
162162 unsigned int result_parse = 0 ;
163+ bool restart = false ;
163164
164165
165166 if (_serial_debug && _debug_level >= 1 ) {
@@ -208,6 +209,7 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
208209 */
209210
210211 if (c == ' +' ) {
212+ commandName += c; // prompt includes also '+'
211213 state = at_parse_state_t ::Cmd;
212214 } else if (c == RESULT_OK[result_parse]) { // FIXME this should also account for following characters
213215 state = at_parse_state_t ::Ok;
@@ -231,9 +233,16 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
231233 */
232234
233235 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?
237246 commandName += c;
238247 }
239248
@@ -318,7 +327,12 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
318327
319328 if (result_parse == strlen (RESULT_OK)) {
320329 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+ }
322336 }
323337 break ;
324338 case at_parse_state_t ::Error:
@@ -332,12 +346,21 @@ ModemClass::ParseResult ModemClass::buf_read(const string &prompt, string &data_
332346
333347 if (result_parse == strlen (RESULT_ERROR)) {
334348 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+ }
336355 }
337356 break ;
338357 case at_parse_state_t ::ParseError:
339358 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+ }
341364 break ;
342365 case at_parse_state_t ::Completed:
343366 break ;
0 commit comments