![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
FRDM-K64F, Avnet M14A2A, Grove Shield, to create smart home system. In use with AT&Ts M2x & Flow.
Dependencies: mbed FXOS8700CQ MODSERIAL
Diff: main.cpp
- Revision:
- 2:0e2ef866af95
- Parent:
- 1:af7a42f7d465
- Child:
- 3:26b3cc155f39
--- a/main.cpp Sat Jul 09 00:45:53 2016 +0000 +++ b/main.cpp Sun Jul 10 00:52:49 2016 +0000 @@ -3,6 +3,9 @@ #include <string> #include "SerialBuffered.h" #include "HTS221.h" +#include "config_me.h" +#include "wnc_control.h" + // comment out the following line if color is not supported on the terminal #define USE_COLOR @@ -54,56 +57,6 @@ #define MAX_AT_RSP_LEN 255 -// -// The modem will return strings of HEX encoded data. This function takes -// a pointer to a string of HEX ASCII data and converts it into a string -// of ASCII data. It takes a pointer to the string of HEX ASCII data and -// a pointer to the destination string. It returns the number of characters -// it converted. -// -int DecodeASCIIstr(string& ins, string& outs) { - int val, n = 0; - char ts[] = {0,0,0}; - - while(n<ins.length()) { - ts[0] = ins[n]; - ts[1] = ins[n+1]; - sscanf(ts,"%X",&val); - sprintf(ts,"%c",val); - outs.append(ts); - n += 2; - } - return outs.length(); -} - - -// -// Modem expects data to be passed to it in the form of HEX encoded strings. This -// function takes a pointer to a users supplied ASCII string, and converts it into -// an ASCII string of equivelent HEX numbers encoded as a string. The function takes -// a pointer to the users input string, and a pointer to the output string. The -// function returns the number of characters converted or 0 if an error occurs or more -// than 750 characters were converted. The 750 chacter limit is because the modem -// will only accept up to 1500 characters, and the converted srings will be 2x the -// input string since the hex representation of 1 character is a two digit hex value. -// -int CreateASCIIstr(string& ins, string& outs) { - int i = 0; - char ts[3]; - - if( ins.length() > 749 ) - return 0; - - while(ins[i] != 0x00) { - sprintf(ts,"%02X", ins[i]); - outs.append(ts); - i++; - } - return outs.length(); -} - - - ssize_t mdm_getline(char *buff, size_t size, int timeout_ms) { int cin = -1; int cin_last; @@ -128,7 +81,7 @@ } wait_ms(1); } - buff[len] = NULL; + buff[len] = (char)NULL; return len; } @@ -189,6 +142,10 @@ // initialze comm with the modem mdm.baud(115200); + // clear out potential garbage + while (mdm.readable()) + mdm.getc(); + mdm_uart1_cts = 0; // enable the signal level translator to start @@ -210,15 +167,76 @@ 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) + + 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) { + 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 reinitialize_mdm(void) +{ + // Initialize the modem + printf(GRN "Modem RE-initializing..." DEF "\r\n"); + if (!mdm_init()) { + printf(RED "\n\rModem RE-initialization failed!" DEF "\n"); + } + printf("\r\n"); +} +// These are built on the fly +string MyServerIpAddress; +string MySocketData; + +// These are to be built on the fly +string my_temp; +string my_humidity; + #define CTOF(x) ((x)*1.8+32) int main() { + int i; HTS221 hts221; pc.baud(115200); - int i, - CreateASCIIstr(string& in, string& out), - DecodeASCIIstr(string& ins, string& outs); - string ins, outs; void hts221_init(void); @@ -233,15 +251,6 @@ printf("Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature())); printf("Humid is: %02d %%\n\r",hts221.readHumidity()); - - string newstr, outstr, instr = "0123456789aAbBcCdDeEfFxXyYzZ"; - pc.printf("\n\rTest ASCII String creation: \n\r"); - i = CreateASCIIstr(instr,outstr); - pc.printf(">Initially the string is '%s' (%d long)\n\r>after encode it is '%s' (%d characters long).\n\r", - instr.c_str(),instr.length(),outstr.c_str(),i); - i = DecodeASCIIstr(outstr, newstr); - pc.printf(">after decoding the encoded string, it is '%s' (%d long)\n\r\n\r",newstr.c_str(),i); - // Initialize the modem printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n"); @@ -251,34 +260,23 @@ while (1); } - // Now that the modem is up and running, transfer characters - // between the pc terminal and the modem to give the user - // a virtual terminal to the modem. - pc.printf(YEL "\rAT command interface ready, completed in %d seconds. You may now type AT commands" DEF "\r\n",i); - - while(1) { - if(pc.readable()) { - char char_in = TOUPPER(pc.getc()); - - static char last_char_in = 0; + //Software init + software_init_mdm(); + + // Resolve URL to IP address to connect to + resolve_mdm(); - if (('\r' == char_in) || ('\n' == char_in)) - { - if (('\r' == char_in) || ('\r' != last_char_in)) - { - mdm.puts("\r\n"); - } - } - else - { - pc.putc(char_in); - mdm.putc(char_in); - } - last_char_in = char_in; - } - if(mdm.readable()) { - char ser_char = mdm.getc(); - pc.putc(ser_char); - } + // Send and receive data perpetually + while(1) { + sockopen_mdm(); + sockwrite_mdm("GET /f653d97537235/a31c2684a02c/d35e42196968fd6/in/flow/climate?deviceID=e5ee19804bd500c8fe69a809342384c2&temp=41.0&humidity=87.33 HTTP/1.1 Host: run-east.att.io:80 Accept: */*\r\n\r\n"); + sockread_mdm(&MySocketData, 1024, 20); + sockclose_mdm(); + } + + string * pStr; + while (1) + { + send_wnc_cmd("AT", &pStr, WNC_TIMEOUT_MS); } }