Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXOS8700CQ MODSERIAL mbed
Fork of Avnet_ATT_Cellular_IOT by
Revision 61:f6b93129f954, committed 2016-08-01
- Comitter:
- stefanrousseau
- Date:
- Mon Aug 01 18:29:04 2016 +0000
- Parent:
- 60:2aa16fd02dfd
- Child:
- 62:73c564e883e9
- Commit message:
- Moved cellular modem routines from main.cpp to cell_modem.cpp; Moved HTS221 routines from main.cpp to sensors.cpp
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cell_modem.cpp Mon Aug 01 18:29:04 2016 +0000 @@ -0,0 +1,319 @@ +#include "mbed.h" +#include <cctype> +#include <string> +#include "SerialBuffered.h" + +#include "config_me.h" +#include "wnc_control.h" +#include "hardware.h" + +#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 + +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; + +//******************************************************************************************************************************************** +//* Process JSON response messages +//******************************************************************************************************************************************** +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 + +int cell_modem_init() +{ + int i; + + pc.baud(115200); + // 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(); + // Open the socket (connect to the server) + sockopen_mdm(); + return (0); +} + +int cell_modem_Sendreceive(char* tx_string, char* rx_string) +{ + int iStatus = 0; //error by default + printf(DEF "\r\n"); + printf(BLU "Sending to modem : %s" DEF "\r\n", &tx_string[0]); + sockwrite_mdm(&tx_string[0]); + if (sockread_mdm(&MySocketData, 1024, 20)) + { + printf(DEF "\r\n"); + printf(YEL "Read back : %s" DEF "\r\n", &MySocketData[0]); + 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)) + { + strcpy(stringToCharBuf, MySocketData.c_str()); + if (extract_JSON(stringToCharBuf, &rx_string[0])) + { + printf(GRN "JSON : %s" DEF "\n", &rx_string[0]); + iStatus = 1; //all good + } + } + else + { + printf(RED "BUFFER not big enough for sock data!" DEF "\r\n"); + } + } + else + { + printf(RED "No response..." DEF "\r\n"); + } + return iStatus; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cell_modem.h Mon Aug 01 18:29:04 2016 +0000 @@ -0,0 +1,5 @@ +#ifndef __CELL_MODEM_H_ +#define __CELL_MODEM_H_ +int cell_modem_init(); +int cell_modem_Sendreceive(char* tx_string, char* rx_string); +#endif \ No newline at end of file
--- a/hardware.h Sat Jul 30 16:26:22 2016 +0000 +++ b/hardware.h Mon Aug 01 18:29:04 2016 +0000 @@ -1,12 +1,38 @@ #ifndef Hardware_H_ #define Hardware_H_ #include "MODSERIAL.h" +#include "SerialBuffered.h" extern I2C i2c; //SDA, SCL -- define the I2C pins being used extern MODSERIAL pc; //UART to USB host +extern SerialBuffered mdm; //UART to WNC modem //Un-comment the definition below if you want to use the USB rx for another purpose. //otherwise the USB rx will be used to receive virtual sensor data from Avnet's //"Sensor Simulator Dashboard" utility #define USE_VIRTUAL_SENSORS +// 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 + +#endif
--- 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 }
--- a/sensors.cpp Sat Jul 30 16:26:22 2016 +0000 +++ b/sensors.cpp Mon Aug 01 18:29:04 2016 +0000 @@ -2,6 +2,8 @@ #include "sensors.h" #include "hardware.h" #include "FXOS8700CQ.h" +#include "HTS221.h" +#include <string> //I2C for pmod sensors: #define Si1145_PMOD_I2C_ADDR 0xC0 //this is for 7-bit addr 0x60 for the Si7020 @@ -312,7 +314,7 @@ //* Read the FXOS8700CQ - 6-axis combo Sensor Accelerometer and Magnetometer //******************************************************************************************************************************************** bool bMotionSensor_present = false; -void init_motion_sensor() +void Init_motion_sensor() { // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus... // Class instantiation with pin names for the motion sensor on the FRDM-K64F board: @@ -333,9 +335,9 @@ bMotionSensor_present = true; fxos.enable(); } -} //init_motion_sensor +} //Init_motion_sensor() -void read_motion_sensor() +void Read_motion_sensor() { // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus... // Class instantiation with pin names for the motion sensor on the FRDM-K64F board: @@ -359,8 +361,46 @@ sprintf(SENSOR_DATA.AccelY, "%2.3f", fAccelScaled_y); sprintf(SENSOR_DATA.AccelZ, "%2.3f", fAccelScaled_z); } //bMotionSensor_present -} //read_motion_sensor +} //Read_motion_sensor() + + +//******************************************************************************************************************************************** +//* Read the HTS221 temperature & humidity sensor on the Cellular Shield +//******************************************************************************************************************************************** +// These are to be built on the fly +string my_temp; +string my_humidity; +HTS221 hts221; +#define CTOF(x) ((x)*1.8+32) +bool bHTS221_present = false; +void Init_HTS221() +{ + int i; + void hts221_init(void); + i = hts221.begin(); + if (i) + { + bHTS221_present = true; + pc.printf(BLU "HTS221 Detected (0x%02X)\n\r",i); + printf(" Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature())); + printf(" Humid is: %02d %%\n\r",hts221.readHumidity()); + } + else + { + bHTS221_present = false; + pc.printf(RED "HTS221 NOT DETECTED!\n\r"); + } +} //Init_HTS221() + +void Read_HTS221() +{ + if (bHTS221_present) + { + sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature())); + sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity()); + } //bHTS221_present +} //Read_HTS221() #ifdef USE_VIRTUAL_SENSORS bool bUsbConnected = false; @@ -497,14 +537,16 @@ #ifdef USE_VIRTUAL_SENSORS pc.attach(&UsbUartRxCallback, MODSERIAL::RxIrq); #endif + Init_HTS221(); Init_Si7020(); Init_Si1145(); - init_motion_sensor(); + Init_motion_sensor(); } //sensors_init void read_sensors(void) { + Read_HTS221(); Read_Si7020(); Read_Si1145(); - read_motion_sensor(); + Read_motion_sensor(); } //read_sensors