GSMA version

Dependencies:   FXOS8700CQ mbed

Fork of AvnetATT_shape_hackathon by Rick McConney

Revision:
42:8500f0cb2ea5
Parent:
41:85a736a9b900
Child:
44:60008ebffdd4
--- 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);