gauresh vanjare / Mbed 2 deprecated ESP8266_LIBRARY Featured

Dependencies:   mbed

EDUVANCE_WIFI_SHIELD.cpp

Committer:
gauresh2798
Date:
2016-05-28
Revision:
1:52cad7057640
Parent:
0:c359fee24b6c
Child:
2:d5c9337fdce1

File content as of revision 1:52cad7057640:


#include "mbed.h"
#include "EDUVANCE_WIFI_SHIELD.h"
//CONSTANTS FOR MODES
#define STATIONMODE 10 
#define APMODE 20

Serial pc(USBTX, USBRX);// COMPUTER DISPLAY
Serial esp(PTE0, PTE1); //ESP8266 SERIAL
extern int modeselector=0;
char ssid[32];    
char pwd[32]; 

const char ch = 's';
char *getreq,*ssid_new,*pass_new,*left,*right;
//ADD DEVICES,PINS AND LEDS HERE
DigitalOut  led1(LED_RED);      





Timer t1;
Timer t2;
int setval=0;

int bufflen, DataRX, count, getcount, replycount, servreq, timeout;
int bufl, ipdLen, linkID, weberror, webcounter;


char webcount[8];

char timebuf[30];
char type[16];
char type1[16];
char channel[2];
char cmdbuff[32];
char replybuff[512];
char webdata[1024]; // This may need to be bigger depending on WEB browser used
char webbuff[4096];     // Currently using 1986 characters, Increase this if more web page data added
int mode_sel=0;

int port        ;  // set server port
int SERVtimeout =5;    // set server timeout in seconds incase link breaks.void callback(void);

//TAKES SSID, PASSWORD AND PORT ADDRESS
void get_ssid_pass(char ssid_f[32],char pass_f[32],int port_f){
    pc.printf("\n\r+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n");
    pc.printf("\n\r+++++++++++++++++++++ INITIALIZING ++++++++++++++++++++++++\r\n");
    pc.printf("\n\r+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n");
    pc.printf("\r\n SSID is %s, PASSWORD is %s, PORT number is %d \r\n",ssid_f,pass_f,port_f);
    strcpy(ssid,ssid_f);
      strcpy(pwd,pass_f);
    port=port_f;
    }
    
//SETS BAUD RATE
void setbaudrate(int baud_f){
    pc.baud(baud_f);
    esp.baud(baud_f);    
    }

// Serial Interrupt read ESP data
void callback() {    
    while (esp.readable()) {webbuff[count] = esp.getc();count++;}
    if(strlen(webbuff)>bufflen){DataRX=1;}  
    }
//SENDS COMMANDS TO ESP
void SendCMD(void){
       esp.printf("%s", cmdbuff);  
    }
//GETS REPLY IN THE FORM OF STRING    
void getreply(void){
    memset(replybuff, '\0', sizeof(replybuff));
    t1.reset(); t1.start();replycount=0;
    while(t1.read_ms()< timeout && replycount < getcount) {
        if(esp.readable()) {
            replybuff[replycount] = esp.getc();replycount++;
            }
        }
    t1.stop();  
    }
    
//READ THE RESPONSE AND TRIGGERS THE ACTIONS [CONTROLS LEDS]
void ReadWebData()
 {
    wait_ms(200);        
    esp.attach(NULL);
    count=0;DataRX=0;weberror=0;
    memset(webdata, '\0', sizeof(webdata)); 
       
    int x = strcspn (webbuff,"+");
    if(x){
        strcpy(webdata, webbuff + x);weberror=0;                                   
        int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type);
        
       
        if( strstr(webdata, "led1=1") != NULL ) {led1=0;}
        if( strstr(webdata, "led1=0") != NULL ) {led1=1;}
    
        sprintf(channel, "%d",linkID);        
        if (strstr(webdata, "GET") != NULL) {servreq=1;}
        if (strstr(webdata, "POST") != NULL) {servreq=1;}
        webcounter++;
        sprintf(webcount, "%d",webcounter);
        }
            else {
                memset(webbuff, '\0', sizeof(webbuff));
                esp.attach(&callback);weberror=1;
                }         
}




