Code to run the controller for the wifi robot

Dependencies:   ESP8266Interface HTTPClient-SSL WebSocketClient mbed-rtos mbed

main.cpp

Committer:
anewton8
Date:
2015-10-20
Revision:
0:e68e51f935d1

File content as of revision 0:e68e51f935d1:

#include "mbed.h"

#define USE_CAP 1
#define USE_WIFI_BASIC 0
#define USE_WIFI_ADVANCED 1

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
Serial pc(USBTX, USBRX); // tx, rx

#if USE_CAP
#include <mpr121.h>
// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p26);
// Setup the i2c bus on pins 9 and 10
I2C i2c(p9, p10);
// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);

void fallInterrupt();
#endif

// WiFi stuff
#if USE_WIFI_BASIC
Serial esp(p28, p27); // tx, rx
DigitalOut reset(p29);
Timer t;

char ssid[32] = "GTother";     // enter WiFi router ssid inside the quotes
char pwd [32] = "GeorgeP@1927"; // enter WiFi router password inside the quotes
int  count,ended,timeout;
char buf[1024];
char snd[255];

void SendCMD(), getreply(), ESPconfig(), ESPsetbaudrate();

void basicWifiSetup();
void basicWifiLoop();
#endif

#if USE_WIFI_ADVANCED
#include "HTTPClient.h"
#include "ESP8266Interface.h"
#include "TCPSocketConnection.h"
#include "Websocket.h"
#include "rtos.h"

const char *httpDest = "http://143.215.98.59/";
ESP8266Interface wifi(p28, p27, p29, "GTother", "GeorgeP@1927", 115200); // TX,RX,Reset,SSID,Password,Baud

HTTPClient http;
char responseBuffer[512];

void advWifiSetup();
void advWifiTest();
void advWifiSendCommand(int val);

Mutex advWifiMutex;
void advWifiThread(void const *args);
int gKeycode = -1;
bool gKeycodeLatch = false;
#endif

int main() {
    pc.printf("====\n\r===\n\r===\n\r=== Reset ====\n\r====\n\r\n\r");
    
    led1 = led2 = led3 = led4 = 0;
    
    #if USE_CAP
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);
    #endif

    // Wifi setup
    #if USE_WIFI_BASIC
    basicWifiSetup();
    #endif
    
    #if USE_WIFI_ADVANCED
    advWifiSetup();
    Thread t2(advWifiThread);
    #endif

    while(1) {
        #if USE_WIFI_BASIC
        basicWifiLoop();
        #endif
        
        #if USE_WIFI_ADVANCED
        //for (int i = 0; i < 2; i++) {
        //    advWifiSendCommand(i);
        //}
        #endif
    }
}

#if USE_CAP
// Light up LEDs with capacitive touch interrupt stuff
void fallInterrupt() {
    int key_code = 0;
    int i = 0;
    
    // Address 0x00 has touch status of 0 - 7 (7, 6, 5, 4, 3, 2, 1, 0)
    // Address 0x01 has touch status of 8 - 11 (X,X,X,X, 11, 10, 9, 8)
    // Combined value is a bitfield type thing
    int value = mpr121.read(0x00);
    value += mpr121.read(0x01) << 8;
    
    // Takes highest set key and uses it
    int bits[12];
    for (i = 0; i < 12; i++) {
        bits[i] = (value >> i) & 0x01;
        if (bits[i] == 1) {
            key_code = i + 1;
        }
    }
    led4 = (key_code >> 0) & 0x01;
    led3 = (key_code >> 1) & 0x01;
    led2 = (key_code >> 2) & 0x01;
    led1 = (key_code >> 3) & 0x01;

    #if USE_WIFI_ADVANCED
    gKeycode = key_code - 1;
    gKeycodeLatch = true;
    #endif
}
#endif

#if USE_WIFI_BASIC
// Sets new ESP8266 baurate, change the esp.baud(xxxxx) to match your new setting once this has been executed
void ESPsetbaudrate()
{
    strcpy(snd, "AT+CIOBAUD=115200\r\n");   // change the numeric value to the required baudrate
    SendCMD();
}
 
