ECE 4180 final project. Used to connected with both Adafruit Huzzah WiFi and Adafruit Bluetooth LE UART.

Dependents:   WirelessInterface_Demo

Huzzah.cpp

Committer:
gboggs3
Date:
2016-04-28
Revision:
1:67c95e75c998
Parent:
0:ee4d2deea4be

File content as of revision 1:67c95e75c998:

/*===================================================================
--------------------- Huzzah.cpp ----------------------
*Description

Written for:
    Georgia Institute of Technology
    ECE 4180, Final Project
    Dr. James Hamblen
    
Authors:
    Garren Boggs
    David Cox
    Anthony Jones
    Parth Patel
===================================================================*/

#include "mbed.h"
#include "Huzzah.h"

char buf[2024];
char snd[1024];
 
char ssid[32];
char pwd [32]; 
int  count,ended,timeout;
//Timer t;

Huzzah :: Huzzah(PinName tx, PinName rx, PinName rst, RawSerial dev, int baudrate) : 
    _cmd(tx, rx), _rst(rst),
#if DEBUGMODE
    _dev(USBTX, USBRX)
#else
    _dev(dev)
#endif
{
    _cmd.baud(baudrate);
    _dev.baud(baudrate);    
    _cmd.attach(this, &Huzzah::send, Serial::RxIrq);
    _dev.attach(this, &Huzzah::recv, Serial::RxIrq);
#if DEBUGMODE
    _dev.printf("Initializing the Huzzah ESP8622...\n\r");
#endif
    reset();
    ESPSetBaudrate(baudrate);
    timeout=2;
    getReply();
}

// Sets new ESP8266 baurate, change the esp.baud(xxxxx) to match your new setting once this has been executed
void Huzzah :: ESPSetBaudrate(int speed)
{
    memset(buf, '\0', sizeof(buf));
    sprintf(buf, "AT+CIOBAUD=%d\r\n", speed);
    strcpy(snd, buf);
    SendCMD();
    _dev.printf("\f\n\r-------------ESP8266 Baudrate Set-------------\n\r");
    _dev.printf("ESP Baudrate set to %d\n\r",speed);
}

/**
*
*/ 
void Huzzah :: configure(char* SSID, char* PASSWORD)
{
    ESPConfig(SSID,PASSWORD);
}

