From 71f7778b2f792c74dfd7d792181fd6819df445f7 Mon Sep 17 00:00:00 2001 From: btsimonh Date: Tue, 1 Mar 2022 21:59:11 +0000 Subject: [PATCH] move http into functions. --- src/httpserver/http_fns.c | 946 ++++++++++++++++++++++++++++++++++++ src/httpserver/http_fns.h | 25 + src/httpserver/new_http.c | 983 ++------------------------------------ src/httpserver/new_http.h | 9 +- 4 files changed, 1023 insertions(+), 940 deletions(-) create mode 100644 src/httpserver/http_fns.c create mode 100644 src/httpserver/http_fns.h diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c new file mode 100644 index 000000000..c4277544a --- /dev/null +++ b/src/httpserver/http_fns.c @@ -0,0 +1,946 @@ +#include "../new_common.h" +#include "ctype.h" +#include "http_fns.h" +#include "../new_pins.h" +#include "../new_cfg.h" +#include "../ota/ota.h" + +#ifdef WINDOWS + // nothing +#elif PLATFORM_XR809 + #include +#elif defined(PLATFORM_BK7231N) + // tuya-iotos-embeded-sdk-wifi-ble-bk7231n/sdk/include/tuya_hal_storage.h + #include "tuya_hal_storage.h" + #include "BkDriverFlash.h" + #include "../flash_config/flash_config.h" +#else + // REALLY? A typo in Tuya SDK? Storge? + // tuya-iotos-embeded-sdk-wifi-ble-bk7231t/platforms/bk7231t/tuya_os_adapter/include/driver/tuya_hal_storge.h + #include "../logging/logging.h" + #include "tuya_hal_storge.h" + #include "BkDriverFlash.h" + #include "../flash_config/flash_config.h" +#endif + + + + +typedef struct template_s { + void (*setter)(); + const char *name; +} template_t; + +template_t g_templates [] = { + { Setup_Device_Empty, "Empty"}, + // BK7231N devices + { Setup_Device_BK7231N_CB2S_QiachipSmartSwitch, "[BK7231N][CB2S] QiaChip Smart Switch"}, + // BK7231T devices + { Setup_Device_BK7231T_WB2S_QiachipSmartSwitch, "[BK7231T][WB2S] QiaChip Smart Switch"}, + { Setup_Device_TuyaWL_SW01_16A, "WL SW01 16A"}, + { Setup_Device_TuyaSmartLife4CH10A, "Smart Life 4CH 10A"}, + { Setup_Device_IntelligentLife_NF101A, "Intelligent Life NF101A"}, + { Setup_Device_TuyaLEDDimmerSingleChannel, "Tuya LED Dimmer Single Channel PWM WB3S"}, + { Setup_Device_CalexLEDDimmerFiveChannel, "Calex RGBWW LED Dimmer Five Channel PWM BK7231S"}, + { Setup_Device_CalexPowerStrip_900018_1v1_0UK, "Calex UK power strip 900018.1 v1.0 UK"}, + { Setup_Device_ArlecCCTDownlight, "Arlec CCT LED Downlight ALD029CHA"}, + { Setup_Device_NedisWIFIPO120FWT_16A, "Nedis WIFIPO120FWT SmartPlug 16A"}, + { Setup_Device_NedisWIFIP130FWT_10A, "Nedis WIFIP130FWT SmartPlug 10A"}, + { Setup_Device_BK7231T_Raw_PrimeWiFiSmartOutletsOutdoor_CCWFIO232PK, "Prime SmartOutlet Outdoor 2x Costco"}, + { Setup_Device_EmaxHome_EDU8774, "Emax Home EDU8774 SmartPlug 16A"}, + { Setup_Device_TuyaSmartPFW02G, "Tuya Smart PFW02-G"} +}; + +int g_total_templates = sizeof(g_templates)/sizeof(g_templates[0]); + +unsigned char hexdigit( char hex ) { + return (hex <= '9') ? hex - '0' : + toupper((unsigned char)hex) - 'A' + 10 ; +} + +unsigned char hexbyte( const char* hex ) { + return (hexdigit(*hex) << 4) | hexdigit(*(hex+1)) ; +} + +int http_fn_about(http_request_t *request){ + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"About us page."); + poststr(request,htmlReturnToMenu); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} + + +int http_fn_cfg_mqtt(http_request_t *request) { + int i; + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"

Use this to connect to your MQTT

"); + poststr(request,"
\ +
\ +
\ +
\ +