//READ THE RESPONSE AND TRIGGERS THE ACTIONS [CONTROLS LEDS]
void ReadWebData_register()
 {
    wait_ms(200);        
    esp.attach(NULL);
    count=0;DataRX=0;weberror=0;
    memset(webdata, '\0', sizeof(webdata)); 
       
    int x = strcspn (webbuff,"+");
    if(x){
        strcpy(webdata, webbuff + x);weberror=0;                                   
        int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type);
        

       //setval=1;
       //      if( strstr(webdata, "led1=1") != NULL ) {led1=0;}
    //    if( strstr(webdata, "led1=0") != NULL ) {led1=1;}
        sprintf(channel, "%d",linkID);        
        if (strstr(webdata, "GET") != NULL) {servreq=1;}
        if (strstr(webdata, "POST") != NULL) {servreq=1;}
        webcounter++;

        sprintf(webcount, "%d",webcounter);
         newcre(webdata);
        }
            else {
                memset(webbuff, '\0', sizeof(webbuff));
                esp.attach(&callback);weberror=1;
                }         
}





// Static WEB page TO DISPLAY   
void sendpage()
{    
// WEB page data     
    strcpy(webbuff, "<!DOCTYPE html>");
    strcat(webbuff, "<html><head><title>ESP8266 Mbed</title></head>");
    strcat(webbuff, "<body>");    
    
    strcat(webbuff, "<p><form method=\"GET\"></p>");
  
     
    if(led1==1){strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" checked>  Red LED off");
                strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" >  Red LED on");} 
        else{strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" >  Red LED off");
                strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" checked>  Red LED on");}   
                   
    strcat(webbuff, "<p><input type=\"submit\" value=\"send-refresh\" ></form></p>");    
 
    
    strcat(webbuff, "</body></html>");    
// end of WEB page data       
    bufl = strlen(webbuff); // get total page buffer length            
    sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length.
    timeout=200;getcount=7;
    SendCMD();
    getreply();                                                               
    SendWEB();  // send web page
    memset(webbuff, '\0', sizeof(webbuff));
    sendcheck();              
}

void sendpage_register()
{    
// WEB page data     
    strcpy(webbuff, "<!DOCTYPE html>");
    strcat(webbuff, "<html><head><title>ESP8266 Mbed</title></head>");
    strcat(webbuff, "<body>");    
    
   strcat(webbuff, "<form method=\"GET\">");
  
  //  strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" >  Red LED off");
    //            strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" checked>  Red LED on");
    strcat(webbuff, "<input type=\"text\" name=\"ssid\">  ssid");
    strcat(webbuff, "<br><input type=\"text\" name=\"pass\"  >  password");
   
          

    strcat(webbuff, "<input type=\"submit\" value=\"send-refresh\" >");
    strcat(webbuff,"</form>")    ;
 
    
    strcat(webbuff, "</body></html>");    
// end of WEB page data       
    bufl = strlen(webbuff); // get total page buffer length            
    sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length.
    timeout=200;getcount=7;
    SendCMD();
    getreply();                                                               
    SendWEB();  // send web page
    memset(webbuff, '\0', sizeof(webbuff));
  sendcheck();


              
}

//  wait for ESP "SEND OK" reply, then close IP to load web page
void sendcheck()
{
     weberror=1;timeout=500;getcount=24;
    t2.reset();t2.start();
    while(weberror==1 && t2.read() <5){        
        getreply();
        if (strstr(replybuff, "SEND OK") != NULL) {weberror=0;}  // wait for valid SEND OK 
        }
    if(weberror==1){ // restart connection
        strcpy(cmdbuff, "AT+CIPMUX=1\r\n"); 
        timeout=500;getcount=10;
        SendCMD();getreply(); 
        sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
        timeout=500;getcount=10;
        SendCMD();getreply();
        }
        else{
            sprintf(cmdbuff, "AT+CIPCLOSE=%s\r\n",channel); // close current connection
            SendCMD();}       
    t2.reset();      
}    

// Large WEB buffer data send
void SendWEB()
{    
    int i=0;
    if(esp.writeable()) {
        while(webbuff[i]!='\0') {esp.putc(webbuff[i]);i++;}
        }     
} 