//  +++++++++++++++++++++++++++++++++ This is for ESP8266 config only, run this once to set up the ESP8266 +++++++++++++++
void Huzzah :: ESPConfig(char* SSID, char* PASSWORD)
{
    //Resets the device to clear current configuration
    reset();
    
    //Clear the current SSID and password of connection
    memset(&ssid[0], '\0', sizeof(ssid));
    memset(&pwd[0], '\0', sizeof(pwd));
    
    //Set the SSID and password of connection
    strcpy(ssid, SSID);
    strcpy(pwd, PASSWORD);
    
    
    
    wait(5);
    _dev.printf("\f---------- Starting ESP Configuration ----------\r\n\n");
        strcpy(snd,".\r\n.\r\n");
    SendCMD();
    
    wait(1);
    _dev.printf("---------- Reset & get Firmware ----------\r\n");
    strcpy(snd,"node.restart()\r\n");
    SendCMD();
    timeout=5;
    getReply();
    _dev.printf(buf);
 
    wait(2);
    _dev.printf("\n---------- Get Version ----------\r\n");
    strcpy(snd,"print(node.info())\r\n");
    SendCMD();
    timeout=4;
    getReply();
    _dev.printf(buf);
 
    wait(3);
    // Set CWMODE to 1=Station, 2=AP, 3=BOTH, Default mode=1 (Station)
    _dev.printf("\n---------- Setting Mode ----------\r\n");
    strcpy(snd, "wifi.setmode(wifi.STATION)\r\n");
    SendCMD();
    timeout=4;
    getReply();
    _dev.printf(buf);
 
    wait(2);
    _dev.printf("\n---------- Listing Access Points ----------\r\n");
    strcpy(snd, "function listap(t)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "for k,v in pairs(t) do\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "print(k..\" : \"..v)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "end\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "end\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "wifi.sta.getap(listap)\r\n");
        SendCMD();
    
    wait(1);
    timeout=15;
    getReply();
    _dev.printf(buf);
 
    wait(2);
    _dev.printf("\n---------- Connecting to AP ----------\r\n");
    _dev.printf("ssid = %s   pwd = %s\r\n",ssid,pwd);
    strcpy(snd, "wifi.sta.config(\"");
    strcat(snd, ssid);
    strcat(snd, "\",\"");
    strcat(snd, pwd);
    strcat(snd, "\")\r\n");
    SendCMD();
    timeout=10;
    getReply();
    _dev.printf(buf);
 
    wait(5);
    _dev.printf("\n---------- Get IP's ----------\r\n");
    strcpy(snd, "print(wifi.sta.getip())\r\n");
    SendCMD();
    timeout=3;
    getReply();
    _dev.printf(buf);
 
    wait(1);
    _dev.printf("\n---------- Get Connection Status ----------\r\n");
    strcpy(snd, "print(wifi.sta.status())\r\n");
    SendCMD();
    timeout=5;
    getReply();
    _dev.printf(buf);
    _dev.printf("\n\n\n  If you get a valid (non zero) IP, ESP8266 has been set up.\r\n");
    _dev.printf("  Run this if you want to reconfig the ESP8266 at any time.\r\n");
    _dev.printf("  It saves the SSID and password settings internally\r\n");
    
    wait(10);   
    _dev.printf("\n---------- Setting up http server ----------\r\n");
    strcpy(snd, "srv=net.createServer(net.TCP)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "srv:listen(80,function(conn)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "conn:on(\"receive\",function(conn,payload)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "print(payload)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "conn:send(\"<!DOCTYPE html>\")\r\n");
        SendCMD();
        wait(1); 
        strcpy(snd, "conn:send(\"<html>\")\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "conn:send(\"</html>\")\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "end)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "conn:on(\"sent\",function(conn) conn:close() end)\r\n");
        SendCMD();
        wait(1);
        strcpy(snd, "end)\r\n");
        SendCMD();
        
    wait(1);
    timeout=17;
    getReply();
    _dev.printf(buf);
    _dev.printf("\r\nDONE");
}

/**
*
*/ 
void Huzzah :: SendCMD()
{
    _cmd.printf("%s", snd);
}

/**
*
*/
void Huzzah :: getReply()
{
    memset(buf, '\0', sizeof(buf));
    t.start();
    ended = 0;
    count = 0;
    while(!ended) {
        if(_cmd.readable()) {
            buf[count] = _cmd.getc();
            count++;
        }
        if(t.read() > timeout) {
            ended = 1;
            t.stop();
            t.reset();
        }
    }
}

/**
*
*
*/
void Huzzah :: setLocalSerial(RawSerial cmd, int baud)
{
    _cmd = cmd;
    _cmd.baud(baud);
}

/**
*
*
*/
void Huzzah :: setSerialDev(RawSerial dev, int baud)
{
    _dev = dev;
    _dev.baud(baud);
}

/**
*
*
*/
RawSerial Huzzah :: getLocalSerial()
{
    return _cmd;
}

/**
*
*
*/
RawSerial Huzzah :: getSerialDev()
{
    return _dev;
}


/**
*
*
*/
void Huzzah :: reset()
{

    _rst = 0;
    wait(0.5);
    _rst = 1;
    _dev.printf("\f\n\r-------------ESP8266 Hardware Reset-------------\n\r");
}

/**
*
*
*/
void Huzzah :: baudrate(int speed)
{
    _cmd.baud(speed);
    ESPSetBaudrate(speed);
}

/**
*
*
*/
void Huzzah :: recv()
{
    while(_dev.readable()) {
        _cmd.putc(_dev.getc());
    } 
}


/**
*
*
*/
void Huzzah :: send()
{
    while(_cmd.readable()) {
        _dev.putc(_cmd.getc());
    } 
}