Lorcan Smith
/
Enet_SPI
SNMP agent attached to SPI slave
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Tue Jul 12 2022 19:17:29 by 1.7.2