Avnet / Mbed 2 deprecated Avnet_ATT_Cellular_IOT

Dependencies:   FXOS8700CQ MODSERIAL mbed

/media/uploads/kevinkeryk/avnet_logo_tagline_rgb.png

Avnet Cellular IoT Instructions

  • One problematic area is setting the MY_SERVER_URL. When you copy the URL from the flow, you must make sure the MY_SERVER_URL is also set to the appropriate server. It can be either "run-east.att.io" or "run-west.att.io".

Useful Links

Adding Additional Sensors

The FLOW_DEVICE_NAME field must contain the name of the instance of the Virtual Starter Kit in FLOW you will be communicating with. Usually this is "vstarterkit001", but if you have problems communicating you can verify this is correct. Note: This device will not be created until you click the “Initialize” input on the Virtual Device tab of the Starter Kit project in FLOW. At that point, it becomes available in M2X and you can see it as the DEVICE SERIAL field under Devices as in the image below. /media/uploads/JMF/vstarterkit.png

Sensors: When executing, the FRDM-K64F board uploads sensor measurements to AT&T’s Flow environment every 5 seconds, using the Cellular shield board. You can adjust how often you want to do this by editing the SENSOR_UPDATE_INTERVAL_MS value in the header file.

Temperature and humidity: By default, the board reports readings from the HTS221 temperature and humidity sensor. These two values are sent to the HTTP IN /climate port in FLOW with field names “temp” and “humidity”. Temperature is in degrees Fahrenheit and humidity is a %. This default assignment is: iSensorsToReport = TEMP_HUMIDITY_ONLY;

Accelerometer: If you want to expand and use the onboard motion sensor, you can also send 3-axis accelerometer information from the board as “accelX”, “accelY”, and “accelZ”. This is useful if you want to know the stationary position of the board with regards to gravity, or whether it is in motion. These readings are in g’s. To send these values, change the assignment to: iSensorsToReport = TEMP_HUMIDITY_ACCELEROMETER;

PMOD Sensors: If you have a Silicon Labs sensor module that can plug into the PMOD connector on the Cellular shield, you are able to measure proximity, UV light, ambient visible and infrared light from the Si1145 sensor. This PMOD also has a temperature and humidity sensor, but in this case it is redundant. When enabled, the fields “proximity”, “light_uv”, “light_vis” and “light_ir” are also sent. To enable all these sensors, change the assignment to: iSensorsToReport = TEMP_HUMIDITY_ACCELEROMETER_PMODSENSORS;

Connecting the PMOD sensors: Because the pinouts do not align, the SiLabs PMOD sensor board cannot be plugged into the J10 PMOD receptacle on the shield directly. The following wiring instructions must be followed:

SignalJ10ShieldPMOD Color in the image below
VCCPin 6Pin 6Red
GNDPin 5Pin 5Black
SDAPin4Pin 3Green
SCLPin3Pin 2Yellow

/media/uploads/JMF/xyz.jpg

AT&T M2X and FLOW Instructions

M2X & FLOW Instructions

Link to AT&T M2X

M2X

Link to AT&T Flow

FLOW

Avnet WNC-Shield Information

Getting Started with the Avnet WNC-Shield Software

  • This project uses Revision 119 of the MBED library because of I2C implementation differences with the tip (Revision 121).
  • This project uses Revision 4 of the FXOS8700CQ library for sensors.

Easily Modifiable Parameters