//  +++++++++++++++++++++++++++++++++ This is for ESP8266 config only, run this once to set up the ESP8266 +++++++++++++++
void ESPconfig()
{
    wait(5);
    strcpy(snd,"AT\r\n");
    SendCMD();
    wait(1);
    strcpy(snd,"AT\r\n");
    SendCMD();
    wait(1);
    strcpy(snd,"AT\r\n");
    SendCMD();
    timeout=1;
    getreply();
    wait(1);
    pc.printf("\f---------- Starting ESP Config ----------\r\n\n");
 
    pc.printf("---------- Reset & get Firmware ----------\r\n");
    strcpy(snd,"AT+RST\r\n");
    SendCMD();
    timeout=5;
    getreply();
    pc.printf(buf);
 
    wait(2);
 
    pc.printf("\n---------- Get Version ----------\r\n");
    strcpy(snd,"AT+GMR\r\n");
    SendCMD();
    timeout=4;
    getreply();
    pc.printf(buf);
 
    wait(3);
 
    // set CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station)
    pc.printf("\n---------- Setting Mode ----------\r\n");
    strcpy(snd, "AT+CWMODE=1\r\n");
    SendCMD();
    timeout=4;
    getreply();
    pc.printf(buf);
 
    wait(2);
 
    // set CIPMUX to 0=Single,1=Multi
    pc.printf("\n---------- Setting Connection Mode ----------\r\n");
    strcpy(snd, "AT+CIPMUX=1\r\n");
    SendCMD();
    timeout=4;
    getreply();
    pc.printf(buf);
 
    wait(2);
 
    pc.printf("\n---------- Listing Access Points ----------\r\n");
    strcpy(snd, "AT+CWLAP\r\n");
    SendCMD();
    timeout=15;
    getreply();
    pc.printf(buf);
 
    wait(2);
 
    pc.printf("\n---------- Connecting to AP ----------\r\n");
    pc.printf("ssid = %s   pwd = %s\r\n",ssid,pwd);
    strcpy(snd, "AT+CWJAP=\"");
    strcat(snd, ssid);
    strcat(snd, "\",\"");
    strcat(snd, pwd);
    strcat(snd, "\"\r\n");
    SendCMD();
    timeout=10;
    getreply();
    pc.printf(buf);
 
    wait(5);
 
    pc.printf("\n---------- Get IP's ----------\r\n");
    strcpy(snd, "AT+CIFSR\r\n");
    SendCMD();
    timeout=3;
    getreply();
    pc.printf(buf);
 
    wait(1);
 
    pc.printf("\n---------- Get Connection Status ----------\r\n");
    strcpy(snd, "AT+CIPSTATUS\r\n");
    SendCMD();
    timeout=5;
    getreply();
    pc.printf(buf);
 
    pc.printf("\n\n\n  If you get a valid (non zero) IP, ESP8266 has been set up.\r\n");
    pc.printf("  Run this if you want to reconfig the ESP8266 at any time.\r\n");
    pc.printf("  It saves the SSID and password settings internally\r\n");
    wait(10);
}
 
void SendCMD()
{
    esp.printf("%s", snd);
}
 
void getreply()
{
    memset(buf, '\0', sizeof(buf));
    t.start();
    ended=0;
    count=0;
    while(!ended) {
        if(esp.readable()) {
            buf[count] = esp.getc();
            count++;
        }
        if(t.read() > timeout) {
            ended = 1;
            t.stop();
            t.reset();
        }
    }
}

// Basic wifi setup code
void basicWifiSetup() {
    reset=0; //hardware reset for 8266
    pc.baud(9600);  // set what you want here depending on your terminal program speed
    pc.printf("\f\n\r-------------ESP8266 Hardware Reset-------------\n\r");
    wait(0.5);
    reset=1;
    timeout=2;
    getreply();
 
    esp.baud(115200);   // change this to the new ESP8266 baudrate if it is changed at any time.
 
    //ESPsetbaudrate();   //******************  include this routine to set a different ESP8266 baudrate  ******************
 
    ESPconfig();        //******************  include Config to set the ESP8266 configuration  ***********************
}

// Loop for basic wifi stuff
void basicWifiLoop() {
    pc.printf("\n---------- Listing Acces Points ----------\r\n");
    strcpy(snd, "AT+CWLAP\r\n");
    SendCMD();
    timeout=15;
    getreply();
    pc.printf(buf);
    wait(2);
    pc.printf("\n---------- Get IP and MAC ----------\r\n");
    strcpy(snd, "AT+CIFSR\r\n");
    SendCMD();
    timeout=10;
    getreply();
    pc.printf(buf);
    wait(2);
}
#endif

