AT driver patch

Andreas Fink <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
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
---------------------------------------------------------------
patch-at.c (text/plain, 2 KB)
--- 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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.