Version of http://mbed.org/cookbook/NetServicesTribute with setting set the same for LPC2368

Dependents:   UDPSocketExample 24LCxx_I2CApp WeatherPlatform_pachube HvZServerLib ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers GPRSModem.cpp Source File

GPRSModem.cpp

00001 
00002 /*
00003 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
00004  
00005 Permission is hereby granted, free of charge, to any person obtaining a copy
00006 of this software and associated documentation files (the "Software"), to deal
00007 in the Software without restriction, including without limitation the rights
00008 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00009 copies of the Software, and to permit persons to whom the Software is
00010 furnished to do so, subject to the following conditions:
00011  
00012 The above copyright notice and this permission notice shall be included in
00013 all copies or substantial portions of the Software.
00014  
00015 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00016 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00017 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00018 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00019 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00020 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00021 THE SOFTWARE.
00022 */
00023 
00024 #include "GPRSModem.h"
00025 #include "mbed.h"
00026 
00027 //#define __DEBUG
00028 #include "dbg/dbg.h"
00029 
00030 #define WAIT_BTW_NETW_POLLS 3.
00031 
00032 #include "netCfg.h"
00033 #if NET_GPRS
00034 
00035 GPRSModem::GPRSModem() : ATIf()
00036 {
00037   DBG("New GPRSModem@%p\n", this);
00038 }
00039 
00040 GPRSModem::~GPRSModem()
00041 {
00042 
00043 }
00044   
00045 GPRSErr GPRSModem::getNetworkState()
00046 {
00047   ATIf::flushBuffer();
00048   /*
00049   netState can be : (Telit_AT_Reference_Guide.pdf p.98)
00050   0 - not registered, ME is not currently searching a new operator to register to
00051   1 - registered, home network
00052   2 - not registered, but ME is currently searching a new operator to register to
00053   3 - registration denied
00054   4 - unknown
00055   5 - registered, roaming
00056   */
00057  // DBG("Network?...\r\n");
00058   ATIf::setReadMode(false); //Discard chars
00059   ATIf::setTimeout(10000);
00060   ATIf::setLineMode(true); //Line mode
00061   int netState = 0;
00062   int len;
00063   len = ATIf::printf("AT+CREG?"); //Registered ?
00064   if(!len) DBG("\r\nprintf - len=%d\r\n",len);
00065   if(!len)
00066     return GPRS_MODEM; //Nothing was actually sent
00067     
00068   len = ATIf::scanf("+CREG: 0,%d", &netState); //Get status
00069   if(len != 1) DBG("\r\nscanf - len=%d\r\n",len);
00070   if(len != 1) //Likely +CMS ERROR was returned
00071     return GPRS_MODEM;
00072 
00073   if( !!ATIf::checkOK() ) //Should not be a problem
00074     {DBG("\r\nNOK\r\n"); return GPRS_MODEM; }
00075     
00076   switch(netState)
00077   {
00078   case 1:
00079   case 5: //TODO: Option allow roaming
00080     DBG("\r\nNetwork is up!\r\n");
00081     return GPRS_OK;
00082   case 3:
00083     DBG("\r\nAccess to network denied.\r\n");
00084     return GPRS_DENIED;
00085   case 0:
00086     DBG("\r\nNo network.\r\n");
00087     return GPRS_NONETWORK;
00088   case 4:
00089   case 2:
00090     //DBG("\r\nRegistering...\r\n");
00091     return GPRS_REGISTERING;
00092   }
00093     
00094   return GPRS_MODEM; // Should not reach this
00095   
00096 }
00097 
00098 GPRSErr GPRSModem::setNetworkUp()
00099 {
00100   ATIf::flushBuffer();
00101   GPRSErr err = GPRS_REGISTERING;
00102   while(true)
00103   {
00104     err = getNetworkState();
00105     if(err != GPRS_REGISTERING)
00106       break;
00107     wait(WAIT_BTW_NETW_POLLS);
00108   }
00109   return err;
00110 }
00111 
00112 //Same, but for GPRS
00113 GPRSErr GPRSModem::getGPRSState()
00114 {
00115   ATIf::flushBuffer();
00116   /*
00117   netState can be : (Telit_AT_Reference_Guide.pdf p.192)
00118   0 - not registered, terminal is not currently searching a new operator to register to
00119   1 - registered, home network
00120   2 - not registered, but terminal is currently searching a new operator to register to
00121   3 - registration denied
00122   4 - unknown
00123   5 - registered, roaming
00124   */
00125   
00126   DBG("GPRS?...\r\n");
00127   ATIf::setReadMode(false); //Discard chars
00128   ATIf::setTimeout(10000);
00129   ATIf::setLineMode(true); //Line mode
00130   int netState = 0;
00131   int len;
00132   len = ATIf::printf("AT+CGREG?"); //Registered ?
00133   if(!len)
00134     return GPRS_MODEM; //Nothing was actually sent
00135     
00136   len = ATIf::scanf("+CGREG: %*d,%d", &netState); //Get GPRS status, see GSM 07.07 spec as Telit AT ref is wrong
00137   if(len != 1) DBG("\r\nscanf - len=%d\r\n",len);
00138   if(len != 1) //Likely +CMS ERROR was returned
00139     return GPRS_MODEM;
00140 
00141   if( !!ATIf::checkOK() ) //Should not be a problem
00142     return GPRS_MODEM;
00143     
00144   switch(netState)
00145   {
00146   case 1:
00147   case 5: //TODO: Option allow roaming
00148     DBG("\r\nNetwork is up!\r\n");
00149     return GPRS_OK;
00150   case 3:
00151     DBG("\r\nAccess to network denied.\r\n");
00152     return GPRS_DENIED;
00153   case 0:
00154     DBG("\r\nNo network.\r\n");
00155     return GPRS_NONETWORK;
00156   case 4:
00157   case 2:
00158     DBG("\r\nRegistering...\r\n");
00159     return GPRS_REGISTERING;
00160   }
00161     
00162   return GPRS_MODEM; // Should not reach this
00163   
00164 }
00165 
00166 GPRSErr GPRSModem::setGPRSUp()
00167 {
00168   ATIf::flushBuffer();
00169   GPRSErr err;
00170   
00171   err = setNetworkUp();
00172   if(err)
00173     return err;
00174   
00175   DBG("\r\nAttaching GPRS...\r\n");
00176   ATIf::setReadMode(false); //Discard chars
00177   ATIf::setTimeout(10000);
00178   ATIf::setLineMode(true); //Line mode
00179   int len;  
00180   
00181   err = getGPRSState();
00182   if(err == GPRS_NONETWORK)
00183   {  
00184     len = ATIf::printf("AT+CGATT=1"); //Attach
00185     if(!len)
00186       return GPRS_MODEM; //Nothing was actually sent  
00187 
00188     if( !!ATIf::checkOK() ) //Should not be a problem
00189       return GPRS_MODEM;
00190   }
00191   
00192   while(true)
00193   {
00194     err = getGPRSState();
00195     if(err != GPRS_REGISTERING)
00196       break;
00197     wait(WAIT_BTW_NETW_POLLS);
00198   }
00199   return err;
00200 }
00201 
00202 GPRSErr GPRSModem::setGPRSDown()
00203 { 
00204   ATIf::flushBuffer();
00205   DBG("\r\nDetaching GPRS...\r\n");
00206   ATIf::setReadMode(false); //Discard chars
00207   ATIf::setTimeout(10000);
00208   ATIf::setLineMode(true); //Line mode
00209   int len;
00210   
00211   len = ATIf::printf("AT+CGATT=0"); //Detach
00212   if(!len)
00213     return GPRS_MODEM; //Nothing was actually sent  
00214 
00215   if( !!ATIf::checkOK() ) //Should not be a problem
00216     return GPRS_MODEM;
00217  
00218   return GPRS_OK;
00219 }
00220 
00221   
00222 GPRSErr GPRSModem::connect(const char* apn /*=NULL*/)
00223 {
00224   ATIf::flushBuffer();
00225   GPRSErr err;
00226     
00227   ATIf::setReadMode(false); //Discard chars
00228   ATIf::setTimeout(5000);
00229   ATIf::setLineMode(true); //Line mode
00230   
00231   DBG("\r\nConnecting...\r\n");  
00232   
00233   int len;
00234   
00235   if( apn != NULL ) //Config APN
00236   {
00237     len = ATIf::printf("AT+CGDCONT=1,\"IP\",\"%s\"",apn); //Define APN
00238     if(!len)
00239       return GPRS_MODEM; //Nothing was actually sent
00240 
00241     if( !!ATIf::checkOK() ) //Should not be a problem
00242       return GPRS_MODEM;
00243   }
00244     
00245   err = setGPRSUp();
00246   if(err)
00247     return err;
00248     
00249   ATIf::setReadMode(false); //Discard chars
00250   ATIf::setTimeout(60000);
00251   ATIf::setLineMode(true); //Line mode
00252   //
00253   //len = ATIf::printf("AT+CGDATA=\"PPP\",1"); //Connect using PDP context #1
00254 //  len = ATIf::printf("ATDT *99***1#");
00255   len = ATIf::printf("ATDT *99#");
00256   if(!len)
00257     return GPRS_MODEM; //Nothing was actually sent
00258     
00259   len = ATIf::scanf("CONNECT"); //Beginning of session
00260   if(len != 0) //Likely +CME ERROR was returned or NO CARRIER
00261     return GPRS_MODEM;
00262     
00263   //ATIf::setSignals(false);
00264   
00265   DBG("\r\nConnected.\r\n");
00266     
00267   return GPRS_OK; //Time to enter a PPP Session !   
00268   
00269 }
00270 
00271 GPRSErr GPRSModem::disconnect()
00272 {
00273   ATIf::flushBuffer();
00274   ATIf::setReadMode(false); //Discard chars
00275   ATIf::setTimeout(5000);
00276   ATIf::setLineMode(true); //Line mode
00277   
00278   if( !!ATIf::checkOK() ) //Should be present at the end of connection
00279     return GPRS_MODEM;
00280   
00281   GPRSErr err;  
00282   err = setGPRSDown();
00283   if(err)
00284     return err;
00285     
00286   DBG("\r\nDisconnected.\r\n");
00287     
00288   return GPRS_OK;
00289 }
00290 
00291 #endif
00292