Proximity strip reader

Dependencies:   mbed sfh7779

Fork of StarterKit by Rick McConney

Files at this revision

API Documentation at this revision

Comitter:
elmkom
Date:
Fri Oct 07 17:01:22 2016 +0000
Parent:
41:85a736a9b900
Child:
43:3979ea0a2df3
Commit message:
code

Changed in this revision

Wnc.cpp Show annotated file Show diff for this revision Revisions of this file
Wnc.h Show annotated file Show diff for this revision Revisions of this file
config_me.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
wnc_control.cpp Show diff for this revision Revisions of this file
wnc_control.h Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wnc.cpp	Fri Oct 07 17:01:22 2016 +0000
@@ -0,0 +1,508 @@
+#include "Wnc.h"
+#include "mbed.h"
+#include <cctype>
+#include <string>
+#include "config_me.h"
+#include "SerialBuffered.h"
+
+
+extern Serial pc;
+
+DigitalOut  mdm_uart2_rx_boot_mode_sel(PTC17);  // on powerup, 0 = boot mode, 1 = normal boot
+DigitalOut  mdm_power_on(PTB9);                 // 0 = turn modem on, 1 = turn modem off (should be held high for >5 seconds to cycle modem)
+DigitalInOut  mdm_wakeup_in(PTC2);                // 0 = let modem sleep, 1 = keep modem awake -- Note: pulled high on shield
+
+DigitalOut  mdm_reset(PTC12);                   // active high      
+
+DigitalOut  shield_3v3_1v8_sig_trans_ena(PTC4); // 0 = disabled (all signals high impedence, 1 = translation active
+DigitalOut  mdm_uart1_cts(PTD0);
+
+SerialBuffered mdm(PTD3, PTD2, 512);
+
+bool powerSave = false;
+
+Wnc::Wnc(void)
+{
+}
+
+void Wnc::checkPassthrough()
+{
+    if(pc.readable())
+    {
+        if(pc.getc() == '~')
+        passthrough();
+    }
+}
+               
+
+void Wnc::passthrough()
+{
+    pc.printf(">>\r\n");
+    while(1)
+    {
+        char c;
+        if(pc.readable())
+        {
+            c =  pc.getc();
+            pc.putc(c);
+            if(c == '~')
+            {
+                pc.printf("exit\r\n");
+                 break;
+            }
+            else if(c == '<')
+            {
+                
+                 mdm_wakeup_in = 0;
+                 pc.printf("sleep\r\n");
+            }
+            else if(c == '>')
+            {
+                 mdm_wakeup_in = 1;
+                 pc.printf("wake\r\n");
+            }
+            else if(c == '^')
+            {
+                pc.printf("reboot\r\n");
+                NVIC_SystemReset();
+            }
+            else
+            {
+               
+                mdm.putc(c);
+            }
+        }
+        if(mdm.readable())
+            pc.putc(mdm.getc());
+    }
+}
+
+bool Wnc::isPowerSaveOn()
+{
+    return powerSave;
+}
+
+void Wnc::resumePowerSave()
+{
+    mdm_wakeup_in = 0;
+}
+
+char* Wnc::read(int timeout_ms)
+{
+    static char response[3200]; 
+    int len = 0;
+    
+    if(timeout_ms > 0) // read until timeout or OK
+    {
+        Timer timer;
+        timer.start();
+        while ((len < (3200-1)) && (timer.read_ms() < timeout_ms)) {
+            if (mdm.readable()) {
+                response[len++] = mdm.getc();
+                if(len>1 && response[len-2] == 'O' && response[len-1] == 'K')
+                    break;
+            }
+        }
+    }
+ 
+    response[len] = (char)NULL;
+    pc.printf("{%s}\r\n",response);
+    return response;
+}
+
+char* Wnc::send(const char *cmd, int timeout_ms)
+{
+    char* reply;
+        
+    int tries = 4;
+    while(tries > 0)
+    {
+        tries--;        
+        pc.printf("\r\n<%s>",cmd);
+        const char *pt = cmd;
+        size_t n = strlen(cmd);
+        while (n--) {
+            mdm.putc(*pt++);
+        };
+        mdm.putc('\r');
+        mdm.putc('\n');
+        reply = read(timeout_ms);
+        if(strlen(reply) > 0 && strstr(reply,"OK") !=0)
+            break; 
+        checkPassthrough();
+    }
+    return reply;
+}
+
+bool Wnc::isModemResponding()
+{    
+    char *reply = send("AT",WNC_WAIT_TIME_MS);
+    if(strlen(reply) > 0 && strstr(reply,"OK") !=0)
+        return true;
+    return false;
+}
+
+void Wnc::setIn()
+{
+    mdm_wakeup_in.input();
+}
+
+void Wnc::toggleWake()
+{
+    mdm_wakeup_in = 0;
+    wait_ms(2000);  
+    mdm_wakeup_in = 0; 
+}
+
+int Wnc::init(void) {
+    mdm_wakeup_in.output();
+    // disable signal level translator (necessary
+    // for the modem to boot properly)
+    shield_3v3_1v8_sig_trans_ena = 0;
+
+    // Hard reset the modem (doesn't go through
+    // the signal level translator)
+    mdm_reset = 1;
+    
+   // wait a moment for the modem to react
+    wait_ms(10);
+    
+    // Let modem boot
+    mdm_reset = 0;
+    
+    // wait a moment for the modem to react
+    wait(1.0);
+    
+    // power modem on //off
+    mdm_power_on = 0; //1;
+    
+    // insure modem boots into normal operating mode
+    // and does not go to sleep when powered on
+    mdm_uart2_rx_boot_mode_sel = 1;
+    mdm_wakeup_in = 1;
+    
+    // initialze comm with the modem
+    mdm.baud(115200);
+    // clear out potential garbage
+    while (mdm.readable())
+      mdm.getc();
+
+    mdm_uart1_cts = 0;
+    
+    // wait a moment for the modem to react to signal
+    // conditions while the level translator is disabled
+    // (sorry, don't have enough information to know
+    // what exactly the modem is doing with the current
+    // pin settings)
+    wait(1.0);
+
+    // enable the signal level translator to start
+    // modem reset process (modem will be powered down)
+    shield_3v3_1v8_sig_trans_ena = 1;
+    
+    // Give the modem 60 secons to start responding by
+    // sending simple 'AT' commands to modem once per second.
+    Timer timer;
+    timer.start();
+    while (timer.read() < 60) {
+        SetLedColor(0x1); //red     
+        if(isModemResponding())
+        {
+            SetLedColor(0);
+            return true; 
+        }
+        SetLedColor(0); //off
+        wait_ms(1000 - (timer.read_ms() % 1000));
+        pc.printf("\r%d",timer.read_ms()/1000);
+         
+    }
+    return false;       
+}
+int Wnc::secToTau(int time)
+{
+    /*
+    0 - value is incremented in multiples of 10 minutes
+    1 - value is incremented in multiples of 1 hour
+    2 - value is incremented in multiples of 10 hours
+    3 - value is incremented in multiples of 2 seconds
+    4 - value is incremented in multiples of 30 seconds
+    5 - value is incremented in multiples of 1 minute
+*/
+    if(time/2 < 32)
+    {
+        return (0x3<<5)+time/2;
+    }
+    else if(time/30 < 32)
+    {
+        return (0x4<<5)+time/30;
+    }
+    else if(time/60 < 32)
+    {
+        return (0x5<<5)+time/60;
+    }
+    else if(time/3600 < 32)
+    {
+        return (0x1<<5)+time/3600;
+    }
+    else if(time/36000 < 32)
+    {
+        return (0x2<<5)+time/36000;
+    }
+    else
+        return (0x7<<5);
+        
+
+}
+int Wnc::secToActivity(int time)
+{
+    /*
+    0 - value is incremented in multiples of 2 seconds
+    1 - value is incremented in multiples of 1 minute
+    2 - value is incremented in multiples of decihours
+    7 - value indicates that the timer is deactivated.
+    */
+    if(time/2 < 32)
+    {
+        return (0x0<<5)+time/2;
+    }
+    else if(time/60 < 32)
+    {
+        return (0x1<<5)+time/60;
+    }
+    else if(time/36000 < 32)
+    {
+        return (0x2<<5)+time/36000;
+    }
+    else
+        return (0x7<<5);
+
+}    
+void Wnc::setPowerSave(bool on,int t3412,int t3324)
+{
+    if(on)
+    {
+        int tau = secToTau(t3412);
+        int activity = secToActivity(t3324);
+        mdm_wakeup_in = 0; //allow power sleep mode
+        powerSave = true;
+        char cmd[32];
+        sprintf(cmd,"AT+CPSMS=1,,,%d,%d",tau,activity);
+        send(cmd,  WNC_WAIT_TIME_MS);
+    }
+    else
+    {
+        mdm_wakeup_in = 1; //disallow power sleep mode
+        powerSave = false;
+        send("AT+CPSMS=0",  WNC_WAIT_TIME_MS);
+    }
+}
+
+char* Wnc::getIccid()
+{
+    static char iccidBuf[32];
+    iccidBuf[0] = NULL;
+    char* reply = send("AT%CCID",500);
+    int index = 0;
+    int begin = -1;
+    int i = 0;
+
+    while (reply[index]) { // While there are more characters to process...
+        if (begin == -1 && isdigit(reply[index])) { // Upon finding a digit, ...
+            begin = index;
+        }
+        if(begin != -1)
+        { 
+            if(isdigit(reply[index]))
+            { 
+                iccidBuf[i++] = reply[index];
+            }
+            else
+            {
+                iccidBuf[i++] = NULL;
+                return iccidBuf;
+            }
+        }
+        index++;
+    }
+    return iccidBuf;
+}
+
+void Wnc::wakeFromPowerSave()
+{
+    char *reply;
+    mdm_wakeup_in = 1;
+    reply = send("AT+CFUN=1", WNC_WAIT_TIME_MS);
+    reply = send("AT%CMATT=1",  WNC_WAIT_TIME_MS);
+    wait(2); // wait to attach
+    reply = send("AT+CREG?",  WNC_WAIT_TIME_MS);
+    reply = send("AT@INTERNET=1",  WNC_WAIT_TIME_MS);  // Internet services enabled
+    reply = send("AT@SOCKDIAL=1",  WNC_WAIT_TIME_MS);
+    
+
+}
+
+void Wnc::startInternet()
+{
+  char *reply;
+  reply = send("ATE1",WNC_WAIT_TIME_MS);           // Echo ON
+  char apn [32];
+  sprintf(apn,"AT%%PDNSET=1,%s,IP",MY_APN_STR);
+
+  reply = send(apn, 2*WNC_WAIT_TIME_MS); // Set APN, cmd seems to take a little longer sometimes
+  reply = send("AT+CREG?",  WNC_WAIT_TIME_MS);
+  reply = send("AT@INTERNET=1",  WNC_WAIT_TIME_MS);  // Internet services enabled
+  reply = send("AT@SOCKDIAL=1",  WNC_WAIT_TIME_MS);
+}
+
+char* Wnc::ping(char* ip)
+{
+    char cmd[32];
+    sprintf(cmd,"AT@PINGREQ=\"%s\"",ip);
+    return send(cmd,WNC_WAIT_TIME_MS);
+}
+// AT@SOCKCONN=1,"108.244.165.22",5005"
+bool Wnc::connect(char* ip, int port)
+{
+  char *reply;
+
+    reply = send("AT@SOCKCREAT=1", WNC_WAIT_TIME_MS);
+    if(strlen(reply) == 0 || strstr(reply,"OK") ==0)
+        return false;
+    char cmd[32];
+    sprintf(cmd,"AT@SOCKCONN=1,\"%s\",%d",ip,port);
+    reply = send(cmd,WNC_WAIT_TIME_MS);
+    if(strlen(reply) == 0 || strstr(reply,"OK") ==0)
+        return false;
+    return true;
+}
+
+void Wnc::disconnect()
+{
+     send("AT@SOCKCLOSE=1", WNC_WAIT_TIME_MS);
+}
+
+char* Wnc::encode(int value, char* result, int base)                                                                                                          
+{                                                                                                                                                        
+    // check that the base if valid                                                                                                                      
+    if ( base < 2 || base > 36 ) {                                                                                                                       
+        *result = '\0';                                                                                                                                  
+        return result;                                                                                                                                   
+    }                                                                                                                                                    
+ 
+    char* ptr = result, *ptr1 = result, tmp_char;                                                                                                        
+    int tmp_value;                                                                                                                                       
+ 
+    do {                                                                                                                                                 
+        tmp_value = value;                                                                                                                               
+        value /= base;                                                                                                                                   
+        *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];                             
+    } while ( value );                                                                                                                                   
+ 
+    // Apply negative sign                                                                                                                               
+    if ( tmp_value < 0 )                                                                                                                                 
+    *ptr++ = '-';                                                                                                                                    
+    *ptr-- = '\0';                                                                                                                                       
+ 
+    while ( ptr1 < ptr ) {                                                                                                                               
+    tmp_char = *ptr;                                                                                                                                 
+    *ptr-- = *ptr1;                                                                                                                                  
+    *ptr1++ = tmp_char;                                                                                                                              
+    }                                                                                                                                                    
+    return result;                                                                                                                                       
+}
+
+char* Wnc::writeSocket(const char * s)
+{
+
+  char *reply;
+  char num2str[6];
+  size_t sLen = strlen(s);
+  if (sLen <= 99999)
+  {
+
+    string cmd_str("AT@SOCKWRITE=1,");
+    encode(sLen, num2str, 10);
+    cmd_str += num2str;
+    cmd_str += ",\"";
+    while(*s != '\0')
+    {
+      encode((int)*s++, num2str, 16);
+      // Always 2-digit ascii hex:
+      if (strlen(num2str) == 1)
+      {
+        num2str[2] = '\0';
+        num2str[1] = num2str[0];
+        num2str[0] = '0';
+      }
+      cmd_str += num2str;
+    }
+    cmd_str += "\"";
+    reply = send(cmd_str.c_str(), WNC_WAIT_TIME_MS);
+  }
+  else
+    pc.puts("sockwrite Err, string to long\r\n");
+  return NULL;
+}
+
+int Wnc::hex_to_int(char c){
+    if(c >=97)
+        c=c-32;
+    int first = c / 16 - 3;
+    int second = c % 16;
+    int result = first*10 + second;
+    if(result > 9) result--;
+    return result;
+}
+
+int Wnc::hex_to_ascii(char h, char l){
+        int high = hex_to_int(h) * 16;
+        int low = hex_to_int(l);
+        return high+low;       
+}
+
+int Wnc::indexOf(char* str, char c)
+{
+    int index = 0;
+    while(str[index] != 0)
+    {
+        if(str[index] == c)
+            return index;
+        index++;
+    }
+    return -1;
+}
+
+char* Wnc::readSocket()
+{
+
+     static char data[1000];
+     int i = 0;
+     char *reply;
+     reply = send("AT@SOCKREAD=1,1024",1000);
+     if(strlen(reply) > 0)
+     {
+        int pos_start = indexOf(reply,'"');
+ 
+        if(pos_start > 0)
+        {
+            pos_start+=1;
+            int length  = indexOf(&reply[pos_start],'"');
+
+            if(length > 0)
+            {
+                char hi;
+                char low;
+                for(i = 0; i < length; i++){
+                    if(i % 2 != 0){
+                        low = reply[pos_start++];
+                        data[i/2] = (char) hex_to_ascii(hi,low);
+                    }else{
+                        hi = reply[pos_start++];
+                    }
+                }
+            }
+        }
+    }
+    data[i] = NULL;
+    return data;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wnc.h	Fri Oct 07 17:01:22 2016 +0000
@@ -0,0 +1,47 @@
+
+#ifndef Wnc_
+#define Wnc_
+
+#define WNC_WAIT_TIME_MS 500
+
+
+extern void SetLedColor(unsigned char ucColor);
+
+
+class Wnc {
+public:
+    Wnc(void);
+    int init(void);
+    bool isModemResponding();
+
+    char* read(int timeout_ms);
+    char* send(const char *cmd, int timeout_ms);
+    
+    
+    void setPowerSave(bool on,int t3412,int t3324);
+    void resumePowerSave();
+    bool isPowerSaveOn();
+    void wakeFromPowerSave();
+    
+    char* getIccid();
+    void startInternet();
+    bool connect(char* ip, int port);
+    void disconnect();
+    char* writeSocket(const char * s);
+    char* readSocket();
+    char* ping(char* ip);
+    void setIn();
+    void passthrough();
+    void checkPassthrough();
+    void toggleWake();
+    
+private:
+    int secToTau(int time);
+    int secToActivity(int time);
+    int hex_to_int(char c);
+    int hex_to_ascii(char h, char l);
+    int indexOf(char* str, char c);
+    char* encode(int value, char* result, int base);
+};
+
+#endif
\ No newline at end of file
--- a/config_me.h	Tue Oct 04 20:29:31 2016 +0000
+++ b/config_me.h	Fri Oct 07 17:01:22 2016 +0000
@@ -38,7 +38,7 @@
 static int iSensorsToReport = PROXIMITY_ONLY; //TEMP_HUMIDITY_ONLY; //modify this to change your selection
 
 // This is the APN name for the cellular network, you will need to change this, check the instructions included with your SIM card kit:
-static const char * MY_APN_STR          = "m2m.com.attz";
+#define  MY_APN_STR  "m2m.com.attz"
 
 //This is for normal HTTP.  If you want to use TCP to a specific port, change that here:
 static const char * MY_PORT_STR         = "5005";
--- a/main.cpp	Tue Oct 04 20:29:31 2016 +0000
+++ b/main.cpp	Fri Oct 07 17:01:22 2016 +0000
@@ -4,14 +4,18 @@
 #include "SerialBuffered.h"
 #include "HTS221.h"
 #include "config_me.h"
-#include "wnc_control.h"
 #include "sensors.h"
 #include "Proximity.h"
+#include "Wnc.h"
 
 #include "hardware.h"
+
+extern SerialBuffered mdm;
+Wnc wnc;
+
 I2C i2c(PTC11, PTC10);    //SDA, SCL -- define the I2C pins being used
 
-#define PROXIMITYON 0
+#define PROXIMITYON 1
 
 #if PROXIMITYON == 1
 Proximity proximityStrip;
@@ -49,39 +53,28 @@
 
 
 
+
 int mdm_dbgmask = MDM_DBG_OFF;
 
 Serial         pc(USBTX, USBRX);
-SerialBuffered mdm(PTD3, PTD2, 512);
+
 DigitalOut led_green(LED_GREEN);
 DigitalOut led_red(LED_RED);
 DigitalOut led_blue(LED_BLUE);
 
-DigitalOut  mdm_uart2_rx_boot_mode_sel(PTC17);  // on powerup, 0 = boot mode, 1 = normal boot
-DigitalOut  mdm_power_on(PTB9);                 // 0 = turn modem on, 1 = turn modem off (should be held high for >5 seconds to cycle modem)
-DigitalOut  mdm_wakeup_in(PTC2);                // 0 = let modem sleep, 1 = keep modem awake -- Note: pulled high on shield
 
-DigitalOut  mdm_reset(PTC12);                   // active high      
-
-DigitalOut  shield_3v3_1v8_sig_trans_ena(PTC4); // 0 = disabled (all signals high impedence, 1 = translation active
-DigitalOut  mdm_uart1_cts(PTD0);
 
 
 DigitalIn   slot1(PTB3,PullUp);
 DigitalIn   slot2(PTB10,PullUp);
 DigitalIn   slot3(PTB11,PullUp);
-//int slot1 = 0;
-//int slot2 = 1;
-//int slot3 = 1;
+
 int lastSlot1;
 int lastSlot2;
 int lastSlot3;
-string iccid;
-
+char *iccid;
 #define TOUPPER(a) (a) //toupper(a)
 
-const char ok_str[] = "OK";
-const char error_str[] = "ERROR";
 
 #define MDM_OK                                  0
 #define MDM_ERR_TIMEOUT                         -1
@@ -89,27 +82,22 @@
 #define MAX_AT_RSP_LEN                          255
 
 bool proximityChange = false;
-bool powerSave = false;
+
 bool toggleLed = false;
 int seqNum;
 
 
-    
-    
-
-
-
 //********************************************************************************************************************************************
 //* Set the RGB LED's Color
 //* LED Color 0=Off to 7=White.  3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue) 
 //********************************************************************************************************************************************
 void SetLedColor(unsigned char ucColor)
 {
-    if(powerSave) 
+    if(wnc.isPowerSaveOn()) 
     {
         led_red = !0;
         led_green = !0;
-        led_blue = !0;
+        led_blue = !(ucColor & 0x4);
     }
     else
     {
@@ -120,356 +108,13 @@
     }
 } //SetLedColor() 
 
-ssize_t mdm_getline(char *buff, size_t size, int timeout_ms) {
-    int cin = -1;
-    int cin_last;
-    
-    if (NULL == buff || size == 0) {
-        return -1;
-    }
 
-    size_t len = 0;
-    Timer timer;
-    timer.start();
-    while ((len < (size-1)) && (timer.read_ms() < timeout_ms)) {
-        if (mdm.readable()) {
-            cin_last = cin;
-            cin = mdm.getc();
-            if (isprint(cin)) {
-                buff[len++] = (char)cin;
-                
-                continue;
-            } else if (('\r' == cin_last) && ('\n' == cin)) {
-                break;
-            }
-        }
-        //wait_ms(1);
-    }
-    buff[len] = (char)NULL;
-    
-    return len;
-}
-
-int mdm_sendAtCmd(const char *cmd, const char **rsp_list, int timeout_ms) {
-    if (cmd && strlen(cmd) > 0) {
-        if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-            printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
-        }
-        mdm.printf("%s\r\n", cmd);
-    }
-    
-    if (rsp_list) {
-        Timer   timer;
-        char    rsp[MAX_AT_RSP_LEN+1];
-        int     len;
-        
-        timer.start();
-        while (timer.read_ms() < timeout_ms) {
-            len = mdm_getline(rsp, sizeof(rsp), timeout_ms - timer.read_ms());
-            
-            if (len < 0)
-                return MDM_ERR_TIMEOUT;
-
-            if (len == 0)
-                continue;
-                
-            if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-                printf(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", rsp);
-            }
-        
-            if (rsp_list) {
-                int rsp_idx = 0;
-                while (rsp_list[rsp_idx]) {
-                    if (strcasecmp(rsp, rsp_list[rsp_idx]) == 0) {
-                        return rsp_idx;
-                    }
-                    rsp_idx++;
-                }
-            }
-        }
-        return MDM_ERR_TIMEOUT;
-    }
-    return MDM_OK;
-}
-int mdm_init(void) {
-    // disable signal level translator (necessary
-    // for the modem to boot properly)
-    shield_3v3_1v8_sig_trans_ena = 0;
-
-    // Hard reset the modem (doesn't go through
-    // the signal level translator)
-    mdm_reset = 1;
-    
-   // wait a moment for the modem to react
-    wait_ms(10);
-    
-    // Let modem boot
-    mdm_reset = 0;
-    
-    // wait a moment for the modem to react
-    wait(1.0);
-    
-    // power modem on //off
-    mdm_power_on = 0; //1;
-    
-    // insure modem boots into normal operating mode
-    // and does not go to sleep when powered on
-    mdm_uart2_rx_boot_mode_sel = 1;
-    mdm_wakeup_in = 1;
-    
-    // initialze comm with the modem
-    mdm.baud(115200);
-    // clear out potential garbage
-    while (mdm.readable())
-      mdm.getc();
-
-    mdm_uart1_cts = 0;
-    
-    // wait a moment for the modem to react to signal
-    // conditions while the level translator is disabled
-    // (sorry, don't have enough information to know
-    // what exactly the modem is doing with the current
-    // pin settings)
-    wait(1.0);
-
-    // enable the signal level translator to start
-    // modem reset process (modem will be powered down)
-    shield_3v3_1v8_sig_trans_ena = 1;
-    
-    // Give the modem 60 secons to start responding by
-    // sending simple 'AT' commands to modem once per second.
-    Timer timer;
-    timer.start();
-    while (timer.read() < 60) {
-        SetLedColor(0x1); //red 
-        const char * rsp_lst[] = { ok_str, error_str, NULL };
-        int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
-        if (rc == 0)
-            return true; //timer.read();
-        SetLedColor(0); //off
-        wait_ms(1000 - (timer.read_ms() % 1000));
-        pc.printf("\r%d",timer.read_ms()/1000);
-         
-    }
-    return false;       
-}
-
-bool oldwakeModem()
-{
-    Timer timer;
-    timer.start();
-    while (timer.read() < 60) {
-        const char * rsp_lst[] = { ok_str, error_str, NULL };
-        int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
-        if (rc == 0)
-            return true; 
-        wait_ms(1000 - (timer.read_ms() % 1000));
-        pc.printf("\r%d",timer.read_ms()/1000);
-    }
-    return false;    
-}
-/*
-bool wakeModem()
-{
-    const char * rsp_lst[] = { ok_str, error_str, NULL };
-    int tries = 60;
-    pc.printf("wake ");
-    while (tries > 0) {
-        tries--; 
-        pc.printf(".");     
-        int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
-        if (rc == 0)
-        {
-            pc.printf("\r\n");
-            return true;
-        } 
-        wait(1.0);
-    }
-    return false;    
-}
-bool rebootModem()
-{
-    mdm.printf("ATZ\r\n");
-    return wakeModem();
-}
-*/
-int oldmdm_init(void) {
-    // Hard reset the modem (doesn't go through
-    // the signal level translator)
-    mdm_reset = 0;
-
-    // disable signal level translator (necessary
-    // for the modem to boot properly).  All signals
-    // except mdm_reset go through the level translator
-    // and have internal pull-up/down in the module. While
-    // the level translator is disabled, these pins will
-    // be in the correct state.  
-    shield_3v3_1v8_sig_trans_ena = 0;
-
-    // While the level translator is disabled and ouptut pins
-    // are tristated, make sure the inputs are in the same state
-    // as the WNC Module pins so that when the level translator is
-    // enabled, there are no differences.
-    mdm_uart2_rx_boot_mode_sel = 1;   // UART2_RX should be high
-    mdm_power_on = 0;                 // powr_on should be low
-    mdm_wakeup_in = 1;                // wake-up should be high
-    mdm_uart1_cts = 0;                // indicate that it is ok to send
-
-   // Now, wait for the WNC Module to perform its initial boot correctly
-    wait(1.0);
-  
-    // The WNC module initializes comms at 115200 8N1 so set it up
-    mdm.baud(115200);
-    
-    //Now, enable the level translator, the input pins should now be the
-    //same as how the M14A module is driving them with internal pull ups/downs.
-    //When enabled, there will be no changes in these 4 pins...
-    shield_3v3_1v8_sig_trans_ena = 1;
-
-    // Now, give the modem 60 secons to start responding by
-    // sending simple 'AT' commands to modem once per second.
-    Timer timer;
-    timer.start();
-    while (timer.read() < 60) {
-        const char * rsp_lst[] = { ok_str, error_str, NULL };
-        int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
-        if (rc == 0)
-            return true; //timer.read();
-        wait_ms(1000 - (timer.read_ms() % 1000));
-        pc.printf("\r%d",timer.read_ms()/1000);
-    }
-    return false;       
-}
-
-int mdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len) {
-    static char cmd_buf[3200];  // Need enough room for the WNC sockreads (over 3000 chars)
-    size_t n = strlen(cmd);
-
-
-    if (cmd && n > 0) {
-        if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-            printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
-        }
-        while (n--) {
-           // pc.printf("%c",*cmd);
-            mdm.putc(*cmd++);
-
-            //wait_ms(1);
-
-        };
-        mdm.putc('\r');
-
-       // wait_ms(1);
-        mdm.putc('\n');
-       // wait_ms(1);
-    }
-
-    if (rsp_list) {
-        rsp->erase(); // Clean up from prior cmd response
-        *len = 0;
-        Timer   timer;
-        timer.start();
-        while (timer.read_ms() < timeout_ms) {
-            int lenCmd = mdm_getline(cmd_buf, sizeof(cmd_buf), timeout_ms - timer.read_ms());
-
-            if (lenCmd == 0)
-                continue;
-
-            if (lenCmd < 0)
-                return MDM_ERR_TIMEOUT;
-            else {
-                *len += lenCmd;
-                *rsp += cmd_buf;
-            }
-
-            if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-                printf(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", cmd_buf);
-            }
-
-            int rsp_idx = 0;
-            while (rsp_list[rsp_idx]) {
-                if (strcasecmp(cmd_buf, rsp_list[rsp_idx]) == 0) {
-                    return rsp_idx;
-                }
-                rsp_idx++;
-            }
-        }
-        return MDM_ERR_TIMEOUT;
-    }
-    pc.printf("D %s",rsp);
-    return MDM_OK;
-}
-
-int oldmdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len) {
-    static char cmd_buf[3200];  // Need enough room for the WNC sockreads (over 3000 chars)
-    size_t n = strlen(cmd);
-    if (cmd && n > 0) {
-        if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-            printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
-        }
-        while (n--) {
-            mdm.putc(*cmd++);
-            wait_ms(1);
-        };
-        mdm.putc('\r');
-        wait_ms(1);
-        mdm.putc('\n');
-        wait_ms(1);
-    }
-
-    if (rsp_list) {
-        rsp->erase(); // Clean up from prior cmd response
-        *len = 0;
-        Timer   timer;
-        timer.start();
-        while (timer.read_ms() < timeout_ms) {
-            int lenCmd = mdm_getline(cmd_buf, sizeof(cmd_buf), timeout_ms - timer.read_ms());
-
-            if (lenCmd == 0)
-                continue;
-
-            if (lenCmd < 0)
-                return MDM_ERR_TIMEOUT;
-            else {
-                *len += lenCmd;
-                *rsp += cmd_buf;
-            }
-
-            if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-                printf(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", cmd_buf);
-            }
-
-            int rsp_idx = 0;
-            while (rsp_list[rsp_idx]) {
-                if (strcasecmp(cmd_buf, rsp_list[rsp_idx]) == 0) {
-                    return rsp_idx;
-                }
-                rsp_idx++;
-            }
-        }
-        return MDM_ERR_TIMEOUT;
-    }
-    pc.printf("D %s",rsp);
-    return MDM_OK;
-}
 void system_reset()
 {
     printf(RED "\n\rSystem resetting..." DEF "\n");
     NVIC_SystemReset();
 }