\ +
\ +
\ +
\ +
\ +
\ +
\ + \ +
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_mqtt_set(http_request_t *request) { + char tmpA[128]; + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + + if(http_getArg(request->url,"host",tmpA,sizeof(tmpA))) { + CFG_SetMQTTHost(tmpA); + } + if(http_getArg(request->url,"port",tmpA,sizeof(tmpA))) { + CFG_SetMQTTPort(atoi(tmpA)); + } + if(http_getArg(request->url,"user",tmpA,sizeof(tmpA))) { + CFG_SetMQTTUserName(tmpA); + } + if(http_getArg(request->url,"password",tmpA,sizeof(tmpA))) { + CFG_SetMQTTPass(tmpA); + } + if(http_getArg(request->url,"client",tmpA,sizeof(tmpA))) { + CFG_SetMQTTBrokerName(tmpA); + } + if(CFG_SaveMQTT()) { + poststr(request,"MQTT mode set!"); + } else { + poststr(request,"Error saving MQTT settings to flash!"); + } + + + poststr(request,"Please wait for module to connect... if there is problem, restart it..."); + + poststr(request,"
"); + poststr(request,"Return to MQTT settings"); + poststr(request,"
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + + +int http_fn_cfg_webapp(http_request_t *request) { + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"

Use this to set the URL of the Webapp

"); + poststr(request,"
\ +
\ +
\ + \ +
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} + +int http_fn_config_dump_table(http_request_t *request) { + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); +#if WINDOWS + poststr(request,"Not implemented
"); +#elif PLATFORM_XR809 + poststr(request,"Not implemented
"); +#else + poststr(request,"Dumped to log
"); + config_dump_table(); +#endif + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_webapp_set(http_request_t *request) { + char tmpA[128]; + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + + if(http_getArg(request->url,"url",tmpA,sizeof(tmpA))) { + if(CFG_SetWebappRoot(tmpA)) { + hprintf128(request,"Webapp url set to %s", tmpA); + } else { + hprintf128(request,"Webapp url change error - failed to save to flash."); + } + } else { + poststr(request,"Webapp url not set because you didn't specify the argument."); + } + + poststr(request,"
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_wifi_set(http_request_t *request) { + char tmpA[128]; + printf("HTTP_ProcessPacket: generating cfg_wifi_set \r\n"); + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + if(http_getArg(request->url,"open",tmpA,sizeof(tmpA))) { + CFG_SetWiFiSSID(""); + CFG_SetWiFiPass(""); + poststr(request,"WiFi mode set: open access point."); + } else { + if(http_getArg(request->url,"ssid",tmpA,sizeof(tmpA))) { + CFG_SetWiFiSSID(tmpA); + } + if(http_getArg(request->url,"pass",tmpA,sizeof(tmpA))) { + CFG_SetWiFiPass(tmpA); + } + poststr(request,"WiFi mode set: connect to WLAN."); + } + printf("HTTP_ProcessPacket: calling CFG_SaveWiFi \r\n"); + CFG_SaveWiFi(); + printf("HTTP_ProcessPacket: done CFG_SaveWiFi \r\n"); + + poststr(request,"Please wait for module to reset..."); + + poststr(request,"
"); + poststr(request,"Return to WiFi settings"); + poststr(request,"
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_loglevel_set(http_request_t *request) { + char tmpA[128]; + printf("HTTP_ProcessPacket: generating cfg_loglevel_set \r\n"); + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + if(http_getArg(request->url,"loglevel",tmpA,sizeof(tmpA))) { +#if PLATFORM_BK7231T + loglevel = atoi(tmpA); +#endif + poststr(request,"LOG level changed."); + } + poststr(request,"
\ +
\ +

\ + \ +
"); + + poststr(request,"
"); + poststr(request,"Return to config settings"); + poststr(request,"
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_wifi(http_request_t *request) { + // for a test, show password as well... + const char *cur_ssid, *cur_pass; + char tmpA[128]; + int i; + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + /*bChanged = 0; + if(http_getArg(recvbuf,"ssid",tmpA,sizeof(tmpA))) { + CFG_SetWiFiSSID(tmpA); + poststr(request,"

WiFi SSID set!

"); + bChanged = 1; + } + if(http_getArg(recvbuf,"pass",tmpA,sizeof(tmpA))) { + CFG_SetWiFiPass(tmpA); + poststr(request,"

WiFi Password set!

"); + bChanged = 1; + } + if(bChanged) { + poststr(request,"

Device will reconnect after restarting

"); + }*/ + poststr(request,"

Check networks reachable by module

This will lag few seconds.
"); + if(http_getArg(request->url,"scan",tmpA,sizeof(tmpA))) { +#ifdef WINDOWS + + poststr(request,"Not available on Windows
"); +#elif PLATFORM_XR809 + poststr(request,"TODO XR809
"); + +#elif PLATFORM_BK7231T + AP_IF_S *ar; + uint32_t num; + + bk_printf("Scan begin...\r\n"); + tuya_hal_wifi_all_ap_scan(&ar,&num); + bk_printf("Scan returned %i networks\r\n",num); + for(i = 0; i < num; i++) { + sprintf(tmpA,"[%i/%i] SSID: %s, Channel: %i, Signal %i
",i,(int)num,ar[i].ssid, ar[i].channel, ar[i].rssi); + poststr(request,tmpA); + } + tuya_hal_wifi_release_ap(ar); +#elif PLATFORM_BK7231N + poststr(request,"TODO: BK7231N support for scan
"); + +#else +#error "Unknown platform" + poststr(request,"Unknown platform
"); +#endif + } + poststr(request,"
\ + \ + \ +
"); + poststr(request,"

Use this to disconnect from your WiFi

"); + poststr(request,"
\ + \ + \ +
"); + poststr(request,"

Use this to connect to your WiFi

"); + poststr(request,"
\ +
\ +
\ +
\ +

\ + \ +
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_mac(http_request_t *request) { + // must be unsigned, else print below prints negatives as e.g. FFFFFFFe + unsigned char mac[6]; + char tmpA[128]; + int i; + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + + if(http_getArg(request->url,"mac",tmpA,sizeof(tmpA))) { + for( i = 0; i < 6; i++ ) + { + mac[i] = hexbyte( &tmpA[i * 2] ) ; + } + //sscanf(tmpA,"%02X%02X%02X%02X%02X%02X",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]); + if(WiFI_SetMacAddress((char*)mac)) { + poststr(request,"

New MAC set!

"); + } else { + poststr(request,"

MAC change error?

"); + } + } + + WiFI_GetMacAddress((char *)mac); + + sprintf(tmpA,"%02X%02X%02X%02X%02X%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); + + poststr(request,"

Here you can change MAC address.

"); + poststr(request,"
\ +
\ +

\ + \ +
"); + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_flash_read_tool(http_request_t *request) { + int len = 16; + int ofs = 1970176; + int res; + int rem; + int now; + int nowOfs; + int hex; + int i; + char tmpA[128]; + char tmpB[64]; + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"

Flash Read Tool

"); + if( http_getArg(request->url,"hex",tmpA,sizeof(tmpA))){ + hex = atoi(tmpA); + } else { + hex = 0; + } + + if( http_getArg(request->url,"offset",tmpA,sizeof(tmpA)) && + http_getArg(request->url,"len",tmpB,sizeof(tmpB))) { + unsigned char buffer[128]; + len = atoi(tmpB); + ofs = atoi(tmpA); + sprintf(tmpA,"Memory at %i with len %i reads: ",ofs,len); + poststr(request,tmpA); + poststr(request,"
"); + + ///res = bekken_hal_flash_read (ofs, buffer,len); + //sprintf(tmpA,"Result %i",res); + // strcat(outbuf,tmpA); + /// strcat(outbuf,"
"); + + nowOfs = ofs; + rem = len; + while(1) { + if(rem > sizeof(buffer)) { + now = sizeof(buffer); + } else { + now = rem; + } +#if PLATFORM_XR809 + //uint32_t flash_read(uint32_t flash, uint32_t addr,void *buf, uint32_t size) + #define FLASH_INDEX_XR809 0 + res = flash_read(FLASH_INDEX_XR809, nowOfs, buffer, now); +#else + res = bekken_hal_flash_read (nowOfs, buffer,now); +#endif + for(i = 0; i < now; i++) { + unsigned char val = buffer[i]; + if(!hex && isprint(val)) { + sprintf(tmpA,"'%c' ",val); + } else { + sprintf(tmpA,"%02X ",val); + } + poststr(request,tmpA); + } + rem -= now; + nowOfs += now; + if(rem <= 0) { + break; + } + } + + poststr(request,"
"); + } + poststr(request,"
"); + + poststr(request,"
"); + poststr(request,"
\ +
",ofs); + poststr(request,tmpA); + poststr(request,"
\ + ",len); + poststr(request,tmpA); + poststr(request,"

\ + \ +
"); + + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_quick(http_request_t *request) { + char tmpA[128]; + int j; + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"

Quick Config

"); + + if(http_getArg(request->url,"dev",tmpA,sizeof(tmpA))) { + j = atoi(tmpA); + sprintf(tmpA,"

Set dev %i!

",j); + poststr(request,tmpA); + + g_templates[j].setter(); + } + poststr(request,"
"); + sprintf(tmpA, ""); + poststr(request,"
"); + + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_ha(http_request_t *request) { + int relayFlags = 0; + int pwmFlags = 0; + int relayCount = 0; + int pwmCount = 0; + const char *baseName; + int i; + char tmpA[128]; + + baseName = CFG_GetShortDeviceName(); + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"

Home Assistant Cfg

"); + poststr(request,"

Paste this to configuration yaml

"); + poststr(request,"
Make sure that you have \"switch:\" keyword only once! Home Assistant doesn't like dup keywords.
"); + poststr(request,"
You can also use \"switch MyDeviceName:\" to avoid keyword duplication!
"); + + poststr(request,""); + + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_cfg(http_request_t *request) { + int i,j,k; + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + poststr(request,"
"); + +#if PLATFORM_BK7231T | PLATFORM_BK7231N + k = config_get_tableOffsets(BK_PARTITION_NET_PARAM,&i,&j); + hprintf128(request,"BK_PARTITION_NET_PARAM: bOk %i, at %i, len %i
",k,i,j); + k = config_get_tableOffsets(BK_PARTITION_RF_FIRMWARE,&i,&j); + hprintf128(request,"BK_PARTITION_RF_FIRMWARE: bOk %i, at %i, len %i
",k,i,j); + k = config_get_tableOffsets(BK_PARTITION_OTA,&i,&j); + hprintf128(request,"BK_PARTITION_OTA: bOk %i, at %i, len %i
",k,i,j); +#endif + + poststr(request,"Launch Web Application
"); + + poststr(request,htmlReturnToMenu); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} + +int http_fn_cfg_pins(http_request_t *request) { + int iChanged = 0; + int iChangedRequested = 0; + int i; + char tmpA[128]; + char tmpB[64]; + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + for(i = 0; i < GPIO_MAX; i++) { + sprintf(tmpA, "%i",i); + if(http_getArg(request->url,tmpA,tmpB,sizeof(tmpB))) { + int role; + int pr; + + iChangedRequested++; + + role = atoi(tmpB); + + pr = PIN_GetPinRoleForPinIndex(i); + if(pr != role) { + PIN_SetPinRoleForPinIndex(i,role); + iChanged++; + } + } + sprintf(tmpA, "r%i",i); + if(http_getArg(request->url,tmpA,tmpB,sizeof(tmpB))) { + int rel; + int prevRel; + + iChangedRequested++; + + rel = atoi(tmpB); + + prevRel = PIN_GetPinChannelForPinIndex(i); + if(prevRel != rel) { + PIN_SetPinChannelForPinIndex(i,rel); + iChanged++; + } + } + } + if(iChangedRequested>0) { + PIN_SaveToFlash(); + sprintf(tmpA, "Pins update - %i reqs, %i changed!

",iChangedRequested,iChanged); + poststr(request,tmpA); + } +// strcat(outbuf,""); + poststr(request,"
"); + for( i = 0; i < GPIO_MAX; i++) { + int si, ch; + int j; + + si = PIN_GetPinRoleForPinIndex(i); + ch = PIN_GetPinChannelForPinIndex(i); + +#if PLATFORM_XR809 + poststr(request,PIN_GetPinNameAlias(i)); + poststr(request," "); +#else + sprintf(tmpA, "P%i ",i); + poststr(request,tmpA); +#endif + sprintf(tmpA, ""); + if(ch == 0) { + tmpB[0] = 0; + } else { + sprintf(tmpB,"%i",ch); + } + sprintf(tmpA, "",i,tmpB); + poststr(request,tmpA); + poststr(request,"
"); + } + poststr(request,"
"); + + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_index(http_request_t *request) { + int relayFlags; + int pwmFlags; + int j, i; + char tmpA[128]; + + relayFlags = 0; + pwmFlags = 0; + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,""); + poststr(request,g_header); + if(http_getArg(request->url,"tgl",tmpA,sizeof(tmpA))) { + j = atoi(tmpA); + sprintf(tmpA,"

Toggled %i!

",j); + poststr(request,tmpA); + CHANNEL_Toggle(j); + } + if(http_getArg(request->url,"on",tmpA,sizeof(tmpA))) { + j = atoi(tmpA); + sprintf(tmpA,"

Enabled %i!

",j); + poststr(request,tmpA); + CHANNEL_Set(j,255,1); + } + if(http_getArg(request->url,"off",tmpA,sizeof(tmpA))) { + j = atoi(tmpA); + sprintf(tmpA,"

Disabled %i!

",j); + poststr(request,tmpA); + CHANNEL_Set(j,0,1); + } + if(http_getArg(request->url,"pwm",tmpA,sizeof(tmpA))) { + int newPWMValue = atoi(tmpA); + http_getArg(request->url,"pwmIndex",tmpA,sizeof(tmpA)); + j = atoi(tmpA); + sprintf(tmpA,"

Changed pwm %i to %i!

",j,newPWMValue); + poststr(request,tmpA); + CHANNEL_Set(j,newPWMValue,1); + } + + for(i = 0; i < GPIO_MAX; i++) { + int role = PIN_GetPinRoleForPinIndex(i); + int ch = PIN_GetPinChannelForPinIndex(i); + if(role == IOR_Relay || role == IOR_Relay_n || role == IOR_LED || role == IOR_LED_n) { + BIT_SET(relayFlags,ch); + } + if(role == IOR_PWM) { + BIT_SET(pwmFlags,ch); + } + } + for(i = 0; i < CHANNEL_MAX; i++) { + if(BIT_CHECK(relayFlags,i)) { + const char *c; + if(CHANNEL_Check(i)) { + c = "r"; + } else { + c = "g"; + } + poststr(request,"
"); + sprintf(tmpA,"",i); + poststr(request,tmpA); + sprintf(tmpA,"
",c,i); + poststr(request,tmpA); + } + if(BIT_CHECK(pwmFlags,i)) { + int pwmValue; + + pwmValue = CHANNEL_Get(i); + sprintf(tmpA,"
",i); + poststr(request,tmpA); + sprintf(tmpA,"",i,pwmValue); + poststr(request,tmpA); + sprintf(tmpA,"",i); + poststr(request,tmpA); + sprintf(tmpA,"
",i); + poststr(request,tmpA); + + + poststr(request,""); + } + } +// strcat(outbuf,""); + + + if(http_getArg(request->url,"restart",tmpA,sizeof(tmpA))) { + poststr(request,"
Module will restart soon
"); +#if WINDOWS + +#elif PLATFORM_XR809 + +#else + RESET_ScheduleModuleReset(3); +#endif + } + + poststr(request,"
"); + + poststr(request,"
\ + \ + \ +
"); + + poststr(request,"
"); + + + poststr(request,htmlReturnToMenu); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_ota_exec(http_request_t *request) { + char tmpA[128]; + char tmpB[64]; + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + if(http_getArg(request->url,"host",tmpA,sizeof(tmpA))) { + sprintf(tmpB,"

OTA requested for %s!

",tmpA); + poststr(request,tmpB); +#if WINDOWS + +#elif PLATFORM_XR809 + //cmd_ota_http_exec(tmpA); + xr809_do_ota_next_frame(tmpA); +#else + otarequest(tmpA); +#endif + } + poststr(request,htmlReturnToMenu); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_ota(http_request_t *request) { + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,"
\ +
\ +
\ + \ +
"); + poststr(request,htmlReturnToMenu); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + +int http_fn_empty_url(http_request_t *request) { + poststr(request,"HTTP/1.1 302 OK\nLocation: /index\nConnection: close\n\n"); + poststr(request, NULL); + return 0; +} + +int http_fn_other(http_request_t *request) { + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + poststr(request,"Not found.
"); + poststr(request,htmlReturnToMenu); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + poststr(request, NULL); + return 0; +} diff --git a/src/httpserver/http_fns.h b/src/httpserver/http_fns.h new file mode 100644 index 000000000..2968fd552 --- /dev/null +++ b/src/httpserver/http_fns.h @@ -0,0 +1,25 @@ +#include "new_http.h" + + +extern const char *g_header; + +int http_fn_about(http_request_t *request); +int http_fn_cfg_mqtt(http_request_t *request); +int http_fn_cfg_mqtt_set(http_request_t *request); +int http_fn_cfg_webapp(http_request_t *request); +int http_fn_config_dump_table(http_request_t *request); +int http_fn_cfg_webapp_set(http_request_t *request); +int http_fn_cfg_wifi_set(http_request_t *request); +int http_fn_cfg_loglevel_set(http_request_t *request); +int http_fn_cfg_wifi(http_request_t *request); +int http_fn_cfg_mac(http_request_t *request); +int http_fn_flash_read_tool(http_request_t *request); +int http_fn_cfg_quick(http_request_t *request); +int http_fn_cfg_ha(http_request_t *request); +int http_fn_cfg(http_request_t *request); +int http_fn_cfg_pins(http_request_t *request); +int http_fn_index(http_request_t *request); +int http_fn_ota_exec(http_request_t *request); +int http_fn_ota(http_request_t *request); +int http_fn_empty_url(http_request_t *request); +int http_fn_other(http_request_t *request); diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c index 2aa7ac466..bcabab350 100644 --- a/src/httpserver/new_http.c +++ b/src/httpserver/new_http.c @@ -9,69 +9,16 @@ #elif PLATFORM_XR809 #include "lwip/sockets.h" #include -#include #else #include "lwip/sockets.h" #include "str_pub.h" -#include "../flash_config/flash_config.h" #endif #include "new_http.h" +#include "http_fns.h" #include "../new_pins.h" #include "../new_cfg.h" #include "../ota/ota.h" -#ifdef WINDOWS -#elif PLATFORM_XR809 - -#elif defined(PLATFORM_BK7231N) -// tuya-iotos-embeded-sdk-wifi-ble-bk7231n/sdk/include/tuya_hal_storage.h -#include "tuya_hal_storage.h" -#include "BkDriverFlash.h" -#else -// REALLY? A typo in Tuya SDK? Storge? -// tuya-iotos-embeded-sdk-wifi-ble-bk7231t/platforms/bk7231t/tuya_os_adapter/include/driver/tuya_hal_storge.h -#include "../logging/logging.h" -#include "tuya_hal_storge.h" -#include "BkDriverFlash.h" -#endif - -/* -GET / HTTP/1.1 -Host: 127.0.0.1 -*/ -/* -GET /test?a=5 HTTP/1.1 -Host: 127.0.0.1 -*/ -/* -GET /test?a=Test%20with%20space HTTP/1.1 -Host: 127.0.0.1 -Connection: keep-alive -Cache-Control: max-age=0 -*/ -/* -GET /test?a=15&b=25 HTTP/1.1 -Host: 127.0.0.1 -Connection: keep-alive -*/ - -#define DEFAULT_OTA_URL "http://raspberrypi:1880/firmware" - -// make sure that USER_SW_VER is set on all platforms -#ifndef USER_SW_VER -#ifdef WINDOWS -#define USER_SW_VER "Win_Test" -#elif PLATFORM_XR809 -#define USER_SW_VER "XR809_Test" -#elif defined(PLATFORM_BK7231N) -#define USER_SW_VER "BK7231N_Test" -#elif defined(PLATFORM_BK7231T) -#define USER_SW_VER "BK7231T_Test" -#else -#define USER_SW_VER "unknown" - -#endif -#endif const char httpHeader[] = "HTTP/1.1 %d OK\nContent-type: %s" ; // HTTP header const char httpMimeTypeHTML[] = "text/html" ; // HTML MIME type @@ -80,8 +27,23 @@ const char httpMimeTypeJson[] = "application/json" ; // TEXT MIME type const char httpMimeTypeBinary[] = "application/octet-stream" ; // binary/file MIME type const char htmlHeader[] = "" ; const char htmlEnd[] = "" ; -const char htmlReturnToMenu[] = "Return to menu";; -const char htmlReturnToCfg[] = "Return to cfg";; +const char htmlReturnToMenu[] = "Return to menu"; +const char htmlReturnToCfg[] = "Return to cfg"; + +// make sure that USER_SW_VER is set on all platforms +#ifndef USER_SW_VER + #ifdef WINDOWS + #define USER_SW_VER "Win_Test" + #elif PLATFORM_XR809 + #define USER_SW_VER "XR809_Test" + #elif defined(PLATFORM_BK7231N) + #define USER_SW_VER "BK7231N_Test" + #elif defined(PLATFORM_BK7231T) + #define USER_SW_VER "BK7231T_Test" + #else + #define USER_SW_VER "unknown" + #endif +#endif const char *g_build_str = "Build on " __DATE__ " " __TIME__ " version " USER_SW_VER; // Show GIT version at Build line; const char httpCorsHeaders[] = "Access-Control-Allow-Origin: *\r\nAccess-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept" ; // TEXT MIME type @@ -93,10 +55,9 @@ const char *methodNames[] = { "OPTIONS" }; - #if WINDOWS -#define os_free free -#define os_malloc malloc + #define os_free free + #define os_malloc malloc #endif void misc_formatUpTimeString(int totalSeconds, char *o); @@ -162,6 +123,7 @@ bool http_startsWith(const char *base, const char *substr) { } return true; } + bool http_checkUrlBase(const char *base, const char *fileName) { while(*base != 0 && *base != '?' && *base != ' ') { if(*base != *fileName) @@ -195,6 +157,7 @@ const char *http_checkArg(const char *p, const char *n) { } return p; } + void http_copyCarg(const char *atin, char *to, int maxSize) { int a, b; const unsigned char *at = (unsigned char *)atin; @@ -234,6 +197,7 @@ void http_copyCarg(const char *atin, char *to, int maxSize) { } *to = 0; } + bool http_getArg(const char *base, const char *name, char *o, int maxSize) { *o = '\0'; while(*base != '?') { @@ -260,20 +224,6 @@ bool http_getArg(const char *base, const char *name, char *o, int maxSize) { return 0; } -const char *htmlIndex = ""; -/* -const char *htmlPinRoles = "\ -\ -\ -\ -\ -\ -"; -*/ - const char *htmlPinRoleNames[] = { " ", "Rel", @@ -314,32 +264,6 @@ void setupAllWB2SPinsAsButtons() { PIN_SetPinChannelForPinIndex(27,1); } -typedef struct template_s { - void (*setter)(); - const char *name; -} template_t; - -template_t g_templates [] = { - { Setup_Device_Empty, "Empty"}, - // BK7231N devices - { Setup_Device_BK7231N_CB2S_QiachipSmartSwitch, "[BK7231N][CB2S] QiaChip Smart Switch"}, - // BK7231T devices - { Setup_Device_BK7231T_WB2S_QiachipSmartSwitch, "[BK7231T][WB2S] QiaChip Smart Switch"}, - { Setup_Device_TuyaWL_SW01_16A, "WL SW01 16A"}, - { Setup_Device_TuyaSmartLife4CH10A, "Smart Life 4CH 10A"}, - { Setup_Device_IntelligentLife_NF101A, "Intelligent Life NF101A"}, - { Setup_Device_TuyaLEDDimmerSingleChannel, "Tuya LED Dimmer Single Channel PWM WB3S"}, - { Setup_Device_CalexLEDDimmerFiveChannel, "Calex RGBWW LED Dimmer Five Channel PWM BK7231S"}, - { Setup_Device_CalexPowerStrip_900018_1v1_0UK, "Calex UK power strip 900018.1 v1.0 UK"}, - { Setup_Device_ArlecCCTDownlight, "Arlec CCT LED Downlight ALD029CHA"}, - { Setup_Device_NedisWIFIPO120FWT_16A, "Nedis WIFIPO120FWT SmartPlug 16A"}, - { Setup_Device_NedisWIFIP130FWT_10A, "Nedis WIFIP130FWT SmartPlug 10A"}, - { Setup_Device_BK7231T_Raw_PrimeWiFiSmartOutletsOutdoor_CCWFIO232PK, "Prime SmartOutlet Outdoor 2x Costco"}, - { Setup_Device_EmaxHome_EDU8774, "Emax Home EDU8774 SmartPlug 16A"}, - { Setup_Device_TuyaSmartPFW02G, "Tuya Smart PFW02-G"} -}; - -int g_total_templates = sizeof(g_templates)/sizeof(g_templates[0]); #if PLATFORM_XR809 const char *g_header = "

OpenXR809

[Read more][Support project]

"; @@ -377,7 +301,6 @@ void HTTP_AddBuildFooter(http_request_t *request) { sprintf(upTimeStr,"
Device MAC: %02X%02X%02X%02X%02X%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); poststr(request,upTimeStr); - } @@ -462,22 +385,9 @@ int hprintf128(http_request_t *request, const char *fmt, ...){ return postany(request, tmp, strlen(tmp)); } -uint8_t hexdigit( char hex ) -{ - return (hex <= '9') ? hex - '0' : - toupper((unsigned char)hex) - 'A' + 10 ; -} - -uint8_t hexbyte( const char* hex ) -{ - return (hexdigit(*hex) << 4) | hexdigit(*(hex+1)) ; -} int HTTP_ProcessPacket(http_request_t *request) { - int i, j, k; - char tmpA[128]; - char tmpB[64]; - char tmpC[64]; + int i; char *p; char *headers; char *protocol; @@ -570,27 +480,6 @@ int HTTP_ProcessPacket(http_request_t *request) { request->bodystart = p; request->bodylen = request->receivedLen - (p - request->received); - // we will make this more general - http_getArg(urlStr,"a",tmpA,sizeof(tmpA)); - http_getArg(urlStr,"b",tmpB,sizeof(tmpB)); - http_getArg(urlStr,"c",tmpC,sizeof(tmpC)); - if (*tmpA){ - request->querynames[request->numqueryitems] = "a"; - request->queryvalues[request->numqueryitems] = tmpA; - request->numqueryitems++; - } - if (*tmpB){ - request->querynames[request->numqueryitems] = "b"; - request->queryvalues[request->numqueryitems] = tmpB; - request->numqueryitems++; - } - if (*tmpC){ - request->querynames[request->numqueryitems] = "c"; - request->queryvalues[request->numqueryitems] = tmpC; - request->numqueryitems++; - } - - // look for a callback with this URL and method, or HTTP_ANY for (i = 0; i < numCallbacks; i++){ char *url = callbacks[i]->url; @@ -602,809 +491,25 @@ int HTTP_ProcessPacket(http_request_t *request) { } } - if(http_checkUrlBase(urlStr,"about")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"About us page."); - poststr(request,htmlReturnToMenu); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_mqtt")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"

Use this to connect to your MQTT

"); - poststr(request,"
\ -
\ -
\ -
\ -

\ -
\ -
\ -
\ -
\ -
\ -
\ - \ -
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_mqtt_set")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - - if(http_getArg(urlStr,"host",tmpA,sizeof(tmpA))) { - CFG_SetMQTTHost(tmpA); - } - if(http_getArg(urlStr,"port",tmpA,sizeof(tmpA))) { - CFG_SetMQTTPort(atoi(tmpA)); - } - if(http_getArg(urlStr,"user",tmpA,sizeof(tmpA))) { - CFG_SetMQTTUserName(tmpA); - } - if(http_getArg(urlStr,"password",tmpA,sizeof(tmpA))) { - CFG_SetMQTTPass(tmpA); - } - if(http_getArg(urlStr,"client",tmpA,sizeof(tmpA))) { - CFG_SetMQTTBrokerName(tmpA); - } - if(CFG_SaveMQTT()) { - poststr(request,"MQTT mode set!"); - } else { - poststr(request,"Error saving MQTT settings to flash!"); - } - + if(http_checkUrlBase(urlStr,"about")) return http_fn_about(request); + if(http_checkUrlBase(urlStr,"cfg_mqtt")) return http_fn_cfg_mqtt(request); + if(http_checkUrlBase(urlStr,"cfg_mqtt_set")) return http_fn_cfg_mqtt_set(request); + if(http_checkUrlBase(urlStr,"cfg_webapp")) return http_fn_cfg_webapp(request); + if(http_checkUrlBase(urlStr,"config_dump_table")) return http_fn_config_dump_table(request); + if(http_checkUrlBase(urlStr,"cfg_webapp_set")) return http_fn_cfg_webapp_set(request); + if(http_checkUrlBase(urlStr,"cfg_wifi_set")) return http_fn_cfg_wifi_set(request); + if(http_checkUrlBase(urlStr,"cfg_loglevel_set")) return http_fn_cfg_loglevel_set(request); + if(http_checkUrlBase(urlStr,"cfg_wifi")) return http_fn_cfg_wifi(request); + if(http_checkUrlBase(urlStr,"cfg_mac")) return http_fn_cfg_mac(request); + if(http_checkUrlBase(urlStr,"flash_read_tool")) return http_fn_flash_read_tool(request); + if(http_checkUrlBase(urlStr,"cfg_quick")) return http_fn_cfg_quick(request); + if(http_checkUrlBase(urlStr,"cfg_ha")) return http_fn_cfg_ha(request); + if(http_checkUrlBase(urlStr,"cfg")) return http_fn_cfg(request); + if(http_checkUrlBase(urlStr,"cfg_pins")) return http_fn_cfg_pins(request); + if(http_checkUrlBase(urlStr,"index")) return http_fn_index(request); + if(http_checkUrlBase(urlStr,"ota_exec")) return http_fn_ota_exec(request); + if(http_checkUrlBase(urlStr,"ota")) return http_fn_ota(request); + if(http_checkUrlBase(urlStr,"")) return http_fn_empty_url(request); - poststr(request,"Please wait for module to connect... if there is problem, restart it..."); - - poststr(request,"
"); - poststr(request,"Return to MQTT settings"); - poststr(request,"
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_webapp")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"

Use this to set the URL of the Webapp

"); - poststr(request,"
\ -
\ -
\ - \ -
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"config_dump_table")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); -#if WINDOWS - poststr(request,"Not implemented
"); -#elif PLATFORM_XR809 - poststr(request,"Not implemented
"); -#else - poststr(request,"Dumped to log
"); - config_dump_table(); -#endif - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_webapp_set")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - - if(http_getArg(urlStr,"url",tmpA,sizeof(tmpA))) { - if(CFG_SetWebappRoot(tmpA)) { - hprintf128(request,"Webapp url set to %s", tmpA); - } else { - hprintf128(request,"Webapp url change error - failed to save to flash."); - } - } else { - poststr(request,"Webapp url not set because you didn't specify the argument."); - } - - poststr(request,"
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_wifi_set")) { - printf("HTTP_ProcessPacket: generating cfg_wifi_set \r\n"); - - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - if(http_getArg(recvbuf,"open",tmpA,sizeof(tmpA))) { - CFG_SetWiFiSSID(""); - CFG_SetWiFiPass(""); - poststr(request,"WiFi mode set: open access point."); - } else { - if(http_getArg(urlStr,"ssid",tmpA,sizeof(tmpA))) { - CFG_SetWiFiSSID(tmpA); - } - if(http_getArg(urlStr,"pass",tmpA,sizeof(tmpA))) { - CFG_SetWiFiPass(tmpA); - } - poststr(request,"WiFi mode set: connect to WLAN."); - } - printf("HTTP_ProcessPacket: calling CFG_SaveWiFi \r\n"); - CFG_SaveWiFi(); - printf("HTTP_ProcessPacket: done CFG_SaveWiFi \r\n"); - - poststr(request,"Please wait for module to reset..."); - - poststr(request,"
"); - poststr(request,"Return to WiFi settings"); - poststr(request,"
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_loglevel_set")) { - printf("HTTP_ProcessPacket: generating cfg_loglevel_set \r\n"); - - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - if(http_getArg(recvbuf,"loglevel",tmpA,sizeof(tmpA))) { -#if PLATFORM_BK7231T - loglevel = atoi(tmpA); -#endif - poststr(request,"LOG level changed."); - } - poststr(request,"
\ -
\ -

\ - \ -
"); - - poststr(request,"
"); - poststr(request,"Return to config settings"); - poststr(request,"
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_wifi")) { - // for a test, show password as well... - const char *cur_ssid, *cur_pass; - - - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - /*bChanged = 0; - if(http_getArg(recvbuf,"ssid",tmpA,sizeof(tmpA))) { - CFG_SetWiFiSSID(tmpA); - poststr(request,"

WiFi SSID set!

"); - bChanged = 1; - } - if(http_getArg(recvbuf,"pass",tmpA,sizeof(tmpA))) { - CFG_SetWiFiPass(tmpA); - poststr(request,"

WiFi Password set!

"); - bChanged = 1; - } - if(bChanged) { - poststr(request,"

Device will reconnect after restarting

"); - }*/ - poststr(request,"

Check networks reachable by module

This will lag few seconds.
"); - if(http_getArg(urlStr,"scan",tmpA,sizeof(tmpA))) { -#ifdef WINDOWS - - poststr(request,"Not available on Windows
"); -#elif PLATFORM_XR809 - poststr(request,"TODO XR809
"); - -#elif PLATFORM_BK7231T - AP_IF_S *ar; - uint32_t num; - - bk_printf("Scan begin...\r\n"); - tuya_hal_wifi_all_ap_scan(&ar,&num); - bk_printf("Scan returned %i networks\r\n",num); - for(i = 0; i < num; i++) { - sprintf(tmpA,"[%i/%i] SSID: %s, Channel: %i, Signal %i
",i,(int)num,ar[i].ssid, ar[i].channel, ar[i].rssi); - poststr(request,tmpA); - } - tuya_hal_wifi_release_ap(ar); -#elif PLATFORM_BK7231N - poststr(request,"TODO: BK7231N support for scan
"); - -#else -#error "Unknown platform" - poststr(request,"Unknown platform
"); -#endif - } - poststr(request,"
\ - \ - \ -
"); - poststr(request,"

Use this to disconnect from your WiFi

"); - poststr(request,"
\ - \ - \ -
"); - poststr(request,"

Use this to connect to your WiFi

"); - poststr(request,"
\ -
\ -
\ -
\ -

\ - \ -
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_mac")) { - // must be unsigned, else print below prints negatives as e.g. FFFFFFFe - unsigned char mac[6]; - - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - - if(http_getArg(recvbuf,"mac",tmpA,sizeof(tmpA))) { - for( i = 0; i < 6; i++ ) - { - mac[i] = hexbyte( &tmpA[i * 2] ) ; - } - //sscanf(tmpA,"%02X%02X%02X%02X%02X%02X",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]); - if(WiFI_SetMacAddress((char*)mac)) { - poststr(request,"

New MAC set!

"); - } else { - poststr(request,"

MAC change error?

"); - } - } - - WiFI_GetMacAddress((char *)mac); - - sprintf(tmpA,"%02X%02X%02X%02X%02X%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); - - poststr(request,"

Here you can change MAC address.

"); - poststr(request,"
\ -
\ -

\ - \ -
"); - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"flash_read_tool")) { - int len = 16; - int ofs = 1970176; - int res; - int rem; - int now; - int nowOfs; - int hex; - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"

Flash Read Tool

"); - if( http_getArg(urlStr,"hex",tmpA,sizeof(tmpA))){ - hex = atoi(tmpA); - } else { - hex = 0; - } - - if( http_getArg(urlStr,"offset",tmpA,sizeof(tmpA)) && - http_getArg(urlStr,"len",tmpB,sizeof(tmpB))) { - u8 buffer[128]; - len = atoi(tmpB); - ofs = atoi(tmpA); - sprintf(tmpA,"Memory at %i with len %i reads: ",ofs,len); - poststr(request,tmpA); - poststr(request,"
"); - - ///res = bekken_hal_flash_read (ofs, buffer,len); - //sprintf(tmpA,"Result %i",res); - // strcat(outbuf,tmpA); - /// strcat(outbuf,"
"); - - nowOfs = ofs; - rem = len; - while(1) { - if(rem > sizeof(buffer)) { - now = sizeof(buffer); - } else { - now = rem; - } -#if PLATFORM_XR809 - //uint32_t flash_read(uint32_t flash, uint32_t addr,void *buf, uint32_t size) - #define FLASH_INDEX_XR809 0 - res = flash_read(FLASH_INDEX_XR809, nowOfs, buffer, now); -#else - res = bekken_hal_flash_read (nowOfs, buffer,now); -#endif - for(i = 0; i < now; i++) { - u8 val = buffer[i]; - if(!hex && isprint(val)) { - sprintf(tmpA,"'%c' ",val); - } else { - sprintf(tmpA,"%02X ",val); - } - poststr(request,tmpA); - } - rem -= now; - nowOfs += now; - if(rem <= 0) { - break; - } - } - - poststr(request,"
"); - } - poststr(request,"
"); - - poststr(request,"
"); - poststr(request,"
\ -
",ofs); - poststr(request,tmpA); - poststr(request,"
\ - ",len); - poststr(request,tmpA); - poststr(request,"

\ - \ -
"); - - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - - } else if(http_checkUrlBase(urlStr,"cfg_quick")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"

Quick Config

"); - - if(http_getArg(urlStr,"dev",tmpA,sizeof(tmpA))) { - j = atoi(tmpA); - sprintf(tmpA,"

Set dev %i!

",j); - poststr(request,tmpA); - - g_templates[j].setter(); - } - poststr(request,"
"); - sprintf(tmpA, ""); - poststr(request,"
"); - - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - - - } else if(http_checkUrlBase(urlStr,"cfg_ha")) { - int relayFlags = 0; - int pwmFlags = 0; - int relayCount = 0; - int pwmCount = 0; - const char *baseName; - - baseName = CFG_GetShortDeviceName(); - - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"

Home Assistant Cfg

"); - poststr(request,"

Paste this to configuration yaml

"); - poststr(request,"
Make sure that you have \"switch:\" keyword only once! Home Assistant doesn't like dup keywords.
"); - poststr(request,"
You can also use \"switch MyDeviceName:\" to avoid keyword duplication!
"); - - poststr(request,""); - - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - - - } else if(http_checkUrlBase(urlStr,"cfg")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - poststr(request,"
"); - -#if PLATFORM_BK7231T | PLATFORM_BK7231N - k = config_get_tableOffsets(BK_PARTITION_NET_PARAM,&i,&j); - sprintf(tmpA,"BK_PARTITION_NET_PARAM: bOk %i, at %i, len %i
",k,i,j); - poststr(request,tmpA); - k = config_get_tableOffsets(BK_PARTITION_RF_FIRMWARE,&i,&j); - sprintf(tmpA,"BK_PARTITION_RF_FIRMWARE: bOk %i, at %i, len %i
",k,i,j); - poststr(request,tmpA); - k = config_get_tableOffsets(BK_PARTITION_OTA,&i,&j); - sprintf(tmpA,"BK_PARTITION_OTA: bOk %i, at %i, len %i
",k,i,j); - poststr(request,tmpA); -#endif - - - poststr(request,"Launch Web Application
"); - - poststr(request,htmlReturnToMenu); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - //} else if(http_checkUrlBase(urlStr,"setWB2SInputs")) { - // http_setup(outbuf, httpMimeTypeHTML); - // poststr(request,htmlHeader); - - // setupAllWB2SPinsAsButtons(); - - // http_setup(outbuf, httpMimeTypeHTML); - // poststr(request,"Set all inputs for dbg ."); - // poststr(request,htmlReturnToMenu); - // HTTP_AddBuildFooter(outbuf); - // poststr(request,htmlEnd); - //} else if(http_checkUrlBase(urlStr,"setAllInputs")) { - // http_setup(outbuf, httpMimeTypeHTML); - // poststr(request,htmlHeader); - // // it breaks UART pins as well, omg! - // for(i = 0; i < GPIO_MAX; i++) { - // PIN_SetPinRoleForPinIndex(i,IOR_Button); - // PIN_SetPinChannelForPinIndex(i,1); - // } - // http_setup(outbuf, httpMimeTypeHTML); - // poststr(request,"Set all inputs for dbg ."); - // poststr(request,htmlReturnToMenu); - // HTTP_AddBuildFooter(outbuf); - // poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"cfg_pins")) { - int iChanged = 0; - int iChangedRequested = 0; - - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - for(i = 0; i < GPIO_MAX; i++) { - sprintf(tmpA, "%i",i); - if(http_getArg(recvbuf,tmpA,tmpB,sizeof(tmpB))) { - int role; - int pr; - - iChangedRequested++; - - role = atoi(tmpB); - - pr = PIN_GetPinRoleForPinIndex(i); - if(pr != role) { - PIN_SetPinRoleForPinIndex(i,role); - iChanged++; - } - } - sprintf(tmpA, "r%i",i); - if(http_getArg(urlStr,tmpA,tmpB,sizeof(tmpB))) { - int rel; - int prevRel; - - iChangedRequested++; - - rel = atoi(tmpB); - - prevRel = PIN_GetPinChannelForPinIndex(i); - if(prevRel != rel) { - PIN_SetPinChannelForPinIndex(i,rel); - iChanged++; - } - } - } - if(iChangedRequested>0) { - PIN_SaveToFlash(); - sprintf(tmpA, "Pins update - %i reqs, %i changed!

",iChangedRequested,iChanged); - poststr(request,tmpA); - } - // strcat(outbuf,""); - poststr(request,"
"); - for( i = 0; i < GPIO_MAX; i++) { - int si, ch; - - si = PIN_GetPinRoleForPinIndex(i); - ch = PIN_GetPinChannelForPinIndex(i); - -#if PLATFORM_XR809 - poststr(request,PIN_GetPinNameAlias(i)); - poststr(request," "); -#else - sprintf(tmpA, "P%i ",i); - poststr(request,tmpA); -#endif - sprintf(tmpA, ""); - if(ch == 0) { - tmpB[0] = 0; - } else { - sprintf(tmpB,"%i",ch); - } - sprintf(tmpA, "",i,tmpB); - poststr(request,tmpA); - poststr(request,"
"); - } - poststr(request,"
"); - - poststr(request,htmlReturnToCfg); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"index")) { - int relayFlags; - int pwmFlags; - - relayFlags = 0; - pwmFlags = 0; - - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,""); - poststr(request,g_header); - if(http_getArg(urlStr,"tgl",tmpA,sizeof(tmpA))) { - j = atoi(tmpA); - sprintf(tmpA,"

Toggled %i!

",j); - poststr(request,tmpA); - CHANNEL_Toggle(j); - } - if(http_getArg(urlStr,"on",tmpA,sizeof(tmpA))) { - j = atoi(tmpA); - sprintf(tmpA,"

Enabled %i!

",j); - poststr(request,tmpA); - CHANNEL_Set(j,255,1); - } - if(http_getArg(urlStr,"off",tmpA,sizeof(tmpA))) { - j = atoi(tmpA); - sprintf(tmpA,"

Disabled %i!

",j); - poststr(request,tmpA); - CHANNEL_Set(j,0,1); - } - if(http_getArg(urlStr,"pwm",tmpA,sizeof(tmpA))) { - int newPWMValue = atoi(tmpA); - http_getArg(urlStr,"pwmIndex",tmpA,sizeof(tmpA)); - j = atoi(tmpA); - sprintf(tmpA,"

Changed pwm %i to %i!

",j,newPWMValue); - poststr(request,tmpA); - CHANNEL_Set(j,newPWMValue,1); - } - - for(i = 0; i < GPIO_MAX; i++) { - int role = PIN_GetPinRoleForPinIndex(i); - int ch = PIN_GetPinChannelForPinIndex(i); - if(role == IOR_Relay || role == IOR_Relay_n || role == IOR_LED || role == IOR_LED_n) { - BIT_SET(relayFlags,ch); - } - if(role == IOR_PWM) { - BIT_SET(pwmFlags,ch); - } - } - for(i = 0; i < CHANNEL_MAX; i++) { - if(BIT_CHECK(relayFlags,i)) { - const char *c; - if(CHANNEL_Check(i)) { - c = "r"; - } else { - c = "g"; - } - poststr(request,"
"); - sprintf(tmpA,"",i); - poststr(request,tmpA); - sprintf(tmpA,"
",c,i); - poststr(request,tmpA); - } - if(BIT_CHECK(pwmFlags,i)) { - int pwmValue; - - pwmValue = CHANNEL_Get(i); - sprintf(tmpA,"
",i); - poststr(request,tmpA); - sprintf(tmpA,"",i,pwmValue); - poststr(request,tmpA); - sprintf(tmpA,"",i); - poststr(request,tmpA); - sprintf(tmpA,"
",i); - poststr(request,tmpA); - - - poststr(request,""); - } - } - // strcat(outbuf,""); - - - if(http_getArg(urlStr,"restart",tmpA,sizeof(tmpA))) { - poststr(request,"
Module will restart soon
"); -#if WINDOWS - -#elif PLATFORM_XR809 - -#else - RESET_ScheduleModuleReset(3); -#endif - } - - poststr(request,"
"); - - poststr(request,"
\ - \ - \ -
"); - - poststr(request,"
"); - - - poststr(request,htmlReturnToMenu); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"ota_exec")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - if(http_getArg(urlStr,"host",tmpA,sizeof(tmpA))) { - sprintf(tmpB,"

OTA requested for %s!

",tmpA); - poststr(request,tmpB); -#if WINDOWS - -#elif PLATFORM_XR809 - //cmd_ota_http_exec(tmpA); - xr809_do_ota_next_frame(tmpA); -#else - otarequest(tmpA); -#endif - } - poststr(request,htmlReturnToMenu); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"ota")) { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,"
\ -
\ -
\ - \ -
"); - poststr(request,htmlReturnToMenu); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } else if(http_checkUrlBase(urlStr,"")) { - // Redirect / to /index page - poststr(request,"HTTP/1.1 302 OK\nLocation: /index\nConnection: close\n\n"); - } else { - http_setup(request, httpMimeTypeHTML); - poststr(request,htmlHeader); - poststr(request,g_header); - poststr(request,"Not found.
"); - poststr(request,htmlReturnToMenu); - HTTP_AddBuildFooter(request); - poststr(request,htmlEnd); - } - - - // force send remaining - poststr(request, NULL); - // nothing more to send - return 0; + return http_fn_other(request); } diff --git a/src/httpserver/new_http.h b/src/httpserver/new_http.h index dc3553f74..289f6f204 100644 --- a/src/httpserver/new_http.h +++ b/src/httpserver/new_http.h @@ -1,3 +1,5 @@ +#ifndef _NEW_HTTP_H +#define _NEW_HTTP_H extern const char httpHeader[]; // HTTP header @@ -8,6 +10,7 @@ extern const char httpMimeTypeBinary[]; extern const char htmlHeader[]; extern const char htmlEnd[]; extern const char htmlReturnToMenu[]; +extern const char htmlReturnToCfg[]; extern const char *htmlPinRoleNames[]; @@ -52,6 +55,8 @@ void http_setup(http_request_t *request, const char *type); int poststr(http_request_t *request, const char *str); int postany(http_request_t *request, const char *str, int len); void misc_formatUpTimeString(int totalSeconds, char *o); +void HTTP_AddBuildFooter(http_request_t *request); +bool http_getArg(const char *base, const char *name, char *o, int maxSize); // poststr with format - for results LESS THAN 128 int hprintf128(http_request_t *request, const char *fmt, ...); @@ -68,4 +73,6 @@ typedef enum { typedef int (*http_callback_fn)(http_request_t *request); // url MUST start with '/' // urls must be unique (i.e. you can't have /about and /aboutme or /about/me) -int HTTP_RegisterCallback( const char *url, int method, http_callback_fn callback); \ No newline at end of file +int HTTP_RegisterCallback( const char *url, int method, http_callback_fn callback); + +#endif \ No newline at end of file