The Hiking Pal tracking device firmware. See full description on the detail page: https://www.hackster.io/bowenfeng/hiking-pal-v1-07c02d

Dependencies:   FXOS8700CQ MODSERIAL mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Revision:
61:f6b93129f954
Parent:
59:7ebb9436b2bd
Child:
63:90d7c69993cd
--- a/main.cpp	Sat Jul 30 16:26:22 2016 +0000
+++ b/main.cpp	Mon Aug 01 18:29:04 2016 +0000
@@ -2,271 +2,18 @@
 #include <cctype>
 #include <string>
 #include "SerialBuffered.h"
-#include "HTS221.h"
 #include "config_me.h"
-#include "wnc_control.h"
 #include "sensors.h"
-
+#include "cell_modem.h"
 #include "hardware.h"
-I2C i2c(PTC11, PTC10);    //SDA, SCL -- define the I2C pins being used
 
-// comment out the following line if color is not supported on the terminal
-#define USE_COLOR
-#ifdef USE_COLOR
- #define BLK "\033[30m"
- #define RED "\033[31m"
- #define GRN "\033[32m"
- #define YEL "\033[33m"
- #define BLU "\033[34m"
- #define MAG "\033[35m"
- #define CYN "\033[36m"
- #define WHT "\033[37m"
- #define DEF "\033[39m"
-#else
- #define BLK
- #define RED
- #define GRN
- #define YEL
- #define BLU
- #define MAG
- #define CYN
- #define WHT
- #define DEF
-#endif
-
-#define MDM_DBG_OFF                             0
-#define MDM_DBG_AT_CMDS                         (1 << 0)
-int mdm_dbgmask = MDM_DBG_OFF;
-
-#define WNC_WAIT_FOR_AT_CMD_MS 40
-
-//Serial         pc(USBTX, USBRX);
+I2C i2c(PTC11, PTC10);    //SDA, SCL -- define the I2C pins being used
 MODSERIAL pc(USBTX, USBRX, 256, 256); // tx, rx with default tx, rx buffer sizes
-
 SerialBuffered mdm(PTD3, PTD2, 4096);
 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);
-
-#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
-
-#define MAX_AT_RSP_LEN                          255
-
-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) {
-    // Per WNC wait:
-    wait_ms(WNC_WAIT_FOR_AT_CMD_MS);
-
-    if (cmd && strlen(cmd) > 0) {
-        if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-            printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
-        }
-        mdm.puts(cmd);
-        mdm.puts("\r\n");
-    }
-
-    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) {
-    // 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 seconds 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);
-
-    // Per WNC wait:
-    wait_ms(WNC_WAIT_FOR_AT_CMD_MS);
-
-    if (cmd && n > 0) {
-        if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
-            printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
-        }
-//        mdm.puts(cmd);
-//        mdm.puts("\r\n");
-        while (n--) {
-            mdm.putc(*cmd++);
-            wait_us(1000);
-        };
-        mdm.putc('\r');
-        wait_us(1000);
-        mdm.putc('\n');
-        wait_us(1000);
-    }
-
-    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;
-    }
-
-    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)
 
 //********************************************************************************************************************************************
 //* Create string with sensor readings that can be sent to flow as an HTTP get
@@ -360,39 +107,8 @@
 } //SetLedColor()
 
 //********************************************************************************************************************************************
-//* Process JSON response messages
+//* Process the JSON response.  In this example we are only extracting a LED color. 
 //********************************************************************************************************************************************
-bool extract_JSON(char* search_field, char* found_string)
-{
-    char* beginquote;
-    char* endquote;
-    beginquote = strchr(search_field, '{'); //start of JSON
-    endquote = strchr(search_field, '}'); //end of JSON
-    if (beginquote)
-    {
-        uint16_t ifoundlen;
-        if (endquote)
-        {
-            ifoundlen = (uint16_t) (endquote - beginquote) + 1;
-            strncpy(found_string, beginquote, ifoundlen );
-            found_string[ifoundlen] = 0; //null terminate
-            return true;
-        }
-        else
-        {
-            endquote = strchr(search_field, '\0'); //end of string...  sometimes the end bracket is missing
-            ifoundlen = (uint16_t) (endquote - beginquote) + 1;
-            strncpy(found_string, beginquote, ifoundlen );
-            found_string[ifoundlen] = 0; //null terminate
-            return false;
-        }
-    }
-    else
-    {
-        return false;
-    }
-} //extract_JSON
-
 bool parse_JSON(char* json_string)
 {
     char* beginquote;
@@ -458,108 +174,48 @@
 } //parse_JSON
 
 int main() {
-    int i;
-    HTS221 hts221;
-    pc.baud(115200);
-    
-    void hts221_init(void);
-
-    // Set LED to RED until init finishes
-    SetLedColor(0x1);
+    static unsigned ledOnce = 0;
 
-    pc.printf(BLU "Hello World from the Cellular IoT Kit!\r\n\n\r");
-    pc.printf(GRN "Initialize the HTS221\n\r");
+    pc.baud(115200);
+    pc.printf(GRN "Hello World from the Cellular IoT Kit!\r\n\r\n");
 
-    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());
-    
+    //Initialize the I2C sensors that are present
     sensors_init();
     read_sensors();
 
