Integrating the ublox LISA C200 modem

Fork of SprintUSBModemHTTPClientTest by Donatien Garnier

Committer:
sam_grove
Date:
Thu Sep 26 00:44:20 2013 -0500
Revision:
5:3f93dd1d4cb3
Child:
7:655438fd019f
Exported program and replaced contents of the repo with the source
to build and debug using keil mdk. Libs NOT upto date are lwip, lwip-sys
and socket. these have newer versions under mbed_official but were starting
from a know working point

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 5:3f93dd1d4cb3 1 /* SprintUSBModem.cpp */
sam_grove 5:3f93dd1d4cb3 2 /* Copyright (C) 2012 mbed.org, MIT License
sam_grove 5:3f93dd1d4cb3 3 *
sam_grove 5:3f93dd1d4cb3 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sam_grove 5:3f93dd1d4cb3 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
sam_grove 5:3f93dd1d4cb3 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
sam_grove 5:3f93dd1d4cb3 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
sam_grove 5:3f93dd1d4cb3 8 * furnished to do so, subject to the following conditions:
sam_grove 5:3f93dd1d4cb3 9 *
sam_grove 5:3f93dd1d4cb3 10 * The above copyright notice and this permission notice shall be included in all copies or
sam_grove 5:3f93dd1d4cb3 11 * substantial portions of the Software.
sam_grove 5:3f93dd1d4cb3 12 *
sam_grove 5:3f93dd1d4cb3 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sam_grove 5:3f93dd1d4cb3 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sam_grove 5:3f93dd1d4cb3 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sam_grove 5:3f93dd1d4cb3 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sam_grove 5:3f93dd1d4cb3 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sam_grove 5:3f93dd1d4cb3 18 */
sam_grove 5:3f93dd1d4cb3 19
sam_grove 5:3f93dd1d4cb3 20 #define __DEBUG__ 3
sam_grove 5:3f93dd1d4cb3 21 #ifndef __MODULE__
sam_grove 5:3f93dd1d4cb3 22 #define __MODULE__ "SprintUSBModem.cpp"
sam_grove 5:3f93dd1d4cb3 23 #endif
sam_grove 5:3f93dd1d4cb3 24
sam_grove 5:3f93dd1d4cb3 25 #include "core/fwk.h"
sam_grove 5:3f93dd1d4cb3 26
sam_grove 5:3f93dd1d4cb3 27 #include "SprintUSBModem.h"
sam_grove 5:3f93dd1d4cb3 28
sam_grove 5:3f93dd1d4cb3 29 #define USE_ONE_PORT 1
sam_grove 5:3f93dd1d4cb3 30
sam_grove 5:3f93dd1d4cb3 31 SprintUSBModem::SprintUSBModem(PinName powerGatingPin /*= NC*/, bool powerGatingOnWhenPinHigh /* = true*/) : m_dongle(),
sam_grove 5:3f93dd1d4cb3 32 m_stream(m_dongle.getSerial(0)),
sam_grove 5:3f93dd1d4cb3 33 m_at(&m_stream),
sam_grove 5:3f93dd1d4cb3 34 m_sms(&m_at), m_ppp(&m_stream),
sam_grove 5:3f93dd1d4cb3 35 m_dongleConnected(false), m_ipInit(false), m_smsInit(false), m_atOpen(false),
sam_grove 5:3f93dd1d4cb3 36 m_powerGatingPin(powerGatingPin), m_powerGatingOnWhenPinHigh(powerGatingOnWhenPinHigh)
sam_grove 5:3f93dd1d4cb3 37 {
sam_grove 5:3f93dd1d4cb3 38 if( m_powerGatingPin != NC )
sam_grove 5:3f93dd1d4cb3 39 {
sam_grove 5:3f93dd1d4cb3 40 power(false); //Dongle will have to be powered on manually
sam_grove 5:3f93dd1d4cb3 41 }
sam_grove 5:3f93dd1d4cb3 42 }
sam_grove 5:3f93dd1d4cb3 43
sam_grove 5:3f93dd1d4cb3 44 class CSSProcessor : public IATCommandsProcessor
sam_grove 5:3f93dd1d4cb3 45 {
sam_grove 5:3f93dd1d4cb3 46 public:
sam_grove 5:3f93dd1d4cb3 47 CSSProcessor() : status(STATUS_REGISTERING)
sam_grove 5:3f93dd1d4cb3 48 {
sam_grove 5:3f93dd1d4cb3 49
sam_grove 5:3f93dd1d4cb3 50 }
sam_grove 5:3f93dd1d4cb3 51 enum REGISTERING_STATUS { STATUS_REGISTERING, STATUS_OK };
sam_grove 5:3f93dd1d4cb3 52 REGISTERING_STATUS getStatus()
sam_grove 5:3f93dd1d4cb3 53 {
sam_grove 5:3f93dd1d4cb3 54 return status;
sam_grove 5:3f93dd1d4cb3 55 }
sam_grove 5:3f93dd1d4cb3 56 private:
sam_grove 5:3f93dd1d4cb3 57 virtual int onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
sam_grove 5:3f93dd1d4cb3 58 {
sam_grove 5:3f93dd1d4cb3 59 char r;
sam_grove 5:3f93dd1d4cb3 60 if( sscanf(line, "%*d, %c", &r) == 1 )
sam_grove 5:3f93dd1d4cb3 61 {
sam_grove 5:3f93dd1d4cb3 62 switch(r)
sam_grove 5:3f93dd1d4cb3 63 {
sam_grove 5:3f93dd1d4cb3 64 case 'Z':
sam_grove 5:3f93dd1d4cb3 65 status = STATUS_REGISTERING;
sam_grove 5:3f93dd1d4cb3 66 break;
sam_grove 5:3f93dd1d4cb3 67 default:
sam_grove 5:3f93dd1d4cb3 68 status = STATUS_OK;
sam_grove 5:3f93dd1d4cb3 69 break;
sam_grove 5:3f93dd1d4cb3 70 }
sam_grove 5:3f93dd1d4cb3 71 }
sam_grove 5:3f93dd1d4cb3 72 return OK;
sam_grove 5:3f93dd1d4cb3 73 }
sam_grove 5:3f93dd1d4cb3 74 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
sam_grove 5:3f93dd1d4cb3 75 {
sam_grove 5:3f93dd1d4cb3 76 return OK;
sam_grove 5:3f93dd1d4cb3 77 }
sam_grove 5:3f93dd1d4cb3 78 volatile REGISTERING_STATUS status;
sam_grove 5:3f93dd1d4cb3 79 };
sam_grove 5:3f93dd1d4cb3 80
sam_grove 5:3f93dd1d4cb3 81 int SprintUSBModem::connect(const char* apn, const char* user, const char* password)
sam_grove 5:3f93dd1d4cb3 82 {
sam_grove 5:3f93dd1d4cb3 83 if( !m_ipInit )
sam_grove 5:3f93dd1d4cb3 84 {
sam_grove 5:3f93dd1d4cb3 85 m_ipInit = true;
sam_grove 5:3f93dd1d4cb3 86 m_ppp.init();
sam_grove 5:3f93dd1d4cb3 87 }
sam_grove 5:3f93dd1d4cb3 88 m_ppp.setup(user, password);
sam_grove 5:3f93dd1d4cb3 89
sam_grove 5:3f93dd1d4cb3 90 int ret = init();
sam_grove 5:3f93dd1d4cb3 91 if(ret)
sam_grove 5:3f93dd1d4cb3 92 {
sam_grove 5:3f93dd1d4cb3 93 return ret;
sam_grove 5:3f93dd1d4cb3 94 }
sam_grove 5:3f93dd1d4cb3 95
sam_grove 5:3f93dd1d4cb3 96 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 97 m_smsInit = false; //SMS status reset
sam_grove 5:3f93dd1d4cb3 98 //m_ussdInit = false; //USSD status reset
sam_grove 5:3f93dd1d4cb3 99 //m_linkMonitorInit = false; //Link monitor status reset
sam_grove 5:3f93dd1d4cb3 100 #endif
sam_grove 5:3f93dd1d4cb3 101
sam_grove 5:3f93dd1d4cb3 102 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 103
sam_grove 5:3f93dd1d4cb3 104 if(apn != NULL)
sam_grove 5:3f93dd1d4cb3 105 {
sam_grove 5:3f93dd1d4cb3 106 char cmd[48];
sam_grove 5:3f93dd1d4cb3 107 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", apn);
sam_grove 5:3f93dd1d4cb3 108 ret = m_at.executeSimple(cmd, &result);
sam_grove 5:3f93dd1d4cb3 109 DBG("Result of command: Err code=%d", ret);
sam_grove 5:3f93dd1d4cb3 110 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 111 DBG("APN set to %s", apn);
sam_grove 5:3f93dd1d4cb3 112 }
sam_grove 5:3f93dd1d4cb3 113
sam_grove 5:3f93dd1d4cb3 114
sam_grove 5:3f93dd1d4cb3 115 //Connect
sam_grove 5:3f93dd1d4cb3 116 DBG("Connecting");
sam_grove 5:3f93dd1d4cb3 117 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 118 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 119 m_atOpen = false; //Will need to be reinitialized afterwards
sam_grove 5:3f93dd1d4cb3 120 #endif
sam_grove 5:3f93dd1d4cb3 121
sam_grove 5:3f93dd1d4cb3 122 DBG("Connecting PPP");
sam_grove 5:3f93dd1d4cb3 123
sam_grove 5:3f93dd1d4cb3 124 ret = m_ppp.connect();
sam_grove 5:3f93dd1d4cb3 125 DBG("Result of connect: Err code=%d", ret);
sam_grove 5:3f93dd1d4cb3 126 return ret;
sam_grove 5:3f93dd1d4cb3 127 }
sam_grove 5:3f93dd1d4cb3 128
sam_grove 5:3f93dd1d4cb3 129
sam_grove 5:3f93dd1d4cb3 130 int SprintUSBModem::disconnect()
sam_grove 5:3f93dd1d4cb3 131 {
sam_grove 5:3f93dd1d4cb3 132 DBG("Disconnecting from PPP");
sam_grove 5:3f93dd1d4cb3 133 int ret = m_ppp.disconnect();
sam_grove 5:3f93dd1d4cb3 134 if(ret)
sam_grove 5:3f93dd1d4cb3 135 {
sam_grove 5:3f93dd1d4cb3 136 ERR("Disconnect returned %d, still trying to disconnect", ret);
sam_grove 5:3f93dd1d4cb3 137 }
sam_grove 5:3f93dd1d4cb3 138
sam_grove 5:3f93dd1d4cb3 139 //Ugly but leave dongle time to recover
sam_grove 5:3f93dd1d4cb3 140 Thread::wait(500);
sam_grove 5:3f93dd1d4cb3 141
sam_grove 5:3f93dd1d4cb3 142 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 143 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 144 DBG("Starting AT thread");
sam_grove 5:3f93dd1d4cb3 145 ret = m_at.open();
sam_grove 5:3f93dd1d4cb3 146 if(ret)
sam_grove 5:3f93dd1d4cb3 147 {
sam_grove 5:3f93dd1d4cb3 148 return ret;
sam_grove 5:3f93dd1d4cb3 149 }
sam_grove 5:3f93dd1d4cb3 150 #endif
sam_grove 5:3f93dd1d4cb3 151
sam_grove 5:3f93dd1d4cb3 152 DBG("Trying to hangup");
sam_grove 5:3f93dd1d4cb3 153
sam_grove 5:3f93dd1d4cb3 154 #if 0 //Does not appear to work
sam_grove 5:3f93dd1d4cb3 155 int tries = 10;
sam_grove 5:3f93dd1d4cb3 156 do
sam_grove 5:3f93dd1d4cb3 157 {
sam_grove 5:3f93dd1d4cb3 158 ret = m_at.executeSimple("+++", &result, 1000);
sam_grove 5:3f93dd1d4cb3 159 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 160 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 161 } while(tries-- && ret);
sam_grove 5:3f93dd1d4cb3 162 if(!ret)
sam_grove 5:3f93dd1d4cb3 163 {
sam_grove 5:3f93dd1d4cb3 164 ret = m_at.executeSimple("ATH", &result);
sam_grove 5:3f93dd1d4cb3 165 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 166 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 167 }
sam_grove 5:3f93dd1d4cb3 168 #endif
sam_grove 5:3f93dd1d4cb3 169
sam_grove 5:3f93dd1d4cb3 170 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 171 //Reinit AT parser
sam_grove 5:3f93dd1d4cb3 172 ret = m_at.init();
sam_grove 5:3f93dd1d4cb3 173 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 174 if(ret)
sam_grove 5:3f93dd1d4cb3 175 {
sam_grove 5:3f93dd1d4cb3 176 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 177 DBG("AT Parser closed, could not complete disconnection");
sam_grove 5:3f93dd1d4cb3 178 return NET_TIMEOUT;
sam_grove 5:3f93dd1d4cb3 179 }
sam_grove 5:3f93dd1d4cb3 180
sam_grove 5:3f93dd1d4cb3 181 #if 0
sam_grove 5:3f93dd1d4cb3 182 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 183 DBG("AT Parser closed");
sam_grove 5:3f93dd1d4cb3 184 #endif
sam_grove 5:3f93dd1d4cb3 185 #endif
sam_grove 5:3f93dd1d4cb3 186 return OK;
sam_grove 5:3f93dd1d4cb3 187 }
sam_grove 5:3f93dd1d4cb3 188
sam_grove 5:3f93dd1d4cb3 189 int SprintUSBModem::sendSM(const char* number, const char* message)
sam_grove 5:3f93dd1d4cb3 190 {
sam_grove 5:3f93dd1d4cb3 191 int ret = init();
sam_grove 5:3f93dd1d4cb3 192 if(ret)
sam_grove 5:3f93dd1d4cb3 193 {
sam_grove 5:3f93dd1d4cb3 194 return ret;
sam_grove 5:3f93dd1d4cb3 195 }
sam_grove 5:3f93dd1d4cb3 196
sam_grove 5:3f93dd1d4cb3 197 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 198 {
sam_grove 5:3f93dd1d4cb3 199 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 200 if(ret)
sam_grove 5:3f93dd1d4cb3 201 {
sam_grove 5:3f93dd1d4cb3 202 return ret;
sam_grove 5:3f93dd1d4cb3 203 }
sam_grove 5:3f93dd1d4cb3 204 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 205 }
sam_grove 5:3f93dd1d4cb3 206
sam_grove 5:3f93dd1d4cb3 207 ret = m_sms.send(number, message);
sam_grove 5:3f93dd1d4cb3 208 if(ret)
sam_grove 5:3f93dd1d4cb3 209 {
sam_grove 5:3f93dd1d4cb3 210 return ret;
sam_grove 5:3f93dd1d4cb3 211 }
sam_grove 5:3f93dd1d4cb3 212
sam_grove 5:3f93dd1d4cb3 213 return OK;
sam_grove 5:3f93dd1d4cb3 214 }
sam_grove 5:3f93dd1d4cb3 215
sam_grove 5:3f93dd1d4cb3 216 int SprintUSBModem::getSM(char* number, char* message, size_t maxLength)
sam_grove 5:3f93dd1d4cb3 217 {
sam_grove 5:3f93dd1d4cb3 218 int ret = init();
sam_grove 5:3f93dd1d4cb3 219 if(ret)
sam_grove 5:3f93dd1d4cb3 220 {
sam_grove 5:3f93dd1d4cb3 221 return ret;
sam_grove 5:3f93dd1d4cb3 222 }
sam_grove 5:3f93dd1d4cb3 223
sam_grove 5:3f93dd1d4cb3 224 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 225 {
sam_grove 5:3f93dd1d4cb3 226 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 227 if(ret)
sam_grove 5:3f93dd1d4cb3 228 {
sam_grove 5:3f93dd1d4cb3 229 return ret;
sam_grove 5:3f93dd1d4cb3 230 }
sam_grove 5:3f93dd1d4cb3 231 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 232 }
sam_grove 5:3f93dd1d4cb3 233
sam_grove 5:3f93dd1d4cb3 234 ret = m_sms.get(number, message, maxLength);
sam_grove 5:3f93dd1d4cb3 235 if(ret)
sam_grove 5:3f93dd1d4cb3 236 {
sam_grove 5:3f93dd1d4cb3 237 return ret;
sam_grove 5:3f93dd1d4cb3 238 }
sam_grove 5:3f93dd1d4cb3 239
sam_grove 5:3f93dd1d4cb3 240 return OK;
sam_grove 5:3f93dd1d4cb3 241 }
sam_grove 5:3f93dd1d4cb3 242
sam_grove 5:3f93dd1d4cb3 243 int SprintUSBModem::getSMCount(size_t* pCount)
sam_grove 5:3f93dd1d4cb3 244 {
sam_grove 5:3f93dd1d4cb3 245 int ret = init();
sam_grove 5:3f93dd1d4cb3 246 if(ret)
sam_grove 5:3f93dd1d4cb3 247 {
sam_grove 5:3f93dd1d4cb3 248 return ret;
sam_grove 5:3f93dd1d4cb3 249 }
sam_grove 5:3f93dd1d4cb3 250
sam_grove 5:3f93dd1d4cb3 251 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 252 {
sam_grove 5:3f93dd1d4cb3 253 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 254 if(ret)
sam_grove 5:3f93dd1d4cb3 255 {
sam_grove 5:3f93dd1d4cb3 256 return ret;
sam_grove 5:3f93dd1d4cb3 257 }
sam_grove 5:3f93dd1d4cb3 258 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 259 }
sam_grove 5:3f93dd1d4cb3 260
sam_grove 5:3f93dd1d4cb3 261 ret = m_sms.getCount(pCount);
sam_grove 5:3f93dd1d4cb3 262 if(ret)
sam_grove 5:3f93dd1d4cb3 263 {
sam_grove 5:3f93dd1d4cb3 264 return ret;
sam_grove 5:3f93dd1d4cb3 265 }
sam_grove 5:3f93dd1d4cb3 266
sam_grove 5:3f93dd1d4cb3 267 return OK;
sam_grove 5:3f93dd1d4cb3 268 }
sam_grove 5:3f93dd1d4cb3 269
sam_grove 5:3f93dd1d4cb3 270 ATCommandsInterface* SprintUSBModem::getATCommandsInterface()
sam_grove 5:3f93dd1d4cb3 271 {
sam_grove 5:3f93dd1d4cb3 272 return &m_at;
sam_grove 5:3f93dd1d4cb3 273 }
sam_grove 5:3f93dd1d4cb3 274
sam_grove 5:3f93dd1d4cb3 275 int SprintUSBModem::power(bool enable)
sam_grove 5:3f93dd1d4cb3 276 {
sam_grove 5:3f93dd1d4cb3 277 if( m_powerGatingPin == NC )
sam_grove 5:3f93dd1d4cb3 278 {
sam_grove 5:3f93dd1d4cb3 279 return NET_INVALID; //A pin name has not been provided in the constructor
sam_grove 5:3f93dd1d4cb3 280 }
sam_grove 5:3f93dd1d4cb3 281
sam_grove 5:3f93dd1d4cb3 282 if(!enable) //Will force components to re-init
sam_grove 5:3f93dd1d4cb3 283 {
sam_grove 5:3f93dd1d4cb3 284 cleanup();
sam_grove 5:3f93dd1d4cb3 285 }
sam_grove 5:3f93dd1d4cb3 286
sam_grove 5:3f93dd1d4cb3 287 DigitalOut powerGatingOut(m_powerGatingPin);
sam_grove 5:3f93dd1d4cb3 288 powerGatingOut = m_powerGatingOnWhenPinHigh?enable:!enable;
sam_grove 5:3f93dd1d4cb3 289
sam_grove 5:3f93dd1d4cb3 290 return OK;
sam_grove 5:3f93dd1d4cb3 291 }
sam_grove 5:3f93dd1d4cb3 292
sam_grove 5:3f93dd1d4cb3 293 bool SprintUSBModem::power()
sam_grove 5:3f93dd1d4cb3 294 {
sam_grove 5:3f93dd1d4cb3 295 if( m_powerGatingPin == NC )
sam_grove 5:3f93dd1d4cb3 296 {
sam_grove 5:3f93dd1d4cb3 297 return true; //Assume power is always on
sam_grove 5:3f93dd1d4cb3 298 }
sam_grove 5:3f93dd1d4cb3 299
sam_grove 5:3f93dd1d4cb3 300 DigitalOut powerGatingOut(m_powerGatingPin);
sam_grove 5:3f93dd1d4cb3 301 return m_powerGatingOnWhenPinHigh?powerGatingOut:!powerGatingOut;
sam_grove 5:3f93dd1d4cb3 302 }
sam_grove 5:3f93dd1d4cb3 303
sam_grove 5:3f93dd1d4cb3 304 int SprintUSBModem::init()
sam_grove 5:3f93dd1d4cb3 305 {
sam_grove 5:3f93dd1d4cb3 306 if( !m_dongleConnected )
sam_grove 5:3f93dd1d4cb3 307 {
sam_grove 5:3f93dd1d4cb3 308 if(!power())
sam_grove 5:3f93dd1d4cb3 309 {
sam_grove 5:3f93dd1d4cb3 310 //Obviously cannot initialize the dongle if it is disconnected...
sam_grove 5:3f93dd1d4cb3 311 ERR("Power is off");
sam_grove 5:3f93dd1d4cb3 312 return NET_INVALID;
sam_grove 5:3f93dd1d4cb3 313 }
sam_grove 5:3f93dd1d4cb3 314 m_dongleConnected = true;
sam_grove 5:3f93dd1d4cb3 315 while( !m_dongle.connected() )
sam_grove 5:3f93dd1d4cb3 316 {
sam_grove 5:3f93dd1d4cb3 317 m_dongle.tryConnect();
sam_grove 5:3f93dd1d4cb3 318 Thread::wait(100);
sam_grove 5:3f93dd1d4cb3 319 }
sam_grove 5:3f93dd1d4cb3 320 }
sam_grove 5:3f93dd1d4cb3 321
sam_grove 5:3f93dd1d4cb3 322 if(m_atOpen)
sam_grove 5:3f93dd1d4cb3 323 {
sam_grove 5:3f93dd1d4cb3 324 return OK;
sam_grove 5:3f93dd1d4cb3 325 }
sam_grove 5:3f93dd1d4cb3 326
sam_grove 5:3f93dd1d4cb3 327 DBG("Starting AT thread if needed");
sam_grove 5:3f93dd1d4cb3 328 int ret = m_at.open();
sam_grove 5:3f93dd1d4cb3 329 if(ret)
sam_grove 5:3f93dd1d4cb3 330 {
sam_grove 5:3f93dd1d4cb3 331 return ret;
sam_grove 5:3f93dd1d4cb3 332 }
sam_grove 5:3f93dd1d4cb3 333
sam_grove 5:3f93dd1d4cb3 334 DBG("Sending initialisation commands");
sam_grove 5:3f93dd1d4cb3 335 ret = m_at.init();
sam_grove 5:3f93dd1d4cb3 336 if(ret)
sam_grove 5:3f93dd1d4cb3 337 {
sam_grove 5:3f93dd1d4cb3 338 return ret;
sam_grove 5:3f93dd1d4cb3 339 }
sam_grove 5:3f93dd1d4cb3 340
sam_grove 5:3f93dd1d4cb3 341 if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINT598U)
sam_grove 5:3f93dd1d4cb3 342 {
sam_grove 5:3f93dd1d4cb3 343 INFO("Using a Sprint 598U Dongle");
sam_grove 5:3f93dd1d4cb3 344 }
sam_grove 5:3f93dd1d4cb3 345 else if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINTMC5728V)
sam_grove 5:3f93dd1d4cb3 346 {
sam_grove 5:3f93dd1d4cb3 347 INFO("Using a Sprint MC5728V Dongle");
sam_grove 5:3f93dd1d4cb3 348 }
sam_grove 5:3f93dd1d4cb3 349 else if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_UBLOXC200)
sam_grove 5:3f93dd1d4cb3 350 {
sam_grove 5:3f93dd1d4cb3 351 INFO("Using a UBLOX C200 Dongle");
sam_grove 5:3f93dd1d4cb3 352 }
sam_grove 5:3f93dd1d4cb3 353 else
sam_grove 5:3f93dd1d4cb3 354 {
sam_grove 5:3f93dd1d4cb3 355 WARN("Using an Unknown Dongle");
sam_grove 5:3f93dd1d4cb3 356 }
sam_grove 5:3f93dd1d4cb3 357
sam_grove 5:3f93dd1d4cb3 358 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 359
sam_grove 5:3f93dd1d4cb3 360 //Wait for network registration
sam_grove 5:3f93dd1d4cb3 361 CSSProcessor cssProcessor;
sam_grove 5:3f93dd1d4cb3 362 do
sam_grove 5:3f93dd1d4cb3 363 {
sam_grove 5:3f93dd1d4cb3 364 DBG("Waiting for network registration");
sam_grove 5:3f93dd1d4cb3 365 ret = m_at.execute("AT+CSS?", &cssProcessor, &result);
sam_grove 5:3f93dd1d4cb3 366 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 367 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 368 if(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING)
sam_grove 5:3f93dd1d4cb3 369 {
sam_grove 5:3f93dd1d4cb3 370 Thread::wait(3000);
sam_grove 5:3f93dd1d4cb3 371 }
sam_grove 5:3f93dd1d4cb3 372 } while(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING);
sam_grove 5:3f93dd1d4cb3 373
sam_grove 5:3f93dd1d4cb3 374 m_atOpen = true;
sam_grove 5:3f93dd1d4cb3 375
sam_grove 5:3f93dd1d4cb3 376 return OK;
sam_grove 5:3f93dd1d4cb3 377 }
sam_grove 5:3f93dd1d4cb3 378
sam_grove 5:3f93dd1d4cb3 379 int SprintUSBModem::cleanup()
sam_grove 5:3f93dd1d4cb3 380 {
sam_grove 5:3f93dd1d4cb3 381 if(m_ppp.isConnected())
sam_grove 5:3f93dd1d4cb3 382 {
sam_grove 5:3f93dd1d4cb3 383 WARN("Data connection is still open"); //Try to encourage good behaviour from the user
sam_grove 5:3f93dd1d4cb3 384 m_ppp.disconnect();
sam_grove 5:3f93dd1d4cb3 385 }
sam_grove 5:3f93dd1d4cb3 386
sam_grove 5:3f93dd1d4cb3 387 m_smsInit = false;
sam_grove 5:3f93dd1d4cb3 388 // m_linkMonitorInit = false;
sam_grove 5:3f93dd1d4cb3 389 //We don't reset m_ipInit as PPPIPInterface::init() only needs to be called once
sam_grove 5:3f93dd1d4cb3 390
sam_grove 5:3f93dd1d4cb3 391 if(m_atOpen)
sam_grove 5:3f93dd1d4cb3 392 {
sam_grove 5:3f93dd1d4cb3 393 m_at.close();
sam_grove 5:3f93dd1d4cb3 394 m_atOpen = false;
sam_grove 5:3f93dd1d4cb3 395 }
sam_grove 5:3f93dd1d4cb3 396
sam_grove 5:3f93dd1d4cb3 397 m_dongle.disconnect();
sam_grove 5:3f93dd1d4cb3 398 m_dongleConnected = false;
sam_grove 5:3f93dd1d4cb3 399
sam_grove 5:3f93dd1d4cb3 400 return OK;
sam_grove 5:3f93dd1d4cb3 401 }
sam_grove 5:3f93dd1d4cb3 402