Hi Denis,

I managed to handle the garbage adding a new syntax which is the copy/paste
of gsm_permissive plus a new state.
Here is how the new feed looks:

static GAtSyntaxResult gsm_telit_feed(GAtSyntax *syntax,  const char
*bytes, gsize *len)
{
gsize i = 0;
GAtSyntaxResult res = G_AT_SYNTAX_RESULT_UNSURE;

while (i < *len) {
char byte = bytes[i];

switch (syntax->state) {
case GSM_TELIT_STATE_IDLE:
if (byte == '\r' || byte == '\n')
/* ignore */;
else if (byte == '>')
syntax->state = GSM_TELIT_STATE_PROMPT;
else if (byte == '~')
syntax->state = GSM_TELIT_STATE_GARBAGE;
else if (byte == '"')
syntax->state = GSM_TELIT_STATE_RESPONSE_STRING;
else
syntax->state = GSM_TELIT_STATE_RESPONSE;
break;

case GSM_TELIT_STATE_RESPONSE:
if (byte == '\r') {
syntax->state = GSM_TELIT_STATE_IDLE;

i += 1;
res = G_AT_SYNTAX_RESULT_LINE;
goto out;
} else if (byte == '"')
syntax->state =
GSM_TELIT_STATE_RESPONSE_STRING;
break;

case GSM_TELIT_STATE_RESPONSE_STRING:
if (byte == '"')
syntax->state = GSM_TELIT_STATE_RESPONSE;
break;

case GSM_TELIT_STATE_GUESS_PDU:
if (byte != '\r' && byte != '\n')
syntax->state = GSM_TELIT_STATE_PDU;
break;

case GSM_TELIT_STATE_PDU:
if (byte == '\r') {
syntax->state = GSM_TELIT_STATE_IDLE;

i += 1;
res = G_AT_SYNTAX_RESULT_PDU;
goto out;
}
break;

case GSM_TELIT_STATE_PROMPT:
if (byte == ' ') {
syntax->state = GSM_TELIT_STATE_IDLE;
i += 1;
res = G_AT_SYNTAX_RESULT_PROMPT;
goto out;
}

syntax->state = GSM_TELIT_STATE_RESPONSE;
return G_AT_SYNTAX_RESULT_UNSURE;

case GSM_TELIT_STATE_GUESS_SHORT_PROMPT:
if (byte == '\n')
/* ignore */;
else if (byte == '\r')
syntax->state = GSM_TELIT_STATE_SHORT_PROMPT;
else
syntax->state = GSM_TELIT_STATE_RESPONSE;
break;

case GSM_TELIT_STATE_SHORT_PROMPT:
if (byte == '\n') {
syntax->state = GSM_TELIT_STATE_IDLE;
i += 1;
res = G_AT_SYNTAX_RESULT_PROMPT;
goto out;
}

syntax->state = GSM_TELIT_STATE_RESPONSE;
return G_AT_SYNTAX_RESULT_UNSURE;


case GSM_TELIT_STATE_GARBAGE:
if (byte == '~')
syntax->state = GSM_TELIT_STATE_RESPONSE;
break;

default:
break;
};

i += 1;
}

out:
*len = i;
return res;
}

Enrico
_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to