Integrating the ublox LISA C200 modem

Fork of SprintUSBModemHTTPClientTest by Donatien Garnier

Committer:
mike.pulice@proxy-usa.com
Date:
Thu Sep 26 17:27:11 2013 -0700
Revision:
8:301426550c6c
Parent:
7:655438fd019f
I found an issue with how +CSS was being parsed.

Strict CSS parsing passes with our modems response.
This will most likely break previous modems.

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
mike.pulice@proxy-usa.com 7:655438fd019f 20 #define __DEBUG__ 4
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
mike.pulice@proxy-usa.com 7:655438fd019f 31 SprintUSBModem::SprintUSBModem(PinName powerGatingPin /*= NC*/, bool powerGatingOnWhenPinHigh /* = true*/, int serial /* 0 */) : m_dongle(),
mike.pulice@proxy-usa.com 7:655438fd019f 32 m_stream(m_dongle.getSerial(serial)),
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 {
mike.pulice@proxy-usa.com 8:301426550c6c 59 char b;
mike.pulice@proxy-usa.com 8:301426550c6c 60 char bc[3] = "";
mike.pulice@proxy-usa.com 8:301426550c6c 61 int sid = 99999;
mike.pulice@proxy-usa.com 8:301426550c6c 62
mike.pulice@proxy-usa.com 8:301426550c6c 63 //if( sscanf(line, "%*d, %c", &r) == 1 )
mike.pulice@proxy-usa.com 8:301426550c6c 64 if(sscanf(line, "%*s %c,%2s,%d", &b,bc,&sid)==3)
mike.pulice@proxy-usa.com 8:301426550c6c 65 {
mike.pulice@proxy-usa.com 8:301426550c6c 66 if(strcmp("Z", bc) == 0)
mike.pulice@proxy-usa.com 8:301426550c6c 67 status = STATUS_REGISTERING;
mike.pulice@proxy-usa.com 8:301426550c6c 68 else
mike.pulice@proxy-usa.com 8:301426550c6c 69 status = STATUS_OK;
sam_grove 5:3f93dd1d4cb3 70 }
sam_grove 5:3f93dd1d4cb3 71 return OK;
sam_grove 5:3f93dd1d4cb3 72 }
sam_grove 5:3f93dd1d4cb3 73 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
sam_grove 5:3f93dd1d4cb3 74 {
sam_grove 5:3f93dd1d4cb3 75 return OK;
sam_grove 5:3f93dd1d4cb3 76 }
sam_grove 5:3f93dd1d4cb3 77 volatile REGISTERING_STATUS status;
sam_grove 5:3f93dd1d4cb3 78 };
sam_grove 5:3f93dd1d4cb3 79
sam_grove 5:3f93dd1d4cb3 80 int SprintUSBModem::connect(const char* apn, const char* user, const char* password)
sam_grove 5:3f93dd1d4cb3 81 {
sam_grove 5:3f93dd1d4cb3 82 if( !m_ipInit )
sam_grove 5:3f93dd1d4cb3 83 {
sam_grove 5:3f93dd1d4cb3 84 m_ipInit = true;
sam_grove 5:3f93dd1d4cb3 85 m_ppp.init();
sam_grove 5:3f93dd1d4cb3 86 }
sam_grove 5:3f93dd1d4cb3 87 m_ppp.setup(user, password);
sam_grove 5:3f93dd1d4cb3 88
sam_grove 5:3f93dd1d4cb3 89 int ret = init();
sam_grove 5:3f93dd1d4cb3 90 if(ret)
sam_grove 5:3f93dd1d4cb3 91 {
sam_grove 5:3f93dd1d4cb3 92 return ret;
sam_grove 5:3f93dd1d4cb3 93 }
sam_grove 5:3f93dd1d4cb3 94
sam_grove 5:3f93dd1d4cb3 95 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 96 m_smsInit = false; //SMS status reset
sam_grove 5:3f93dd1d4cb3 97 //m_ussdInit = false; //USSD status reset
sam_grove 5:3f93dd1d4cb3 98 //m_linkMonitorInit = false; //Link monitor status reset
sam_grove 5:3f93dd1d4cb3 99 #endif
sam_grove 5:3f93dd1d4cb3 100
sam_grove 5:3f93dd1d4cb3 101 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 102
sam_grove 5:3f93dd1d4cb3 103 if(apn != NULL)
sam_grove 5:3f93dd1d4cb3 104 {
sam_grove 5:3f93dd1d4cb3 105 char cmd[48];
sam_grove 5:3f93dd1d4cb3 106 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", apn);
sam_grove 5:3f93dd1d4cb3 107 ret = m_at.executeSimple(cmd, &result);
sam_grove 5:3f93dd1d4cb3 108 DBG("Result of command: Err code=%d", ret);
sam_grove 5:3f93dd1d4cb3 109 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 110 DBG("APN set to %s", apn);
sam_grove 5:3f93dd1d4cb3 111 }
sam_grove 5:3f93dd1d4cb3 112
sam_grove 5:3f93dd1d4cb3 113
sam_grove 5:3f93dd1d4cb3 114 //Connect
sam_grove 5:3f93dd1d4cb3 115 DBG("Connecting");
sam_grove 5:3f93dd1d4cb3 116 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 117 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 118 m_atOpen = false; //Will need to be reinitialized afterwards
sam_grove 5:3f93dd1d4cb3 119 #endif
sam_grove 5:3f93dd1d4cb3 120
sam_grove 5:3f93dd1d4cb3 121 DBG("Connecting PPP");
sam_grove 5:3f93dd1d4cb3 122
sam_grove 5:3f93dd1d4cb3 123 ret = m_ppp.connect();
sam_grove 5:3f93dd1d4cb3 124 DBG("Result of connect: Err code=%d", ret);
sam_grove 5:3f93dd1d4cb3 125 return ret;
sam_grove 5:3f93dd1d4cb3 126 }
sam_grove 5:3f93dd1d4cb3 127
sam_grove 5:3f93dd1d4cb3 128
sam_grove 5:3f93dd1d4cb3 129 int SprintUSBModem::disconnect()
sam_grove 5:3f93dd1d4cb3 130 {
sam_grove 5:3f93dd1d4cb3 131 DBG("Disconnecting from PPP");
sam_grove 5:3f93dd1d4cb3 132 int ret = m_ppp.disconnect();
sam_grove 5:3f93dd1d4cb3 133 if(ret)
sam_grove 5:3f93dd1d4cb3 134 {
sam_grove 5:3f93dd1d4cb3 135 ERR("Disconnect returned %d, still trying to disconnect", ret);
sam_grove 5:3f93dd1d4cb3 136 }
sam_grove 5:3f93dd1d4cb3 137
sam_grove 5:3f93dd1d4cb3 138 //Ugly but leave dongle time to recover
sam_grove 5:3f93dd1d4cb3 139 Thread::wait(500);
sam_grove 5:3f93dd1d4cb3 140
sam_grove 5:3f93dd1d4cb3 141 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 142 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 143 DBG("Starting AT thread");
sam_grove 5:3f93dd1d4cb3 144 ret = m_at.open();
sam_grove 5:3f93dd1d4cb3 145 if(ret)
sam_grove 5:3f93dd1d4cb3 146 {
sam_grove 5:3f93dd1d4cb3 147 return ret;
sam_grove 5:3f93dd1d4cb3 148 }
sam_grove 5:3f93dd1d4cb3 149 #endif
sam_grove 5:3f93dd1d4cb3 150
sam_grove 5:3f93dd1d4cb3 151 DBG("Trying to hangup");
sam_grove 5:3f93dd1d4cb3 152
sam_grove 5:3f93dd1d4cb3 153 #if 0 //Does not appear to work
sam_grove 5:3f93dd1d4cb3 154 int tries = 10;
sam_grove 5:3f93dd1d4cb3 155 do
sam_grove 5:3f93dd1d4cb3 156 {
sam_grove 5:3f93dd1d4cb3 157 ret = m_at.executeSimple("+++", &result, 1000);
sam_grove 5:3f93dd1d4cb3 158 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 159 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 160 } while(tries-- && ret);
sam_grove 5:3f93dd1d4cb3 161 if(!ret)
sam_grove 5:3f93dd1d4cb3 162 {
sam_grove 5:3f93dd1d4cb3 163 ret = m_at.executeSimple("ATH", &result);
sam_grove 5:3f93dd1d4cb3 164 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 165 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 166 }
sam_grove 5:3f93dd1d4cb3 167 #endif
sam_grove 5:3f93dd1d4cb3 168
sam_grove 5:3f93dd1d4cb3 169 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 170 //Reinit AT parser
sam_grove 5:3f93dd1d4cb3 171 ret = m_at.init();
sam_grove 5:3f93dd1d4cb3 172 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 173 if(ret)
sam_grove 5:3f93dd1d4cb3 174 {
sam_grove 5:3f93dd1d4cb3 175 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 176 DBG("AT Parser closed, could not complete disconnection");
sam_grove 5:3f93dd1d4cb3 177 return NET_TIMEOUT;
sam_grove 5:3f93dd1d4cb3 178 }
sam_grove 5:3f93dd1d4cb3 179
sam_grove 5:3f93dd1d4cb3 180 #if 0
sam_grove 5:3f93dd1d4cb3 181 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 182 DBG("AT Parser closed");
sam_grove 5:3f93dd1d4cb3 183 #endif
sam_grove 5:3f93dd1d4cb3 184 #endif
sam_grove 5:3f93dd1d4cb3 185 return OK;
sam_grove 5:3f93dd1d4cb3 186 }
sam_grove 5:3f93dd1d4cb3 187
sam_grove 5:3f93dd1d4cb3 188 int SprintUSBModem::sendSM(const char* number, const char* message)
sam_grove 5:3f93dd1d4cb3 189 {
sam_grove 5:3f93dd1d4cb3 190 int ret = init();
sam_grove 5:3f93dd1d4cb3 191 if(ret)
sam_grove 5:3f93dd1d4cb3 192 {
sam_grove 5:3f93dd1d4cb3 193 return ret;
sam_grove 5:3f93dd1d4cb3 194 }
sam_grove 5:3f93dd1d4cb3 195
sam_grove 5:3f93dd1d4cb3 196 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 197 {
sam_grove 5:3f93dd1d4cb3 198 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 199 if(ret)
sam_grove 5:3f93dd1d4cb3 200 {
sam_grove 5:3f93dd1d4cb3 201 return ret;
sam_grove 5:3f93dd1d4cb3 202 }
sam_grove 5:3f93dd1d4cb3 203 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 204 }
sam_grove 5:3f93dd1d4cb3 205
sam_grove 5:3f93dd1d4cb3 206 ret = m_sms.send(number, message);
sam_grove 5:3f93dd1d4cb3 207 if(ret)
sam_grove 5:3f93dd1d4cb3 208 {
sam_grove 5:3f93dd1d4cb3 209 return ret;
sam_grove 5:3f93dd1d4cb3 210 }
sam_grove 5:3f93dd1d4cb3 211
sam_grove 5:3f93dd1d4cb3 212 return OK;
sam_grove 5:3f93dd1d4cb3 213 }
sam_grove 5:3f93dd1d4cb3 214
sam_grove 5:3f93dd1d4cb3 215 int SprintUSBModem::getSM(char* number, char* message, size_t maxLength)
sam_grove 5:3f93dd1d4cb3 216 {
sam_grove 5:3f93dd1d4cb3 217 int ret = init();
sam_grove 5:3f93dd1d4cb3 218 if(ret)
sam_grove 5:3f93dd1d4cb3 219 {
sam_grove 5:3f93dd1d4cb3 220 return ret;
sam_grove 5:3f93dd1d4cb3 221 }
sam_grove 5:3f93dd1d4cb3 222
sam_grove 5:3f93dd1d4cb3 223 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 224 {
sam_grove 5:3f93dd1d4cb3 225 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 226 if(ret)
sam_grove 5:3f93dd1d4cb3 227 {
sam_grove 5:3f93dd1d4cb3 228 return ret;
sam_grove 5:3f93dd1d4cb3 229 }
sam_grove 5:3f93dd1d4cb3 230 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 231 }
sam_grove 5:3f93dd1d4cb3 232
sam_grove 5:3f93dd1d4cb3 233 ret = m_sms.get(number, message, maxLength);
sam_grove 5:3f93dd1d4cb3 234 if(ret)
sam_grove 5:3f93dd1d4cb3 235 {
sam_grove 5:3f93dd1d4cb3 236 return ret;
sam_grove 5:3f93dd1d4cb3 237 }
sam_grove 5:3f93dd1d4cb3 238
sam_grove 5:3f93dd1d4cb3 239 return OK;
sam_grove 5:3f93dd1d4cb3 240 }
sam_grove 5:3f93dd1d4cb3 241
sam_grove 5:3f93dd1d4cb3 242 int SprintUSBModem::getSMCount(size_t* pCount)
sam_grove 5:3f93dd1d4cb3 243 {
sam_grove 5:3f93dd1d4cb3 244 int ret = init();
sam_grove 5:3f93dd1d4cb3 245 if(ret)
sam_grove 5:3f93dd1d4cb3 246 {
sam_grove 5:3f93dd1d4cb3 247 return ret;
sam_grove 5:3f93dd1d4cb3 248 }
sam_grove 5:3f93dd1d4cb3 249
sam_grove 5:3f93dd1d4cb3 250 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 251 {
sam_grove 5:3f93dd1d4cb3 252 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 253 if(ret)
sam_grove 5:3f93dd1d4cb3 254 {
sam_grove 5:3f93dd1d4cb3 255 return ret;
sam_grove 5:3f93dd1d4cb3 256 }
sam_grove 5:3f93dd1d4cb3 257 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 258 }
sam_grove 5:3f93dd1d4cb3 259
sam_grove 5:3f93dd1d4cb3 260 ret = m_sms.getCount(pCount);
sam_grove 5:3f93dd1d4cb3 261 if(ret)
sam_grove 5:3f93dd1d4cb3 262 {
sam_grove 5:3f93dd1d4cb3 263 return ret;
sam_grove 5:3f93dd1d4cb3 264 }
sam_grove 5:3f93dd1d4cb3 265
sam_grove 5:3f93dd1d4cb3 266 return OK;
sam_grove 5:3f93dd1d4cb3 267 }
sam_grove 5:3f93dd1d4cb3 268
sam_grove 5:3f93dd1d4cb3 269 ATCommandsInterface* SprintUSBModem::getATCommandsInterface()
sam_grove 5:3f93dd1d4cb3 270 {
sam_grove 5:3f93dd1d4cb3 271 return &m_at;
sam_grove 5:3f93dd1d4cb3 272 }
sam_grove 5:3f93dd1d4cb3 273
sam_grove 5:3f93dd1d4cb3 274 int SprintUSBModem::power(bool enable)
sam_grove 5:3f93dd1d4cb3 275 {
sam_grove 5:3f93dd1d4cb3 276 if( m_powerGatingPin == NC )
sam_grove 5:3f93dd1d4cb3 277 {
sam_grove 5:3f93dd1d4cb3 278 return NET_INVALID; //A pin name has not been provided in the constructor
sam_grove 5:3f93dd1d4cb3 279 }
sam_grove 5:3f93dd1d4cb3 280
sam_grove 5:3f93dd1d4cb3 281 if(!enable) //Will force components to re-init
sam_grove 5:3f93dd1d4cb3 282 {
sam_grove 5:3f93dd1d4cb3 283 cleanup();
sam_grove 5:3f93dd1d4cb3 284 }
sam_grove 5:3f93dd1d4cb3 285
sam_grove 5:3f93dd1d4cb3 286 DigitalOut powerGatingOut(m_powerGatingPin);
sam_grove 5:3f93dd1d4cb3 287 powerGatingOut = m_powerGatingOnWhenPinHigh?enable:!enable;
sam_grove 5:3f93dd1d4cb3 288
sam_grove 5:3f93dd1d4cb3 289 return OK;
sam_grove 5:3f93dd1d4cb3 290 }
sam_grove 5:3f93dd1d4cb3 291
sam_grove 5:3f93dd1d4cb3 292 bool SprintUSBModem::power()
sam_grove 5:3f93dd1d4cb3 293 {
sam_grove 5:3f93dd1d4cb3 294 if( m_powerGatingPin == NC )
sam_grove 5:3f93dd1d4cb3 295 {
sam_grove 5:3f93dd1d4cb3 296 return true; //Assume power is always on
sam_grove 5:3f93dd1d4cb3 297 }
sam_grove 5:3f93dd1d4cb3 298
sam_grove 5:3f93dd1d4cb3 299 DigitalOut powerGatingOut(m_powerGatingPin);
sam_grove 5:3f93dd1d4cb3 300 return m_powerGatingOnWhenPinHigh?powerGatingOut:!powerGatingOut;
sam_grove 5:3f93dd1d4cb3 301 }
sam_grove 5:3f93dd1d4cb3 302
sam_grove 5:3f93dd1d4cb3 303 int SprintUSBModem::init()
sam_grove 5:3f93dd1d4cb3 304 {
sam_grove 5:3f93dd1d4cb3 305 if( !m_dongleConnected )
sam_grove 5:3f93dd1d4cb3 306 {
sam_grove 5:3f93dd1d4cb3 307 if(!power())
sam_grove 5:3f93dd1d4cb3 308 {
sam_grove 5:3f93dd1d4cb3 309 //Obviously cannot initialize the dongle if it is disconnected...
sam_grove 5:3f93dd1d4cb3 310 ERR("Power is off");
sam_grove 5:3f93dd1d4cb3 311 return NET_INVALID;
sam_grove 5:3f93dd1d4cb3 312 }
sam_grove 5:3f93dd1d4cb3 313 m_dongleConnected = true;
sam_grove 5:3f93dd1d4cb3 314 while( !m_dongle.connected() )
sam_grove 5:3f93dd1d4cb3 315 {
sam_grove 5:3f93dd1d4cb3 316 m_dongle.tryConnect();
sam_grove 5:3f93dd1d4cb3 317 Thread::wait(100);
sam_grove 5:3f93dd1d4cb3 318 }
sam_grove 5:3f93dd1d4cb3 319 }
sam_grove 5:3f93dd1d4cb3 320
sam_grove 5:3f93dd1d4cb3 321 if(m_atOpen)
sam_grove 5:3f93dd1d4cb3 322 {
sam_grove 5:3f93dd1d4cb3 323 return OK;
sam_grove 5:3f93dd1d4cb3 324 }
sam_grove 5:3f93dd1d4cb3 325
sam_grove 5:3f93dd1d4cb3 326 DBG("Starting AT thread if needed");
sam_grove 5:3f93dd1d4cb3 327 int ret = m_at.open();
sam_grove 5:3f93dd1d4cb3 328 if(ret)
sam_grove 5:3f93dd1d4cb3 329 {
sam_grove 5:3f93dd1d4cb3 330 return ret;
sam_grove 5:3f93dd1d4cb3 331 }
sam_grove 5:3f93dd1d4cb3 332
sam_grove 5:3f93dd1d4cb3 333 DBG("Sending initialisation commands");
sam_grove 5:3f93dd1d4cb3 334 ret = m_at.init();
sam_grove 5:3f93dd1d4cb3 335 if(ret)
sam_grove 5:3f93dd1d4cb3 336 {
sam_grove 5:3f93dd1d4cb3 337 return ret;
sam_grove 5:3f93dd1d4cb3 338 }
sam_grove 5:3f93dd1d4cb3 339
sam_grove 5:3f93dd1d4cb3 340 if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINT598U)
sam_grove 5:3f93dd1d4cb3 341 {
sam_grove 5:3f93dd1d4cb3 342 INFO("Using a Sprint 598U Dongle");
sam_grove 5:3f93dd1d4cb3 343 }
sam_grove 5:3f93dd1d4cb3 344 else if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINTMC5728V)
sam_grove 5:3f93dd1d4cb3 345 {
sam_grove 5:3f93dd1d4cb3 346 INFO("Using a Sprint MC5728V Dongle");
sam_grove 5:3f93dd1d4cb3 347 }
sam_grove 5:3f93dd1d4cb3 348 else if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_UBLOXC200)
sam_grove 5:3f93dd1d4cb3 349 {
sam_grove 5:3f93dd1d4cb3 350 INFO("Using a UBLOX C200 Dongle");
sam_grove 5:3f93dd1d4cb3 351 }
sam_grove 5:3f93dd1d4cb3 352 else
sam_grove 5:3f93dd1d4cb3 353 {
sam_grove 5:3f93dd1d4cb3 354 WARN("Using an Unknown Dongle");
sam_grove 5:3f93dd1d4cb3 355 }
sam_grove 5:3f93dd1d4cb3 356
sam_grove 5:3f93dd1d4cb3 357 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 358
sam_grove 5:3f93dd1d4cb3 359 //Wait for network registration
sam_grove 5:3f93dd1d4cb3 360 CSSProcessor cssProcessor;
sam_grove 5:3f93dd1d4cb3 361 do
sam_grove 5:3f93dd1d4cb3 362 {
sam_grove 5:3f93dd1d4cb3 363 DBG("Waiting for network registration");
sam_grove 5:3f93dd1d4cb3 364 ret = m_at.execute("AT+CSS?", &cssProcessor, &result);
sam_grove 5:3f93dd1d4cb3 365 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 366 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 367 if(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING)
sam_grove 5:3f93dd1d4cb3 368 {
sam_grove 5:3f93dd1d4cb3 369 Thread::wait(3000);
sam_grove 5:3f93dd1d4cb3 370 }
sam_grove 5:3f93dd1d4cb3 371 } while(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING);
sam_grove 5:3f93dd1d4cb3 372
sam_grove 5:3f93dd1d4cb3 373 m_atOpen = true;
sam_grove 5:3f93dd1d4cb3 374
sam_grove 5:3f93dd1d4cb3 375 return OK;
sam_grove 5:3f93dd1d4cb3 376 }
sam_grove 5:3f93dd1d4cb3 377
sam_grove 5:3f93dd1d4cb3 378 int SprintUSBModem::cleanup()
sam_grove 5:3f93dd1d4cb3 379 {
sam_grove 5:3f93dd1d4cb3 380 if(m_ppp.isConnected())
sam_grove 5:3f93dd1d4cb3 381 {
sam_grove 5:3f93dd1d4cb3 382 WARN("Data connection is still open"); //Try to encourage good behaviour from the user
sam_grove 5:3f93dd1d4cb3 383 m_ppp.disconnect();
sam_grove 5:3f93dd1d4cb3 384 }
sam_grove 5:3f93dd1d4cb3 385
sam_grove 5:3f93dd1d4cb3 386 m_smsInit = false;
sam_grove 5:3f93dd1d4cb3 387 // m_linkMonitorInit = false;
sam_grove 5:3f93dd1d4cb3 388 //We don't reset m_ipInit as PPPIPInterface::init() only needs to be called once
sam_grove 5:3f93dd1d4cb3 389
sam_grove 5:3f93dd1d4cb3 390 if(m_atOpen)
sam_grove 5:3f93dd1d4cb3 391 {
sam_grove 5:3f93dd1d4cb3 392 m_at.close();
sam_grove 5:3f93dd1d4cb3 393 m_atOpen = false;
sam_grove 5:3f93dd1d4cb3 394 }
sam_grove 5:3f93dd1d4cb3 395
sam_grove 5:3f93dd1d4cb3 396 m_dongle.disconnect();
sam_grove 5:3f93dd1d4cb3 397 m_dongleConnected = false;
sam_grove 5:3f93dd1d4cb3 398
sam_grove 5:3f93dd1d4cb3 399 return OK;
sam_grove 5:3f93dd1d4cb3 400 }
sam_grove 5:3f93dd1d4cb3 401