Hi folks.

A user reported to me having problems while initializing the modem after a while.
The log shows it gets no "OK" after AT&F. I however realized that it might simply not wait long enough. AT&F resets the modem and this might take a while on some old slow phones. Our default timeout of 3 seconds might simply be too slow for those.


I wrote the attached patch to work around this issue and also to retry the first few commands if it failed. This should make initialization more robust. Before I commit it to CVS I however want to have it tested by a couple of modem users with different types of modems to be sure it doesn't screw up something else.


Andreas Fink Fink Consulting GmbH

---------------------------------------------------------------
Tel: +41-61-6666332 Fax: +41-61-6666331  Mobile: +41-79-2457333
Address: Clarastrasse 3, 4058 Basel, Switzerland
E-Mail:  [EMAIL PROTECTED]
Homepage: http://www.finkconsulting.com
---------------------------------------------------------------


--- gw/smsc/smsc_at.c   17 Sep 2004 22:20:50 -0000      1.17
+++ gw/smsc/smsc_at.c   3 Dec 2004 07:38:53 -0000
@@ -417,20 +417,28 @@
     gwthread_sleep(0.10);
 
     /* reset the modem */
-    if (at2_send_modem_command(privdata, "ATZ", 0, 0) == -1)
-        return -1;
+    if (at2_send_modem_command(privdata, "ATZ", 0, 0) == -1) {
+        error(0, "AT2[%s]: modem doesnt like me :(. I'll ignore it for now", 
octstr_get_cstr(privdata->name));
+       }
 
     /* check if the modem responded */
     if (at2_send_modem_command(privdata, "AT", 0, 0) == -1) {
-        error(0, "AT2[%s]: no answer from modem", 
octstr_get_cstr(privdata->name));
-        return -1;
+        error(0, "AT2[%s]: Wrong or no answer from modem. Trying again", 
octstr_get_cstr(privdata->name));
+               if (at2_send_modem_command(privdata, "AT", 0, 0) == -1) {
+               error(0, "AT2[%s]: No luck. get something more reliable", 
octstr_get_cstr(privdata->name));
+               return -1;
+       }
     }
 
     at2_flush_buffer(privdata);
 
-    if (at2_send_modem_command(privdata, "AT&F", 0, 0) == -1)
-        return -1;
-
+       /* AT&F might need a bit a longer timeout as usual */
+    if (at2_send_modem_command(privdata, "AT&F", 7, 0) == -1) {
+               error(0, "AT2[%s]: Modem didnt like my AT&F. Lets give it a 
second try", octstr_get_cstr(privdata->name));
+           if (at2_send_modem_command(privdata, "AT&F", 7, 0) == -1) {
+               return -1;
+       }
+       }
     if (at2_send_modem_command(privdata, "ATE0", 0, 0) == -1)
         return -1;
 
@@ -565,9 +573,21 @@
 }
 
 
+/* at_wait_modem_command waits for the response of a previous
+       sent AT command. The return values are
+           -1: got ERROR
+               0: got OK
+               1: got >
+               2: got SIM PIN
+       the function also handles interceptions like "RING"
+       or incoming SMS and handles them accordingly and transparently
+       timeout is 3 seconds by default
+*/
+
 int at2_wait_modem_command(PrivAT2data *privdata, time_t timeout, int gt_flag, 
                            int *output)
 {
+
     Octstr *line = NULL;
     Octstr *line2 = NULL;
     Octstr *pdu = NULL;

Reply via email to