+    // Set LED to RED until init finishes
+    SetLedColor(0x1); //Red
     // Initialize the modem
-    printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n");
-    do {
-        i=mdm_init();
-        if (!i) {
-            pc.printf(RED "Modem initialization failed!" DEF "\n");
-        }
-    } while (!i);
-    
-    //Software init
-    software_init_mdm();
- 
-    // Resolve URL to IP address to connect to
-    resolve_mdm();
+    pc.printf("\r\n");
+    cell_modem_init();
+    // Set LED BLUE for partial init
+    SetLedColor(0x4); //Blue
 
     //Create a 1ms timer tick function:
+    iTimer1Interval_ms = SENSOR_UPDATE_INTERVAL_MS;
     OneMsTicker.attach(OneMsFunction, 0.001f) ;
 
-    iTimer1Interval_ms = SENSOR_UPDATE_INTERVAL_MS;
-
-    // Open the socket (connect to the server)
-    sockopen_mdm();
-
-    // Set LED BLUE for partial init
-    SetLedColor(0x4);
-
     // Send and receive data perpetually
     while(1) {
-        static unsigned ledOnce = 0;
         #ifdef USE_VIRTUAL_SENSORS
         ProcessUsbInterface();
         #endif
         if  (bTimerExpiredFlag)
         {
             bTimerExpiredFlag = false;
-            puts("HTS221 START\r\n");
-            sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature()));
-            sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity());
-            puts("READ OTHER SENSORS START\r\n");
             read_sensors(); //read available external sensors from a PMOD and the on-board motion sensor
             char modem_string[512];
-            puts("GENERATE MODEM STRING\r\n");
             GenerateModemString(&modem_string[0]);
-            printf(BLU "\r\nSending to modem : %s" DEF "\r\n", modem_string); 
-            sockwrite_mdm(modem_string);
-            printf("READ START\r\n");
-            if (sockread_mdm(&MySocketData, 1024, 20))
+            char myJsonResponse[512];
+            if (cell_modem_Sendreceive(&modem_string[0], &myJsonResponse[0]))
             {
-                // If any non-zero response from server, make it GREEN one-time
-                //  then the actual FLOW responses will set the color.
                 if (!ledOnce)
                 {
                     ledOnce = 1;
-                    SetLedColor(0x2);
+                    SetLedColor(0x2); //Green
                 }
-                printf(YEL "Read back : %s" DEF "\r\n", &MySocketData[0]);
-                char myJsonResponse[512];
-                char stringToCharBuf[BUF_SIZE_FOR_N_MAX_SOCKREAD*MAX_WNC_SOCKREAD_PAYLOAD+1]; // WNC can return max of 1500 (per sockread)
-                if ((MySocketData.length() + 1) < sizeof(stringToCharBuf))
-                {
-                    puts("STRING COPY\r\n");
-                    strcpy(stringToCharBuf, MySocketData.c_str());
-                    puts("EXTRACT JSON\r\n");
-                    if (extract_JSON(stringToCharBuf, &myJsonResponse[0]))
-                    {
-                        printf(GRN "JSON : %s" DEF "\n", &myJsonResponse[0]);
-                        puts("PARSE JSON\r\n");
-                        parse_JSON(&myJsonResponse[0]);
-                    }
-                }
-                else
-                    puts("BUFFER not big enough for sock data!\r\n");
+                parse_JSON(&myJsonResponse[0]);
             }
-            else
-            {
-                printf(RED "No response..." DEF "\r\n");
-            }
-            puts("SOCKREAD DONE\r\n");
         } //bTimerExpiredFlag
     } //forever loop
 }