Vodafone K3770/K3772-Z modems driver & networking library

Dependencies:   Socket USBHostWANDongle lwip-sys lwip

Dependents:   VodafoneUSBModemHTTPClientTest VodafoneUSBModemNTPClientTest VodafoneUSBModemSMSTest VodafoneUSBModemUSSDTest ... more

Fork of VodafoneUSBModem_bleedingedge by Donatien Garnier

This is the driver for the Vodafone K3700 & K3772-Z Dongles:

K3770

More details and instructions can be found here.

Committer:
donatien
Date:
Thu May 24 16:40:40 2012 +0000
Revision:
0:3b2f052c333b
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:3b2f052c333b 1 /* VodafoneK3770.cpp */
donatien 0:3b2f052c333b 2 /*
donatien 0:3b2f052c333b 3 Copyright (C) 2012 ARM Limited.
donatien 0:3b2f052c333b 4
donatien 0:3b2f052c333b 5 Permission is hereby granted, free of charge, to any person obtaining a copy of
donatien 0:3b2f052c333b 6 this software and associated documentation files (the "Software"), to deal in
donatien 0:3b2f052c333b 7 the Software without restriction, including without limitation the rights to
donatien 0:3b2f052c333b 8 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
donatien 0:3b2f052c333b 9 of the Software, and to permit persons to whom the Software is furnished to do
donatien 0:3b2f052c333b 10 so, subject to the following conditions:
donatien 0:3b2f052c333b 11
donatien 0:3b2f052c333b 12 The above copyright notice and this permission notice shall be included in all
donatien 0:3b2f052c333b 13 copies or substantial portions of the Software.
donatien 0:3b2f052c333b 14
donatien 0:3b2f052c333b 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:3b2f052c333b 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:3b2f052c333b 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:3b2f052c333b 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:3b2f052c333b 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:3b2f052c333b 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
donatien 0:3b2f052c333b 21 SOFTWARE.
donatien 0:3b2f052c333b 22 */
donatien 0:3b2f052c333b 23
donatien 0:3b2f052c333b 24 #define __DEBUG__ 4
donatien 0:3b2f052c333b 25 #ifndef __MODULE__
donatien 0:3b2f052c333b 26 #define __MODULE__ "VodafoneK3770.cpp"
donatien 0:3b2f052c333b 27 #endif
donatien 0:3b2f052c333b 28
donatien 0:3b2f052c333b 29 #include "core/fwk.h"
donatien 0:3b2f052c333b 30
donatien 0:3b2f052c333b 31 #include "VodafoneK3770.h"
donatien 0:3b2f052c333b 32
donatien 0:3b2f052c333b 33 VodafoneK3770::VodafoneK3770() : m_dongle(),
donatien 0:3b2f052c333b 34 m_stream(m_dongle), m_at(&m_stream),
donatien 0:3b2f052c333b 35 m_ppp(&m_stream), m_sms(&m_at), m_ussd(&m_at),
donatien 0:3b2f052c333b 36 m_dongleConnected(false), m_ipInit(false), m_smsInit(false), m_atOpen(false)
donatien 0:3b2f052c333b 37 {
donatien 0:3b2f052c333b 38
donatien 0:3b2f052c333b 39 }
donatien 0:3b2f052c333b 40
donatien 0:3b2f052c333b 41 class CREGProcessor : public IATCommandsProcessor
donatien 0:3b2f052c333b 42 {
donatien 0:3b2f052c333b 43 public:
donatien 0:3b2f052c333b 44 CREGProcessor() : status(STATUS_REGISTERING)
donatien 0:3b2f052c333b 45 {
donatien 0:3b2f052c333b 46
donatien 0:3b2f052c333b 47 }
donatien 0:3b2f052c333b 48 enum REGISTERING_STATUS { STATUS_REGISTERING, STATUS_OK, STATUS_FAILED };
donatien 0:3b2f052c333b 49 REGISTERING_STATUS getStatus()
donatien 0:3b2f052c333b 50 {
donatien 0:3b2f052c333b 51 return status;
donatien 0:3b2f052c333b 52 }
donatien 0:3b2f052c333b 53 private:
donatien 0:3b2f052c333b 54 virtual int onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
donatien 0:3b2f052c333b 55 {
donatien 0:3b2f052c333b 56 int r;
donatien 0:3b2f052c333b 57 if( sscanf(line, "+CREG: %*d,%d", &r) == 1 )
donatien 0:3b2f052c333b 58 {
donatien 0:3b2f052c333b 59 switch(r)
donatien 0:3b2f052c333b 60 {
donatien 0:3b2f052c333b 61 case 1:
donatien 0:3b2f052c333b 62 case 5:
donatien 0:3b2f052c333b 63 status = STATUS_OK;
donatien 0:3b2f052c333b 64 break;
donatien 0:3b2f052c333b 65 case 0:
donatien 0:3b2f052c333b 66 case 2:
donatien 0:3b2f052c333b 67 status = STATUS_REGISTERING;
donatien 0:3b2f052c333b 68 break;
donatien 0:3b2f052c333b 69 case 3:
donatien 0:3b2f052c333b 70 default:
donatien 0:3b2f052c333b 71 status = STATUS_FAILED;
donatien 0:3b2f052c333b 72 break;
donatien 0:3b2f052c333b 73 }
donatien 0:3b2f052c333b 74 }
donatien 0:3b2f052c333b 75 return OK;
donatien 0:3b2f052c333b 76 }
donatien 0:3b2f052c333b 77 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
donatien 0:3b2f052c333b 78 {
donatien 0:3b2f052c333b 79 return OK;
donatien 0:3b2f052c333b 80 }
donatien 0:3b2f052c333b 81 volatile REGISTERING_STATUS status;
donatien 0:3b2f052c333b 82 };
donatien 0:3b2f052c333b 83
donatien 0:3b2f052c333b 84 class COPSProcessor : public IATCommandsProcessor
donatien 0:3b2f052c333b 85 {
donatien 0:3b2f052c333b 86 public:
donatien 0:3b2f052c333b 87 COPSProcessor() : valid(false)
donatien 0:3b2f052c333b 88 {
donatien 0:3b2f052c333b 89 network[0] = '\0';
donatien 0:3b2f052c333b 90 apn[0] = '\0';
donatien 0:3b2f052c333b 91 bearer[0] = '\0';
donatien 0:3b2f052c333b 92 }
donatien 0:3b2f052c333b 93 char* getNetwork()
donatien 0:3b2f052c333b 94 {
donatien 0:3b2f052c333b 95 return network;
donatien 0:3b2f052c333b 96 }
donatien 0:3b2f052c333b 97 char* getAPN()
donatien 0:3b2f052c333b 98 {
donatien 0:3b2f052c333b 99 return apn;
donatien 0:3b2f052c333b 100 }
donatien 0:3b2f052c333b 101 char* getBearer()
donatien 0:3b2f052c333b 102 {
donatien 0:3b2f052c333b 103 return bearer;
donatien 0:3b2f052c333b 104 }
donatien 0:3b2f052c333b 105 bool isValid()
donatien 0:3b2f052c333b 106 {
donatien 0:3b2f052c333b 107 return valid;
donatien 0:3b2f052c333b 108 }
donatien 0:3b2f052c333b 109 private:
donatien 0:3b2f052c333b 110 virtual int onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
donatien 0:3b2f052c333b 111 {
donatien 0:3b2f052c333b 112 int networkId;
donatien 0:3b2f052c333b 113 int bearerId;
donatien 0:3b2f052c333b 114 int s = sscanf(line, "+COPS: %*d,%*d,\"%d\",%d", &networkId, &bearerId);
donatien 0:3b2f052c333b 115 if( s == 2 )
donatien 0:3b2f052c333b 116 {
donatien 0:3b2f052c333b 117 switch(networkId)
donatien 0:3b2f052c333b 118 {
donatien 0:3b2f052c333b 119 case 23415:
donatien 0:3b2f052c333b 120 strcpy(network, "Vodafone UK");
donatien 0:3b2f052c333b 121 strcpy(apn, "pp.vodafone.co.uk");
donatien 0:3b2f052c333b 122 valid = true;
donatien 0:3b2f052c333b 123 break;
donatien 0:3b2f052c333b 124 case 20810:
donatien 0:3b2f052c333b 125 strcpy(network, "SFR FR");
donatien 0:3b2f052c333b 126 strcpy(apn, "websfr");
donatien 0:3b2f052c333b 127 valid = true;
donatien 0:3b2f052c333b 128 break;
donatien 0:3b2f052c333b 129 default:
donatien 0:3b2f052c333b 130 break;
donatien 0:3b2f052c333b 131 }
donatien 0:3b2f052c333b 132 }
donatien 0:3b2f052c333b 133 else
donatien 0:3b2f052c333b 134 {
donatien 0:3b2f052c333b 135 return OK;
donatien 0:3b2f052c333b 136 }
donatien 0:3b2f052c333b 137 switch(bearerId)
donatien 0:3b2f052c333b 138 {
donatien 0:3b2f052c333b 139 case 0: strcpy(bearer, "GSM"); break;
donatien 0:3b2f052c333b 140 case 1: strcpy(bearer, "GSM Compact"); break;
donatien 0:3b2f052c333b 141 case 2: strcpy(bearer, "UTRAN"); break;
donatien 0:3b2f052c333b 142 case 3: strcpy(bearer, "GSM w/EGPRS"); break;
donatien 0:3b2f052c333b 143 case 4: strcpy(bearer, "UTRAN w/HSDPA"); break;
donatien 0:3b2f052c333b 144 case 5: strcpy(bearer, "UTRAN w/HSUPA"); break;
donatien 0:3b2f052c333b 145 case 6: strcpy(bearer, "UTRAN w/HSDPA and HSUPA"); break;
donatien 0:3b2f052c333b 146 case 7: strcpy(bearer, "E-UTRAN"); break;
donatien 0:3b2f052c333b 147
donatien 0:3b2f052c333b 148 default:
donatien 0:3b2f052c333b 149 break;
donatien 0:3b2f052c333b 150 }
donatien 0:3b2f052c333b 151 return OK;
donatien 0:3b2f052c333b 152 }
donatien 0:3b2f052c333b 153 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
donatien 0:3b2f052c333b 154 {
donatien 0:3b2f052c333b 155 return OK;
donatien 0:3b2f052c333b 156 }
donatien 0:3b2f052c333b 157 char network[24];
donatien 0:3b2f052c333b 158 char bearer[24];
donatien 0:3b2f052c333b 159 char apn[24];
donatien 0:3b2f052c333b 160 volatile bool valid;
donatien 0:3b2f052c333b 161 };
donatien 0:3b2f052c333b 162
donatien 0:3b2f052c333b 163
donatien 0:3b2f052c333b 164 int VodafoneK3770::connect(const char* apn, const char* user, const char* password)
donatien 0:3b2f052c333b 165 {
donatien 0:3b2f052c333b 166 if( !m_ipInit )
donatien 0:3b2f052c333b 167 {
donatien 0:3b2f052c333b 168 m_ipInit = true;
donatien 0:3b2f052c333b 169 m_ppp.init();
donatien 0:3b2f052c333b 170 }
donatien 0:3b2f052c333b 171 m_ppp.setup(user, password);
donatien 0:3b2f052c333b 172
donatien 0:3b2f052c333b 173 int ret = init();
donatien 0:3b2f052c333b 174 if(ret)
donatien 0:3b2f052c333b 175 {
donatien 0:3b2f052c333b 176 return ret;
donatien 0:3b2f052c333b 177 }
donatien 0:3b2f052c333b 178
donatien 0:3b2f052c333b 179 m_smsInit = false; //SMS status reset
donatien 0:3b2f052c333b 180 m_ussdInit = false; //USSD status reset
donatien 0:3b2f052c333b 181
donatien 0:3b2f052c333b 182 ATCommandsInterface::ATResult result;
donatien 0:3b2f052c333b 183
donatien 0:3b2f052c333b 184 #if 0
donatien 0:3b2f052c333b 185 //Get network info & select corresponding APN
donatien 0:3b2f052c333b 186 COPSProcessor copsProcessor;
donatien 0:3b2f052c333b 187 DBG("Get network info & select APN from DB");
donatien 0:3b2f052c333b 188 ret = m_at.execute("AT+COPS=,2;+COPS?", &copsProcessor, &result); //Configure to get operator's info in numeric code & get operator's id
donatien 0:3b2f052c333b 189 DBG("Result of command: Err code=%d", ret);
donatien 0:3b2f052c333b 190 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
donatien 0:3b2f052c333b 191
donatien 0:3b2f052c333b 192 if(!copsProcessor.isValid())
donatien 0:3b2f052c333b 193 {
donatien 0:3b2f052c333b 194 WARN("Connected to an unknown network, try to connect with default parameters");
donatien 0:3b2f052c333b 195 DBG("Connected with %s", copsProcessor.getBearer());
donatien 0:3b2f052c333b 196 }
donatien 0:3b2f052c333b 197 else
donatien 0:3b2f052c333b 198 {
donatien 0:3b2f052c333b 199 DBG("Connected to %s with %s", copsProcessor.getNetwork(), copsProcessor.getBearer());
donatien 0:3b2f052c333b 200 char cmd[48];
donatien 0:3b2f052c333b 201 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", copsProcessor.getAPN());
donatien 0:3b2f052c333b 202 ret = m_at.executeSimple(cmd, &result);
donatien 0:3b2f052c333b 203 DBG("Result of command: Err code=%d", ret);
donatien 0:3b2f052c333b 204 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
donatien 0:3b2f052c333b 205 DBG("APN set to %s", copsProcessor.getAPN());
donatien 0:3b2f052c333b 206 }
donatien 0:3b2f052c333b 207 #else
donatien 0:3b2f052c333b 208 if(apn != NULL)
donatien 0:3b2f052c333b 209 {
donatien 0:3b2f052c333b 210 char cmd[48];
donatien 0:3b2f052c333b 211 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", apn);
donatien 0:3b2f052c333b 212 ret = m_at.executeSimple(cmd, &result);
donatien 0:3b2f052c333b 213 DBG("Result of command: Err code=%d", ret);
donatien 0:3b2f052c333b 214 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
donatien 0:3b2f052c333b 215 DBG("APN set to %s", apn);
donatien 0:3b2f052c333b 216 }
donatien 0:3b2f052c333b 217 #endif
donatien 0:3b2f052c333b 218
donatien 0:3b2f052c333b 219
donatien 0:3b2f052c333b 220 //Connect
donatien 0:3b2f052c333b 221 DBG("Connecting");
donatien 0:3b2f052c333b 222 ret = m_at.executeSimple("ATDT *99#", &result);
donatien 0:3b2f052c333b 223 DBG("Result of command: Err code=%d", ret);
donatien 0:3b2f052c333b 224 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
donatien 0:3b2f052c333b 225 m_at.close(); // Closing AT parser
donatien 0:3b2f052c333b 226 m_atOpen = false; //Will need to be reinitialized afterwards
donatien 0:3b2f052c333b 227
donatien 0:3b2f052c333b 228 DBG("AT Parser closed");
donatien 0:3b2f052c333b 229 if( (ret!=NET_MOREINFO) || (result.result != ATCommandsInterface::ATResult::AT_CONNECT))
donatien 0:3b2f052c333b 230 {
donatien 0:3b2f052c333b 231 ERR("Could not connect");
donatien 0:3b2f052c333b 232 return ret; //Could not connect
donatien 0:3b2f052c333b 233 }
donatien 0:3b2f052c333b 234 DBG("Connecting PPP");
donatien 0:3b2f052c333b 235
donatien 0:3b2f052c333b 236 ret = m_ppp.connect();
donatien 0:3b2f052c333b 237 DBG("Result of connect: Err code=%d", ret);
donatien 0:3b2f052c333b 238 return ret;
donatien 0:3b2f052c333b 239 }
donatien 0:3b2f052c333b 240
donatien 0:3b2f052c333b 241
donatien 0:3b2f052c333b 242 int VodafoneK3770::disconnect()
donatien 0:3b2f052c333b 243 {
donatien 0:3b2f052c333b 244 DBG("Disconnecting from PPP");
donatien 0:3b2f052c333b 245 int ret = m_ppp.disconnect();
donatien 0:3b2f052c333b 246 if(ret)
donatien 0:3b2f052c333b 247 {
donatien 0:3b2f052c333b 248 ERR("Disconnect returned %d, still trying to disconnect", ret);
donatien 0:3b2f052c333b 249 }
donatien 0:3b2f052c333b 250
donatien 0:3b2f052c333b 251 //Ugly but leave dongle time to recover
donatien 0:3b2f052c333b 252 Thread::wait(500);
donatien 0:3b2f052c333b 253
donatien 0:3b2f052c333b 254 ATCommandsInterface::ATResult result;
donatien 0:3b2f052c333b 255 DBG("Starting AT thread");
donatien 0:3b2f052c333b 256 ret = m_at.open();
donatien 0:3b2f052c333b 257 if(ret)
donatien 0:3b2f052c333b 258 {
donatien 0:3b2f052c333b 259 return ret;
donatien 0:3b2f052c333b 260 }
donatien 0:3b2f052c333b 261
donatien 0:3b2f052c333b 262 DBG("Trying to hangup");
donatien 0:3b2f052c333b 263
donatien 0:3b2f052c333b 264 #if 0 //Does not appear to work
donatien 0:3b2f052c333b 265 int tries = 10;
donatien 0:3b2f052c333b 266 do
donatien 0:3b2f052c333b 267 {
donatien 0:3b2f052c333b 268 ret = m_at.executeSimple("+++", &result, 1000);
donatien 0:3b2f052c333b 269 DBG("Result of command: Err code=%d\n", ret);
donatien 0:3b2f052c333b 270 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
donatien 0:3b2f052c333b 271 } while(tries-- && ret);
donatien 0:3b2f052c333b 272 if(!ret)
donatien 0:3b2f052c333b 273 {
donatien 0:3b2f052c333b 274 ret = m_at.executeSimple("ATH", &result);
donatien 0:3b2f052c333b 275 DBG("Result of command: Err code=%d\n", ret);
donatien 0:3b2f052c333b 276 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
donatien 0:3b2f052c333b 277 }
donatien 0:3b2f052c333b 278 #endif
donatien 0:3b2f052c333b 279
donatien 0:3b2f052c333b 280 //Reinit AT parser
donatien 0:3b2f052c333b 281 ret = m_at.init();
donatien 0:3b2f052c333b 282 DBG("Result of command: Err code=%d\n", ret);
donatien 0:3b2f052c333b 283 if(ret)
donatien 0:3b2f052c333b 284 {
donatien 0:3b2f052c333b 285 m_at.close(); // Closing AT parser
donatien 0:3b2f052c333b 286 DBG("AT Parser closed, could not complete disconnection");
donatien 0:3b2f052c333b 287 return NET_TIMEOUT;
donatien 0:3b2f052c333b 288 }
donatien 0:3b2f052c333b 289
donatien 0:3b2f052c333b 290 m_at.close(); // Closing AT parser
donatien 0:3b2f052c333b 291 DBG("AT Parser closed");
donatien 0:3b2f052c333b 292 return OK;
donatien 0:3b2f052c333b 293 }
donatien 0:3b2f052c333b 294
donatien 0:3b2f052c333b 295 int VodafoneK3770::sendSM(const char* number, const char* message)
donatien 0:3b2f052c333b 296 {
donatien 0:3b2f052c333b 297 int ret = init();
donatien 0:3b2f052c333b 298 if(ret)
donatien 0:3b2f052c333b 299 {
donatien 0:3b2f052c333b 300 return ret;
donatien 0:3b2f052c333b 301 }
donatien 0:3b2f052c333b 302
donatien 0:3b2f052c333b 303 if(!m_smsInit)
donatien 0:3b2f052c333b 304 {
donatien 0:3b2f052c333b 305 ret = m_sms.init();
donatien 0:3b2f052c333b 306 if(ret)
donatien 0:3b2f052c333b 307 {
donatien 0:3b2f052c333b 308 return ret;
donatien 0:3b2f052c333b 309 }
donatien 0:3b2f052c333b 310 m_smsInit = true;
donatien 0:3b2f052c333b 311 }
donatien 0:3b2f052c333b 312
donatien 0:3b2f052c333b 313 ret = m_sms.send(number, message);
donatien 0:3b2f052c333b 314 if(ret)
donatien 0:3b2f052c333b 315 {
donatien 0:3b2f052c333b 316 return ret;
donatien 0:3b2f052c333b 317 }
donatien 0:3b2f052c333b 318
donatien 0:3b2f052c333b 319 return OK;
donatien 0:3b2f052c333b 320 }
donatien 0:3b2f052c333b 321
donatien 0:3b2f052c333b 322 int VodafoneK3770::getSM(char* number, char* message, size_t maxLength)
donatien 0:3b2f052c333b 323 {
donatien 0:3b2f052c333b 324 int ret = init();
donatien 0:3b2f052c333b 325 if(ret)
donatien 0:3b2f052c333b 326 {
donatien 0:3b2f052c333b 327 return ret;
donatien 0:3b2f052c333b 328 }
donatien 0:3b2f052c333b 329
donatien 0:3b2f052c333b 330 if(!m_smsInit)
donatien 0:3b2f052c333b 331 {
donatien 0:3b2f052c333b 332 ret = m_sms.init();
donatien 0:3b2f052c333b 333 if(ret)
donatien 0:3b2f052c333b 334 {
donatien 0:3b2f052c333b 335 return ret;
donatien 0:3b2f052c333b 336 }
donatien 0:3b2f052c333b 337 m_smsInit = true;
donatien 0:3b2f052c333b 338 }
donatien 0:3b2f052c333b 339
donatien 0:3b2f052c333b 340 ret = m_sms.get(number, message, maxLength);
donatien 0:3b2f052c333b 341 if(ret)
donatien 0:3b2f052c333b 342 {
donatien 0:3b2f052c333b 343 return ret;
donatien 0:3b2f052c333b 344 }
donatien 0:3b2f052c333b 345
donatien 0:3b2f052c333b 346 return OK;
donatien 0:3b2f052c333b 347 }
donatien 0:3b2f052c333b 348
donatien 0:3b2f052c333b 349 int VodafoneK3770::getSMCount(size_t* pCount)
donatien 0:3b2f052c333b 350 {
donatien 0:3b2f052c333b 351 int ret = init();
donatien 0:3b2f052c333b 352 if(ret)
donatien 0:3b2f052c333b 353 {
donatien 0:3b2f052c333b 354 return ret;
donatien 0:3b2f052c333b 355 }
donatien 0:3b2f052c333b 356
donatien 0:3b2f052c333b 357 if(!m_smsInit)
donatien 0:3b2f052c333b 358 {
donatien 0:3b2f052c333b 359 ret = m_sms.init();
donatien 0:3b2f052c333b 360 if(ret)
donatien 0:3b2f052c333b 361 {
donatien 0:3b2f052c333b 362 return ret;
donatien 0:3b2f052c333b 363 }
donatien 0:3b2f052c333b 364 m_smsInit = true;
donatien 0:3b2f052c333b 365 }
donatien 0:3b2f052c333b 366
donatien 0:3b2f052c333b 367 ret = m_sms.getCount(pCount);
donatien 0:3b2f052c333b 368 if(ret)
donatien 0:3b2f052c333b 369 {
donatien 0:3b2f052c333b 370 return ret;
donatien 0:3b2f052c333b 371 }
donatien 0:3b2f052c333b 372
donatien 0:3b2f052c333b 373 return OK;
donatien 0:3b2f052c333b 374 }
donatien 0:3b2f052c333b 375
donatien 0:3b2f052c333b 376 int VodafoneK3770::sendUSSD(const char* command, char* result, size_t maxLength)
donatien 0:3b2f052c333b 377 {
donatien 0:3b2f052c333b 378 int ret = init();
donatien 0:3b2f052c333b 379 if(ret)
donatien 0:3b2f052c333b 380 {
donatien 0:3b2f052c333b 381 return ret;
donatien 0:3b2f052c333b 382 }
donatien 0:3b2f052c333b 383
donatien 0:3b2f052c333b 384 if(!m_ussdInit)
donatien 0:3b2f052c333b 385 {
donatien 0:3b2f052c333b 386 ret = m_ussd.init();
donatien 0:3b2f052c333b 387 if(ret)
donatien 0:3b2f052c333b 388 {
donatien 0:3b2f052c333b 389 return ret;
donatien 0:3b2f052c333b 390 }
donatien 0:3b2f052c333b 391 m_ussdInit = true;
donatien 0:3b2f052c333b 392 }
donatien 0:3b2f052c333b 393
donatien 0:3b2f052c333b 394 ret = m_ussd.send(command, result, maxLength);
donatien 0:3b2f052c333b 395 if(ret)
donatien 0:3b2f052c333b 396 {
donatien 0:3b2f052c333b 397 return ret;
donatien 0:3b2f052c333b 398 }
donatien 0:3b2f052c333b 399
donatien 0:3b2f052c333b 400 return OK;
donatien 0:3b2f052c333b 401 }
donatien 0:3b2f052c333b 402
donatien 0:3b2f052c333b 403 ATCommandsInterface* VodafoneK3770::getATCommandsInterface()
donatien 0:3b2f052c333b 404 {
donatien 0:3b2f052c333b 405 return &m_at;
donatien 0:3b2f052c333b 406 }
donatien 0:3b2f052c333b 407
donatien 0:3b2f052c333b 408 int VodafoneK3770::init()
donatien 0:3b2f052c333b 409 {
donatien 0:3b2f052c333b 410 if( !m_dongleConnected )
donatien 0:3b2f052c333b 411 {
donatien 0:3b2f052c333b 412 m_dongleConnected = true;
donatien 0:3b2f052c333b 413 while( !m_dongle.connected() )
donatien 0:3b2f052c333b 414 {
donatien 0:3b2f052c333b 415 m_dongle.tryConnect();
donatien 0:3b2f052c333b 416 Thread::wait(10);
donatien 0:3b2f052c333b 417 }
donatien 0:3b2f052c333b 418 }
donatien 0:3b2f052c333b 419
donatien 0:3b2f052c333b 420 if(m_atOpen)
donatien 0:3b2f052c333b 421 {
donatien 0:3b2f052c333b 422 return OK;
donatien 0:3b2f052c333b 423 }
donatien 0:3b2f052c333b 424
donatien 0:3b2f052c333b 425 DBG("Starting AT thread if needed");
donatien 0:3b2f052c333b 426 int ret = m_at.open();
donatien 0:3b2f052c333b 427 if(ret)
donatien 0:3b2f052c333b 428 {
donatien 0:3b2f052c333b 429 return ret;
donatien 0:3b2f052c333b 430 }
donatien 0:3b2f052c333b 431
donatien 0:3b2f052c333b 432 DBG("Sending initialisation commands");
donatien 0:3b2f052c333b 433 ret = m_at.init();
donatien 0:3b2f052c333b 434 if(ret)
donatien 0:3b2f052c333b 435 {
donatien 0:3b2f052c333b 436 return ret;
donatien 0:3b2f052c333b 437 }
donatien 0:3b2f052c333b 438
donatien 0:3b2f052c333b 439 DBG("Configuring unsolicited result codes support properly");
donatien 0:3b2f052c333b 440 //Configuring port
donatien 0:3b2f052c333b 441 ret = m_at.executeSimple("AT^CURC=0;^PORTSEL=1", NULL); //Huawei-specific, not 3GPP-compliant
donatien 0:3b2f052c333b 442 if(ret != OK)
donatien 0:3b2f052c333b 443 {
donatien 0:3b2f052c333b 444 return NET_PROTOCOL;
donatien 0:3b2f052c333b 445 }
donatien 0:3b2f052c333b 446
donatien 0:3b2f052c333b 447 ATCommandsInterface::ATResult result;
donatien 0:3b2f052c333b 448
donatien 0:3b2f052c333b 449 //Wait for network registration
donatien 0:3b2f052c333b 450 CREGProcessor cregProcessor;
donatien 0:3b2f052c333b 451 do
donatien 0:3b2f052c333b 452 {
donatien 0:3b2f052c333b 453 DBG("Waiting for network registration");
donatien 0:3b2f052c333b 454 ret = m_at.execute("AT+CREG?", &cregProcessor, &result);
donatien 0:3b2f052c333b 455 DBG("Result of command: Err code=%d\n", ret);
donatien 0:3b2f052c333b 456 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
donatien 0:3b2f052c333b 457 if(cregProcessor.getStatus() == CREGProcessor::STATUS_REGISTERING)
donatien 0:3b2f052c333b 458 {
donatien 0:3b2f052c333b 459 Thread::wait(3000);
donatien 0:3b2f052c333b 460 }
donatien 0:3b2f052c333b 461 } while(cregProcessor.getStatus() == CREGProcessor::STATUS_REGISTERING);
donatien 0:3b2f052c333b 462 if(cregProcessor.getStatus() == CREGProcessor::STATUS_FAILED)
donatien 0:3b2f052c333b 463 {
donatien 0:3b2f052c333b 464 ERR("Registration denied");
donatien 0:3b2f052c333b 465 return NET_AUTH;
donatien 0:3b2f052c333b 466 }
donatien 0:3b2f052c333b 467
donatien 0:3b2f052c333b 468 m_atOpen = true;
donatien 0:3b2f052c333b 469
donatien 0:3b2f052c333b 470 return OK;
donatien 0:3b2f052c333b 471 }
donatien 0:3b2f052c333b 472
donatien 0:3b2f052c333b 473
donatien 0:3b2f052c333b 474