Demo Software for Avnet+AT&T IoT kit. / Mbed 2 deprecated AvnetATT_shape_hackathon

Dependencies:   mbed FXOS8700CQ

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 }