GSMA version

Dependencies:   FXOS8700CQ mbed

Fork of AvnetATT_shape_hackathon by Rick McConney

Committer:
elmkom
Date:
Wed Oct 26 18:40:40 2016 +0000
Revision:
44:60008ebffdd4
Parent:
43:3979ea0a2df3
Child:
45:fe90f1fcb4e0
Gsma version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmkom 42:8500f0cb2ea5 1 #include "Wnc.h"
elmkom 42:8500f0cb2ea5 2 #include "mbed.h"
elmkom 42:8500f0cb2ea5 3 #include <cctype>
elmkom 42:8500f0cb2ea5 4 #include <string>
elmkom 42:8500f0cb2ea5 5 #include "config_me.h"
elmkom 42:8500f0cb2ea5 6 #include "SerialBuffered.h"
elmkom 42:8500f0cb2ea5 7
elmkom 42:8500f0cb2ea5 8
elmkom 42:8500f0cb2ea5 9 extern Serial pc;
elmkom 42:8500f0cb2ea5 10
elmkom 42:8500f0cb2ea5 11 DigitalOut mdm_uart2_rx_boot_mode_sel(PTC17); // on powerup, 0 = boot mode, 1 = normal boot
elmkom 42:8500f0cb2ea5 12 DigitalOut mdm_power_on(PTB9); // 0 = turn modem on, 1 = turn modem off (should be held high for >5 seconds to cycle modem)
elmkom 42:8500f0cb2ea5 13 DigitalInOut mdm_wakeup_in(PTC2); // 0 = let modem sleep, 1 = keep modem awake -- Note: pulled high on shield
elmkom 42:8500f0cb2ea5 14
elmkom 42:8500f0cb2ea5 15 DigitalOut mdm_reset(PTC12); // active high
elmkom 42:8500f0cb2ea5 16
elmkom 42:8500f0cb2ea5 17 DigitalOut shield_3v3_1v8_sig_trans_ena(PTC4); // 0 = disabled (all signals high impedence, 1 = translation active
elmkom 42:8500f0cb2ea5 18 DigitalOut mdm_uart1_cts(PTD0);
elmkom 42:8500f0cb2ea5 19
elmkom 44:60008ebffdd4 20 DigitalOut uart1Rts(PTD1);
elmkom 44:60008ebffdd4 21
elmkom 42:8500f0cb2ea5 22 SerialBuffered mdm(PTD3, PTD2, 512);
elmkom 42:8500f0cb2ea5 23
elmkom 44:60008ebffdd4 24 int t3412Timer = 4*60*60;
elmkom 44:60008ebffdd4 25 int t3324Timer = 20;
elmkom 42:8500f0cb2ea5 26 bool powerSave = false;
elmkom 43:3979ea0a2df3 27 bool firstWake = false;
elmkom 42:8500f0cb2ea5 28
elmkom 42:8500f0cb2ea5 29 Wnc::Wnc(void)
elmkom 42:8500f0cb2ea5 30 {
elmkom 42:8500f0cb2ea5 31 }
elmkom 42:8500f0cb2ea5 32
elmkom 42:8500f0cb2ea5 33 void Wnc::checkPassthrough()
elmkom 42:8500f0cb2ea5 34 {
elmkom 42:8500f0cb2ea5 35 if(pc.readable())
elmkom 42:8500f0cb2ea5 36 {
elmkom 42:8500f0cb2ea5 37 if(pc.getc() == '~')
elmkom 42:8500f0cb2ea5 38 passthrough();
elmkom 42:8500f0cb2ea5 39 }
elmkom 42:8500f0cb2ea5 40 }
elmkom 42:8500f0cb2ea5 41
elmkom 42:8500f0cb2ea5 42
elmkom 42:8500f0cb2ea5 43 void Wnc::passthrough()
elmkom 42:8500f0cb2ea5 44 {
elmkom 42:8500f0cb2ea5 45 pc.printf(">>\r\n");
elmkom 42:8500f0cb2ea5 46 while(1)
elmkom 42:8500f0cb2ea5 47 {
elmkom 42:8500f0cb2ea5 48 char c;
elmkom 42:8500f0cb2ea5 49 if(pc.readable())
elmkom 42:8500f0cb2ea5 50 {
elmkom 42:8500f0cb2ea5 51 c = pc.getc();
elmkom 42:8500f0cb2ea5 52 pc.putc(c);
elmkom 42:8500f0cb2ea5 53 if(c == '~')
elmkom 42:8500f0cb2ea5 54 {
elmkom 42:8500f0cb2ea5 55 pc.printf("exit\r\n");
elmkom 42:8500f0cb2ea5 56 break;
elmkom 42:8500f0cb2ea5 57 }
elmkom 42:8500f0cb2ea5 58 else if(c == '<')
elmkom 42:8500f0cb2ea5 59 {
elmkom 42:8500f0cb2ea5 60
elmkom 42:8500f0cb2ea5 61 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 62 pc.printf("sleep\r\n");
elmkom 42:8500f0cb2ea5 63 }
elmkom 42:8500f0cb2ea5 64 else if(c == '>')
elmkom 42:8500f0cb2ea5 65 {
elmkom 42:8500f0cb2ea5 66 mdm_wakeup_in = 1;
elmkom 42:8500f0cb2ea5 67 pc.printf("wake\r\n");
elmkom 42:8500f0cb2ea5 68 }
elmkom 43:3979ea0a2df3 69 else if(c == '}')
elmkom 43:3979ea0a2df3 70 {
elmkom 43:3979ea0a2df3 71 mdm_uart2_rx_boot_mode_sel = 1;
elmkom 43:3979ea0a2df3 72 pc.printf("rx hi\r\n");
elmkom 43:3979ea0a2df3 73 }
elmkom 43:3979ea0a2df3 74 else if(c == '{')
elmkom 43:3979ea0a2df3 75 {
elmkom 43:3979ea0a2df3 76 mdm_uart2_rx_boot_mode_sel = 0;
elmkom 43:3979ea0a2df3 77 pc.printf("rx low\r\n");
elmkom 43:3979ea0a2df3 78 }
elmkom 43:3979ea0a2df3 79
elmkom 42:8500f0cb2ea5 80 else if(c == '^')
elmkom 42:8500f0cb2ea5 81 {
elmkom 42:8500f0cb2ea5 82 pc.printf("reboot\r\n");
elmkom 42:8500f0cb2ea5 83 NVIC_SystemReset();
elmkom 42:8500f0cb2ea5 84 }
elmkom 42:8500f0cb2ea5 85 else
elmkom 42:8500f0cb2ea5 86 {
elmkom 42:8500f0cb2ea5 87
elmkom 42:8500f0cb2ea5 88 mdm.putc(c);
elmkom 42:8500f0cb2ea5 89 }
elmkom 42:8500f0cb2ea5 90 }
elmkom 42:8500f0cb2ea5 91 if(mdm.readable())
elmkom 42:8500f0cb2ea5 92 pc.putc(mdm.getc());
elmkom 42:8500f0cb2ea5 93 }
elmkom 42:8500f0cb2ea5 94 }
elmkom 42:8500f0cb2ea5 95
elmkom 42:8500f0cb2ea5 96 bool Wnc::isPowerSaveOn()
elmkom 42:8500f0cb2ea5 97 {
elmkom 42:8500f0cb2ea5 98 return powerSave;
elmkom 42:8500f0cb2ea5 99 }
elmkom 42:8500f0cb2ea5 100
elmkom 42:8500f0cb2ea5 101 void Wnc::resumePowerSave()
elmkom 42:8500f0cb2ea5 102 {
elmkom 42:8500f0cb2ea5 103 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 104 }
elmkom 42:8500f0cb2ea5 105
elmkom 44:60008ebffdd4 106 int Wnc::gett3412Timer()
elmkom 44:60008ebffdd4 107 {
elmkom 44:60008ebffdd4 108 return t3412Timer;
elmkom 44:60008ebffdd4 109 }
elmkom 44:60008ebffdd4 110
elmkom 44:60008ebffdd4 111 int Wnc::gett3324Timer()
elmkom 44:60008ebffdd4 112 {
elmkom 44:60008ebffdd4 113 return t3324Timer;
elmkom 44:60008ebffdd4 114 }
elmkom 44:60008ebffdd4 115
elmkom 42:8500f0cb2ea5 116 char* Wnc::read(int timeout_ms)
elmkom 42:8500f0cb2ea5 117 {
elmkom 42:8500f0cb2ea5 118 static char response[3200];
elmkom 42:8500f0cb2ea5 119 int len = 0;
elmkom 42:8500f0cb2ea5 120
elmkom 42:8500f0cb2ea5 121 if(timeout_ms > 0) // read until timeout or OK
elmkom 42:8500f0cb2ea5 122 {
elmkom 42:8500f0cb2ea5 123 Timer timer;
elmkom 42:8500f0cb2ea5 124 timer.start();
elmkom 42:8500f0cb2ea5 125 while ((len < (3200-1)) && (timer.read_ms() < timeout_ms)) {
elmkom 42:8500f0cb2ea5 126 if (mdm.readable()) {
elmkom 42:8500f0cb2ea5 127 response[len++] = mdm.getc();
elmkom 42:8500f0cb2ea5 128 if(len>1 && response[len-2] == 'O' && response[len-1] == 'K')
elmkom 42:8500f0cb2ea5 129 break;
elmkom 42:8500f0cb2ea5 130 }
elmkom 42:8500f0cb2ea5 131 }
elmkom 42:8500f0cb2ea5 132 }
elmkom 42:8500f0cb2ea5 133
elmkom 42:8500f0cb2ea5 134 response[len] = (char)NULL;
elmkom 42:8500f0cb2ea5 135 pc.printf("{%s}\r\n",response);
elmkom 42:8500f0cb2ea5 136 return response;
elmkom 42:8500f0cb2ea5 137 }
elmkom 42:8500f0cb2ea5 138
elmkom 42:8500f0cb2ea5 139 char* Wnc::send(const char *cmd, int timeout_ms)
elmkom 42:8500f0cb2ea5 140 {
elmkom 42:8500f0cb2ea5 141 char* reply;
elmkom 43:3979ea0a2df3 142
elmkom 43:3979ea0a2df3 143 while (mdm.readable()) {
elmkom 43:3979ea0a2df3 144 mdm.getc();
elmkom 43:3979ea0a2df3 145 }
elmkom 42:8500f0cb2ea5 146
elmkom 42:8500f0cb2ea5 147 int tries = 4;
elmkom 42:8500f0cb2ea5 148 while(tries > 0)
elmkom 42:8500f0cb2ea5 149 {
elmkom 42:8500f0cb2ea5 150 tries--;
elmkom 42:8500f0cb2ea5 151 pc.printf("\r\n<%s>",cmd);
elmkom 42:8500f0cb2ea5 152 const char *pt = cmd;
elmkom 42:8500f0cb2ea5 153 size_t n = strlen(cmd);
elmkom 42:8500f0cb2ea5 154 while (n--) {
elmkom 42:8500f0cb2ea5 155 mdm.putc(*pt++);
elmkom 42:8500f0cb2ea5 156 };
elmkom 42:8500f0cb2ea5 157 mdm.putc('\r');
elmkom 42:8500f0cb2ea5 158 mdm.putc('\n');
elmkom 42:8500f0cb2ea5 159 reply = read(timeout_ms);
elmkom 42:8500f0cb2ea5 160 if(strlen(reply) > 0 && strstr(reply,"OK") !=0)
elmkom 42:8500f0cb2ea5 161 break;
elmkom 42:8500f0cb2ea5 162 checkPassthrough();
elmkom 42:8500f0cb2ea5 163 }
elmkom 42:8500f0cb2ea5 164 return reply;
elmkom 42:8500f0cb2ea5 165 }
elmkom 42:8500f0cb2ea5 166
elmkom 42:8500f0cb2ea5 167 bool Wnc::isModemResponding()
elmkom 42:8500f0cb2ea5 168 {
elmkom 42:8500f0cb2ea5 169 char *reply = send("AT",WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 170 if(strlen(reply) > 0 && strstr(reply,"OK") !=0)
elmkom 42:8500f0cb2ea5 171 return true;
elmkom 42:8500f0cb2ea5 172 return false;
elmkom 42:8500f0cb2ea5 173 }
elmkom 42:8500f0cb2ea5 174
elmkom 42:8500f0cb2ea5 175 void Wnc::setIn()
elmkom 42:8500f0cb2ea5 176 {
elmkom 42:8500f0cb2ea5 177 mdm_wakeup_in.input();
elmkom 42:8500f0cb2ea5 178 }
elmkom 42:8500f0cb2ea5 179
elmkom 42:8500f0cb2ea5 180 void Wnc::toggleWake()
elmkom 42:8500f0cb2ea5 181 {
elmkom 42:8500f0cb2ea5 182 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 183 wait_ms(2000);
elmkom 42:8500f0cb2ea5 184 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 185 }
elmkom 42:8500f0cb2ea5 186
elmkom 42:8500f0cb2ea5 187 int Wnc::init(void) {
elmkom 44:60008ebffdd4 188 uart1Rts = 0;
elmkom 42:8500f0cb2ea5 189 mdm_wakeup_in.output();
elmkom 42:8500f0cb2ea5 190 // disable signal level translator (necessary
elmkom 42:8500f0cb2ea5 191 // for the modem to boot properly)
elmkom 42:8500f0cb2ea5 192 shield_3v3_1v8_sig_trans_ena = 0;
elmkom 42:8500f0cb2ea5 193
elmkom 42:8500f0cb2ea5 194 // Hard reset the modem (doesn't go through
elmkom 42:8500f0cb2ea5 195 // the signal level translator)
elmkom 42:8500f0cb2ea5 196 mdm_reset = 1;
elmkom 42:8500f0cb2ea5 197
elmkom 42:8500f0cb2ea5 198 // wait a moment for the modem to react
elmkom 42:8500f0cb2ea5 199 wait_ms(10);
elmkom 42:8500f0cb2ea5 200
elmkom 42:8500f0cb2ea5 201 // Let modem boot
elmkom 42:8500f0cb2ea5 202 mdm_reset = 0;
elmkom 42:8500f0cb2ea5 203
elmkom 42:8500f0cb2ea5 204 // wait a moment for the modem to react
elmkom 42:8500f0cb2ea5 205 wait(1.0);
elmkom 42:8500f0cb2ea5 206
elmkom 42:8500f0cb2ea5 207 // power modem on //off
elmkom 42:8500f0cb2ea5 208 mdm_power_on = 0; //1;
elmkom 42:8500f0cb2ea5 209
elmkom 42:8500f0cb2ea5 210 // insure modem boots into normal operating mode
elmkom 42:8500f0cb2ea5 211 // and does not go to sleep when powered on
elmkom 42:8500f0cb2ea5 212 mdm_uart2_rx_boot_mode_sel = 1;
elmkom 42:8500f0cb2ea5 213 mdm_wakeup_in = 1;
elmkom 42:8500f0cb2ea5 214
elmkom 42:8500f0cb2ea5 215 // initialze comm with the modem
elmkom 42:8500f0cb2ea5 216 mdm.baud(115200);
elmkom 42:8500f0cb2ea5 217 // clear out potential garbage
elmkom 42:8500f0cb2ea5 218 while (mdm.readable())
elmkom 42:8500f0cb2ea5 219 mdm.getc();
elmkom 42:8500f0cb2ea5 220
elmkom 42:8500f0cb2ea5 221 mdm_uart1_cts = 0;
elmkom 42:8500f0cb2ea5 222
elmkom 42:8500f0cb2ea5 223 // wait a moment for the modem to react to signal
elmkom 42:8500f0cb2ea5 224 // conditions while the level translator is disabled
elmkom 42:8500f0cb2ea5 225 // (sorry, don't have enough information to know
elmkom 42:8500f0cb2ea5 226 // what exactly the modem is doing with the current
elmkom 42:8500f0cb2ea5 227 // pin settings)
elmkom 42:8500f0cb2ea5 228 wait(1.0);
elmkom 42:8500f0cb2ea5 229
elmkom 42:8500f0cb2ea5 230 // enable the signal level translator to start
elmkom 42:8500f0cb2ea5 231 // modem reset process (modem will be powered down)
elmkom 42:8500f0cb2ea5 232 shield_3v3_1v8_sig_trans_ena = 1;
elmkom 42:8500f0cb2ea5 233
elmkom 42:8500f0cb2ea5 234 // Give the modem 60 secons to start responding by
elmkom 42:8500f0cb2ea5 235 // sending simple 'AT' commands to modem once per second.
elmkom 42:8500f0cb2ea5 236 Timer timer;
elmkom 42:8500f0cb2ea5 237 timer.start();
elmkom 42:8500f0cb2ea5 238 while (timer.read() < 60) {
elmkom 42:8500f0cb2ea5 239 SetLedColor(0x1); //red
elmkom 42:8500f0cb2ea5 240 if(isModemResponding())
elmkom 42:8500f0cb2ea5 241 {
elmkom 42:8500f0cb2ea5 242 SetLedColor(0);
elmkom 44:60008ebffdd4 243 //mdm_uart2_rx_boot_mode_sel = 0;
elmkom 42:8500f0cb2ea5 244 return true;
elmkom 42:8500f0cb2ea5 245 }
elmkom 42:8500f0cb2ea5 246 SetLedColor(0); //off
elmkom 42:8500f0cb2ea5 247 wait_ms(1000 - (timer.read_ms() % 1000));
elmkom 42:8500f0cb2ea5 248 pc.printf("\r%d",timer.read_ms()/1000);
elmkom 42:8500f0cb2ea5 249
elmkom 42:8500f0cb2ea5 250 }
elmkom 42:8500f0cb2ea5 251 return false;
elmkom 42:8500f0cb2ea5 252 }
elmkom 42:8500f0cb2ea5 253 int Wnc::secToTau(int time)
elmkom 42:8500f0cb2ea5 254 {
elmkom 42:8500f0cb2ea5 255 /*
elmkom 42:8500f0cb2ea5 256 0 - value is incremented in multiples of 10 minutes
elmkom 42:8500f0cb2ea5 257 1 - value is incremented in multiples of 1 hour
elmkom 42:8500f0cb2ea5 258 2 - value is incremented in multiples of 10 hours
elmkom 42:8500f0cb2ea5 259 3 - value is incremented in multiples of 2 seconds
elmkom 42:8500f0cb2ea5 260 4 - value is incremented in multiples of 30 seconds
elmkom 42:8500f0cb2ea5 261 5 - value is incremented in multiples of 1 minute
elmkom 42:8500f0cb2ea5 262 */
elmkom 42:8500f0cb2ea5 263 if(time/2 < 32)
elmkom 42:8500f0cb2ea5 264 {
elmkom 42:8500f0cb2ea5 265 return (0x3<<5)+time/2;
elmkom 42:8500f0cb2ea5 266 }
elmkom 42:8500f0cb2ea5 267 else if(time/30 < 32)
elmkom 42:8500f0cb2ea5 268 {
elmkom 42:8500f0cb2ea5 269 return (0x4<<5)+time/30;
elmkom 42:8500f0cb2ea5 270 }
elmkom 42:8500f0cb2ea5 271 else if(time/60 < 32)
elmkom 42:8500f0cb2ea5 272 {
elmkom 42:8500f0cb2ea5 273 return (0x5<<5)+time/60;
elmkom 42:8500f0cb2ea5 274 }
elmkom 42:8500f0cb2ea5 275 else if(time/3600 < 32)
elmkom 42:8500f0cb2ea5 276 {
elmkom 42:8500f0cb2ea5 277 return (0x1<<5)+time/3600;
elmkom 42:8500f0cb2ea5 278 }
elmkom 42:8500f0cb2ea5 279 else if(time/36000 < 32)
elmkom 42:8500f0cb2ea5 280 {
elmkom 42:8500f0cb2ea5 281 return (0x2<<5)+time/36000;
elmkom 42:8500f0cb2ea5 282 }
elmkom 42:8500f0cb2ea5 283 else
elmkom 42:8500f0cb2ea5 284 return (0x7<<5);
elmkom 42:8500f0cb2ea5 285
elmkom 42:8500f0cb2ea5 286
elmkom 42:8500f0cb2ea5 287 }
elmkom 42:8500f0cb2ea5 288 int Wnc::secToActivity(int time)
elmkom 42:8500f0cb2ea5 289 {
elmkom 42:8500f0cb2ea5 290 /*
elmkom 42:8500f0cb2ea5 291 0 - value is incremented in multiples of 2 seconds
elmkom 42:8500f0cb2ea5 292 1 - value is incremented in multiples of 1 minute
elmkom 42:8500f0cb2ea5 293 2 - value is incremented in multiples of decihours
elmkom 42:8500f0cb2ea5 294 7 - value indicates that the timer is deactivated.
elmkom 42:8500f0cb2ea5 295 */
elmkom 42:8500f0cb2ea5 296 if(time/2 < 32)
elmkom 42:8500f0cb2ea5 297 {
elmkom 42:8500f0cb2ea5 298 return (0x0<<5)+time/2;
elmkom 42:8500f0cb2ea5 299 }
elmkom 42:8500f0cb2ea5 300 else if(time/60 < 32)
elmkom 42:8500f0cb2ea5 301 {
elmkom 42:8500f0cb2ea5 302 return (0x1<<5)+time/60;
elmkom 42:8500f0cb2ea5 303 }
elmkom 42:8500f0cb2ea5 304 else if(time/36000 < 32)
elmkom 42:8500f0cb2ea5 305 {
elmkom 42:8500f0cb2ea5 306 return (0x2<<5)+time/36000;
elmkom 42:8500f0cb2ea5 307 }
elmkom 42:8500f0cb2ea5 308 else
elmkom 42:8500f0cb2ea5 309 return (0x7<<5);
elmkom 42:8500f0cb2ea5 310
elmkom 42:8500f0cb2ea5 311 }
elmkom 42:8500f0cb2ea5 312 void Wnc::setPowerSave(bool on,int t3412,int t3324)
elmkom 42:8500f0cb2ea5 313 {
elmkom 42:8500f0cb2ea5 314 if(on)
elmkom 42:8500f0cb2ea5 315 {
elmkom 44:60008ebffdd4 316 t3412Timer = t3412;
elmkom 44:60008ebffdd4 317 t3324Timer = t3324;
elmkom 42:8500f0cb2ea5 318 int tau = secToTau(t3412);
elmkom 42:8500f0cb2ea5 319 int activity = secToActivity(t3324);
elmkom 42:8500f0cb2ea5 320 mdm_wakeup_in = 0; //allow power sleep mode
elmkom 42:8500f0cb2ea5 321 powerSave = true;
elmkom 42:8500f0cb2ea5 322 char cmd[32];
elmkom 42:8500f0cb2ea5 323 sprintf(cmd,"AT+CPSMS=1,,,%d,%d",tau,activity);
elmkom 42:8500f0cb2ea5 324 send(cmd, WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 325 }
elmkom 42:8500f0cb2ea5 326 else
elmkom 42:8500f0cb2ea5 327 {
elmkom 42:8500f0cb2ea5 328 mdm_wakeup_in = 1; //disallow power sleep mode
elmkom 42:8500f0cb2ea5 329 powerSave = false;
elmkom 42:8500f0cb2ea5 330 send("AT+CPSMS=0", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 331 }
elmkom 42:8500f0cb2ea5 332 }
elmkom 42:8500f0cb2ea5 333
elmkom 42:8500f0cb2ea5 334 char* Wnc::getIccid()
elmkom 42:8500f0cb2ea5 335 {
elmkom 42:8500f0cb2ea5 336 static char iccidBuf[32];
elmkom 42:8500f0cb2ea5 337 iccidBuf[0] = NULL;
elmkom 42:8500f0cb2ea5 338 char* reply = send("AT%CCID",500);
elmkom 42:8500f0cb2ea5 339 int index = 0;
elmkom 42:8500f0cb2ea5 340 int begin = -1;
elmkom 42:8500f0cb2ea5 341 int i = 0;
elmkom 42:8500f0cb2ea5 342
elmkom 42:8500f0cb2ea5 343 while (reply[index]) { // While there are more characters to process...
elmkom 42:8500f0cb2ea5 344 if (begin == -1 && isdigit(reply[index])) { // Upon finding a digit, ...
elmkom 42:8500f0cb2ea5 345 begin = index;
elmkom 42:8500f0cb2ea5 346 }
elmkom 42:8500f0cb2ea5 347 if(begin != -1)
elmkom 42:8500f0cb2ea5 348 {
elmkom 42:8500f0cb2ea5 349 if(isdigit(reply[index]))
elmkom 42:8500f0cb2ea5 350 {
elmkom 42:8500f0cb2ea5 351 iccidBuf[i++] = reply[index];
elmkom 42:8500f0cb2ea5 352 }
elmkom 42:8500f0cb2ea5 353 else
elmkom 42:8500f0cb2ea5 354 {
elmkom 42:8500f0cb2ea5 355 iccidBuf[i++] = NULL;
elmkom 42:8500f0cb2ea5 356 return iccidBuf;
elmkom 42:8500f0cb2ea5 357 }
elmkom 42:8500f0cb2ea5 358 }
elmkom 42:8500f0cb2ea5 359 index++;
elmkom 42:8500f0cb2ea5 360 }
elmkom 42:8500f0cb2ea5 361 return iccidBuf;
elmkom 42:8500f0cb2ea5 362 }
elmkom 42:8500f0cb2ea5 363
elmkom 42:8500f0cb2ea5 364 void Wnc::wakeFromPowerSave()
elmkom 42:8500f0cb2ea5 365 {
elmkom 42:8500f0cb2ea5 366 char *reply;
elmkom 42:8500f0cb2ea5 367 mdm_wakeup_in = 1;
elmkom 43:3979ea0a2df3 368 pc.printf("wake from power save\r\n");
elmkom 43:3979ea0a2df3 369 firstWake = true;
elmkom 43:3979ea0a2df3 370 // reply = send("AT+CFUN=1", WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 371 // reply = send("AT%CMATT=1", WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 372 // wait(5); // wait to attach
elmkom 43:3979ea0a2df3 373 // reply = send("AT+CREG?", WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 374 // reply = send("AT@INTERNET=1", WNC_WAIT_TIME_MS); // Internet services enabled
elmkom 43:3979ea0a2df3 375 // reply = send("AT@SOCKDIAL=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 376
elmkom 42:8500f0cb2ea5 377
elmkom 42:8500f0cb2ea5 378 }
elmkom 42:8500f0cb2ea5 379
elmkom 42:8500f0cb2ea5 380 void Wnc::startInternet()
elmkom 42:8500f0cb2ea5 381 {
elmkom 42:8500f0cb2ea5 382 char *reply;
elmkom 42:8500f0cb2ea5 383 reply = send("ATE1",WNC_WAIT_TIME_MS); // Echo ON
elmkom 42:8500f0cb2ea5 384 char apn [32];
elmkom 42:8500f0cb2ea5 385 sprintf(apn,"AT%%PDNSET=1,%s,IP",MY_APN_STR);
elmkom 42:8500f0cb2ea5 386
elmkom 42:8500f0cb2ea5 387 reply = send(apn, 2*WNC_WAIT_TIME_MS); // Set APN, cmd seems to take a little longer sometimes
elmkom 42:8500f0cb2ea5 388 reply = send("AT+CREG?", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 389 reply = send("AT@INTERNET=1", WNC_WAIT_TIME_MS); // Internet services enabled
elmkom 42:8500f0cb2ea5 390 reply = send("AT@SOCKDIAL=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 391 }
elmkom 42:8500f0cb2ea5 392
elmkom 42:8500f0cb2ea5 393 char* Wnc::ping(char* ip)
elmkom 42:8500f0cb2ea5 394 {
elmkom 42:8500f0cb2ea5 395 char cmd[32];
elmkom 42:8500f0cb2ea5 396 sprintf(cmd,"AT@PINGREQ=\"%s\"",ip);
elmkom 42:8500f0cb2ea5 397 return send(cmd,WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 398 }
elmkom 43:3979ea0a2df3 399 // AT@SOCKCONN=1,"108.244.165.22",5005
elmkom 42:8500f0cb2ea5 400 bool Wnc::connect(char* ip, int port)
elmkom 42:8500f0cb2ea5 401 {
elmkom 42:8500f0cb2ea5 402 char *reply;
elmkom 42:8500f0cb2ea5 403
elmkom 43:3979ea0a2df3 404 if(isModemResponding())
elmkom 43:3979ea0a2df3 405 {
elmkom 43:3979ea0a2df3 406 reply = send("AT@SOCKCREAT=1", WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 407 if(strlen(reply) == 0 || strstr(reply,"OK") ==0)
elmkom 43:3979ea0a2df3 408 return false;
elmkom 43:3979ea0a2df3 409 }
elmkom 43:3979ea0a2df3 410
elmkom 43:3979ea0a2df3 411
elmkom 42:8500f0cb2ea5 412 char cmd[32];
elmkom 43:3979ea0a2df3 413 if(isModemResponding())
elmkom 43:3979ea0a2df3 414 {
elmkom 43:3979ea0a2df3 415 sprintf(cmd,"AT@SOCKCONN=1,\"%s\",%d",ip,port);
elmkom 43:3979ea0a2df3 416 reply = send(cmd,WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 417 if(firstWake)
elmkom 43:3979ea0a2df3 418 {
elmkom 43:3979ea0a2df3 419 for(int i = 0;i<10;i++)
elmkom 43:3979ea0a2df3 420 {
elmkom 43:3979ea0a2df3 421 pc.printf("%d",i);
elmkom 43:3979ea0a2df3 422 send("AT", WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 423 reply = send("AT+CREG?",WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 424 if(strlen(reply) > 0 && strstr(reply,"2,1") != 0)
elmkom 43:3979ea0a2df3 425 {
elmkom 43:3979ea0a2df3 426 pc.printf("connected %s",reply);
elmkom 43:3979ea0a2df3 427 break;
elmkom 43:3979ea0a2df3 428 }
elmkom 43:3979ea0a2df3 429 else
elmkom 43:3979ea0a2df3 430 {
elmkom 43:3979ea0a2df3 431 pc.printf("Unconnected %s",reply);
elmkom 43:3979ea0a2df3 432 }
elmkom 43:3979ea0a2df3 433 wait(1);
elmkom 43:3979ea0a2df3 434 }
elmkom 43:3979ea0a2df3 435 }
elmkom 43:3979ea0a2df3 436 firstWake = false;
elmkom 43:3979ea0a2df3 437 reply = send(cmd,WNC_WAIT_TIME_MS);
elmkom 43:3979ea0a2df3 438
elmkom 43:3979ea0a2df3 439 if(strlen(reply) == 0 || strstr(reply,"OK") ==0)
elmkom 43:3979ea0a2df3 440 return false;
elmkom 43:3979ea0a2df3 441 }
elmkom 42:8500f0cb2ea5 442 return true;
elmkom 42:8500f0cb2ea5 443 }
elmkom 42:8500f0cb2ea5 444
elmkom 42:8500f0cb2ea5 445 void Wnc::disconnect()
elmkom 42:8500f0cb2ea5 446 {
elmkom 42:8500f0cb2ea5 447 send("AT@SOCKCLOSE=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 448 }
elmkom 42:8500f0cb2ea5 449
elmkom 42:8500f0cb2ea5 450 char* Wnc::encode(int value, char* result, int base)
elmkom 42:8500f0cb2ea5 451 {
elmkom 42:8500f0cb2ea5 452 // check that the base if valid
elmkom 42:8500f0cb2ea5 453 if ( base < 2 || base > 36 ) {
elmkom 42:8500f0cb2ea5 454 *result = '\0';
elmkom 42:8500f0cb2ea5 455 return result;
elmkom 42:8500f0cb2ea5 456 }
elmkom 42:8500f0cb2ea5 457
elmkom 42:8500f0cb2ea5 458 char* ptr = result, *ptr1 = result, tmp_char;
elmkom 42:8500f0cb2ea5 459 int tmp_value;
elmkom 42:8500f0cb2ea5 460
elmkom 42:8500f0cb2ea5 461 do {
elmkom 42:8500f0cb2ea5 462 tmp_value = value;
elmkom 42:8500f0cb2ea5 463 value /= base;
elmkom 42:8500f0cb2ea5 464 *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
elmkom 42:8500f0cb2ea5 465 } while ( value );
elmkom 42:8500f0cb2ea5 466
elmkom 42:8500f0cb2ea5 467 // Apply negative sign
elmkom 42:8500f0cb2ea5 468 if ( tmp_value < 0 )
elmkom 42:8500f0cb2ea5 469 *ptr++ = '-';
elmkom 42:8500f0cb2ea5 470 *ptr-- = '\0';
elmkom 42:8500f0cb2ea5 471
elmkom 42:8500f0cb2ea5 472 while ( ptr1 < ptr ) {
elmkom 42:8500f0cb2ea5 473 tmp_char = *ptr;
elmkom 42:8500f0cb2ea5 474 *ptr-- = *ptr1;
elmkom 42:8500f0cb2ea5 475 *ptr1++ = tmp_char;
elmkom 42:8500f0cb2ea5 476 }
elmkom 42:8500f0cb2ea5 477 return result;
elmkom 42:8500f0cb2ea5 478 }
elmkom 42:8500f0cb2ea5 479
elmkom 42:8500f0cb2ea5 480 char* Wnc::writeSocket(const char * s)
elmkom 42:8500f0cb2ea5 481 {
elmkom 42:8500f0cb2ea5 482
elmkom 42:8500f0cb2ea5 483 char *reply;
elmkom 42:8500f0cb2ea5 484 char num2str[6];
elmkom 42:8500f0cb2ea5 485 size_t sLen = strlen(s);
elmkom 42:8500f0cb2ea5 486 if (sLen <= 99999)
elmkom 42:8500f0cb2ea5 487 {
elmkom 42:8500f0cb2ea5 488
elmkom 42:8500f0cb2ea5 489 string cmd_str("AT@SOCKWRITE=1,");
elmkom 42:8500f0cb2ea5 490 encode(sLen, num2str, 10);
elmkom 42:8500f0cb2ea5 491 cmd_str += num2str;
elmkom 42:8500f0cb2ea5 492 cmd_str += ",\"";
elmkom 42:8500f0cb2ea5 493 while(*s != '\0')
elmkom 42:8500f0cb2ea5 494 {
elmkom 42:8500f0cb2ea5 495 encode((int)*s++, num2str, 16);
elmkom 42:8500f0cb2ea5 496 // Always 2-digit ascii hex:
elmkom 42:8500f0cb2ea5 497 if (strlen(num2str) == 1)
elmkom 42:8500f0cb2ea5 498 {
elmkom 42:8500f0cb2ea5 499 num2str[2] = '\0';
elmkom 42:8500f0cb2ea5 500 num2str[1] = num2str[0];
elmkom 42:8500f0cb2ea5 501 num2str[0] = '0';
elmkom 42:8500f0cb2ea5 502 }
elmkom 42:8500f0cb2ea5 503 cmd_str += num2str;
elmkom 42:8500f0cb2ea5 504 }
elmkom 42:8500f0cb2ea5 505 cmd_str += "\"";
elmkom 42:8500f0cb2ea5 506 reply = send(cmd_str.c_str(), WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 507 }
elmkom 42:8500f0cb2ea5 508 else
elmkom 42:8500f0cb2ea5 509 pc.puts("sockwrite Err, string to long\r\n");
elmkom 42:8500f0cb2ea5 510 return NULL;
elmkom 42:8500f0cb2ea5 511 }
elmkom 42:8500f0cb2ea5 512
elmkom 42:8500f0cb2ea5 513 int Wnc::hex_to_int(char c){
elmkom 42:8500f0cb2ea5 514 if(c >=97)
elmkom 42:8500f0cb2ea5 515 c=c-32;
elmkom 42:8500f0cb2ea5 516 int first = c / 16 - 3;
elmkom 42:8500f0cb2ea5 517 int second = c % 16;
elmkom 42:8500f0cb2ea5 518 int result = first*10 + second;
elmkom 42:8500f0cb2ea5 519 if(result > 9) result--;
elmkom 42:8500f0cb2ea5 520 return result;
elmkom 42:8500f0cb2ea5 521 }
elmkom 42:8500f0cb2ea5 522
elmkom 42:8500f0cb2ea5 523 int Wnc::hex_to_ascii(char h, char l){
elmkom 42:8500f0cb2ea5 524 int high = hex_to_int(h) * 16;
elmkom 42:8500f0cb2ea5 525 int low = hex_to_int(l);
elmkom 42:8500f0cb2ea5 526 return high+low;
elmkom 42:8500f0cb2ea5 527 }
elmkom 42:8500f0cb2ea5 528
elmkom 42:8500f0cb2ea5 529 int Wnc::indexOf(char* str, char c)
elmkom 42:8500f0cb2ea5 530 {
elmkom 42:8500f0cb2ea5 531 int index = 0;
elmkom 42:8500f0cb2ea5 532 while(str[index] != 0)
elmkom 42:8500f0cb2ea5 533 {
elmkom 42:8500f0cb2ea5 534 if(str[index] == c)
elmkom 42:8500f0cb2ea5 535 return index;
elmkom 42:8500f0cb2ea5 536 index++;
elmkom 42:8500f0cb2ea5 537 }
elmkom 42:8500f0cb2ea5 538 return -1;
elmkom 42:8500f0cb2ea5 539 }
elmkom 42:8500f0cb2ea5 540
elmkom 42:8500f0cb2ea5 541 char* Wnc::readSocket()
elmkom 42:8500f0cb2ea5 542 {
elmkom 42:8500f0cb2ea5 543
elmkom 42:8500f0cb2ea5 544 static char data[1000];
elmkom 42:8500f0cb2ea5 545 int i = 0;
elmkom 42:8500f0cb2ea5 546 char *reply;
elmkom 42:8500f0cb2ea5 547 reply = send("AT@SOCKREAD=1,1024",1000);
elmkom 42:8500f0cb2ea5 548 if(strlen(reply) > 0)
elmkom 42:8500f0cb2ea5 549 {
elmkom 42:8500f0cb2ea5 550 int pos_start = indexOf(reply,'"');
elmkom 42:8500f0cb2ea5 551
elmkom 42:8500f0cb2ea5 552 if(pos_start > 0)
elmkom 42:8500f0cb2ea5 553 {
elmkom 42:8500f0cb2ea5 554 pos_start+=1;
elmkom 42:8500f0cb2ea5 555 int length = indexOf(&reply[pos_start],'"');
elmkom 42:8500f0cb2ea5 556
elmkom 42:8500f0cb2ea5 557 if(length > 0)
elmkom 42:8500f0cb2ea5 558 {
elmkom 42:8500f0cb2ea5 559 char hi;
elmkom 42:8500f0cb2ea5 560 char low;
elmkom 42:8500f0cb2ea5 561 for(i = 0; i < length; i++){
elmkom 42:8500f0cb2ea5 562 if(i % 2 != 0){
elmkom 42:8500f0cb2ea5 563 low = reply[pos_start++];
elmkom 42:8500f0cb2ea5 564 data[i/2] = (char) hex_to_ascii(hi,low);
elmkom 42:8500f0cb2ea5 565 }else{
elmkom 42:8500f0cb2ea5 566 hi = reply[pos_start++];
elmkom 42:8500f0cb2ea5 567 }
elmkom 42:8500f0cb2ea5 568 }
elmkom 44:60008ebffdd4 569 data[length/2] = NULL;
elmkom 42:8500f0cb2ea5 570 }
elmkom 42:8500f0cb2ea5 571 }
elmkom 42:8500f0cb2ea5 572 }
elmkom 42:8500f0cb2ea5 573 data[i] = NULL;
elmkom 42:8500f0cb2ea5 574 return data;
elmkom 42:8500f0cb2ea5 575 }