GSMA version

Dependencies:   FXOS8700CQ mbed

Fork of AvnetATT_shape_hackathon by Rick McConney

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);
     }
 }