/* Some random cgi routines. */ #include #include #include "user_interface.h" #include "mem.h" #include "httpd.h" #include "cgi.h" #include "io.h" #include "espmissingincludes.h" int ICACHE_FLASH_ATTR cgiLed(HttpdConnData *connData) { int len; char buff[1024]; if (connData->conn==NULL) { //Connection aborted. Clean up. return HTTPD_CGI_DONE; } len=httpdFindArg(connData->postBuff, "led", buff, sizeof(buff)); if (len!=0) ioLed(atoi(buff)); httpdRedirect(connData, "led.html"); return HTTPD_CGI_DONE; } //WiFi access point data typedef struct { char ssid[32]; char rssi; char enc; } ApData; //Scan resolt typedef struct { char scanInProgress; ApData **apData; int noAps; } ScanResultData; //Static scan status storage. ScanResultData cgiWifiAps; void ICACHE_FLASH_ATTR wifiScanDoneCb(void *arg, STATUS status) { int n; struct bss_info *bss_link = (struct bss_info *)arg; os_printf("wifiScanDoneCb %d\n", status); if (status!=OK) { cgiWifiAps.scanInProgress=0; wifi_station_disconnect(); //test HACK return; } //Clear prev ap data if needed. if (cgiWifiAps.apData!=NULL) { for (n=0; nnext.stqe_next; n++; } //Allocate memory for access point data cgiWifiAps.apData=(ApData **)os_malloc(sizeof(ApData *)*n); cgiWifiAps.noAps=n; //Copy access point data to the static struct n=0; bss_link = (struct bss_info *)arg; while (bss_link != NULL) { cgiWifiAps.apData[n]=(ApData *)os_malloc(sizeof(ApData)); cgiWifiAps.apData[n]->rssi=bss_link->rssi; cgiWifiAps.apData[n]->enc=bss_link->authmode; strncpy(cgiWifiAps.apData[n]->ssid, (char*)bss_link->ssid, 32); bss_link = bss_link->next.stqe_next; n++; } os_printf("Scan done: found %d APs\n", n); //We're done. cgiWifiAps.scanInProgress=0; } static void ICACHE_FLASH_ATTR wifiStartScan() { int x; cgiWifiAps.scanInProgress=1; 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(); } wifi_station_scan(NULL, wifiScanDoneCb); } int ICACHE_FLASH_ATTR cgiWiFiScan(HttpdConnData *connData) { int len; int i; char buff[1024]; httpdStartResponse(connData, 200); httpdHeader(connData, "Content-Type", "text/json"); httpdEndHeaders(connData); if (cgiWifiAps.scanInProgress==1) { len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"1\"\n }\n}\n"); espconn_sent(connData->conn, (uint8 *)buff, len); } else { 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)?"":","); espconn_sent(connData->conn, (uint8 *)buff, len); } len=os_sprintf(buff, "]\n}\n}\n"); espconn_sent(connData->conn, (uint8 *)buff, len); wifiStartScan(); } return HTTPD_CGI_DONE; } static struct station_config stconf; static void ICACHE_FLASH_ATTR resetTimerCb(void *arg) { int x=wifi_station_get_connect_status(); if (x==STATION_GOT_IP) { //Go to STA mode. This needs a reset, so do that. wifi_set_opmode(1); system_restart(); } else { os_printf("Connect fail. Not going into STA-only mode.\n"); } } static void ICACHE_FLASH_ATTR reassTimerCb(void *arg) { int x; static ETSTimer resetTimer; wifi_station_disconnect(); wifi_station_set_config(&stconf); wifi_station_connect(); x=wifi_get_opmode(); if (x!=1) { //Schedule disconnect/connect os_timer_disarm(&resetTimer); os_timer_setfn(&resetTimer, resetTimerCb, NULL); os_timer_arm(&resetTimer, 4000, 0); } } int ICACHE_FLASH_ATTR cgiWiFiConnect(HttpdConnData *connData) { char essid[128]; char passwd[128]; static ETSTimer reassTimer; if (connData->conn==NULL) { //Connection aborted. Clean up. return HTTPD_CGI_DONE; } httpdFindArg(connData->postBuff, "essid", essid, sizeof(essid)); httpdFindArg(connData->postBuff, "passwd", passwd, sizeof(passwd)); os_strncpy((char*)stconf.ssid, essid, 32); os_strncpy((char*)stconf.password, passwd, 64); //Schedule disconnect/connect os_timer_disarm(&reassTimer); os_timer_setfn(&reassTimer, reassTimerCb, NULL); os_timer_arm(&reassTimer, 1000, 0); httpdRedirect(connData, "connecting.html"); return HTTPD_CGI_DONE; } //Cgi that reads the SPI flash. Assumes 512KByte flash. int ICACHE_FLASH_ATTR cgiReadFlash(HttpdConnData *connData) { int *pos=(int *)&connData->cgiData; if (connData->conn==NULL) { //Connection aborted. Clean up. return HTTPD_CGI_DONE; } if (*pos==0) { os_printf("Start flash download.\n"); httpdStartResponse(connData, 200); httpdHeader(connData, "Content-Type", "application/bin"); httpdEndHeaders(connData); *pos=0x40200000; return HTTPD_CGI_MORE; } espconn_sent(connData->conn, (uint8 *)(*pos), 1024); *pos+=1024; if (*pos>=0x40200000+(512*1024)) return HTTPD_CGI_DONE; else return HTTPD_CGI_MORE; } int ICACHE_FLASH_ATTR cgiTest(HttpdConnData *connData) { return HTTPD_CGI_DONE; } void ICACHE_FLASH_ATTR tplWlan(HttpdConnData *connData, char *token, void **arg) { char buff[1024]; int x; static struct station_config stconf; if (token==NULL) return; wifi_station_get_config(&stconf); os_strcpy(buff, "Unknown"); if (os_strcmp(token, "WiFiMode")==0) { x=wifi_get_opmode(); if (x==1) os_strcpy(buff, "Client"); if (x==2) os_strcpy(buff, "SoftAP"); if (x==3) os_strcpy(buff, "STA+AP"); } else if (os_strcmp(token, "currSsid")==0) { os_strcpy(buff, (char*)stconf.ssid); } else if (os_strcmp(token, "WiFiPasswd")==0) { os_strcpy(buff, (char*)stconf.password); } espconn_sent(connData->conn, (uint8 *)buff, os_strlen(buff)); }