#if USE_WIFI_ADVANCED
// Setup advanced wifi
void advWifiSetup() {
    pc.baud(9600);
    wifi.init(); //Reset
    wifi.connect(); //Use DHCP
    
    advWifiTest(); // Test the connection
}

// Test that the advanced wifi is working with pastebin get/post
void advWifiTest() {
    bool getSuccess = false,
         postSuccess = false;
    
    //GET
    pc.printf("\nTrying to fetch page using GET...\n\r");
    int httpResp = http.get("http://54.175.222.246/get", responseBuffer, 512);//IP address is httpbin.org/get
    if (!httpResp) {
        pc.printf("Page fetched successfully - read %d characters\n\r", strlen(responseBuffer));
        pc.printf("Result: %s\n\r", responseBuffer);
        getSuccess = true;
    } else {
        pc.printf("Error - ret = %d - HTTP return code = %d\n\r", httpResp, http.getHTTPResponseCode());
        getSuccess = false;
    }
    
    //POST
    HTTPMap postDataMap;
    HTTPText responseTextBind(responseBuffer, 512);
    postDataMap.put("Hello", "World");
    postDataMap.put("test", "1234");
    pc.printf("\nTrying to POST data to httpbin.org/post...\n\r");
    httpResp = http.post("http://54.175.222.246/post", postDataMap, &responseTextBind);//IP address is httpbin.org/post
    if (!httpResp) {
      pc.printf("Executed POST successfully - read %d characters\n\r", strlen(responseBuffer));
      pc.printf("Result: %s\n\r", responseBuffer);
      postSuccess = true;
    }
    else {
      pc.printf("Error - ret = %d - HTTP return code = %d\n\r", httpResp, http.getHTTPResponseCode());
      postSuccess = false;
    }
    
    if (getSuccess && postSuccess) {
        pc.printf("\n\r=== WIFI SETUP AND GOOD TO GO====\n\r\n\r");
    } else {
        pc.printf("\n\r=== WIFI BAD - Try at your own risk... ====\n\r\n\r");
    }
}

// Send an advanced wifi command (non-blocking)
// INPUTS:
//    keycode - Keycode from capacitive touch screen
void advWifiSendCommand(int keycode) {
    pc.printf("Send command %d\n\r", keycode);
    
    char sendVal[32];
    switch (keycode) {
        case 2:
            sprintf(sendVal, "fwd");
            break;
        case 5:
            sprintf(sendVal, "left");
            break;
        case 7:
            sprintf(sendVal, "right");
            break;
        case 10:
            sprintf(sendVal, "back");
            break;
        default:
            pc.printf("\tBailing from bad keycode '%d'...\n\r", keycode);
            return; // Bail
    }
    
    // We good to go? Grab a mutex
    //if (!advWifiMutex.trylock()) {
    //    pc.printf("\tFailed to lock mutex. Bailing...\n\r");
    //    return;
    //}
    
    // Clear buffer
    responseBuffer[0] = '\0';
    
    // Setup bindings
    HTTPMap postDataMap;
    HTTPText responseTextBind(responseBuffer, 512);
    postDataMap.put("keycode", sendVal);
    
    pc.printf("Turning: %s with %d\t(%s)\n\r", sendVal, keycode, httpDest);
    int httpResp = http.post(httpDest, postDataMap, &responseTextBind);
    if (!httpResp) {
        pc.printf("\tSuccess!\n\r");
        pc.printf("\tResult: %s\n\r", responseBuffer);
    } else {
        pc.printf("\tFailed!\n\r");
        pc.printf("\tResult: %s\n\r", responseBuffer);
        pc.printf("\tRespVal(%d) \ ResponseCode(%d)\n\r", httpResp, http.getHTTPResponseCode());
    }
    
    //advWifiMutex.unlock();
}

void advWifiThread(void const *args) {
    while(1) {
        if (gKeycodeLatch && gKeycode != -1) {
            advWifiSendCommand(gKeycode);
            gKeycodeLatch = false;
        }
        
        Thread::wait(100);
    }
}
#endif