Rick McConney
/
stripReader
Proximity strip reader
Fork of StarterKit by
Diff: main.cpp
- Revision:
- 42:8500f0cb2ea5
- Parent:
- 41:85a736a9b900
- Child:
- 44:60008ebffdd4
diff -r 85a736a9b900 -r 8500f0cb2ea5 main.cpp --- 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);