-void reinitialize_mdm(void)
-{
-    system_reset();
-    /*
-    // Initialize the modem
-    printf(GRN "Modem RE-initializing..." DEF "\r\n");
-    if (!mdm_init()) {
-        
-        system_reset();
-    }
-    printf("\r\n");
-    */
-}
+
 // These are built on the fly
 string MyServerIpAddress;
 string MySocketData;
@@ -511,7 +156,7 @@
 
             char* data = proximityStrip.getDataStr();
             seqNum++;
-            sprintf(modem_string, "GET %s%s?serial=%s&seq=%d&data=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", iccid.c_str(), seqNum, data,  FLOW_URL_TYPE, MY_SERVER_URL);
+            sprintf(modem_string, "GET %s%s?serial=%s&seq=%d&data=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", iccid, seqNum, data,  FLOW_URL_TYPE, MY_SERVER_URL);
             break;
         }
 #endif
@@ -520,7 +165,7 @@
             char data[32];
             sprintf(data,"[{\"p\":%d},{\"p\":%d},{\"p\":%d}]",lastSlot1*26,lastSlot2*26,lastSlot3*26);
             seqNum++;
-            sprintf(modem_string, "GET %s%s?serial=%s&seq=%d&data=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/car", iccid.c_str(), seqNum, data,  FLOW_URL_TYPE, MY_SERVER_URL);
+            sprintf(modem_string, "GET %s%s?serial=%s&seq=%d&data=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/car", iccid, seqNum, data,  FLOW_URL_TYPE, MY_SERVER_URL);
             break;
         }
         case TEMP_HUMIDITY_ONLY:
@@ -572,119 +217,6 @@
 
 } //extract_reply
 
-void setPowerSave(bool on)
-{
-    string * pRespStr;
-    if(on)
-    {
-        powerSave = true;
-        send_wnc_cmd("AT+CPSMS=1", &pRespStr, WNC_TIMEOUT_MS);
-    }
-    else
-    {
-        powerSave = false;
-        send_wnc_cmd("AT+CPSMS=0", &pRespStr, WNC_TIMEOUT_MS);
-    }
-}
-
-
-          
-
-int secToTau(int time)
-{
-    /*
-    0 - value is incremented in multiples of 10 minutes
-    1 - value is incremented in multiples of 1 hour
-    2 - value is incremented in multiples of 10 hours
-    3 - value is incremented in multiples of 2 seconds
-    4 - value is incremented in multiples of 30 seconds
-    5 - value is incremented in multiples of 1 minute
-*/
-    if(time/2 < 32)
-    {
-        return (0x3<<5)+time/2;
-    }
-    else if(time/30 < 32)
-    {
-        return (0x4<<5)+time/30;
-    }
-    else if(time/60 < 32)
-    {
-        return (0x5<<5)+time/60;
-    }
-    else if(time/3600 < 32)
-    {
-        return (0x1<<5)+time/3600;
-    }
-    else if(time/36000 < 32)
-    {
-        return (0x2<<5)+time/36000;
-    }
-    else
-        return (0x7<<5);
-        
-
-}
-int secToActivity(int time)
-{
-    /*
-    0 - value is incremented in multiples of 2 seconds
-    1 - value is incremented in multiples of 1 minute
-    2 - value is incremented in multiples of decihours
-    7 - value indicates that the timer is deactivated.
-    */
-    if(time/2 < 32)
-    {
-        return (0x0<<5)+time/2;
-    }
-    else if(time/60 < 32)
-    {
-        return (0x1<<5)+time/60;
-    }
-    else if(time/36000 < 32)
-    {
-        return (0x2<<5)+time/36000;
-    }
-    else
-        return (0x7<<5);
-
-}    
-void setTauTimer(int time)
-{
-    string * pRespStr;
-    string cmd_str("AT%SETACFG=\"ecm.Mtc.PsmPTAU_T3412\",\"");
-    char str[15];
-    sprintf(str, "%d", secToTau(time));
-    pc.printf("TAU %d = %d",time,secToTau(time));
-    cmd_str += str;
-    cmd_str += "\"";
-    send_wnc_cmd("AT%SETCFG=\"EXT_TAU_CAP_EN\",\"1\"", &pRespStr, WNC_TIMEOUT_MS);
-    send_wnc_cmd("AT%SETACFG=\"ecm.Mtc.PsmCpsmsEn\",\"true\"", &pRespStr, WNC_TIMEOUT_MS);
-    send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
-}
-
-void setActivityTimer(int time)
-{
-    string * pRespStr;
-    string cmd_str("AT%SETACFG=\"ecm.Mtc.PsmActTime_T3324\",\"");
-    char str[15];
-    sprintf(str, "%d", secToActivity(time));
-    pc.printf("Activity %d = %d",time,secToActivity(time));
-    cmd_str += str;
-    cmd_str += "\"";
-    send_wnc_cmd("AT%SETCFG=\"PSM_CAP_EN\",\"1\"", &pRespStr, WNC_TIMEOUT_MS);
-    send_wnc_cmd("AT%SETACFG=\"ecm.Mtc.PsmCpsmsEn\",\"true\"", &pRespStr, WNC_TIMEOUT_MS);
-    send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
-}
-
-void checkSocket()
-{
-    string * pRespStr;
-
-    send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS);
-    pc.printf(pRespStr->c_str());
- 
-}
 
 void parse_reply(char* reply)
 {
@@ -703,61 +235,22 @@
         int t3412 = atoi(tokens[3]);
         int t3324 = atoi(tokens[4]);
         pc.printf("t3412 %d t3324 %d\r\n",t3412,t3324);
-        setTauTimer(t3412);
-        setActivityTimer(t3324);
+        // setTauTimer(t3412);
+        //setActivityTimer(t3324);
         
         if(strcmp("true",tokens[2]) == 0)
         {
             pc.printf("PSM ON\r\n");
-            setPowerSave(true);
+            wnc.setPowerSave(true,t3412,t3324);
         }
         else
         {
             pc.printf("PSM OFF\r\n");
-            setPowerSave(false);
+            wnc.setPowerSave(false,t3412,t3324);
         }
     }        
 }
 