void ATcheck(void){
//FIRST AT COMMAND
    pc.printf("\r\n++++++++++++++++++++ AT RESPONSE ESP ++++++++++++++++++++\r\n");
    strcpy(cmdbuff,"AT\r\n");
    timeout=8000;
    getcount=1000;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",replybuff);
    }
  
void ATReset(void){
    //RESET ESP  
    pc.printf("+++++++++++++++++++++++++ Resetting ESP ++++++++++++++++++++++\r\n");  
    strcpy(cmdbuff,"AT+RST\r\n");
    timeout=2000;getcount=600;
    SendCMD();
    getreply();
    pc.printf(replybuff);
    pc.printf("%d",count);
    }

 void ListAccessPts(void){
//list access points
    pc.printf("++++++++++++++++++ Listing Access POINTS NEARBY +++++++++++++++\r\n");
    strcpy(cmdbuff,"AT+CWLAP\r\n");
    timeout=8000;
    getcount=1000;
    SendCMD();
    getreply();
    //strcpy(replybuff,"\0");
    pc.printf("%s\r\n",replybuff);
    //const char *tempdata=replybuff;
    //return replybuff;
     if (strstr(cmdbuff, ssid) != NULL){mode_sel=STATIONMODE;} 
     else{mode_sel=APMODE;}
    }
    
void StationModeSet(void){
    //SET CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station)
    pc.printf("+++++++++++++++++++ SETTING ESP IN STATION MODE +++++++++++++++++\r\n");
    strcpy(cmdbuff,"AT+CWMODE=1\r\n");
    timeout=8000;
    getcount=1000;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",replybuff);
    }
    
void ApModeSet(void){
    //SET CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station)
      pc.printf("+++++++++++++++++++++ SETTING ESP IN AP MODE +++++++++++++++++++\r\n");
    strcpy(cmdbuff,"AT+CWMODE=2\r\n");
    timeout=8000;
    getcount=1000;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",replybuff);
    }
    
void ConnectWifiServer(void){
 
    pc.printf("\n+++++++++++++++ Connecting to WIFI SERVER (AP) +++++++++++++++\r\n");
    pc.printf("ssid = %s   pwd = %s\r\n",ssid,pwd);
    strcpy(cmdbuff, "AT+CWJAP=\"");
    strcat(cmdbuff, ssid);
    strcat(cmdbuff, "\",\"");
    strcat(cmdbuff, pwd);
    strcat(cmdbuff, "\"\r\n");
    timeout=8000;
    getcount=1000;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",cmdbuff);
    }
    
void Commtype(void){
     // set CIPMUX to 0=Single,1=Multi
    pc.printf("+++++++++++++++++ Setting Connection of ESP in MULTI ++++++++++++++\r\n");
    strcpy(cmdbuff,"AT+CIPMUX=1\r\n");
    timeout=500;
    getcount=10;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",replybuff);
    }
    
void StartServer_AT(void){
    //START SERVER
    pc.printf("\n++++++++++++++++++++++ STARTING SERVER OF ESP +++++++++++++++++++\r\n");
    sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
    timeout=500;getcount=10;
    SendCMD();
    getreply();
    sprintf(cmdbuff,"AT+CIPSTO=%d\r\n",SERVtimeout);
    timeout=500;getcount=50;
    SendCMD();
    getreply();
    }
void getIP(void){
    //GET IP
    pc.printf("\n Getting Server IP \r\n"); 
    strcpy(cmdbuff, "AT+CIFSR\r\n");
    timeout=1000;getcount=50;
    while(weberror==0){
        SendCMD();getreply();
        if (strstr(replybuff, "0.0.0.0") == NULL) {weberror=1;}  // wait for valid IP
        }
    pc.printf("\n Enter WEB address in your browser \r\n\n");
    replybuff[strlen(replybuff) - 8] = '\0';                
    char* IP = replybuff + 5;
    sprintf(webdata,"   http://%s:%d", IP, port);
    pc.printf(webdata);        
    }
    
