From a8b0da04c50211b7855305c1d486ab96863cb385 Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Thu, 4 Dec 2014 18:31:55 +0100 Subject: [PATCH] Added comments --- user/cgi.c | 4 +++- user/cgiwifi.c | 23 ++++++++++++++++++++--- user/espfs.c | 2 ++ user/httpd.c | 34 +++++++++++++++++++++++++--------- user/httpd.h | 2 ++ user/httpdespfs.c | 2 +- 6 files changed, 53 insertions(+), 14 deletions(-) diff --git a/user/cgi.c b/user/cgi.c index c489408..c002ad3 100644 --- a/user/cgi.c +++ b/user/cgi.c @@ -1,5 +1,6 @@ /* -Some random cgi routines. +Some random cgi routines. Used in the LED example and the page that returns the entire +flash as a binary. Also handles the hit counter on the main page. */ /* @@ -94,6 +95,7 @@ int ICACHE_FLASH_ATTR cgiReadFlash(HttpdConnData *connData) { *pos=0x40200000; return HTTPD_CGI_MORE; } + //Send 1K of flash per call. We will get called again if we haven't sent 512K yet. espconn_sent(connData->conn, (uint8 *)(*pos), 1024); *pos+=1024; if (*pos>=0x40200000+(512*1024)) return HTTPD_CGI_DONE; else return HTTPD_CGI_MORE; diff --git a/user/cgiwifi.c b/user/cgiwifi.c index 2cf8418..a74156d 100644 --- a/user/cgiwifi.c +++ b/user/cgiwifi.c @@ -71,9 +71,12 @@ void ICACHE_FLASH_ATTR wifiScanDoneCb(void *arg, STATUS status) { bss_link = (struct bss_info *)arg; while (bss_link != NULL) { if (n>=cgiWifiAps.noAps) { + //This means the bss_link changed under our nose. Shouldn't happen! + //Break because otherwise we will write in unallocated memory. os_printf("Huh? I have more than the allocated %d aps!\n", cgiWifiAps.noAps); break; } + //Save the ap data. cgiWifiAps.apData[n]=(ApData *)os_malloc(sizeof(ApData)); cgiWifiAps.apData[n]->rssi=bss_link->rssi; cgiWifiAps.apData[n]->enc=bss_link->authmode; @@ -92,14 +95,15 @@ static void ICACHE_FLASH_ATTR wifiStartScan() { // int x; if (cgiWifiAps.scanInProgress) return; cgiWifiAps.scanInProgress=1; -/* +#if 0 + //Not sure if this is still needed. x=wifi_station_get_connect_status(); if (x!=STATION_GOT_IP) { //Unit probably is trying to connect to a bogus AP. This messes up scanning. Stop that. os_printf("STA status = %d. Disconnecting STA...\n", x); wifi_station_disconnect(); } -*/ +#endif wifi_station_scan(NULL, wifiScanDoneCb); } @@ -115,13 +119,16 @@ int ICACHE_FLASH_ATTR cgiWiFiScan(HttpdConnData *connData) { httpdEndHeaders(connData); if (cgiWifiAps.scanInProgress==1) { + //We're still scanning. Tell Javascript code that. len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"1\"\n }\n}\n"); espconn_sent(connData->conn, (uint8 *)buff, len); } else { + //We have a scan result. Pass it on. len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"0\", \n\"APs\": [\n"); espconn_sent(connData->conn, (uint8 *)buff, len); if (cgiWifiAps.apData==NULL) cgiWifiAps.noAps=0; for (i=0; issid, cgiWifiAps.apData[i]->rssi, cgiWifiAps.apData[i]->enc, (i==cgiWifiAps.noAps-1)?"":","); @@ -129,6 +136,7 @@ int ICACHE_FLASH_ATTR cgiWiFiScan(HttpdConnData *connData) { } len=os_sprintf(buff, "]\n}\n}\n"); espconn_sent(connData->conn, (uint8 *)buff, len); + //Also start a new scan. wifiStartScan(); } return HTTPD_CGI_DONE; @@ -137,6 +145,14 @@ int ICACHE_FLASH_ATTR cgiWiFiScan(HttpdConnData *connData) { //Temp store for new ap info. static struct station_config stconf; +/* +ToDo: +- Thoroughly test this code +- Simplify if possible. The cascaded delayed routines are probably not + needed anymore. I hope. +*/ + + //This routine is ran some time after a connection attempt to an access point. If //the connect succeeds, this gets the module in STA-only mode. static void ICACHE_FLASH_ATTR resetTimerCb(void *arg) { @@ -148,6 +164,7 @@ static void ICACHE_FLASH_ATTR resetTimerCb(void *arg) { system_restart(); } else { os_printf("Connect fail. Not going into STA-only mode.\n"); + //Maybe also pass this through on the webpage? } } @@ -193,7 +210,7 @@ int ICACHE_FLASH_ATTR cgiWiFiConnect(HttpdConnData *connData) { //Schedule disconnect/connect os_timer_disarm(&reassTimer); os_timer_setfn(&reassTimer, reassTimerCb, NULL); -#if 1 +#if 1 //Set to 0 if you want to disable the actual reconnecting bit os_timer_arm(&reassTimer, 1000, 0); httpdRedirect(connData, "connecting.html"); diff --git a/user/espfs.c b/user/espfs.c index 81828e0..0789f35 100644 --- a/user/espfs.c +++ b/user/espfs.c @@ -81,6 +81,8 @@ a memory exception, crashing the program. //Copies len bytes over from dst to src, but does it using *only* //aligned 32-bit reads. Yes, it's no too optimized but it's short and sweet and it works. + +//ToDo: perhaps os_memcpy also does unaligned accesses? void ICACHE_FLASH_ATTR memcpyAligned(char *dst, char *src, int len) { int x; int w, b; diff --git a/user/httpd.c b/user/httpd.c index 49545ec..1973c88 100644 --- a/user/httpd.c +++ b/user/httpd.c @@ -1,4 +1,6 @@ -//Esp8266 http server - core routines +/* +Esp8266 http server - core routines +*/ /* * ---------------------------------------------------------------------------- @@ -32,7 +34,7 @@ //This gets set at init time. static HttpdBuiltInUrl *builtInUrls; -//Private data for httpd thing +//Private data for http connection struct HttpdPriv { char head[MAX_HEAD_LEN]; int headPos; @@ -43,10 +45,11 @@ struct HttpdPriv { static HttpdPriv connPrivData[MAX_CONN]; static HttpdConnData connData[MAX_CONN]; +//Listening connection data static struct espconn httpdConn; static esp_tcp httpdTcp; - +//Struct to keep extension->mime data in typedef struct { const char *ext; const char *mimetype; @@ -72,7 +75,8 @@ const char ICACHE_FLASH_ATTR *httpdGetMimetype(char *url) { char *ext=url+(strlen(url)-1); while (ext!=url && *ext!='.') ext--; if (*ext=='.') ext++; - + + //ToDo: os_strcmp is case sensitive; we may want to do case-intensive matching here... while (mimeTypes[i].ext!=NULL && os_strcmp(ext, mimeTypes[i].ext)!=0) i++; return mimeTypes[i].mimetype; } @@ -134,7 +138,8 @@ int httpdUrlDecode(char *val, int valLen, char *ret, int retLen) { //Find a specific arg in a string of get- or post-data. //Line is the string of post/get-data, arg is the name of the value to find. The //zero-terminated result is written in buff, with at most buffLen bytes used. The -//function returns the length of the result, or -1 if the value wasn't found. +//function returns the length of the result, or -1 if the value wasn't found. The +//returned string will be urldecoded already. int ICACHE_FLASH_ATTR httpdFindArg(char *line, char *arg, char *buff, int buffLen) { char *p, *e; if (line==NULL) return 0; @@ -160,7 +165,7 @@ int ICACHE_FLASH_ATTR httpdFindArg(char *line, char *arg, char *buff, int buffLe void ICACHE_FLASH_ATTR httpdStartResponse(HttpdConnData *conn, int code) { char buff[128]; int l; - l=os_sprintf(buff, "HTTP/1.0 %d OK\r\nServer: esp8266-httpd/0.1\r\n", code); + l=os_sprintf(buff, "HTTP/1.0 %d OK\r\nServer: esp8266-httpd/"HTTPDVER"\r\n", code); espconn_sent(conn->conn, (uint8 *)buff, l); } @@ -177,7 +182,8 @@ void ICACHE_FLASH_ATTR httpdEndHeaders(HttpdConnData *conn) { espconn_sent(conn->conn, (uint8 *)"\r\n", 2); } -//ToDo: sprintf->snprintf everywhere +//ToDo: sprintf->snprintf everywhere... esp doesn't have snprintf tho' :/ +//Redirect to the given URL. void ICACHE_FLASH_ATTR httpdRedirect(HttpdConnData *conn, char *newUrl) { char buff[1024]; int l; @@ -185,6 +191,7 @@ void ICACHE_FLASH_ATTR httpdRedirect(HttpdConnData *conn, char *newUrl) { espconn_sent(conn->conn, (uint8 *)buff, l); } +//Use this as a cgi function to redirect one url to another. int ICACHE_FLASH_ATTR cgiRedirect(HttpdConnData *connData) { if (connData->conn==NULL) { //Connection aborted. Clean up. @@ -195,7 +202,8 @@ int ICACHE_FLASH_ATTR cgiRedirect(HttpdConnData *connData) { return HTTPD_CGI_DONE; } - +//Callback called when the data on a socket has been successfully +//sent. static void ICACHE_FLASH_ATTR httpdSentCb(void *arg) { int r; HttpdConnData *conn=httpdFindConnData(arg); @@ -216,6 +224,8 @@ static void ICACHE_FLASH_ATTR httpdSentCb(void *arg) { static const char *httpNotFoundHeader="HTTP/1.0 404 Not Found\r\nServer: esp8266-httpd/0.1\r\nContent-Type: text/plain\r\n\r\nNot Found.\r\n"; +//This is called when the headers have been received and the connection is ready to send +//the result headers and data. static void ICACHE_FLASH_ATTR httpdSendResp(HttpdConnData *conn) { int i=0; int r; @@ -241,6 +251,7 @@ static void ICACHE_FLASH_ATTR httpdSendResp(HttpdConnData *conn) { conn->cgi=NULL; //mark for destruction } +//Parse a line of header data and modify the connection data accordingly. static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) { int i; // os_printf("Got header %s\n", h); @@ -258,6 +269,7 @@ static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) { *e=0; //terminate url part os_printf("URL = %s\n", conn->url); + //Parse out the URL part before the GET parameters. conn->getArgs=(char*)os_strstr(conn->url, "?"); if (conn->getArgs!=0) { *conn->getArgs=0; @@ -268,15 +280,20 @@ static void ICACHE_FLASH_ATTR httpdParseHeader(char *h, HttpdConnData *conn) { } } else if (os_strncmp(h, "Content-Length: ", 16)==0) { i=0; + //Skip trailing spaces while (h[i]!=' ') i++; + //Get POST data length conn->postLen=atoi(h+i+1); + //Clamp if too big. Hmm, maybe we should error out instead? if (conn->postLen>MAX_POST) conn->postLen=MAX_POST; os_printf("Mallocced buffer for %d bytes of post data.\n", conn->postLen); + //Alloc the memory. conn->postBuff=(char*)os_malloc(conn->postLen+1); conn->priv->postPos=0; } } +//Callback called when there's data available on a socket. static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short len) { int x; char *p, *e; @@ -285,7 +302,6 @@ static void ICACHE_FLASH_ATTR httpdRecvCb(void *arg, char *data, unsigned short for (x=0; xpriv->headPos!=-1) { //This byte is a header byte. if (conn->priv->headPos!=MAX_HEAD_LEN) conn->priv->head[conn->priv->headPos++]=data[x]; diff --git a/user/httpd.h b/user/httpd.h index e9505c9..724bd39 100644 --- a/user/httpd.h +++ b/user/httpd.h @@ -4,6 +4,8 @@ #include "lwip/ip_addr.h" #include +#define HTTPDVER "0.2" + #define HTTPD_CGI_MORE 0 #define HTTPD_CGI_DONE 1 #define HTTPD_CGI_NOTFOUND 2 diff --git a/user/httpdespfs.c b/user/httpdespfs.c index b730240..27c6c86 100644 --- a/user/httpdespfs.c +++ b/user/httpdespfs.c @@ -1,5 +1,5 @@ /* -Connector to let httpd use the espfs filesystem to serve the files in that. +Connector to let httpd use the espfs filesystem to serve the files in it. */ /*