-bool getIccid(string * iccid)
-{
-    string * respStr;
-    
-    iccid->erase();
-    
-    send_wnc_cmd("AT%CCID", &respStr, WNC_TIMEOUT_MS); 
-
-    size_t pos = respStr->find("AT%CCID");
-    if (pos == string::npos)
-        return (false);
-    
-    size_t posOK = respStr->rfind("OK");
-    if (posOK == string::npos)
-        return (false);
-
-    pos += 7; // Advanced to the number
-    *iccid = respStr->substr(pos, posOK - pos);
-    
-    return (true);
-}
-
-void check_wnc(void)
-{
-  string * pRespStr;
-  send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS);             // Heartbeat?
-  send_wnc_cmd("ATE1", &pRespStr, WNC_TIMEOUT_MS);           // Echo ON
-  string cmd_str("AT+CGDCONT=1,\"IP\",");
-  cmd_str += "\"";
-  cmd_str += MY_APN_STR;
-  cmd_str += "\"";
-  
-  send_wnc_cmd(cmd_str.c_str(), &pRespStr, 2*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
-  send_wnc_cmd("AT+CGACT=1,1", &pRespStr, WNC_TIMEOUT_MS);
-  send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS);
-  send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS);  // Internet services enabled
-  send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, WNC_TIMEOUT_MS);
-}
-
 bool checkSlots()
 {
     bool changed = false;
@@ -781,12 +274,9 @@
 
     int i;
 
-
     HTS221 hts221;
     pc.baud(115200);
-
-
-    
+   
     void hts221_init(void);
 
     // Set LED to RED until init finishes
@@ -808,32 +298,29 @@
     // Initialize the modem
     printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n");
     do {
-        i=mdm_init();
+        i=wnc.init();
         if (!i) {
             pc.printf(RED "Modem initialization failed!" DEF "\n");
         }
     } while (!i);
     
-    getIccid(&iccid);
-    printf(GRN "ICCID = %s" DEF "\r\n",iccid.c_str());
+   // wnc.setIn();
+    wnc.send("AT+CPSMS=0",WNC_WAIT_TIME_MS);
+
+    wnc.toggleWake();   
+        
     
-    //check_wnc();
-         
+    iccid = wnc.getIccid();
+    printf(GRN "ICCID = %s" DEF "\r\n",iccid);
+           
     //Software init
-    software_init_mdm();
-    
- 
-    // Resolve URL to IP address to connect to
-    resolve_mdm();
-
-    sockopen_mdm();
+    wnc.startInternet();
+    //wnc.ping("108.244.165.22");
 
     // Set LED BLUE for partial init
     SetLedColor(0x4);
     
-    setTauTimer(12*60*60);
-    setActivityTimer(20);
-    setPowerSave(false);
+    wnc.setPowerSave(false,12*60*60,20);
  
 #if PROXIMITYON == 1  
     proximityStrip.init();  
@@ -844,7 +331,7 @@
     // Send and receive data perpetually
     while(1) {
        
-
+        wnc.checkPassthrough();
         //sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature()));
         //sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity());
         // read_sensors(); //read available external sensors from a PMOD and the on-board motion sensor
@@ -861,14 +348,17 @@
 #endif
                 
         
-        
-
 #if PROXIMITYON == 1            
         if(count >= 5*60 || proximityStrip.changed(50))
 #else
         if(count >= 5*60 || slotsChanged)
 #endif
         {
+            if(wnc.isPowerSaveOn())
+            {
+                wnc.wakeFromPowerSave();
+                //wnc.ping("108.244.165.22");
+            }
             count = 0;
             SetLedColor(0x04); //blue
                 
@@ -881,38 +371,52 @@
 #endif
   
             printf(BLU "Sending to modem : %s" DEF "\r\n", modem_string);
-            wakeModem(); 
-            sockopen_mdm();
-            checkSocket();
-            sockwrite_mdm(modem_string);
-            wakeModem();
-            sockread_mdm(&MySocketData, 1024, 20);
-            sockclose_mdm();
-            // If any non-zero response from server, make it GREEN one-time
-            //  then the actual FLOW responses will set the color.
-            if (MySocketData.length() > 0)
-            {   
+
+            if(wnc.connect("108.244.165.22",5005))
+            {
+                char * reply = wnc.writeSocket(modem_string);
+           
+                char* mydata;
+                int tries = 4;
+                while(tries > 0) // wait for reply
+                {
+                    tries--;
+                    mydata = wnc.readSocket();
+                    if (strlen(mydata) > 0)
+                        break;
+                 
+                    wait(0.2);
+                }
+            
+                if (strlen(mydata) > 0)
+                {   
                                 
-                SetLedColor(0x2); // green
-                //only copy on sucessful send
+                    SetLedColor(0x2); // green
+                    //only copy on sucessful send
 
-                printf(BLU "Read back : %s" DEF "\r\n", &MySocketData[0]);
-                char reply[512];
-                if (extract_reply(&MySocketData[0], &reply[0]))
+                    printf(BLU "Read back : %s" DEF "\r\n", mydata);
+                    char datareply[512];
+                    if (extract_reply(mydata, datareply))
+                    {
+                        printf(GRN "JSON : %s" DEF "\r\n", datareply);
+                        parse_reply(datareply);
+                    }
+                    SetLedColor(0); // off             
+                }
+                else // no reply reset
                 {
-                    printf(GRN "JSON : %s" DEF "\r\n", &reply[0]);
-                    parse_reply(&reply[0]);
-                }
-                SetLedColor(0); // off             
+                    SetLedColor(0x1); //red
+                    system_reset();                 
+                } 
+                wnc.disconnect();
             }
-            else
+            else // failed to connect reset
             {
                 SetLedColor(0x1); //red
-                // failed to read reply try reseting modem
-                if(!rebootModem()) // if reset fails do a full software reset
-                    system_reset();
-                   
-            }    
+                system_reset(); 
+            }
+            if(wnc.isPowerSaveOn())
+                wnc.resumePowerSave();   
         }
         count++;
         wait(0.2); 
--- a/wnc_control.cpp	Tue Oct 04 20:29:31 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,402 +0,0 @@
-#include "mbed.h"
-#include <cctype>
-#include <string>
-#include "config_me.h"
-#include "SerialBuffered.h"
-#include "wnc_control.h"
-
-extern Serial pc;
-extern Serial mdm;
-extern string MyServerIpAddress;
-extern string MySocketData;
-
-int reinitialize_mdm(void);
-
-enum WNC_ERR_e {
-    WNC_OK =0,
-    WNC_CMD_ERR = -1,
-    WNC_NO_RESPONSE = -2
-};
-
-// Contains result of last call to send_wnc_cmd(..)
-WNC_ERR_e WNC_MDM_ERR = WNC_OK;
-
-// Contains the RAW WNC UART responses
-static string wncStr;
-static int socketOpen = 0;
-
-void software_init_mdm(void)
-{
-  do
-  {
-    WNC_MDM_ERR = WNC_OK;
-    at_init_wnc();
-    if (WNC_MDM_ERR != WNC_OK)
-      reinitialize_mdm();
-  } while (WNC_MDM_ERR != WNC_OK); 
-}
-
-void resolve_mdm(void)
-{
-    do
-    {
-      WNC_MDM_ERR = WNC_OK;
-      at_dnsresolve_wnc(MY_SERVER_URL, &MyServerIpAddress);
-      if (WNC_MDM_ERR == WNC_NO_RESPONSE)
-      {
-        reinitialize_mdm();
-        software_init_mdm();
-      }
-      else if (WNC_MDM_ERR == WNC_CMD_ERR)
-      {
-        pc.puts("Bad URL!!!!!!\r\n");
-        MyServerIpAddress = "192.168.0.1";
-        WNC_MDM_ERR = WNC_OK;
-      }
-    } while (WNC_MDM_ERR != WNC_OK);
-    
-    pc.printf("My Server IP: %s\r\n", MyServerIpAddress.c_str());
-}
-
-void sockopen_mdm(void)
-{
-    do
-    {
-      at_at_wnc();
-      at_at_wnc();
-      WNC_MDM_ERR = WNC_OK;
-      at_sockopen_wnc(MyServerIpAddress, MY_PORT_STR);
-      if (WNC_MDM_ERR == WNC_NO_RESPONSE)
-      {
-        reinitialize_mdm();
-        software_init_mdm();
-      }
-      else if (WNC_MDM_ERR == WNC_CMD_ERR)
-      {
-        
-        pc.puts("Socket open fail!!!!\r\n");
-        reinitialize_mdm();
-      }
-      else
-        socketOpen = 1;
-    } while (WNC_MDM_ERR != WNC_OK);
-}
-
-void sockwrite_mdm(const char * s)
-{
-    if (socketOpen == 1)
-    {
-    do
-    {
-      WNC_MDM_ERR = WNC_OK;
-      at_sockwrite_wnc(s);
-      if (WNC_MDM_ERR == WNC_NO_RESPONSE)
-      {
-        reinitialize_mdm();
-        software_init_mdm();
-      }
-      else if (WNC_MDM_ERR == WNC_CMD_ERR)
-      {
-        pc.puts("Socket Write fail!!!\r\n");
-        // Have seen when write fails modem gets stuck in bad state, try to recover
-        reinitialize_mdm();
-        software_init_mdm();
-      }
-    } while (WNC_MDM_ERR != WNC_OK);
-    }
-    else
-      puts("Socket is closed for write!\r\n");
-}
-
-unsigned sockread_mdm(string * sockData, int len, int retries)
-{
-    // Clear out any possible old data
-    sockData->erase();
-    if (socketOpen == 1)
-    {
-    do
-    {
-      WNC_MDM_ERR = WNC_OK;
-      at_sockread_wnc(sockData, len, retries);
-      if (WNC_MDM_ERR == WNC_NO_RESPONSE)
-      {
-        reinitialize_mdm();
-        software_init_mdm();
-      }
-      else if (WNC_MDM_ERR == WNC_CMD_ERR)
-        puts("Sock read fail!!!!\r\n");
-    } while (WNC_MDM_ERR != WNC_OK);
-    }
-    else
-      puts("Socket is closed for read\r\n");
-      
-    return (sockData->size());
-}
-
-void sockclose_mdm(void)
-{
-    do
-    {
-      WNC_MDM_ERR = WNC_OK;
-      at_sockclose_wnc();
-      // Assume close happened even if it went bad
-      // going bad will result in a re-init anyways and if close
-      // fails we're pretty much in bad state and not much can do
-      socketOpen = 0;
-      if (WNC_MDM_ERR == WNC_NO_RESPONSE)
-      {
-        reinitialize_mdm();
-        software_init_mdm();
-      }
-      else if (WNC_MDM_ERR == WNC_CMD_ERR)
-        puts("Sock close fail!!!\r\n");
-    } while (WNC_MDM_ERR != WNC_OK);
-}
-
-/**                                                                                                                                                          
- * C++ version 0.4 char* style "itoa":                                                                                                                       
- * Written by Lukás Chmela                                                                                                                                   
- * Released under GPLv3.                                                                                                                                     
-*/
- 
-char* itoa(int value, char* result, int base)                                                                                                          
-{                                                                                                                                                        
-    // check that the base if valid                                                                                                                      
-    if ( base < 2 || base > 36 ) {                                                                                                                       
-        *result = '\0';                                                                                                                                  
-        return result;                                                                                                                                   
-    }                                                                                                                                                    
- 
-    char* ptr = result, *ptr1 = result, tmp_char;                                                                                                        
-    int tmp_value;                                                                                                                                       
- 
-    do {                                                                                                                                                 
-        tmp_value = value;                                                                                                                               
-        value /= base;                                                                                                                                   
-        *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];                             
-    } while ( value );                                                                                                                                   
- 
-    // Apply negative sign                                                                                                                               
-    if ( tmp_value < 0 )                                                                                                                                 
-    *ptr++ = '-';                                                                                                                                    
-    *ptr-- = '\0';                                                                                                                                       
- 
-    while ( ptr1 < ptr ) {                                                                                                                               
-    tmp_char = *ptr;                                                                                                                                 
-    *ptr-- = *ptr1;                                                                                                                                  
-    *ptr1++ = tmp_char;                                                                                                                              
-    }                                                                                                                                                    
- 
-    return result;                                                                                                                                       
-}
-
-extern int mdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len);
-
-bool wakeModem()
-{
-    const char * rsp_lst[] = { "OK", "ERROR", NULL };
-    int tries = 60;
-    pc.printf("wake ");
-    while (tries > 0) {
-        tries--; 
-        pc.printf(".");     
-        int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
-        if (rc == 0)
-        {
-            pc.printf("\r\n");
-            return true;
-        } 
-        wait(1.0);
-    }
-    return false;    
-}
-bool rebootModem()
-{
-    mdm.printf("ATZ\r\n");
-    return wakeModem();
-}
-
-
-
-// Sets a global with failure or success, assumes 1 thread all the time
-int send_wnc_cmd(const char * s, string ** r, int ms_timeout)
-{
-  static const char * rsp_lst[] = { "OK", "ERROR", NULL };
-  int len;
-  
-  //pc.printf("Send: %s\r\n",s);
-  int res = mdm_sendAtCmdRsp(s, rsp_lst, ms_timeout, &wncStr, &len);
-  *r = &wncStr;   // Return a pointer to the static string
-      
-  if (res >= 0)
-  {
-      pc.puts("[");
-      pc.puts(wncStr.c_str());
-      pc.puts("]\n\r");
-      if (res > 0)
-      {
-          if (WNC_MDM_ERR != WNC_NO_RESPONSE)
-            WNC_MDM_ERR = WNC_CMD_ERR;
-          return -1;
-      }
-      else
-          return 0;
-  }
-  else
-  {
-      WNC_MDM_ERR = WNC_NO_RESPONSE;
-      pc.puts("No response from WNC!\n\r");
-      NVIC_SystemReset();
-      return -2;
-  }
-}
-
-void at_at_wnc(void)
-{
-    string * pRespStr;
-    send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat?
-}
-
-void at_init_wnc(void)
-{
-  string * pRespStr;
-  send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS);             // Heartbeat?
-  send_wnc_cmd("ATE1", &pRespStr, WNC_TIMEOUT_MS);           // Echo ON
-  string cmd_str("AT%PDNSET=1,");
-  cmd_str += MY_APN_STR;
-  cmd_str += ",IP";
-  send_wnc_cmd(cmd_str.c_str(), &pRespStr, 2*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
-  send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS);  // Internet services enabled
-  send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, WNC_TIMEOUT_MS);
-}
-
-void at_sockopen_wnc(const string & ipStr, const char * port )
-{
-  string * pRespStr;
-  send_wnc_cmd("AT@SOCKCREAT=1", &pRespStr, WNC_TIMEOUT_MS);
-  string cmd_str("AT@SOCKCONN=1,\"");
-  cmd_str += ipStr;
-  cmd_str += "\",";
-  cmd_str += port;
-  send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
-}
-
-void at_sockclose_wnc(void)
-{
-  string * pRespStr;
-  send_wnc_cmd("AT@SOCKCLOSE=1", &pRespStr, WNC_TIMEOUT_MS);
-}
-
-int at_dnsresolve_wnc(const char * s, string * ipStr)
-{
-  string * pRespStr;
-  string str(s);
-  str = "AT@DNSRESVDON=\"" + str;
-  str += "\"\r\n";
-  if (send_wnc_cmd(str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0)
-  {
-    size_t pos_start = pRespStr->find(":\"") + 2;
-    if (pos_start !=  string::npos)
-    {
-      size_t pos_end = pRespStr->rfind("\"") - 1;
-      if (pos_end != string::npos)
-      {
-        if (pos_end > pos_start)
-        {
-          // Make a copy for use later (the source string is re-used)
-          *ipStr = pRespStr->substr(pos_start, pos_end - pos_start + 1);
-          return 1;
-        }
-        else
-          pc.puts("URL Resolve fail, substr Err\r\n");
-      }
-      else
-        pc.puts("URL Resolve fail, no 2nd quote\r\n");
-    }
-    else
-      pc.puts("URL Resolve fail, no quotes\r\n");
-  }
-  else
-    pc.puts("URL Resolve fail, WNC cmd fail\r\n");
-  
-  return -1;
-}
-
-void at_sockwrite_wnc(const char * s)
-{
-  string * pRespStr;
-  char num2str[6];
-  size_t sLen = strlen(s);
-  if (sLen <= 99999)
-  {
-    string cmd_str("AT@SOCKWRITE=1,");
-    itoa(sLen, num2str, 10);
-    cmd_str += num2str;
-    cmd_str += ",\"";
-    while(*s != '\0')
-    {
-      itoa((int)*s++, num2str, 16);
-      // Always 2-digit ascii hex:
-      if (strlen(num2str) == 1)
-      {
-        num2str[2] = '\0';
-        num2str[1] = num2str[0];
-        num2str[0] = '0';
-      }
-      cmd_str += num2str;
-    }
-    cmd_str += "\"";
-    send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
-  }
-  else
-    pc.puts("sockwrite Err, string to long\r\n");
-}
-
-unsigned at_sockread_wnc(string * pS, unsigned n, unsigned retries = 0)
-{
-  unsigned i;
-  string * pRespStr;
-  string cmd_str("AT@SOCKREAD=1,");
-  
-  // Don't assume clean slate:
-  pS->erase();
-  
-  if (n <= 1500)
-  {
-    char num2str[6];
-    
-    itoa(n, num2str, 10);
-    cmd_str += num2str;
-    retries += 1;
-    pc.puts("reading");
-    while (retries--)
-    {
-      // Assuming someone is sending then calling this to receive response, invoke
-      // a pause to give the response some time to come back and then also
-      // between each retry.
-      wait_ms(100);
-      pc.puts(".");
-      send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
-      size_t pos_start = pRespStr->find("\"")  + 1;
-      size_t pos_end   = pRespStr->rfind("\"") - 1;
-      i = pos_end - pos_start + 1;
-      if (i > 0)
-      {
-        retries = 0;  // If any data found stop retrying
-        string byte;
-        while (pos_start < pos_end)
-        {
-          byte = pRespStr->substr(pos_start, 2);
-          *pS += (char)strtol(byte.c_str(), NULL, 16);
-          pos_start += 2;
-        }
-        pc.puts("\r\n");
-        return i;
-      }
-    }
-  }
-  else
-    pc.puts("sockread Err, to many to read\r\n");
-  
-  return 0;
-}
--- a/wnc_control.h	Tue Oct 04 20:29:31 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-
-#ifndef __WNC_CONTROL_H_
-#define __WNC_CONTROL_H_
-
-static const unsigned WNC_TIMEOUT_MS = 5000;
-
-// Core function that sends data to the WNC UART
-extern int send_wnc_cmd(const char * s, string ** r, int ms_timeout);
-
-// Low level command functions
-extern void at_init_wnc(void);
-extern void at_sockopen_wnc(const string & ipStr, const char * port );
-extern void at_sockclose_wnc(void);
-extern int at_dnsresolve_wnc(const char * s, string * ipStr);
-extern void at_sockwrite_wnc(const char * s);
-extern unsigned at_sockread_wnc(string * pS, unsigned n, unsigned retries);
-extern void at_at_wnc(void);
-
-// High level functions that attempt to correct for things going bad with the WNC
-extern void software_init_mdm(void);
-extern void resolve_mdm(void);
-extern void sockopen_mdm(void);
-extern void sockwrite_mdm(const char * s);
-extern unsigned sockread_mdm(string * sockData, int len, int retries);
-extern void sockclose_mdm(void);
-extern int mdm_sendAtCmd(const char *cmd, const char **rsp_list, int timeout_ms);
-
-extern bool rebootModem();
-extern bool wakeModem();
-
-#endif
-
-