Proximity strip reader

Dependencies:   mbed sfh7779

Fork of StarterKit by Rick McConney

Files at this revision

API Documentation at this revision

Comitter:
elmkom
Date:
Mon Sep 26 18:02:16 2016 +0000
Parent:
37:ee01f752524a
Child:
39:3bbb3dbb531b
Commit message:
latest

Changed in this revision

Proximity.cpp Show annotated file Show diff for this revision Revisions of this file
Proximity.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 annotated file Show diff for this revision Revisions of this file
wnc_control.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Proximity.cpp	Mon Sep 26 18:02:16 2016 +0000
@@ -0,0 +1,142 @@
+#include "mbed.h"
+#include "Proximity.h"
+
+I2C *proximityi2c;
+short proximityData [NUM_PROXIMIY_SENSORS][3];
+short lastProximityData [NUM_PROXIMIY_SENSORS][3];
+char dataStr[NUM_PROXIMIY_SENSORS*32];
+
+Proximity::Proximity(void)
+{
+
+
+}
+
+void Proximity::init(void)
+{
+    proximityi2c = new I2C(PTE25, PTE24);
+    proximityi2c->frequency(400000);
+}
+
+void Proximity::write_reg(char address,char reg, char cmd)
+{
+    char txbuffer [2];
+    txbuffer[0] = reg;
+    txbuffer[1] = cmd;
+
+    proximityi2c->write(address<<1, txbuffer, 2,false );
+
+} 
+
+void Proximity::write(char address, char cmd)
+{
+    char txbuffer [1];
+    txbuffer[0] = cmd;
+
+    proximityi2c->write(address<<1, txbuffer, 1,false );
+
+}  
+
+unsigned char Proximity::read_reg(char address,char reg)
+{
+    char txbuffer [1];
+    char rxbuffer [1];
+    rxbuffer[0] = 0;
+    txbuffer[0] = reg;
+    proximityi2c->write(address<<1, txbuffer, 1,false );
+    proximityi2c->read(address<<1, rxbuffer, 1 );
+    return (unsigned char)rxbuffer[0];
+}
+void Proximity::off()
+{
+    for(int sensor = 0;sensor<NUM_PROXIMIY_SENSORS;sensor++)
+    {
+        write(MUXADDRESS,1<<sensor); 
+        write_reg(PROXIMITYADDRESS,0x41,0x00);
+    }
+}
+
+void Proximity::on()
+{  
+    for(int sensor = 0;sensor<NUM_PROXIMIY_SENSORS;sensor++)
+    {
+
+        lastProximityData[sensor][0] = 1000;
+        write(MUXADDRESS,1<<sensor); 
+        write_reg(PROXIMITYADDRESS,0x41,Als400Ps400); // initiate ALS: and PS
+        write_reg(PROXIMITYADDRESS,0x42,GainAls64Ir64|C25ma); // set ALS_VIS=ALS_IR GAIN = 64 current 25ma
+    }
+    wait(0.5);
+}
+       
+void Proximity::scan()
+{  
+    for(int sensor = 0;sensor<NUM_PROXIMIY_SENSORS;sensor++)
+    {
+        write(MUXADDRESS,1<<sensor);
+        //proximity_sensor_on(sensor);
+        unsigned char prox_lsb = read_reg(PROXIMITYADDRESS,0x44);
+        unsigned char prox_msb = read_reg(PROXIMITYADDRESS,0x45);
+        unsigned char ALS_lsb = read_reg(PROXIMITYADDRESS,0x46);
+        unsigned char ALS_msb = read_reg(PROXIMITYADDRESS,0x47);
+        unsigned char IR_lsb = read_reg(PROXIMITYADDRESS,0x48);
+        unsigned char IR_msb = read_reg(PROXIMITYADDRESS,0x49);
+    
+        short proximity = prox_msb*256+prox_lsb;
+        short ALS = ALS_msb*256+ALS_lsb;
+        short IR = IR_msb*256+IR_lsb;
+        proximityData[sensor][0] = proximity;
+        proximityData[sensor][1] = ALS;
+        proximityData[sensor][2] = IR;
+        //proximity_sensor_off(sensor);
+        //pc.printf(GRN "Sensor %d = %d, %d, %d\n\r",sensor,proximity,ALS,IR);
+    }
+
+}
+
+bool Proximity::changed(short delta)
+{
+    for(int sensor = 0;sensor<NUM_PROXIMIY_SENSORS;sensor++)
+    {
+        if(abs(proximityData[sensor][0] - lastProximityData[sensor][0]) > delta)
+        {
+            return true;
+        }
+    }
+
+    return false;
+}   
+
+short Proximity::getProximity(int sensor)
+{
+    return proximityData[sensor][0];
+}
+short Proximity::getAmbientLight(int sensor)
+{
+    return proximityData[sensor][1];
+}
+short Proximity::getIR(int sensor)
+{
+    return proximityData[sensor][2];
+}
+
+char* Proximity::getDataStr()
+{
+    int i=0;
+    int index = 0;
+    for (i=0; i<NUM_PROXIMIY_SENSORS; i++)
+    {
+        if(i<NUM_PROXIMIY_SENSORS-1)
+            index += snprintf(&dataStr[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d},", i,proximityData[i][0],proximityData[i][1],proximityData[i][2]);
+        else
+            index += snprintf(&dataStr[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d}", i,proximityData[i][0],proximityData[i][1],proximityData[i][2]);
+        lastProximityData[i][0] = proximityData[i][0];
+        lastProximityData[i][1] = proximityData[i][1];
+        lastProximityData[i][2] = proximityData[i][2];
+    } 
+    return dataStr;
+}
+    
+    
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Proximity.h	Mon Sep 26 18:02:16 2016 +0000
@@ -0,0 +1,55 @@
+#ifndef Proximity_
+#define Proximity_
+
+#define MUXADDRESS 0x70
+#define PROXIMITYADDRESS  0x39
+#define NUM_PROXIMIY_SENSORS 8
+
+#define C25ma 0x00
+#define C50ma 0x01
+#define C100m1 0x02
+#define C200ma 0x03
+    
+#define GainAls1Ir1 (0x00<<2)
+#define GainAls2Ir1 (0x04<<2)
+#define GainAls2Ir2 (0x05<<2)
+#define GainAls64Ir64 (0x0A<<2)
+#define GainAls128Ir64 (0x0D<<2)
+#define GainAls128Ir128 (0x0F<<2)
+    
+#define Als0Ps0 0x00
+#define Als0Ps10 0x01
+#define Als0Ps40 0x02
+#define Als0Ps100 0x03    
+#define Als0Ps400 0x04
+    
+#define Als100Ps0 0x05
+#define Als100Ps100 0x06
+#define Als100Ps400 0x07
+    
+#define Als401Ps0 0x08
+#define Als401Ps100 0x09
+#define Als400Ps0 0x0A   
+#define Als400Ps400 0x0B
+    
+#define Als50Ps50 0x0C
+
+
+class Proximity {
+public:
+    Proximity(void);
+    void init(void);
+    void write_reg(char address,char reg, char cmd);
+    void write(char address, char cmd);
+    unsigned char read_reg(char address,char reg);
+    void off();
+    void on();
+    void scan();
+    bool changed(short delta);
+    short getProximity(int sensor);
+    short getAmbientLight(int sensor);
+    short getIR(int sensor);
+    char* getDataStr();
+};
+
+#endif
\ No newline at end of file
--- a/config_me.h	Wed Sep 21 18:03:43 2016 +0000
+++ b/config_me.h	Mon Sep 26 18:02:16 2016 +0000
@@ -32,8 +32,8 @@
 #define TEMP_HUMIDITY_ONLY                      1
 #define TEMP_HUMIDITY_ACCELEROMETER             2
 #define TEMP_HUMIDITY_ACCELEROMETER_PMODSENSORS 3
-#define PROXIMITY 4
-static int iSensorsToReport = PROXIMITY; //TEMP_HUMIDITY_ONLY; //modify this to change your selection
+#define PROXIMITY_ONLY 4
+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";
--- a/main.cpp	Wed Sep 21 18:03:43 2016 +0000
+++ b/main.cpp	Mon Sep 26 18:02:16 2016 +0000
@@ -6,10 +6,11 @@
 #include "config_me.h"
 #include "wnc_control.h"
 #include "sensors.h"
+#include "Proximity.h"
 
 #include "hardware.h"
 I2C i2c(PTC11, PTC10);    //SDA, SCL -- define the I2C pins being used
-I2C proximityi2c(PTE25, PTE24);
+Proximity proximityStrip;
 
 // comment out the following line if color is not supported on the terminal
 #define USE_COLOR
@@ -67,105 +68,12 @@
 #define MDM_ERR_TIMEOUT                         -1
 
 #define MAX_AT_RSP_LEN                          255
-#define NUM_PROXIMIY_SENSORS 8
-short proximityData [NUM_PROXIMIY_SENSORS][3];
-short lastProximityData [NUM_PROXIMIY_SENSORS][3];
+
 bool proximityChange = false;
-
-void prox_write_reg(char address,char reg, char cmd)
-{
-    char txbuffer [2];
-    txbuffer[0] = reg;
-    txbuffer[1] = cmd;
-    proximityi2c.write(address<<1, txbuffer, 2,false );
-} 
-
-void prox_write(char address, char cmd)
-{
-    char txbuffer [1];
-    txbuffer[0] = cmd;
-    proximityi2c.write(address<<1, txbuffer, 1,false );
-}  
-
-unsigned char prox_read_reg(char address,char reg)
-{
-    char txbuffer [1];
-    char rxbuffer [1];
-    rxbuffer[0] = 0;
-    txbuffer[0] = reg;
-    proximityi2c.write(address<<1, txbuffer, 1,false );
-    proximityi2c.read(address<<1, rxbuffer, 1 );
-    return (unsigned char)rxbuffer[0];
-}
-void proximity_sensor_off(int sensor)
-{
-    prox_write(MUXADDRESS,1<<sensor); 
-    prox_write_reg(PROXIMITYADDRESS,0x41,0x00);
-}
-
-void proximity_sensor_on(int sensor)
-{
-    char C25ma = 0x00;
-    char C50ma = 0x01;
-    char C100m1 = 0x02;
-    char C200ma = 0x03;
-    
-    char GainAls1Ir1 = 0x00<<2;
-    char GainAls2Ir1 = 0x04<<2;
-    char GainAls2Ir2 = 0x05<<2;
-    char GainAls64Ir64 = 0x0A<<2;
-    char GainAls128Ir64 = 0x0D<<2;
-    char GainAls128Ir128 = 0x0F<<2;
-    
-    char Als0Ps0 = 0x00;
-    char Als0Ps10 = 0x01;
-    char Als0Ps40 = 0x02;
-    char Als0Ps100 = 0x03;    
-    char Als0Ps400 = 0x04;
-    
-    char Als100Ps0 = 0x05;
-    char Als100Ps100 = 0x06;
-    char Als100Ps400 = 0x07;
-    
-    char Als401Ps0 = 0x08;
-    char Als401Ps100 = 0x09;
-    char Als400Ps0 = 0x0A;    
-    char Als400Ps400 = 0x0B;
-    
-    char Als50Ps50 = 0x0C;
-     
-
-    prox_write(MUXADDRESS,1<<sensor); 
-    prox_write_reg(PROXIMITYADDRESS,0x41,Als400Ps400); // initiate ALS: and PS
-    prox_write_reg(PROXIMITYADDRESS,0x42,GainAls64Ir64|C25ma); // set ALS_VIS=ALS_IR GAIN = 64 current 25ma
-    wait(0.5);
-}
-       
-short* read_proximity(int sensor)
-{
-    short readings[3];
-   
-    prox_write(MUXADDRESS,1<<sensor);
-    //proximity_sensor_on(sensor);
-    unsigned char prox_lsb = prox_read_reg(PROXIMITYADDRESS,0x44);
-    unsigned char prox_msb = prox_read_reg(PROXIMITYADDRESS,0x45);
-    unsigned char ALS_lsb = prox_read_reg(PROXIMITYADDRESS,0x46);
-    unsigned char ALS_msb = prox_read_reg(PROXIMITYADDRESS,0x47);
-    unsigned char IR_lsb = prox_read_reg(PROXIMITYADDRESS,0x48);
-    unsigned char IR_msb = prox_read_reg(PROXIMITYADDRESS,0x49);
-    
-    short proximity = prox_msb*256+prox_lsb;
-    short ALS = ALS_msb*256+ALS_lsb;
-    short IR = IR_msb*256+IR_lsb;
-    readings[0] = proximity;
-    readings[1] = ALS;
-    readings[2] = IR;
-    //proximity_sensor_off(sensor);
-    //pc.printf(GRN "Sensor %d = %d, %d, %d\n\r",sensor,proximity,ALS,IR);
+bool powerSave = false;
 
 
-    return readings;
-}
+
     
     
 
@@ -177,10 +85,19 @@
 //********************************************************************************************************************************************
 void SetLedColor(unsigned char ucColor)
 {
-    //Note that when an LED is on, you write a 0 to it:
-    led_red = !(ucColor & 0x1); //bit 0
-    led_green = !(ucColor & 0x2); //bit 1
-    led_blue = !(ucColor & 0x4); //bit 2
+    if(powerSave) 
+    {
+        led_red = !0;
+        led_green = !0;
+        led_blue = !0;
+    }
+    else
+    {
+        //Note that when an LED is on, you write a 0 to it:
+        led_red = !(ucColor & 0x1); //bit 0
+        led_green = !(ucColor & 0x2); //bit 1
+        led_blue = !(ucColor & 0x4); //bit 2
+    }
 } //SetLedColor() 
 
 ssize_t mdm_getline(char *buff, size_t size, int timeout_ms) {
@@ -331,7 +248,7 @@
     }
     return false;    
 }
-
+/*
 bool wakeModem()
 {
     const char * rsp_lst[] = { ok_str, error_str, NULL };
@@ -350,7 +267,12 @@
     }
     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)
@@ -504,21 +426,10 @@
 {
     switch(iSensorsToReport)
     {
-        case PROXIMITY:
+        case PROXIMITY_ONLY:
         {
-            char dataStr[NUM_PROXIMIY_SENSORS*32];
-            int i=0;
-            int index = 0;
-            for (i=0; i<NUM_PROXIMIY_SENSORS; i++)
-            {
-                if(i<NUM_PROXIMIY_SENSORS-1)
-                    index += snprintf(&dataStr[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d},", i,proximityData[i][0],proximityData[i][1],proximityData[i][2]);
-                else
-                    index += snprintf(&dataStr[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d}", i,proximityData[i][0],proximityData[i][1],proximityData[i][2]);
-            } 
-            sprintf(modem_string, "GET %s%s?serial=%s&data=[%s] %s%s\r\n\r\n", 
-            FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, dataStr, FLOW_URL_TYPE, MY_SERVER_URL);
-            
+            char* data = proximityStrip.getDataStr();
+            sprintf(modem_string, "GET %s%s?serial=%s&data=[%s] %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, data,  FLOW_URL_TYPE, MY_SERVER_URL);
             break;
         }
         case TEMP_HUMIDITY_ONLY:
@@ -545,25 +456,6 @@
 } //GenerateModemString        
             
             
-//Periodic timer
-Ticker OneMsTicker;
-volatile bool bTimerExpiredFlag = false;
-int OneMsTicks = 0;
-int iTimer1Interval_ms = 1000;
-//********************************************************************************************************************************************
-//* Periodic 1ms timer tick
-//********************************************************************************************************************************************
-void OneMsFunction() 
-{
-    OneMsTicks++;
-    if ((OneMsTicks % iTimer1Interval_ms) == 0)
-    {
-        bTimerExpiredFlag = true;
-    }            
-} //OneMsFunction()
-
-
-
 //********************************************************************************************************************************************
 //* Process JSON response messages
 //********************************************************************************************************************************************
@@ -598,69 +490,133 @@
     }
 } //extract_JSON
 
-bool parse_JSON(char* json_string)
+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);
+    }
+}
+
+void parse_JSON_PSM(char* json_string)
 {
     char* beginquote;
-    char token[] = "\"LED\":\"";
+    char token[] = "\"PSM\":\"";
     beginquote = strstr(json_string, token );
     if ((beginquote != 0))
     {
-        char cLedColor = beginquote[strlen(token)];
-        printf(GRN "LED Found : %c" DEF "\r\n", cLedColor);
-        switch(cLedColor)
+        char mode = beginquote[strlen(token)];
+        printf(GRN "PSM Found : %c" DEF "\r\n", mode);
+        switch(mode)
         {
-            case 'O':
-            { //Off
-                SetLedColor(0);
+            case 'T':
+            { setPowerSave(true);
                 break;
-            }
-            case 'R':
-            { //Red
-                SetLedColor(1);
-                break;
-            }
-            case 'G':
-            { //Green
-                SetLedColor(2);
-                break;
-            }
-            case 'Y':
-            { //Yellow
-                SetLedColor(3);
+            } 
+            case 'F':
+            { setPowerSave(false);
                 break;
-            }
-            case 'B':
-            { //Blue
-                SetLedColor(4);
-                break;
-            }
-            case 'M':
-            { //Magenta
-                SetLedColor(5);
-                break;
-            }
-            case 'T':
-            { //Turquoise
-                SetLedColor(6);
-                break;
-            }
-            case 'W':
-            { //White
-                SetLedColor(7);
-                break;
-            }
-            default:
-            {
-                break;
-            }
-        } //switch(cLedColor)
-        return true;
+            }           
+        } 
+    }
+}
+          
+
+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 false;
+        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;
     }
-} //parse_JSON
+    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);
+}
+
+
 
 int main() {
 
@@ -669,7 +625,7 @@
 
     HTS221 hts221;
     pc.baud(115200);
-    proximityi2c.frequency(400000);
+
 
     
     void hts221_init(void);
@@ -688,37 +644,7 @@
 
     printf("Temp  is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
     printf("Humid is: %02d %%\n\r",hts221.readHumidity());
-    
-        
-    //test
-  /*  
-    int count = 0;
-    while(count < 4)
-    {
-        if(count == 0)
-            proximity_sensor_on(i);
-        for(int i = 0;i<NUM_PROXIMIY_SENSORS;i++)
-        {
-                
-                short* readings = read_proximity(i);
-                proximityData[i][0] = readings[0];  
-                proximityData[i][1] = readings[1];
-                proximityData[i][2] = readings[2];
-        }
-        proximity_sensor_off(i);
-        wait(2);
-        count++;
-    }
-*/
 
-    for(int i = 0;i<NUM_PROXIMIY_SENSORS;i++)
-    {               
-        proximity_sensor_on(i); 
-        lastProximityData[i][0] = 1000;                       
-    }
-            
-    sensors_init();
-    read_sensors();
 
     // Initialize the modem
     printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n");
@@ -737,102 +663,81 @@
     // Resolve URL to IP address to connect to
     resolve_mdm();
 
-    //Create a 1ms timer tick function:
-    //OneMsTicker.attach(OneMsFunction, 0.001f) ;
-
-   // iTimer1Interval_ms = SENSOR_UPDATE_INTERVAL_MS;
-
-    // Open the socket (connect to the server)
     sockopen_mdm();
 
     // Set LED BLUE for partial init
     SetLedColor(0x4);
+    
+    setTauTimer(12*60*60);
+    setActivityTimer(20);
    
+    proximityStrip.init();
+   
+    proximityStrip.on();        
+
+    int count = 0;
     // Send and receive data perpetually
     while(1) {
-        static unsigned ledOnce = 0;
-        if  (true || bTimerExpiredFlag)
-        {
+       
+
+        //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
             
-            bTimerExpiredFlag = false;
-            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
+        SetLedColor(0x2); //green       
+            
+        proximityStrip.scan();
+                
+        SetLedColor(0); //off 
             
-            SetLedColor(0x2); //green       
-            for(int i = 0;i<NUM_PROXIMIY_SENSORS;i++)
-            {     
-                        
-                short* readings = read_proximity(i);
-                proximityData[i][0] = readings[0];  
-                proximityData[i][1] = readings[1];
-                proximityData[i][2] = readings[2];  
-                if(abs(proximityData[i][0] - lastProximityData[i][0]) > 50)
-                {
-                    proximityChange = true;
-                }                     
-            }
-           
+        if(count >= 5*60 ||proximityStrip.changed(50))
+        {
+            count = 0;
+            SetLedColor(0x04); //blue
                 
-            SetLedColor(0); //off 
+            char modem_string[512];
+            GenerateModemString(&modem_string[0]);
+            printf(BLU "Sending to modem : %s" DEF "\r\n", modem_string);
+            wakeModem(); 
+            sockwrite_mdm(modem_string);
+            sockread_mdm(&MySocketData, 1024, 20);
             
-            if(proximityChange)
-            {
-                SetLedColor(0x04); //blue
-                proximityChange = false;
-                char modem_string[512];
-                GenerateModemString(&modem_string[0]);
-                printf(BLU "Sending to modem : %s" DEF "\r\n", modem_string);
-                wakeModem(); 
-                sockwrite_mdm(modem_string);
-                sockread_mdm(&MySocketData, 1024, 20);
-            
-                // 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 any non-zero response from server, make it GREEN one-time
+            //  then the actual FLOW responses will set the color.
+            if (MySocketData.length() > 0)
+            {   
                                 
-                    SetLedColor(0x2); // green
-                    //only copy on sucessful send
-                    for(int i = 0;i<NUM_PROXIMIY_SENSORS;i++)
-                    { 
-                        lastProximityData[i][0] =  proximityData[i][0];
-                    }
-                    printf(BLU "Read back : %s" DEF "\r\n", &MySocketData[0]);
-                    char myJsonResponse[512];
-                    if (extract_JSON(&MySocketData[0], &myJsonResponse[0]))
-                    {
-                        printf(GRN "JSON : %s" DEF "\r\n", &myJsonResponse[0]);
-                        //parse_JSON(&myJsonResponse[0]);
-                    }
-                    else
-                    {
-                        printf(RED "JSON : %s" DEF "\r\n", &myJsonResponse[0]); //most likely an incomplete JSON string
-                        //parse_JSON(&myJsonResponse[0]); //This is risky, as the string may be corrupted
-                    }
-                    SetLedColor(0); // off             
+                SetLedColor(0x2); // green
+                //only copy on sucessful send
+
+                printf(BLU "Read back : %s" DEF "\r\n", &MySocketData[0]);
+                char myJsonResponse[512];
+                if (extract_JSON(&MySocketData[0], &myJsonResponse[0]))
+                {
+                    printf(GRN "JSON : %s" DEF "\r\n", &myJsonResponse[0]);
+                    parse_JSON_PSM(&myJsonResponse[0]);
                 }
-                else
+                SetLedColor(0); // off             
+            }
+            else
+            {
+                SetLedColor(0x1); //red
+                // reset socket if read fails
+                if(sendAttemps < 2)
                 {
-                   SetLedColor(0x1); //red
-                   // reset socket if read fails
-                   if(sendAttemps < 2)
-                   {
-                        sendAttemps++;
-                        sockclose_mdm();
-                        sockopen_mdm();
-                    }
-                    else // give up and do full reset
-                    {
+                    sendAttemps++;
+                    sockclose_mdm();
+                    sockopen_mdm();
+                }
+                else // give up and do full reset
+                {
+                    if(!rebootModem())
                         system_reset();
-                    }
+                }
                    
-                } 
-            
-                
-            }
-            wait(0.2);
-        } //bTimerExpiredFlag
-        
+            }    
+        }
+        count++;
+        wait(0.2); 
     } //forever loop
 }
--- a/wnc_control.cpp	Wed Sep 21 18:03:43 2016 +0000
+++ b/wnc_control.cpp	Mon Sep 26 18:02:16 2016 +0000
@@ -72,7 +72,11 @@
         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);
@@ -188,6 +192,29 @@
 
 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)
 {
@@ -216,6 +243,7 @@
   {
       WNC_MDM_ERR = WNC_NO_RESPONSE;
       pc.puts("No response from WNC!\n\r");
+      NVIC_SystemReset();
       return -2;
   }
 }
--- a/wnc_control.h	Wed Sep 21 18:03:43 2016 +0000
+++ b/wnc_control.h	Mon Sep 26 18:02:16 2016 +0000
@@ -23,6 +23,10 @@
 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