Inside the mbed Avnet_ATT_Cellular_IOT project, the parameters needed to customize your board are in the config_me.h file.

  • FLOW parameters: This project assumes you are using a fork of the Starter Kit Base project, which is a reference design created using AT&T’s FLOW (https://flow.att.com) that allows the creation of online virtualization and other IoT functionality. The default parameters in the config_me.h file are done for a specific instance of this project. When you fork the original project, you get your own instance and it will have its own base address. At the bottom of the FLOW environment, when you click on the Endpoints tab, URL information that is specific to your instance is displayed. Of note is the Base URL. In the example below (as in the default mbed project), the Base URL is: https://run-west.att.io/1e464b19cdcde/774c88d68202/86694923d5bf28a/in/flow You have to take note of two parts of this address. The run-west.att.io part is the server URL, and you have to make sure the
  • MY_SERVER_URL field in config_me.h matches this. The rest of the base URL, in green above, needs to be pasted into the FLOW_BASE_URL field.

There is also a FLOW_INPUT_NAME field. This should match the name of the HTTP IN port in the FLOW project that you want to send sensor data to. The default is "/climate", as in the FLOW image below.

/media/uploads/JMF/sf.png

Where is the Binary I compiled

When the COMPILE button is pressed, it compiles your project and links it. The result is placed in the DOWNLOAD folder you use when downloading files from the Internet. It will be called AvnetATT_shape_hackathon_K64F.bin.

Additional Information on Compiling/Configuring

Comprehensive instructions can be found at: Quick Start Instructions

Committer:
fkellermavnet
Date:
Wed Jul 13 20:11:57 2016 +0000
Revision:
26:8d6e7e7cdcae
Merged in my changes with Stefan's (hopefully correctly)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkellermavnet 26:8d6e7e7cdcae 1 #include "mbed.h"
fkellermavnet 26:8d6e7e7cdcae 2 #include <cctype>
fkellermavnet 26:8d6e7e7cdcae 3 #include <string>
fkellermavnet 26:8d6e7e7cdcae 4 #include "SerialBuffered.h"
fkellermavnet 26:8d6e7e7cdcae 5 #include "HTS221.h"
fkellermavnet 26:8d6e7e7cdcae 6 #include "config_me.h"
fkellermavnet 26:8d6e7e7cdcae 7 #include "wnc_control.h"
fkellermavnet 26:8d6e7e7cdcae 8 #include "sensors.h"
fkellermavnet 26:8d6e7e7cdcae 9
fkellermavnet 26:8d6e7e7cdcae 10 #include "hardware.h"
fkellermavnet 26:8d6e7e7cdcae 11 I2C i2c(PTC11, PTC10); //SDA, SCL -- define the I2C pins being used
fkellermavnet 26:8d6e7e7cdcae 12
fkellermavnet 26:8d6e7e7cdcae 13 // comment out the following line if color is not supported on the terminal
fkellermavnet 26:8d6e7e7cdcae 14 #define USE_COLOR
fkellermavnet 26:8d6e7e7cdcae 15 #ifdef USE_COLOR
fkellermavnet 26:8d6e7e7cdcae 16 #define BLK "\033[30m"
fkellermavnet 26:8d6e7e7cdcae 17 #define RED "\033[31m"
fkellermavnet 26:8d6e7e7cdcae 18 #define GRN "\033[32m"
fkellermavnet 26:8d6e7e7cdcae 19 #define YEL "\033[33m"
fkellermavnet 26:8d6e7e7cdcae 20 #define BLU "\033[34m"
fkellermavnet 26:8d6e7e7cdcae 21 #define MAG "\033[35m"
fkellermavnet 26:8d6e7e7cdcae 22 #define CYN "\033[36m"
fkellermavnet 26:8d6e7e7cdcae 23 #define WHT "\033[37m"
fkellermavnet 26:8d6e7e7cdcae 24 #define DEF "\033[39m"
fkellermavnet 26:8d6e7e7cdcae 25 #else
fkellermavnet 26:8d6e7e7cdcae 26 #define BLK
fkellermavnet 26:8d6e7e7cdcae 27 #define RED
fkellermavnet 26:8d6e7e7cdcae 28 #define GRN
fkellermavnet 26:8d6e7e7cdcae 29 #define YEL
fkellermavnet 26:8d6e7e7cdcae 30 #define BLU
fkellermavnet 26:8d6e7e7cdcae 31 #define MAG
fkellermavnet 26:8d6e7e7cdcae 32 #define CYN
fkellermavnet 26:8d6e7e7cdcae 33 #define WHT
fkellermavnet 26:8d6e7e7cdcae 34 #define DEF
fkellermavnet 26:8d6e7e7cdcae 35 #endif
fkellermavnet 26:8d6e7e7cdcae 36
fkellermavnet 26:8d6e7e7cdcae 37 #define MDM_DBG_OFF 0
fkellermavnet 26:8d6e7e7cdcae 38 #define MDM_DBG_AT_CMDS (1 << 0)
fkellermavnet 26:8d6e7e7cdcae 39 int mdm_dbgmask = MDM_DBG_OFF;
fkellermavnet 26:8d6e7e7cdcae 40
fkellermavnet 26:8d6e7e7cdcae 41 Serial pc(USBTX, USBRX);
fkellermavnet 26:8d6e7e7cdcae 42 SerialBuffered mdm(PTD3, PTD2, 128);
fkellermavnet 26:8d6e7e7cdcae 43 DigitalOut led_green(LED_GREEN);
fkellermavnet 26:8d6e7e7cdcae 44 DigitalOut led_red(LED_RED);
fkellermavnet 26:8d6e7e7cdcae 45 DigitalOut led_blue(LED_BLUE);
fkellermavnet 26:8d6e7e7cdcae 46
fkellermavnet 26:8d6e7e7cdcae 47 DigitalOut mdm_uart2_rx_boot_mode_sel(PTC17); // on powerup, 0 = boot mode, 1 = normal boot
fkellermavnet 26:8d6e7e7cdcae 48 DigitalOut mdm_power_on(PTB9); // 0 = turn modem on, 1 = turn modem off (should be held high for >5 seconds to cycle modem)
fkellermavnet 26:8d6e7e7cdcae 49 DigitalOut mdm_wakeup_in(PTC2); // 0 = let modem sleep, 1 = keep modem awake -- Note: pulled high on shield
fkellermavnet 26:8d6e7e7cdcae 50
fkellermavnet 26:8d6e7e7cdcae 51 DigitalOut mdm_reset(PTC12); // active high
fkellermavnet 26:8d6e7e7cdcae 52
fkellermavnet 26:8d6e7e7cdcae 53 DigitalOut shield_3v3_1v8_sig_trans_ena(PTC4); // 0 = disabled (all signals high impedence, 1 = translation active
fkellermavnet 26:8d6e7e7cdcae 54 DigitalOut mdm_uart1_cts(PTD0);
fkellermavnet 26:8d6e7e7cdcae 55
fkellermavnet 26:8d6e7e7cdcae 56 #define TOUPPER(a) (a) //toupper(a)
fkellermavnet 26:8d6e7e7cdcae 57
fkellermavnet 26:8d6e7e7cdcae 58 const char ok_str[] = "OK";
fkellermavnet 26:8d6e7e7cdcae 59 const char error_str[] = "ERROR";
fkellermavnet 26:8d6e7e7cdcae 60
fkellermavnet 26:8d6e7e7cdcae 61 #define MDM_OK 0
fkellermavnet 26:8d6e7e7cdcae 62 #define MDM_ERR_TIMEOUT -1
fkellermavnet 26:8d6e7e7cdcae 63
fkellermavnet 26:8d6e7e7cdcae 64 #define MAX_AT_RSP_LEN 255
fkellermavnet 26:8d6e7e7cdcae 65
fkellermavnet 26:8d6e7e7cdcae 66 ssize_t mdm_getline(char *buff, size_t size, int timeout_ms) {
fkellermavnet 26:8d6e7e7cdcae 67 int cin = -1;
fkellermavnet 26:8d6e7e7cdcae 68 int cin_last;
fkellermavnet 26:8d6e7e7cdcae 69
fkellermavnet 26:8d6e7e7cdcae 70 if (NULL == buff || size == 0) {
fkellermavnet 26:8d6e7e7cdcae 71 return -1;
fkellermavnet 26:8d6e7e7cdcae 72 }
fkellermavnet 26:8d6e7e7cdcae 73
fkellermavnet 26:8d6e7e7cdcae 74 size_t len = 0;
fkellermavnet 26:8d6e7e7cdcae 75 Timer timer;
fkellermavnet 26:8d6e7e7cdcae 76 timer.start();
fkellermavnet 26:8d6e7e7cdcae 77 while ((len < (size-1)) && (timer.read_ms() < timeout_ms)) {
fkellermavnet 26:8d6e7e7cdcae 78 if (mdm.readable()) {
fkellermavnet 26:8d6e7e7cdcae 79 cin_last = cin;
fkellermavnet 26:8d6e7e7cdcae 80 cin = mdm.getc();
fkellermavnet 26:8d6e7e7cdcae 81 if (isprint(cin)) {
fkellermavnet 26:8d6e7e7cdcae 82 buff[len++] = (char)cin;
fkellermavnet 26:8d6e7e7cdcae 83 continue;
fkellermavnet 26:8d6e7e7cdcae 84 } else if (('\r' == cin_last) && ('\n' == cin)) {
fkellermavnet 26:8d6e7e7cdcae 85 break;
fkellermavnet 26:8d6e7e7cdcae 86 }
fkellermavnet 26:8d6e7e7cdcae 87 }
fkellermavnet 26:8d6e7e7cdcae 88 wait_ms(1);
fkellermavnet 26:8d6e7e7cdcae 89 }
fkellermavnet 26:8d6e7e7cdcae 90 buff[len] = (char)NULL;
fkellermavnet 26:8d6e7e7cdcae 91
fkellermavnet 26:8d6e7e7cdcae 92 return len;
fkellermavnet 26:8d6e7e7cdcae 93 }
fkellermavnet 26:8d6e7e7cdcae 94
fkellermavnet 26:8d6e7e7cdcae 95 int mdm_sendAtCmd(const char *cmd, const char **rsp_list, int timeout_ms) {
fkellermavnet 26:8d6e7e7cdcae 96 if (cmd && strlen(cmd) > 0) {
fkellermavnet 26:8d6e7e7cdcae 97 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
fkellermavnet 26:8d6e7e7cdcae 98 printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
fkellermavnet 26:8d6e7e7cdcae 99 }
fkellermavnet 26:8d6e7e7cdcae 100 mdm.printf("%s\r\n", cmd);
fkellermavnet 26:8d6e7e7cdcae 101 }
fkellermavnet 26:8d6e7e7cdcae 102
fkellermavnet 26:8d6e7e7cdcae 103 if (rsp_list) {
fkellermavnet 26:8d6e7e7cdcae 104 Timer timer;
fkellermavnet 26:8d6e7e7cdcae 105 char rsp[MAX_AT_RSP_LEN+1];
fkellermavnet 26:8d6e7e7cdcae 106 int len;
fkellermavnet 26:8d6e7e7cdcae 107
fkellermavnet 26:8d6e7e7cdcae 108 timer.start();
fkellermavnet 26:8d6e7e7cdcae 109 while (timer.read_ms() < timeout_ms) {
fkellermavnet 26:8d6e7e7cdcae 110 len = mdm_getline(rsp, sizeof(rsp), timeout_ms - timer.read_ms());
fkellermavnet 26:8d6e7e7cdcae 111
fkellermavnet 26:8d6e7e7cdcae 112 if (len < 0)
fkellermavnet 26:8d6e7e7cdcae 113 return MDM_ERR_TIMEOUT;
fkellermavnet 26:8d6e7e7cdcae 114
fkellermavnet 26:8d6e7e7cdcae 115 if (len == 0)
fkellermavnet 26:8d6e7e7cdcae 116 continue;
fkellermavnet 26:8d6e7e7cdcae 117
fkellermavnet 26:8d6e7e7cdcae 118 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
fkellermavnet 26:8d6e7e7cdcae 119 printf(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", rsp);
fkellermavnet 26:8d6e7e7cdcae 120 }
fkellermavnet 26:8d6e7e7cdcae 121
fkellermavnet 26:8d6e7e7cdcae 122 if (rsp_list) {
fkellermavnet 26:8d6e7e7cdcae 123 int rsp_idx = 0;
fkellermavnet 26:8d6e7e7cdcae 124 while (rsp_list[rsp_idx]) {
fkellermavnet 26:8d6e7e7cdcae 125 if (strcasecmp(rsp, rsp_list[rsp_idx]) == 0) {
fkellermavnet 26:8d6e7e7cdcae 126 return rsp_idx;
fkellermavnet 26:8d6e7e7cdcae 127 }
fkellermavnet 26:8d6e7e7cdcae 128 rsp_idx++;
fkellermavnet 26:8d6e7e7cdcae 129 }
fkellermavnet 26:8d6e7e7cdcae 130 }
fkellermavnet 26:8d6e7e7cdcae 131 }
fkellermavnet 26:8d6e7e7cdcae 132 return MDM_ERR_TIMEOUT;
fkellermavnet 26:8d6e7e7cdcae 133 }
fkellermavnet 26:8d6e7e7cdcae 134 return MDM_OK;
fkellermavnet 26:8d6e7e7cdcae 135 }
fkellermavnet 26:8d6e7e7cdcae 136
fkellermavnet 26:8d6e7e7cdcae 137 int mdm_init(void) {
fkellermavnet 26:8d6e7e7cdcae 138 // Hard reset the modem (doesn't go through
fkellermavnet 26:8d6e7e7cdcae 139 // the signal level translator)
fkellermavnet 26:8d6e7e7cdcae 140 mdm_reset = 0;
fkellermavnet 26:8d6e7e7cdcae 141
fkellermavnet 26:8d6e7e7cdcae 142 // disable signal level translator (necessary
fkellermavnet 26:8d6e7e7cdcae 143 // for the modem to boot properly). All signals
fkellermavnet 26:8d6e7e7cdcae 144 // except mdm_reset go through the level translator
fkellermavnet 26:8d6e7e7cdcae 145 // and have internal pull-up/down in the module. While
fkellermavnet 26:8d6e7e7cdcae 146 // the level translator is disabled, these pins will
fkellermavnet 26:8d6e7e7cdcae 147 // be in the correct state.
fkellermavnet 26:8d6e7e7cdcae 148 shield_3v3_1v8_sig_trans_ena = 0;
fkellermavnet 26:8d6e7e7cdcae 149
fkellermavnet 26:8d6e7e7cdcae 150 // While the level translator is disabled and ouptut pins
fkellermavnet 26:8d6e7e7cdcae 151 // are tristated, make sure the inputs are in the same state
fkellermavnet 26:8d6e7e7cdcae 152 // as the WNC Module pins so that when the level translator is
fkellermavnet 26:8d6e7e7cdcae 153 // enabled, there are no differences.
fkellermavnet 26:8d6e7e7cdcae 154 mdm_uart2_rx_boot_mode_sel = 1; // UART2_RX should be high
fkellermavnet 26:8d6e7e7cdcae 155 mdm_power_on = 0; // powr_on should be low
fkellermavnet 26:8d6e7e7cdcae 156 mdm_wakeup_in = 1; // wake-up should be high
fkellermavnet 26:8d6e7e7cdcae 157 mdm_uart1_cts = 0; // indicate that it is ok to send
fkellermavnet 26:8d6e7e7cdcae 158
fkellermavnet 26:8d6e7e7cdcae 159 // Now, wait for the WNC Module to perform its initial boot correctly
fkellermavnet 26:8d6e7e7cdcae 160 wait(1.0);
fkellermavnet 26:8d6e7e7cdcae 161
fkellermavnet 26:8d6e7e7cdcae 162 // The WNC module initializes comms at 115200 8N1 so set it up
fkellermavnet 26:8d6e7e7cdcae 163 mdm.baud(115200);
fkellermavnet 26:8d6e7e7cdcae 164
fkellermavnet 26:8d6e7e7cdcae 165 //Now, enable the level translator, the input pins should now be the
fkellermavnet 26:8d6e7e7cdcae 166 //same as how the M14A module is driving them with internal pull ups/downs.
fkellermavnet 26:8d6e7e7cdcae 167 //When enabled, there will be no changes in these 4 pins...
fkellermavnet 26:8d6e7e7cdcae 168 shield_3v3_1v8_sig_trans_ena = 1;
fkellermavnet 26:8d6e7e7cdcae 169
fkellermavnet 26:8d6e7e7cdcae 170 // Now, give the modem 60 secons to start responding by
fkellermavnet 26:8d6e7e7cdcae 171 // sending simple 'AT' commands to modem once per second.
fkellermavnet 26:8d6e7e7cdcae 172 Timer timer;
fkellermavnet 26:8d6e7e7cdcae 173 timer.start();
fkellermavnet 26:8d6e7e7cdcae 174 while (timer.read() < 60) {
fkellermavnet 26:8d6e7e7cdcae 175 const char * rsp_lst[] = { ok_str, error_str, NULL };
fkellermavnet 26:8d6e7e7cdcae 176 int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
fkellermavnet 26:8d6e7e7cdcae 177 if (rc == 0)
fkellermavnet 26:8d6e7e7cdcae 178 return true; //timer.read();
fkellermavnet 26:8d6e7e7cdcae 179 wait_ms(1000 - (timer.read_ms() % 1000));
fkellermavnet 26:8d6e7e7cdcae 180 pc.printf("\r%d",timer.read_ms()/1000);
fkellermavnet 26:8d6e7e7cdcae 181 }
fkellermavnet 26:8d6e7e7cdcae 182 return false;
fkellermavnet 26:8d6e7e7cdcae 183 }
fkellermavnet 26:8d6e7e7cdcae 184
fkellermavnet 26:8d6e7e7cdcae 185 int mdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len) {
fkellermavnet 26:8d6e7e7cdcae 186 static char cmd_buf[3200]; // Need enough room for the WNC sockreads (over 3000 chars)
fkellermavnet 26:8d6e7e7cdcae 187 size_t n = strlen(cmd);
fkellermavnet 26:8d6e7e7cdcae 188 if (cmd && n > 0) {
fkellermavnet 26:8d6e7e7cdcae 189 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
fkellermavnet 26:8d6e7e7cdcae 190 printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
fkellermavnet 26:8d6e7e7cdcae 191 }
fkellermavnet 26:8d6e7e7cdcae 192 while (n--) {
fkellermavnet 26:8d6e7e7cdcae 193 mdm.putc(*cmd++);
fkellermavnet 26:8d6e7e7cdcae 194 wait_ms(1);
fkellermavnet 26:8d6e7e7cdcae 195 };
fkellermavnet 26:8d6e7e7cdcae 196 mdm.putc('\r');
fkellermavnet 26:8d6e7e7cdcae 197 wait_ms(1);
fkellermavnet 26:8d6e7e7cdcae 198 mdm.putc('\n');
fkellermavnet 26:8d6e7e7cdcae 199 wait_ms(1);
fkellermavnet 26:8d6e7e7cdcae 200 }
fkellermavnet 26:8d6e7e7cdcae 201
fkellermavnet 26:8d6e7e7cdcae 202 if (rsp_list) {
fkellermavnet 26:8d6e7e7cdcae 203 rsp->erase(); // Clean up from prior cmd response
fkellermavnet 26:8d6e7e7cdcae 204 *len = 0;
fkellermavnet 26:8d6e7e7cdcae 205 Timer timer;
fkellermavnet 26:8d6e7e7cdcae 206 timer.start();
fkellermavnet 26:8d6e7e7cdcae 207 while (timer.read_ms() < timeout_ms) {
fkellermavnet 26:8d6e7e7cdcae 208 int lenCmd = mdm_getline(cmd_buf, sizeof(cmd_buf), timeout_ms - timer.read_ms());
fkellermavnet 26:8d6e7e7cdcae 209
fkellermavnet 26:8d6e7e7cdcae 210 if (lenCmd == 0)
fkellermavnet 26:8d6e7e7cdcae 211 continue;
fkellermavnet 26:8d6e7e7cdcae 212
fkellermavnet 26:8d6e7e7cdcae 213 if (lenCmd < 0)
fkellermavnet 26:8d6e7e7cdcae 214 return MDM_ERR_TIMEOUT;
fkellermavnet 26:8d6e7e7cdcae 215 else {
fkellermavnet 26:8d6e7e7cdcae 216 *len += lenCmd;
fkellermavnet 26:8d6e7e7cdcae 217 *rsp += cmd_buf;
fkellermavnet 26:8d6e7e7cdcae 218 }
fkellermavnet 26:8d6e7e7cdcae 219
fkellermavnet 26:8d6e7e7cdcae 220 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
fkellermavnet 26:8d6e7e7cdcae 221 printf(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", cmd_buf);
fkellermavnet 26:8d6e7e7cdcae 222 }
fkellermavnet 26:8d6e7e7cdcae 223
fkellermavnet 26:8d6e7e7cdcae 224 int rsp_idx = 0;
fkellermavnet 26:8d6e7e7cdcae 225 while (rsp_list[rsp_idx]) {
fkellermavnet 26:8d6e7e7cdcae 226 if (strcasecmp(cmd_buf, rsp_list[rsp_idx]) == 0) {
fkellermavnet 26:8d6e7e7cdcae 227 return rsp_idx;
fkellermavnet 26:8d6e7e7cdcae 228 }
fkellermavnet 26:8d6e7e7cdcae 229 rsp_idx++;
fkellermavnet 26:8d6e7e7cdcae 230 }
fkellermavnet 26:8d6e7e7cdcae 231 }
fkellermavnet 26:8d6e7e7cdcae 232 return MDM_ERR_TIMEOUT;
fkellermavnet 26:8d6e7e7cdcae 233 }
fkellermavnet 26:8d6e7e7cdcae 234 pc.printf("D %s",rsp);
fkellermavnet 26:8d6e7e7cdcae 235 return MDM_OK;
fkellermavnet 26:8d6e7e7cdcae 236 }
fkellermavnet 26:8d6e7e7cdcae 237
fkellermavnet 26:8d6e7e7cdcae 238 void reinitialize_mdm(void)
fkellermavnet 26:8d6e7e7cdcae 239 {
fkellermavnet 26:8d6e7e7cdcae 240 // Initialize the modem
fkellermavnet 26:8d6e7e7cdcae 241 printf(GRN "Modem RE-initializing..." DEF "\r\n");
fkellermavnet 26:8d6e7e7cdcae 242 if (!mdm_init()) {
fkellermavnet 26:8d6e7e7cdcae 243 printf(RED "\n\rModem RE-initialization failed!" DEF "\n");
fkellermavnet 26:8d6e7e7cdcae 244 }
fkellermavnet 26:8d6e7e7cdcae 245 printf("\r\n");
fkellermavnet 26:8d6e7e7cdcae 246 }
fkellermavnet 26:8d6e7e7cdcae 247 // These are built on the fly
fkellermavnet 26:8d6e7e7cdcae 248 string MyServerIpAddress;
fkellermavnet 26:8d6e7e7cdcae 249 string MySocketData;
fkellermavnet 26:8d6e7e7cdcae 250
fkellermavnet 26:8d6e7e7cdcae 251 // These are to be built on the fly
fkellermavnet 26:8d6e7e7cdcae 252 string my_temp;
fkellermavnet 26:8d6e7e7cdcae 253 string my_humidity;
fkellermavnet 26:8d6e7e7cdcae 254
fkellermavnet 26:8d6e7e7cdcae 255 #define CTOF(x) ((x)*1.8+32)
fkellermavnet 26:8d6e7e7cdcae 256
fkellermavnet 26:8d6e7e7cdcae 257 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 258 //* Create string with sensor readings that can be sent to flow as an HTTP get
fkellermavnet 26:8d6e7e7cdcae 259 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 260 K64F_Sensors_t SENSOR_DATA =
fkellermavnet 26:8d6e7e7cdcae 261 {
fkellermavnet 26:8d6e7e7cdcae 262 .Temperature = "0",
fkellermavnet 26:8d6e7e7cdcae 263 .Humidity = "0",
fkellermavnet 26:8d6e7e7cdcae 264 .AccelX = "0",
fkellermavnet 26:8d6e7e7cdcae 265 .AccelY = "0",
fkellermavnet 26:8d6e7e7cdcae 266 .AccelZ = "0",
fkellermavnet 26:8d6e7e7cdcae 267 .MagnetometerX = "0",
fkellermavnet 26:8d6e7e7cdcae 268 .MagnetometerY = "0",
fkellermavnet 26:8d6e7e7cdcae 269 .MagnetometerZ = "0",
fkellermavnet 26:8d6e7e7cdcae 270 .AmbientLightVis = "0",
fkellermavnet 26:8d6e7e7cdcae 271 .AmbientLightIr = "0",
fkellermavnet 26:8d6e7e7cdcae 272 .UVindex = "0",
fkellermavnet 26:8d6e7e7cdcae 273 .Proximity = "0",
fkellermavnet 26:8d6e7e7cdcae 274 .Temperature_Si7020 = "0",
fkellermavnet 26:8d6e7e7cdcae 275 .Humidity_Si7020 = "0"
fkellermavnet 26:8d6e7e7cdcae 276 };
fkellermavnet 26:8d6e7e7cdcae 277
fkellermavnet 26:8d6e7e7cdcae 278 void GenerateModemString(char * modem_string)
fkellermavnet 26:8d6e7e7cdcae 279 {
fkellermavnet 26:8d6e7e7cdcae 280 switch(iSensorsToReport)
fkellermavnet 26:8d6e7e7cdcae 281 {
fkellermavnet 26:8d6e7e7cdcae 282 case TEMP_HUMIDITY_ONLY:
fkellermavnet 26:8d6e7e7cdcae 283 {
fkellermavnet 26:8d6e7e7cdcae 284 sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, FLOW_URL_TYPE, MY_SERVER_URL);
fkellermavnet 26:8d6e7e7cdcae 285 break;
fkellermavnet 26:8d6e7e7cdcae 286 }
fkellermavnet 26:8d6e7e7cdcae 287 case TEMP_HUMIDITY_ACCELEROMETER:
fkellermavnet 26:8d6e7e7cdcae 288 {
fkellermavnet 26:8d6e7e7cdcae 289 sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s&accelX=%s&accelY=%s&accelZ=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, SENSOR_DATA.AccelX,SENSOR_DATA.AccelY,SENSOR_DATA.AccelZ, FLOW_URL_TYPE, MY_SERVER_URL);
fkellermavnet 26:8d6e7e7cdcae 290 break;
fkellermavnet 26:8d6e7e7cdcae 291 }
fkellermavnet 26:8d6e7e7cdcae 292 case TEMP_HUMIDITY_ACCELEROMETER_PMODSENSORS:
fkellermavnet 26:8d6e7e7cdcae 293 {
fkellermavnet 26:8d6e7e7cdcae 294 sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s&accelX=%s&accelY=%s&accelZ=%s&proximity=%s&light_uv=%s&light_vis=%s&light_ir=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, SENSOR_DATA.AccelX,SENSOR_DATA.AccelY,SENSOR_DATA.AccelZ, SENSOR_DATA.Proximity, SENSOR_DATA.UVindex, SENSOR_DATA.AmbientLightVis, SENSOR_DATA.AmbientLightIr, FLOW_URL_TYPE, MY_SERVER_URL);
fkellermavnet 26:8d6e7e7cdcae 295 break;
fkellermavnet 26:8d6e7e7cdcae 296 }
fkellermavnet 26:8d6e7e7cdcae 297 default:
fkellermavnet 26:8d6e7e7cdcae 298 {
fkellermavnet 26:8d6e7e7cdcae 299 sprintf(modem_string, "Invalid sensor selected\r\n\r\n");
fkellermavnet 26:8d6e7e7cdcae 300 break;
fkellermavnet 26:8d6e7e7cdcae 301 }
fkellermavnet 26:8d6e7e7cdcae 302 } //switch(iSensorsToReport)
fkellermavnet 26:8d6e7e7cdcae 303 } //GenerateModemString
fkellermavnet 26:8d6e7e7cdcae 304
fkellermavnet 26:8d6e7e7cdcae 305
fkellermavnet 26:8d6e7e7cdcae 306 //Periodic timer
fkellermavnet 26:8d6e7e7cdcae 307 Ticker OneMsTicker;
fkellermavnet 26:8d6e7e7cdcae 308 volatile bool bTimerExpiredFlag = false;
fkellermavnet 26:8d6e7e7cdcae 309 int OneMsTicks = 0;
fkellermavnet 26:8d6e7e7cdcae 310 int iTimer1Interval_ms = 1000;
fkellermavnet 26:8d6e7e7cdcae 311 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 312 //* Periodic 1ms timer tick
fkellermavnet 26:8d6e7e7cdcae 313 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 314 void OneMsFunction()
fkellermavnet 26:8d6e7e7cdcae 315 {
fkellermavnet 26:8d6e7e7cdcae 316 OneMsTicks++;
fkellermavnet 26:8d6e7e7cdcae 317 if ((OneMsTicks % iTimer1Interval_ms) == 0)
fkellermavnet 26:8d6e7e7cdcae 318 {
fkellermavnet 26:8d6e7e7cdcae 319 bTimerExpiredFlag = true;
fkellermavnet 26:8d6e7e7cdcae 320 }
fkellermavnet 26:8d6e7e7cdcae 321 } //OneMsFunction()
fkellermavnet 26:8d6e7e7cdcae 322
fkellermavnet 26:8d6e7e7cdcae 323 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 324 //* Set the RGB LED's Color
fkellermavnet 26:8d6e7e7cdcae 325 //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue)
fkellermavnet 26:8d6e7e7cdcae 326 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 327 void SetLedColor(unsigned char ucColor)
fkellermavnet 26:8d6e7e7cdcae 328 {
fkellermavnet 26:8d6e7e7cdcae 329 //Note that when an LED is on, you write a 0 to it:
fkellermavnet 26:8d6e7e7cdcae 330 led_red = !(ucColor & 0x1); //bit 0
fkellermavnet 26:8d6e7e7cdcae 331 led_green = !(ucColor & 0x2); //bit 1
fkellermavnet 26:8d6e7e7cdcae 332 led_blue = !(ucColor & 0x4); //bit 2
fkellermavnet 26:8d6e7e7cdcae 333 } //SetLedColor()
fkellermavnet 26:8d6e7e7cdcae 334
fkellermavnet 26:8d6e7e7cdcae 335 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 336 //* Process JSON response messages
fkellermavnet 26:8d6e7e7cdcae 337 //********************************************************************************************************************************************
fkellermavnet 26:8d6e7e7cdcae 338 bool extract_JSON(char* search_field, char* found_string)
fkellermavnet 26:8d6e7e7cdcae 339 {
fkellermavnet 26:8d6e7e7cdcae 340 char* beginquote;
fkellermavnet 26:8d6e7e7cdcae 341 char* endquote;
fkellermavnet 26:8d6e7e7cdcae 342 beginquote = strchr(search_field, '{'); //start of JSON
fkellermavnet 26:8d6e7e7cdcae 343 endquote = strchr(search_field, '}'); //end of JSON
fkellermavnet 26:8d6e7e7cdcae 344 if (beginquote != 0)
fkellermavnet 26:8d6e7e7cdcae 345 {
fkellermavnet 26:8d6e7e7cdcae 346 uint16_t ifoundlen;
fkellermavnet 26:8d6e7e7cdcae 347 if (endquote != 0)
fkellermavnet 26:8d6e7e7cdcae 348 {
fkellermavnet 26:8d6e7e7cdcae 349 ifoundlen = (uint16_t) (endquote - beginquote) + 1;
fkellermavnet 26:8d6e7e7cdcae 350 strncpy(found_string, beginquote, ifoundlen );
fkellermavnet 26:8d6e7e7cdcae 351 found_string[ifoundlen] = 0; //null terminate
fkellermavnet 26:8d6e7e7cdcae 352 return true;
fkellermavnet 26:8d6e7e7cdcae 353 }
fkellermavnet 26:8d6e7e7cdcae 354 else
fkellermavnet 26:8d6e7e7cdcae 355 {
fkellermavnet 26:8d6e7e7cdcae 356 endquote = strchr(search_field, '\0'); //end of string... sometimes the end bracket is missing
fkellermavnet 26:8d6e7e7cdcae 357 ifoundlen = (uint16_t) (endquote - beginquote) + 1;
fkellermavnet 26:8d6e7e7cdcae 358 strncpy(found_string, beginquote, ifoundlen );
fkellermavnet 26:8d6e7e7cdcae 359 found_string[ifoundlen] = 0; //null terminate
fkellermavnet 26:8d6e7e7cdcae 360 return false;
fkellermavnet 26:8d6e7e7cdcae 361 }
fkellermavnet 26:8d6e7e7cdcae 362 }
fkellermavnet 26:8d6e7e7cdcae 363 else
fkellermavnet 26:8d6e7e7cdcae 364 {
fkellermavnet 26:8d6e7e7cdcae 365 return false;
fkellermavnet 26:8d6e7e7cdcae 366 }
fkellermavnet 26:8d6e7e7cdcae 367 } //extract_JSON
fkellermavnet 26:8d6e7e7cdcae 368
fkellermavnet 26:8d6e7e7cdcae 369 bool parse_JSON(char* json_string)
fkellermavnet 26:8d6e7e7cdcae 370 {
fkellermavnet 26:8d6e7e7cdcae 371 char* beginquote;
fkellermavnet 26:8d6e7e7cdcae 372 char token[] = "\"LED\":\"";
fkellermavnet 26:8d6e7e7cdcae 373 beginquote = strstr(json_string, token );
fkellermavnet 26:8d6e7e7cdcae 374 if ((beginquote != 0))
fkellermavnet 26:8d6e7e7cdcae 375 {
fkellermavnet 26:8d6e7e7cdcae 376 char cLedColor = beginquote[strlen(token)];
fkellermavnet 26:8d6e7e7cdcae 377 printf(GRN "LED Found : %c" DEF "\r\n", cLedColor);
fkellermavnet 26:8d6e7e7cdcae 378 switch(cLedColor)
fkellermavnet 26:8d6e7e7cdcae 379 {
fkellermavnet 26:8d6e7e7cdcae 380 case 'O':
fkellermavnet 26:8d6e7e7cdcae 381 { //Off
fkellermavnet 26:8d6e7e7cdcae 382 SetLedColor(0);
fkellermavnet 26:8d6e7e7cdcae 383 break;
fkellermavnet 26:8d6e7e7cdcae 384 }
fkellermavnet 26:8d6e7e7cdcae 385 case 'R':
fkellermavnet 26:8d6e7e7cdcae 386 { //Red
fkellermavnet 26:8d6e7e7cdcae 387 SetLedColor(1);
fkellermavnet 26:8d6e7e7cdcae 388 break;
fkellermavnet 26:8d6e7e7cdcae 389 }
fkellermavnet 26:8d6e7e7cdcae 390 case 'G':
fkellermavnet 26:8d6e7e7cdcae 391 { //Green
fkellermavnet 26:8d6e7e7cdcae 392 SetLedColor(2);
fkellermavnet 26:8d6e7e7cdcae 393 break;
fkellermavnet 26:8d6e7e7cdcae 394 }
fkellermavnet 26:8d6e7e7cdcae 395 case 'Y':
fkellermavnet 26:8d6e7e7cdcae 396 { //Yellow
fkellermavnet 26:8d6e7e7cdcae 397 SetLedColor(3);
fkellermavnet 26:8d6e7e7cdcae 398 break;
fkellermavnet 26:8d6e7e7cdcae 399 }
fkellermavnet 26:8d6e7e7cdcae 400 case 'B':
fkellermavnet 26:8d6e7e7cdcae 401 { //Blue
fkellermavnet 26:8d6e7e7cdcae 402 SetLedColor(4);
fkellermavnet 26:8d6e7e7cdcae 403 break;
fkellermavnet 26:8d6e7e7cdcae 404 }
fkellermavnet 26:8d6e7e7cdcae 405 case 'M':
fkellermavnet 26:8d6e7e7cdcae 406 { //Magenta
fkellermavnet 26:8d6e7e7cdcae 407 SetLedColor(5);
fkellermavnet 26:8d6e7e7cdcae 408 break;
fkellermavnet 26:8d6e7e7cdcae 409 }
fkellermavnet 26:8d6e7e7cdcae 410 case 'T':
fkellermavnet 26:8d6e7e7cdcae 411 { //Turquoise
fkellermavnet 26:8d6e7e7cdcae 412 SetLedColor(6);
fkellermavnet 26:8d6e7e7cdcae 413 break;
fkellermavnet 26:8d6e7e7cdcae 414 }
fkellermavnet 26:8d6e7e7cdcae 415 case 'W':
fkellermavnet 26:8d6e7e7cdcae 416 { //White
fkellermavnet 26:8d6e7e7cdcae 417 SetLedColor(7);
fkellermavnet 26:8d6e7e7cdcae 418 break;
fkellermavnet 26:8d6e7e7cdcae 419 }
fkellermavnet 26:8d6e7e7cdcae 420 default:
fkellermavnet 26:8d6e7e7cdcae 421 {
fkellermavnet 26:8d6e7e7cdcae 422 break;
fkellermavnet 26:8d6e7e7cdcae 423 }
fkellermavnet 26:8d6e7e7cdcae 424 } //switch(cLedColor)
fkellermavnet 26:8d6e7e7cdcae 425 return true;
fkellermavnet 26:8d6e7e7cdcae 426 }
fkellermavnet 26:8d6e7e7cdcae 427 else
fkellermavnet 26:8d6e7e7cdcae 428 {
fkellermavnet 26:8d6e7e7cdcae 429 return false;
fkellermavnet 26:8d6e7e7cdcae 430 }
fkellermavnet 26:8d6e7e7cdcae 431 } //parse_JSON
fkellermavnet 26:8d6e7e7cdcae 432
fkellermavnet 26:8d6e7e7cdcae 433 int main() {
fkellermavnet 26:8d6e7e7cdcae 434 int i;
fkellermavnet 26:8d6e7e7cdcae 435 HTS221 hts221;
fkellermavnet 26:8d6e7e7cdcae 436 pc.baud(115200);
fkellermavnet 26:8d6e7e7cdcae 437
fkellermavnet 26:8d6e7e7cdcae 438 void hts221_init(void);
fkellermavnet 26:8d6e7e7cdcae 439
fkellermavnet 26:8d6e7e7cdcae 440 // Set LED to RED until init finishes
fkellermavnet 26:8d6e7e7cdcae 441 SetLedColor(0x1);
fkellermavnet 26:8d6e7e7cdcae 442
fkellermavnet 26:8d6e7e7cdcae 443 pc.printf(BLU "Hello World from AT&T Shape!\r\n\n\r");
fkellermavnet 26:8d6e7e7cdcae 444 pc.printf(GRN "Initialize the HTS221\n\r");
fkellermavnet 26:8d6e7e7cdcae 445
fkellermavnet 26:8d6e7e7cdcae 446 i = hts221.begin();
fkellermavnet 26:8d6e7e7cdcae 447 if( i )
fkellermavnet 26:8d6e7e7cdcae 448 pc.printf(BLU "HTS221 Detected! (0x%02X)\n\r",i);
fkellermavnet 26:8d6e7e7cdcae 449 else
fkellermavnet 26:8d6e7e7cdcae 450 pc.printf(RED "HTS221 NOT DETECTED!!\n\r");
fkellermavnet 26:8d6e7e7cdcae 451
fkellermavnet 26:8d6e7e7cdcae 452 printf("Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
fkellermavnet 26:8d6e7e7cdcae 453 printf("Humid is: %02d %%\n\r",hts221.readHumidity());
fkellermavnet 26:8d6e7e7cdcae 454
fkellermavnet 26:8d6e7e7cdcae 455 sensors_init();
fkellermavnet 26:8d6e7e7cdcae 456 read_sensors();
fkellermavnet 26:8d6e7e7cdcae 457
fkellermavnet 26:8d6e7e7cdcae 458 // Initialize the modem
fkellermavnet 26:8d6e7e7cdcae 459 printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n");
fkellermavnet 26:8d6e7e7cdcae 460 do {
fkellermavnet 26:8d6e7e7cdcae 461 i=mdm_init();
fkellermavnet 26:8d6e7e7cdcae 462 if (!i) {
fkellermavnet 26:8d6e7e7cdcae 463 pc.printf(RED "Modem initialization failed!" DEF "\n");
fkellermavnet 26:8d6e7e7cdcae 464 }
fkellermavnet 26:8d6e7e7cdcae 465 } while (!i);
fkellermavnet 26:8d6e7e7cdcae 466
fkellermavnet 26:8d6e7e7cdcae 467 //Software init
fkellermavnet 26:8d6e7e7cdcae 468 software_init_mdm();
fkellermavnet 26:8d6e7e7cdcae 469
fkellermavnet 26:8d6e7e7cdcae 470 // Resolve URL to IP address to connect to
fkellermavnet 26:8d6e7e7cdcae 471 resolve_mdm();
fkellermavnet 26:8d6e7e7cdcae 472
fkellermavnet 26:8d6e7e7cdcae 473 //Create a 1ms timer tick function:
fkellermavnet 26:8d6e7e7cdcae 474 OneMsTicker.attach(OneMsFunction, 0.001f) ;
fkellermavnet 26:8d6e7e7cdcae 475 iTimer1Interval_ms = SENSOR_UPDATE_INTERVAL_MS;
fkellermavnet 26:8d6e7e7cdcae 476
fkellermavnet 26:8d6e7e7cdcae 477 // Set LED BLUE for partial init
fkellermavnet 26:8d6e7e7cdcae 478 SetLedColor(0x4);
fkellermavnet 26:8d6e7e7cdcae 479
fkellermavnet 26:8d6e7e7cdcae 480 // Send and receive data perpetually
fkellermavnet 26:8d6e7e7cdcae 481 while(1) {
fkellermavnet 26:8d6e7e7cdcae 482 static unsigned ledOnce = 0;
fkellermavnet 26:8d6e7e7cdcae 483 if (bTimerExpiredFlag)
fkellermavnet 26:8d6e7e7cdcae 484 {
fkellermavnet 26:8d6e7e7cdcae 485 bTimerExpiredFlag = false;
fkellermavnet 26:8d6e7e7cdcae 486 sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature()));
fkellermavnet 26:8d6e7e7cdcae 487 sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity());
fkellermavnet 26:8d6e7e7cdcae 488 read_sensors(); //read available external sensors from a PMOD and the on-board motion sensor
fkellermavnet 26:8d6e7e7cdcae 489 sockopen_mdm();
fkellermavnet 26:8d6e7e7cdcae 490 char modem_string[512];
fkellermavnet 26:8d6e7e7cdcae 491 GenerateModemString(&modem_string[0]);
fkellermavnet 26:8d6e7e7cdcae 492 printf(BLU "Sending to modem : %s" DEF "\n", modem_string);
fkellermavnet 26:8d6e7e7cdcae 493 sockwrite_mdm(modem_string);
fkellermavnet 26:8d6e7e7cdcae 494 sockread_mdm(&MySocketData, 1024, 20);
fkellermavnet 26:8d6e7e7cdcae 495
fkellermavnet 26:8d6e7e7cdcae 496 // If any non-zero response from server, make it GREEN one-time
fkellermavnet 26:8d6e7e7cdcae 497 // then the actual FLOW responses will set the color.
fkellermavnet 26:8d6e7e7cdcae 498 if ((!ledOnce) && (MySocketData.length() > 0))
fkellermavnet 26:8d6e7e7cdcae 499 {
fkellermavnet 26:8d6e7e7cdcae 500 ledOnce = 1;
fkellermavnet 26:8d6e7e7cdcae 501 SetLedColor(0x2);
fkellermavnet 26:8d6e7e7cdcae 502 }
fkellermavnet 26:8d6e7e7cdcae 503
fkellermavnet 26:8d6e7e7cdcae 504 printf(BLU "Read back : %s" DEF "\n", &MySocketData[0]);
fkellermavnet 26:8d6e7e7cdcae 505 char * myJsonResponse;
fkellermavnet 26:8d6e7e7cdcae 506 if (extract_JSON(&MySocketData[0], &myJsonResponse[0]))
fkellermavnet 26:8d6e7e7cdcae 507 {
fkellermavnet 26:8d6e7e7cdcae 508 printf(GRN "JSON : %s" DEF "\n", &myJsonResponse[0]);
fkellermavnet 26:8d6e7e7cdcae 509 parse_JSON(&myJsonResponse[0]);
fkellermavnet 26:8d6e7e7cdcae 510 }
fkellermavnet 26:8d6e7e7cdcae 511 else
fkellermavnet 26:8d6e7e7cdcae 512 {
fkellermavnet 26:8d6e7e7cdcae 513 printf(RED "JSON : %s" DEF "\n", &myJsonResponse[0]); //most likely an incomplete JSON string
fkellermavnet 26:8d6e7e7cdcae 514 parse_JSON(&myJsonResponse[0]); //This is risky, as the string may be corrupted
fkellermavnet 26:8d6e7e7cdcae 515 }
fkellermavnet 26:8d6e7e7cdcae 516 sockclose_mdm();
fkellermavnet 26:8d6e7e7cdcae 517 } //bTimerExpiredFlag
fkellermavnet 26:8d6e7e7cdcae 518 } //forever loop
fkellermavnet 26:8d6e7e7cdcae 519 }