
Proximity strip reader
Fork of StarterKit by
Revision 42:8500f0cb2ea5, committed 2016-10-07
- Comitter:
- elmkom
- Date:
- Fri Oct 07 17:01:22 2016 +0000
- Parent:
- 41:85a736a9b900
- Child:
- 43:3979ea0a2df3
- Commit message:
- code
Changed in this revision
--- /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 - -