void finishup(void){
    //END PART
    bufflen=200;count=0;
    pc.printf("\n\n++++++++++++++++++++++++ READY ++++++++++++++++++++++++++\r\n\n");
    esp.attach(&callback);
    }



int startserver(void){
     ATcheck();
     ATReset();
     StationModeSet();
      
    //list access points
    pc.printf("++++++++++++++++++++++++ Listing Access ESP ++++++++++++++++++++++\r\n");
    strcpy(cmdbuff,"AT+CWLAP\r\n");
    timeout=8000;
    getcount=1000;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",replybuff);
    if (strstr(replybuff, ssid) != NULL) {
     
       t2.reset();t2.start();
        return 10;
   }
   else{
        t2.reset();t2.start();
        return 20;   
   }
    
    }
    

void closeserver_AT(void){
       pc.printf("+++++++++++++++++ CLOSE THE SERVER ++++++++++++++\r\n");
          
     sprintf(cmdbuff,"AT+CIPCLOSE=%d\r\n", linkID);
      timeout=500;
    getcount=10;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",replybuff);
    
    
    
    strcpy(cmdbuff,"AT+CIPSERVER=0\r\n");
    timeout=500;
    getcount=10;
    SendCMD();
    getreply();
    pc.printf("%s\r\n",replybuff);
    
    ATReset();
    
 
    }

void StationConfig(void){
    pc.printf("\n\r------------------- IN THE STATION MODE -------------------\r\n");
    StationModeSet();
    ConnectWifiServer();
    Commtype();
    StartServer_AT();
    getIP();
    finishup();
    }
void ApConfig(void){
     pc.printf("\n\r--------------------- IN THE AP MODE -----------------------\r\n");
     ApModeSet();
    Commtype();
    StartServer_AT();
    getIP();
    finishup();
    }
void request_fetch_station(void){
  
     if(DataRX==1){
            ReadWebData();
           
            if (servreq == 1 && weberror == 0){sendpage();}
            esp.attach(&callback);     
           pc.printf(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type);        
           pc.printf("\n\n  HTTP Packet: \n\n%s\n", webdata); 
           pc.printf("  Web Characters sent : %d\n\n", bufl);
          pc.printf("  -------------------------------------\n\n");
            //strcpy(lasthit, timebuf);
            servreq=0;               
        }    
    } 
    

void request_fetch_ap(void){
     if(DataRX==1){
          
            
            ReadWebData_register();
           
            if (servreq == 1 && weberror == 0){sendpage_register();}
            esp.attach(&callback);     
            pc.printf(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type);        
            pc.printf("\n\n  HTTP Packet: \n\n%s\n", webdata); 
            pc.printf("  Web Characters sent : %d\n\n", bufl);
            pc.printf("  -------------------------------------\n\n");
            //strcpy(lasthit, timebuf);
         
            servreq=0;
                
        }    
      
    } 
        
char* getname(char *strd,const char s[2],int part){
   char *temp;  
   char *token,*dataarr[2];
   int i=0;
   
   token = strtok(strd, s);
   
   while( token != NULL ) 
   {
     dataarr[i]=token;
     i++;
     token = strtok(NULL, s);
   }
  
   if(part==1){temp=dataarr[0];}
   else if(part==2){temp=dataarr[1];}
   return temp;
    
}
void newcre(char webstring[]){
  //  char webstring[]="http://192.168.4.1:8266/ssid=hellogfg&pwd=thisispwd";
   char *pass_l,*ssid_temp,*pass_temp;
   getreq = strchr(webstring, ch);
   pc.printf("\n\r Desired substring:  %s\n\r", getreq);
   
   left = getname(getreq,"&",1);
   right = getname(getreq,"&",2);
   ssid_temp=getname(left,"=",2);
   pass_l=getname(right,"=",2);
   pass_temp=getname(pass_l," ",1);
   pc.printf( "\n\r new ssid is %s\n", ssid_temp );
   pc.printf( "\n\r new password is %s\n", pass_temp );
   get_ssid_pass(ssid_temp,pass_temp,8266);
//   wait(5);
    closeserver_AT();
    modeselector=10;
      StationConfig();
      request_fetch_station();
    
    }