LeeT WiFiLamp code and test
Dependencies: ESP8266_WebServer mbed
Fork of WiFiLamp by
main.cpp
- Committer:
- sschocke
- Date:
- 2015-01-04
- Revision:
- 23:3563e1699fb9
- Parent:
- 22:6d7a72fab8ff
- Child:
- 24:849265425708
File content as of revision 23:3563e1699fb9:
#include "mbed.h" #include "PololuLedStrip.h" #include "ESP8266_WebServer.h" #include "resource.h" #include <string> //#define DEBUG_WIFI PololuLedStrip ledStrip(D11); #define LED_COUNT 8 rgb_color colors[LED_COUNT]; DigitalOut wifiCHPD(D4); DigitalOut wifiReset(D9); int wifiOn = 0; int opMode = 0; std::string stationMAC; std::string stationIP; std::string ssid; std::string apMAC; std::string apIP; Serial wifiSerial(D8,D2); Serial pc(USBTX,USBRX); ESP8266_WebServer server(&wifiSerial); char temp[200]; const char* VERSION = "0.5-alpha"; #ifdef DEBUG_WIFI void pcrxint(void) { //server.debugBuffers(&pc); pc.putc('@'); server.echoMode = true; } #endif void rxint(void) { server.rxint(); } void setColor( uint8_t r, uint8_t g, uint8_t b ) { for ( int c = 0; c < LED_COUNT; c++ ) { colors[c].red = r; colors[c].green = g; colors[c].blue = b; } ledStrip.write(colors, LED_COUNT); } void sendConfigJSONReply(int linkID, const char* result) { sprintf(temp, jsonConfigReply, opMode, stationIP.c_str(), ssid.c_str(), result); server.SendReply(linkID, temp, mimeJSON, 0); } int main() { pc.baud(115200); #ifdef DEBUG_WIFI pc.attach(&pcrxint); #endif pc.printf("WiFi Lamp - %s...\r\n", VERSION); setColor( 25, 0, 0); wifiCHPD = 0; wifiReset = 0; wifiSerial.baud(115200); wifiSerial.attach(&rxint); #ifdef DEBUG_WIFI server.debugSerial = &pc; #endif wait_ms(1000); pc.printf("Powering WiFi...\r\n"); wifiCHPD = 1; wifiReset = 1; wait_ms(250); pc.printf("Hardware Reset WiFi...\r\n"); wifiOn = 1; std::string fwVer = server.GetFirmwareVersion(); pc.printf("ESP Firmware Version: %s\r\n", fwVer.c_str()); pc.printf("Starting Web Server...\r\n"); server.Initialize(); pc.printf("Done\r\n"); opMode = server.GetOperatingMode(); pc.printf("Operating Mode: %s(%d)\r\n", opModes[opMode], opMode); if( (opMode & OPMODE_STATION) ) { pc.printf("Waiting 5 secs for join to WiFi Network...\r\n"); wait_ms(5000); stationMAC = server.GetStationMAC(); stationIP = server.GetStationIP(); ssid = server.GetStationSSID(); pc.printf("Station MAC: %s, Station SSID: %s, Station IP: %s\r\n", stationMAC.c_str(), ssid.c_str(), stationIP.c_str()); } if( (opMode & OPMODE_SOFTAP) ) { apMAC = server.GetAPMAC(); apIP = server.GetAPIP(); pc.printf("SoftAP MAC: %s, SoftAP IP: %s\r\n", apMAC.c_str(), apIP.c_str()); } //std::list<std::string> apList = server.ListAvailableSSID(); //for( std::list<std::string>::iterator it = apList.begin(); it!=apList.end(); ++it ) { // pc.printf("Found SSID %s\r\n", (*it).c_str()); //} setColor( 0, 25, 0); wait_ms(500); setColor( 0, 0, 0); std::string httpReply; while(true) { ESP8266_WebRequest* request = server.GetRequest(); if( request != NULL ) { pc.printf("HTTP %s %s\r\n", request->Method.c_str(), request->URI.c_str()); for( std::map<std::string,std::string>::iterator it = request->Parameters.begin(); it!=request->Parameters.end(); ++it ) { pc.printf("HTTP Parameter %s = %s\r\n", it->first.c_str(), it->second.c_str()); } if( request->URI == "/" ) { httpReply = htmlHead; httpReply += "<table><tr><td align='right'><a href='config'><img src='config.gif' /></a></td></tr>"; httpReply += "<tr><td align='center'>"; httpReply += "<img style='margin-right:2px' src='colormap.gif' usemap='#colormap' />"; httpReply += "<map id='colormap' name='colormap'>"; //int startx = 63; //int countx = 7; //for( int y=0; y<=180; y+=15) { // int endx = startx + (countx*18); // for( int x=startx; x<endx; x+= 18) { // sprintf(temp, areaHTML, x,y, x+9,y+4, x+9,y+15, x,y+19, x-9,y+15, x-9,y+4); // httpReply += temp; // } // if( y < 90 ) { // startx -= 9; // countx++; // } else { // startx += 9; // countx--; // } //} httpReply += "</map></td></tr><tr><td><span onClick=\"changeColor('#000000')\">Turn Off</span></td></tr></table>"; httpReply += htmlTail; server.SendReply(request->LinkID, httpReply, mimeHTML); } else if( request->URI == "/config" ) { if( (opMode & OPMODE_STATION) ) { stationIP = server.GetStationIP(); ssid = server.GetStationSSID(); } httpReply = htmlHead; httpReply += htmlConfigHTML; httpReply += htmlTail; httpReply = httpReply.replace(httpReply.find("%opmode1%"), 9, (opMode==1? " selected" : "")); httpReply = httpReply.replace(httpReply.find("%opmode2%"), 9, (opMode==2? " selected" : "")); httpReply = httpReply.replace(httpReply.find("%opmode3%"), 9, (opMode==3? " selected" : "")); httpReply = httpReply.replace(httpReply.find("%stamac%"), 8, stationMAC); httpReply = httpReply.replace(httpReply.find("%staip%"), 7, stationIP); httpReply = httpReply.replace(httpReply.find("%apmac%"), 7, apMAC); httpReply = httpReply.replace(httpReply.find("%apip%"), 6, apIP); httpReply = httpReply.replace(httpReply.find("%ssid%"), 6, ssid); server.SendReply(request->LinkID, httpReply, mimeHTML, 0); } else if( request->URI == "/updateconfig" ) { bool result = true; int newOpMode = atoi(request->Parameters["opmode"].c_str()); std::string newSSID = request->Parameters["ssid"]; std::string newPassword = request->Parameters["pwd"]; if( newOpMode != opMode ) { result = server.SetOperatingMode(newOpMode); if( result == false ) { sendConfigJSONReply(request->LinkID, "Error setting Operating Mode"); delete request; continue; } opMode = newOpMode; } if( (opMode & OPMODE_STATION) ) { if( (ssid.compare(newSSID) != 0) || (newPassword.empty() == false) ) { result = server.SetStationSSID(newSSID, newPassword); if( result == false ) { sendConfigJSONReply(request->LinkID, "Error connecting to SSID"); delete request; continue; } // Wait for SSID to connect for( int retries=0; retries < 6; retries++) { wait_ms(5000); ssid = server.GetStationSSID(); if( ssid.compare(newSSID) == 0 ) { break; } } stationIP = server.GetStationIP(); } } sendConfigJSONReply(request->LinkID, "Success"); } else if( request->URI == "/wifilamp.js" ) { server.SendReply(request->LinkID, javascript, strlen(javascript), mimeJavaScript); } else if( request->URI == "/wifilamp.css" ) { server.SendReply(request->LinkID, css, strlen(css), mimeCSS); } else if( request->URI == "/colormap.gif" ) { server.SendReply(request->LinkID, (char*)colormap, sizeof(colormap), mimeGIF); } else if( request->URI == "/config.gif" ) { server.SendReply(request->LinkID, (char*)configIcon, sizeof(configIcon), mimeGIF); } else if( request->URI == "/setcolour" || request->URI == "/setcolor" ) { int r=0, g=0, b=0; if(request->Parameters.count("r") > 0) r=atoi(request->Parameters["r"].c_str()); if(request->Parameters.count("g") > 0) g=atoi(request->Parameters["g"].c_str()); if(request->Parameters.count("b") > 0) b=atoi(request->Parameters["b"].c_str()); pc.printf( "Set colour to (%i, %i, %i)\r\n", r,g,b); setColor( r,g,b ); server.SendReply(request->LinkID, "OK", mimeText, 0); } else { server.Send404Error(request->LinkID); } pc.printf("\r\nHTTP Reply Sent\r\n"); delete request; } } }