summaryrefslogtreecommitdiffstats
path: root/gatchat/gatsyntax.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2009-08-06 17:05:52 -0500
committerDenis Kenzior <denkenz@gmail.com>2009-08-06 17:05:52 -0500
commitd2c106b4db1ebece4df63268fd73a8ab789cb58a (patch)
tree9d5d9fd38d447275c550f9c1eaf42c73d9fb9567 /gatchat/gatsyntax.c
parente3466d9b9270bd398bd22006f4d2006875f2ec32 (diff)
downloadofono-d2c106b4db1ebece4df63268fd73a8ab789cb58a.tar.bz2
Be more lenient for PDU lines
Diffstat (limited to 'gatchat/gatsyntax.c')
-rw-r--r--gatchat/gatsyntax.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/gatchat/gatsyntax.c b/gatchat/gatsyntax.c
index 7c5aadce..890d01d5 100644
--- a/gatchat/gatsyntax.c
+++ b/gatchat/gatsyntax.c
@@ -36,6 +36,8 @@ enum GSMV1_STATE_ {
GSMV1_STATE_GUESS_MULTILINE_RESPONSE,
GSMV1_STATE_MULTILINE_RESPONSE,
GSMV1_STATE_MULTILINE_TERMINATOR_CR,
+ GSMV1_STATE_PDU_CHECK_EXTRA_CR,
+ GSMV1_STATE_PDU_CHECK_EXTRA_LF,
GSMV1_STATE_PDU,
GSMV1_STATE_PDU_CR,
GSMV1_STATE_PROMPT,
@@ -47,7 +49,7 @@ static void gsmv1_hint(GAtSyntax *syntax, GAtSyntaxExpectHint hint)
{
switch (hint) {
case G_AT_SYNTAX_EXPECT_PDU:
- syntax->state = GSMV1_STATE_PDU;
+ syntax->state = GSMV1_STATE_PDU_CHECK_EXTRA_CR;
break;
case G_AT_SYNTAX_EXPECT_MULTILINE:
syntax->state = GSMV1_STATE_GUESS_MULTILINE_RESPONSE;
@@ -129,6 +131,27 @@ static GAtSyntaxResult gsmv1_feed(GAtSyntax *syntax,
goto out;
+ /* Some 27.007 compliant modems still get this wrong. They
+ * insert an extra CRLF between the command and he PDU,
+ * in effect making them two separate lines. We try to
+ * handle this case gracefully
+ */
+ case GSMV1_STATE_PDU_CHECK_EXTRA_CR:
+ if (byte == '\r')
+ syntax->state = GSMV1_STATE_PDU_CHECK_EXTRA_LF;
+ else
+ syntax->state = GSMV1_STATE_PDU;
+ break;
+
+ case GSMV1_STATE_PDU_CHECK_EXTRA_LF:
+ res = G_AT_SYNTAX_RESULT_UNRECOGNIZED;
+ syntax->state = GSMV1_STATE_PDU;
+
+ if (byte == '\n')
+ i += 1;
+
+ goto out;
+
case GSMV1_STATE_PDU:
if (byte == '\r')
syntax->state = GSMV1_STATE_PDU_CR;