Rick McConney
/
stripReader
Proximity strip reader
Fork of StarterKit by
main.cpp
- Committer:
- fkellermavnet
- Date:
- 2016-07-11
- Revision:
- 5:3417b6a84ee3
- Parent:
- 4:f83bedd9cab4
- Child:
- 6:713b4cbf1a7d
- Child:
- 7:489835c87d95
File content as of revision 5:3417b6a84ee3:
#include "mbed.h" #include <cctype> #include <string> #include "SerialBuffered.h" #include "HTS221.h" #include "config_me.h" #include "wnc_control.h" #include "sensors.h" // 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; Serial pc(USBTX, USBRX); SerialBuffered mdm(PTD3, PTD2, 128); DigitalOut led_red(LED_RED); DigitalOut led_green(LED_GREEN); 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 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) { if (cmd && strlen(cmd) > 0) { if (mdm_dbgmask & MDM_DBG_AT_CMDS) { printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd); } mdm.printf("%s\r\n", cmd); } if (rsp_list) { 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) { // disable signal level translator shield_3v3_1v8_sig_trans_ena = 0; // power modem on //off mdm_power_on = 0; //1; // insure modem boots into normal operating mode // and does not go to sleep when powered on mdm_uart2_rx_boot_mode_sel = 1; mdm_wakeup_in = 1; // initialze comm with the modem mdm.baud(115200); // clear out potential garbage while (mdm.readable()) mdm.getc(); mdm_uart1_cts = 0; // enable the signal level translator to start // modem reset process (modem will be powered down) shield_3v3_1v8_sig_trans_ena = 1; // Give the modem 60 secons 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 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) if (cmd && strlen(cmd) > 0) { if (mdm_dbgmask & MDM_DBG_AT_CMDS) { printf(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd); } mdm.printf("%s\r\n", cmd); } if (rsp_list) { rsp->erase(); // Clean up from prior cmd response *len = 0; Timer timer; timer.start(); while (timer.read_ms() < timeout_ms) { int lenCmd = mdm_getline(cmd_buf, sizeof(cmd_buf), timeout_ms - timer.read_ms()); if (lenCmd == 0) continue; if (lenCmd < 0) return MDM_ERR_TIMEOUT; else { *len += lenCmd; *rsp += cmd_buf; } if (mdm_dbgmask & MDM_DBG_AT_CMDS) { printf(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", cmd_buf); } int rsp_idx = 0; while (rsp_list[rsp_idx]) { if (strcasecmp(cmd_buf, rsp_list[rsp_idx]) == 0) { return rsp_idx; } rsp_idx++; } } return MDM_ERR_TIMEOUT; } pc.printf("D %s",rsp); return MDM_OK; } void reinitialize_mdm(void) { // Initialize the modem printf(GRN "Modem RE-initializing..." DEF "\r\n"); if (!mdm_init()) { printf(RED "\n\rModem RE-initialization failed!" DEF "\n"); } printf("\r\n"); } // These are built on the fly string MyServerIpAddress; string MySocketData; // These are to be built on the fly string my_temp; string my_humidity; #define CTOF(x) ((x)*1.8+32) #include "Flow_parameters.h" //******************************************************************************************************************************************** //* Create string that can be sent to flow as an HTTP get //******************************************************************************************************************************************** static Flow_datapoint_t FLOW_DATAPOINT = { .URL_start = FLOW_CALLBACK_URL_START, .URL_end = FLOW_CALLBACK_URL_END, .Device_ID = FLOW_DEVICE_ID }; void GenerateModemString(char * modem_string) { sprintf(modem_string, "%s?deviceID=%s&temp=%s&humidity=%s %s", FLOW_DATAPOINT.URL_start, FLOW_DATAPOINT.Device_ID, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, FLOW_DATAPOINT.URL_end); } //GenerateModemString //Periodic timer Ticker OneMsTicker; volatile bool bTimerExpiredFlag = false; int OneMsTicks = 0; int iTimer1Interval_ms = 1000; //******************************************************************************************************************************************** //* Periodic 1ms timer tick //******************************************************************************************************************************************** void OneMsFunction() { OneMsTicks++; if ((OneMsTicks % iTimer1Interval_ms) == 0) { bTimerExpiredFlag = true; } } //OneMsFunction() int main() { int i; HTS221 hts221; pc.baud(115200); void hts221_init(void); pc.printf(BLU "Hello World from AT&T Shape!\r\n\n\r"); pc.printf(GRN "Initialize the HTS221\n\r"); 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 modem printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n"); i=mdm_init(); if (!i) { pc.printf(RED "Modem initialization failed!" DEF "\n"); while (1); } //Software init software_init_mdm(); // Resolve URL to IP address to connect to resolve_mdm(); sensors_init(); //Create a 1ms timer tick function: OneMsTicker.attach(OneMsFunction, 0.001f) ; iTimer1Interval_ms = 5000; //5 seconds // Send and receive data perpetually while(1) { if (bTimerExpiredFlag) { bTimerExpiredFlag = false; sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature())); sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity()); read_sensors(); //read available external sensors from a PMOD and the on-board motion sensor sockopen_mdm(); char modem_string[512]; GenerateModemString(&modem_string[0]); printf(DEF "Sending to modem : %s\n", modem_string); //sockwrite_mdm("GET \r\n/f653d97537235/a31c2684a02c/d35e42196968fd6/in/flow/climate?deviceID=foo&temp=41.0&humidity=87.33\r\n HTTP/1.1\r\nHost: run-east.att.io:80\r\nAccept: */*\r\n\r\n"); sockwrite_mdm(modem_string); sockread_mdm(&MySocketData, 1024, 20); sockclose_mdm(); } //bTimerExpiredFlag } //forever loop string * pStr; while (1) { send_wnc_cmd("AT", &pStr, WNC_TIMEOUT_MS); } }