A simple project for sending button input up to AT&T Flow
Dependencies: FXOS8700CQ MODSERIAL mbed
For instructions on using this program, see the AT&T Starter Kit tutorial on it.
main.cpp
- Committer:
- rfinn
- Date:
- 2016-08-12
- Revision:
- 72:0afdd141157c
- Parent:
- 71:bcbc072b85e1
File content as of revision 72:0afdd141157c:
#include "mbed.h" #include <cctype> #include <string> #include "config_me.h" #include "cell_modem.h" #include "hardware.h" 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 MODSERIAL mdm(PTD3, PTD2, 4096, 4096); DigitalOut led_green(LED_GREEN); DigitalOut led_red(LED_RED); DigitalOut led_blue(LED_BLUE); // interrupts for buttons InterruptIn sw3(SW3); InterruptIn sw2(SW2); // flag - must be volatile as changes within ISR // g_ prefix makes it easier to distinguish it as global volatile int g_sw3_flag = 0; volatile int g_sw2_flag = 0; // SW2 event-triggered interrupt // ISR = interrupt service routine // down = button was pushed down/falling // up = button was released/rising void sw2_isr_down() { g_sw2_flag = 1; // set flag in ISR } void sw2_isr_up() { g_sw2_flag = 0; } // SW3 event-triggered interrupt void sw3_isr_down() { g_sw3_flag = 1; // set flag in ISR } void sw3_isr_up() { g_sw3_flag = 0; } void GenerateModemString(char * modem_string, char btn1, char btn2) { sprintf(modem_string, "serial:%s button1:%c button2:%c\r\n", M2X_DEVICE_SERIAL, btn1, btn2 ); // HTTP method /*sprintf(modem_string, "GET %s%s?serial=%s&button1=%c&button2=%c %s%s\r\n\r\n", FLOW_BASE_PATH, FLOW_INPUT_NAME, M2X_DEVICE_NAME, btn1, btn2, FLOW_URL_TYPE, MY_SERVER_NAME); */ } //GenerateModemString //******************************************************************************************************************************************** //* Set the RGB LED's Color //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue) //******************************************************************************************************************************************** void SetLedColor(unsigned char ucColor) { //Note that when an LED is on, you write a 0 to it: led_red = !(ucColor & 0x1); //bit 0 led_green = !(ucColor & 0x2); //bit 1 led_blue = !(ucColor & 0x4); //bit 2 } //SetLedColor() //******************************************************************************************************************************************** //* Process the JSON response. In this example we are only extracting a LED color. //******************************************************************************************************************************************** bool parse_JSON(char* json_string) { char* beginquote; char token[] = "\"LED\":\""; beginquote = strstr(json_string, token ); if ((beginquote != 0)) { char cLedColor = beginquote[strlen(token)]; PRINTF(GRN "LED Found : %c" DEF "\r\n", cLedColor); switch(cLedColor) { case 'O': { //Off SetLedColor(0); break; } case 'R': { //Red SetLedColor(1); break; } case 'G': { //Green SetLedColor(2); break; } case 'Y': { //Yellow SetLedColor(3); break; } case 'B': { //Blue SetLedColor(4); break; } case 'M': { //Magenta SetLedColor(5); break; } case 'T': { //Turquoise SetLedColor(6); break; } case 'W': { //White SetLedColor(7); break; } default: { break; } } //switch(cLedColor) return true; } else { return false; } } //parse_JSON void send_button_data(char btn1, char btn2) { char modem_string[512]; GenerateModemString(&modem_string[0], btn1, btn2); char myJsonResponse[512]; if (cell_modem_Sendreceive(&modem_string[0], &myJsonResponse[0])) { if (true) { //ledOnce = 1; SetLedColor(0x2); //Green } parse_JSON(&myJsonResponse[0]); } } int main() { //static unsigned ledOnce = 0; pc.baud(115200); PRINTF(GRN "Hello World from the Cellular IoT Kit!\r\n"); PRINTF(GRN "Cellular IoT Buttons!\r\n\r\n"); // SW have a pull-up resistor, so the pin will be at 3.3 V by default // and fall to 0 V when pressed. We therefore need to look for a falling edge // on the pin to fire the interrupt sw3.fall(&sw3_isr_down); sw3.rise(&sw3_isr_up); sw2.fall(&sw2_isr_down); sw2.rise(&sw2_isr_up); // since SW have an external pull-up, we should disable to internal pull-down // resistor that is enabled by default using InterruptIn sw3.mode(PullNone); sw2.mode(PullNone); // Set LED to RED until init finishes SetLedColor(0x1); //Red // Initialize the modem PRINTF("\r\n"); cell_modem_init(); // Set LED BLUE for partial init SetLedColor(0x4); //Blue // Send and receive data perpetually while(1) { if (g_sw3_flag) { printf("%s\n","SW3 Button"); led_green = 0; send_button_data('0','1'); } else { led_green = 1; } if (g_sw2_flag) { printf("%s\n","SW2 Button"); led_blue = 0; send_button_data('1','0'); } else { led_blue = 1; } // put the MCU to sleep until an interrupt wakes it up sleep(); } //forever loop }