This program simply connects to a HTS221 I2C device to proximity sensor

Dependencies:   FXOS8700CQ mbed

Committer:
elmkom
Date:
Mon Oct 10 16:29:34 2016 +0000
Revision:
43:3979ea0a2df3
Parent:
42:8500f0cb2ea5
Flush modem buffer before send

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