Rick McConney
/
StarterKit
GSMA version
Fork of AvnetATT_shape_hackathon by
Diff: main.cpp
- Revision:
- 46:733edf15f9e8
- Parent:
- 45:fe90f1fcb4e0
--- a/main.cpp Wed Nov 30 14:50:16 2016 +0000 +++ b/main.cpp Mon Jan 09 18:23:37 2017 +0000 @@ -1,30 +1,14 @@ #include "mbed.h" #include <cctype> #include "SerialBuffered.h" -#include "HTS221.h" #include "config_me.h" -#include "sensors.h" -#include "Proximity.h" #include "Wnc.h" -#include "hardware.h" -#include "att160826.h" - extern SerialBuffered mdm; Wnc wnc; - -I2C i2c(PTC11, PTC10); //SDA, SCL -- define the I2C pins being used -I2C *myi2c; - -#define PROXIMITYON 1 +int seqNum =0; +int msgLen = 10; -#if PROXIMITYON == 1 -att160826_data_t strip_data[2]; -att160826_data_t last_data[2]; -ATT160826 *strips[2]; -#elif PROXIMITYON == 2 -Proximity proximityStrip[2]; -#endif // comment out the following line if color is not supported on the terminal #define USE_COLOR @@ -55,10 +39,6 @@ - - - - int mdm_dbgmask = MDM_DBG_OFF; Serial pc(USBTX, USBRX); @@ -71,16 +51,13 @@ -DigitalIn slot1(PTB3,PullUp); -DigitalIn slot2(PTB10,PullUp); -DigitalIn slot3(PTB11,PullUp); +//DigitalIn slot1(PTB3,PullUp); +//DigitalIn slot2(PTB10,PullUp); +//DigitalIn slot3(PTB11,PullUp); DigitalIn sw2(SW2); -int lastSlot1; -int lastSlot2; -int lastSlot3; -char *iccid; + #define TOUPPER(a) (a) //toupper(a) @@ -90,7 +67,7 @@ #define MAX_AT_RSP_LEN 255 bool toggleLed = false; -int seqNum; + //******************************************************************************************************************************************** @@ -99,277 +76,39 @@ //******************************************************************************************************************************************** void SetLedColor(unsigned char ucColor) { - if(wnc.isPowerSaveOn()) - { - led_red = !0; - led_green = !0; - led_blue = !(ucColor & 0x4); - } - 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 - } + + //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() void system_reset() { - //wnc.passthrough(); printf(RED "\n\rSystem resetting..." DEF "\n"); NVIC_SystemReset(); } - - -#define CTOF(x) ((x)*1.8+32) - -//******************************************************************************************************************************************** -//* Create string with sensor readings that can be sent to flow as an HTTP get -//******************************************************************************************************************************************** -K64F_Sensors_t SENSOR_DATA = -{ - .Temperature = "0", - .Humidity = "0", - .AccelX = "0", - .AccelY = "0", - .AccelZ = "0", - .MagnetometerX = "0", - .MagnetometerY = "0", - .MagnetometerZ = "0", - .AmbientLightVis = "0", - .AmbientLightIr = "0", - .UVindex = "0", - .Proximity = "0", - .Temperature_Si7020 = "0", - .Humidity_Si7020 = "0" -}; - - - -void GenerateModemString(char * modem_string,int sensor,int strip) -{ - switch(sensor) - { -#if PROXIMITYON == 1 - - case PROXIMITY_ONLY: - { - if(strip == -1) - { - seqNum++; - sprintf(modem_string, "GET %s%s?ver=cat1&strip=%d&serial=%s&seq=%d&psm=%d&T=%d&t=%d %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", strip, iccid, seqNum, wnc.isPowerSaveOn(),wnc.gett3412Timer(),wnc.gett3324Timer(),FLOW_URL_TYPE, MY_SERVER_URL); - break; - } - int stripIndex = 0; - if(strip == 3) - stripIndex = 1; - char data[256]; - int i=0; - int index = 0; - index += sprintf(&data[index],"["); - for (i=1; i<SENSORS_PER_STRIP; i++) - { - short p = last_data[stripIndex].sensor[i].sample.prox; - short l = last_data[stripIndex].sensor[i].sample.als_vis; - short r = last_data[stripIndex].sensor[i].sample.als_ir; - if(i<SENSORS_PER_STRIP-1) - index += snprintf(&data[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d},", i,p,l,r); - else - index += snprintf(&data[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d}]", i,p,l,r); - - } - - - seqNum++; - sprintf(modem_string, "GET %s%s?ver=cat1&strip=%d&serial=%s&seq=%d&psm=%d&T=%d&t=%d&data=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", strip, iccid, seqNum, wnc.isPowerSaveOn(),wnc.gett3412Timer(),wnc.gett3324Timer(), data, FLOW_URL_TYPE, MY_SERVER_URL); - break; - } -#elif PROXIMITYON == 2 - case PROXIMITY_ONLY: - { - - char* data0 = proximityStrip[0].getDataStr(); - char* data1 = proximityStrip[1].getDataStr(); - seqNum++; - sprintf(modem_string, "GET %s%s?serial=%s&seq=%d&data=%s&data1=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", iccid, seqNum, data0,data1, FLOW_URL_TYPE, MY_SERVER_URL); - break; - } -#endif - case SWITCH_ONLY: - { - 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, seqNum, data, FLOW_URL_TYPE, MY_SERVER_URL); - break; - } - case TEMP_HUMIDITY_ONLY: - { - sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, FLOW_URL_TYPE, MY_SERVER_URL); - break; - } - case TEMP_HUMIDITY_ACCELEROMETER: - { - sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s&accelX=%s&accelY=%s&accelZ=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, SENSOR_DATA.AccelX,SENSOR_DATA.AccelY,SENSOR_DATA.AccelZ, FLOW_URL_TYPE, MY_SERVER_URL); - break; - } - case TEMP_HUMIDITY_ACCELEROMETER_PMODSENSORS: - { - sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s&accelX=%s&accelY=%s&accelZ=%s&proximity=%s&light_uv=%s&light_vis=%s&light_ir=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, SENSOR_DATA.AccelX,SENSOR_DATA.AccelY,SENSOR_DATA.AccelZ, SENSOR_DATA.Proximity, SENSOR_DATA.UVindex, SENSOR_DATA.AmbientLightVis, SENSOR_DATA.AmbientLightIr, FLOW_URL_TYPE, MY_SERVER_URL); - break; - } - default: - { - sprintf(modem_string, "Invalid sensor selected\r\n\r\n"); - break; - } - } //switch(iSensorsToReport) -} //GenerateModemString - - -//******************************************************************************************************************************************** -//* Process JSON response messages -//******************************************************************************************************************************************** -bool extract_reply(char* search_field, char* found_string) -{ - char* beginquote; - char* endquote; - beginquote = strstr(search_field, "\r\n\r\n"); //start of data - endquote = strchr(search_field, '\0'); - if (beginquote != 0) - { - uint16_t ifoundlen; - if (endquote != 0) - { - ifoundlen = (uint16_t) (endquote - beginquote) + 1; - strncpy(found_string, beginquote, ifoundlen ); - found_string[ifoundlen] = 0; //null terminate - return true; - } - } - - return false; - -} //extract_reply - - -void parse_reply(char* reply) -{ - char *tokens[5]; - int index = 0; - tokens[index++] = strtok(reply," "); - while( index < 5 ) - { - char* token = strtok(NULL, " "); - if(token == NULL) break; - tokens[index++] = token; - } - if(strcmp("PSM",tokens[1]) == 0) - { - - int t3412 = atoi(tokens[3]); - int t3324 = atoi(tokens[4]); - pc.printf("t3412 %d t3324 %d\r\n",t3412,t3324); - // setTauTimer(t3412); - //setActivityTimer(t3324); - - if(strcmp("true",tokens[2]) == 0) - { - pc.printf("PSM ON\r\n"); - wnc.setPowerSave(true,t3412,t3324); - } - else - { - pc.printf("PSM OFF\r\n"); - wnc.setPowerSave(false,t3412,t3324); - } - } + +void GenerateTestString(char * modem_string,int len) +{ + seqNum++; + char data[len+1]; + for(int i = 0;i<len;i++) + data[i] = 'a'; + data[len] = 0; + sprintf(modem_string, "%s", data); } -bool checkSlots() -{ - bool changed = false; - int s1 = !slot1; - int s2 = !slot2; - int s3 = !slot3; - if(lastSlot1 != s1 || lastSlot2 != s2 ||lastSlot3 != s3) - { - pc.printf("slot 1 %d\r\n",s1); - pc.printf("slot 2 %d\r\n",s2); - pc.printf("slot 3 %d\r\n",s3); - changed = true; - } - lastSlot1 = s1; - lastSlot2 = s2; - lastSlot3 = s3; - return changed; -} -#if PROXIMITYON == 1 -bool scanStrip(int id) -{ - bool stripChanged = false; - ATT160826& strip = *strips[id]; - att160826_data_t *data = &strip_data[id]; - bool ok = strip.scan(data); - - if(ok) - { - // printf("%d\r\n",id); - for (int i = 1; i < SENSORS_PER_STRIP;i++) { // ignore first sensor it is blocked - - /* - if (strip_data[id].sensor[i].present) { - printf(" %3d", strip_data[id].sensor[i].sample.prox); - } else { - printf(" %3s", "---"); - } - */ - if (strip_data[id].sensor[i].present) { - - if (abs(last_data[id].sensor[i].sample.prox - strip_data[id].sensor[i].sample.prox) > 50) - { - stripChanged = true; - last_data[id].sensor[i].sample.prox = strip_data[id].sensor[i].sample.prox; - last_data[id].sensor[i].sample.als_vis = strip_data[id].sensor[i].sample.als_vis; - last_data[id].sensor[i].sample.als_ir = strip_data[id].sensor[i].sample.als_ir; - } - - } - } - // printf("\r\n"); - } - else - printf("scan of strip %d failed",id); - return stripChanged; -} -#endif - int main() { - int i; - - HTS221 hts221; pc.baud(115200); - void hts221_init(void); - // Set LED to RED until init finishes SetLedColor(0x1); - pc.printf(BLU "Hello World from AT&T Shape!\r\n\n\r"); - pc.printf(GRN "Initialize the HTS221\n\r"); - - i = hts221.begin(); - if( i ) - pc.printf(BLU "HTS221 Detected! (0x%02X)\n\r",i); - else - pc.printf(RED "HTS221 NOT DETECTED!!\n\r"); - - printf("Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature())); - printf("Humid is: %02d %%\n\r",hts221.readHumidity()); - + pc.printf(BLU "Hello World\r\n\n\r"); // Initialize the modem printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n"); @@ -378,9 +117,8 @@ pc.printf(RED "Modem initialization failed!" DEF "\n"); system_reset(); } - - - iccid = wnc.getIccid(); + + char* iccid = wnc.getIccid(); printf(GRN "ICCID = %s" DEF "\r\n",iccid); @@ -400,136 +138,25 @@ // Set LED BLUE for partial init SetLedColor(0x4); - wnc.setPowerSave(true,wnc.gett3412Timer(),wnc.gett3324Timer()); - -#if PROXIMITYON == 1 - bool stripChanged[2]; - myi2c = new I2C(PTE25, PTE24); - //myi2c = new I2C(PTC11, PTC10); - myi2c->frequency(100000); - ATT160826 strip0 (myi2c, 0); - ATT160826 strip1 (myi2c, 3); - strips[0] = &strip0; - strips[1] = &strip1; - -#elif PROXIMITYON == 2 - - myi2c = new I2C(PTE25, PTE24); + char modem_string[512]; - myi2c->frequency(100000); - Proximity strip0; - Proximity strip1; - proximityStrip[0] = strip0; - proximityStrip[1] = strip1; - proximityStrip[0].init(myi2c, 0x70); - proximityStrip[1].init(myi2c, 0x73); - proximityStrip[0].on(); - proximityStrip[1].on(); - -#endif - - int count = 5*120; - // 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 + while(true) + { toggleLed = !toggleLed; if(toggleLed) SetLedColor(0x2); //green else - SetLedColor(0); //off - -#if PROXIMITYON == 1 - - if(stripChanged[0] == false) - stripChanged[0] = scanStrip(0); - if(stripChanged[1] == false) - stripChanged[1] = scanStrip(1); - -#elif PROXIMITYON == 2 - - printf("scan %d\r\n",count); - bool stripChanged = false; - proximityStrip[0].scan(); - printf("scan0 done %d\r\n",count); - proximityStrip[1].scan(); - printf("scan1 done %d\r\n",count); - stripChanged |= proximityStrip[0].changed(50); - printf("scan0 change %d\r\n",stripChanged); - stripChanged |= proximityStrip[1].changed(50); - printf("scan1 change %d\r\n",stripChanged); - -#else - bool slotsChanged = checkSlots(); -#endif - - char modem_string[512]; - -#if PROXIMITYON == 1 -/* - if(count >= 5*120) - { - stripChanged[0] = true; - stripChanged[1] = true; - } - */ + SetLedColor(0); //off + if(sw2 == 0) - { - stripChanged[0] = true; - stripChanged[1] = true; - } - if(stripChanged[0] || stripChanged[1]) - - -#elif PROXIMITYON == 2 - if(count >= 5*60 || stripChanged ) -#else - if(count >= 5*60 || slotsChanged) -#endif - { - if(wnc.isPowerSaveOn()) - { - wnc.wakeFromPowerSave(); - //wnc.ping("108.244.165.22"); - } - count = 0; - SetLedColor(0x04); //blue - - - -#if PROXIMITYON == 1 - if(stripChanged[0]) - { - GenerateModemString(&modem_string[0],PROXIMITY_ONLY,0); - stripChanged[0] = false; - } - else if (stripChanged[1]) - { - GenerateModemString(&modem_string[0],PROXIMITY_ONLY,3); - stripChanged[1] = false; - } - else - GenerateModemString(&modem_string[0],PROXIMITY_ONLY,-1); -#elif PROXIMITYON == 2 - GenerateModemString(&modem_string[0],PROXIMITY_ONLY,0); -#else - GenerateModemString(&modem_string[0],SWITCH_ONLY,0); -#endif - + { + GenerateTestString(modem_string,msgLen); printf(BLU "Sending to modem : %s" DEF "\r\n", modem_string); - - //if(wnc.connect("108.244.165.22",5005)) // node-red - - + if(wnc.connect(ip,MY_PORT)) // shelf - //if(wnc.connect("52.33.231.251",80)) // car { if(wnc.writeSocket(modem_string)) - { - + { char* mydata; int tries = 8; while(tries > 0) // wait for reply @@ -543,25 +170,11 @@ } if (strlen(mydata) > 0) - { - + { SetLedColor(0x2); // green - //only copy on sucessful send - 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 + sscanf(mydata,"LEN=%d",&msgLen); } - else // no reply reset - { - SetLedColor(0x1); //red - system_reset(); - } } wnc.disconnect(); } @@ -569,11 +182,8 @@ { SetLedColor(0x1); //red system_reset(); - } - if(wnc.isPowerSaveOn()) - wnc.resumePowerSave(); + } } - count++; wait(0.2); } //forever loop }