Be more lenient for PDU lines
authorDenis Kenzior <denkenz@gmail.com>
Thu, 6 Aug 2009 22:05:52 +0000 (17:05 -0500)
committerDenis Kenzior <denkenz@gmail.com>
Thu, 6 Aug 2009 22:05:52 +0000 (17:05 -0500)
gatchat/gatsyntax.c

index 7c5aadc..890d01d 100644 (file)
@@ -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;