From a5769a5db00f8dcfbd90405eb1376a9643076942 Mon Sep 17 00:00:00 2001 From: Indu Prakash Date: Fri, 4 Nov 2022 19:15:48 -0500 Subject: [PATCH 1/8] Added shortcut icon, Escaped deviceName at some places --- favicon.ico | Bin 0 -> 1150 bytes src/httpserver/http_fns.c | 6 +- src/httpserver/new_http.c | 95 ++++++++++++++++++++-- src/httpserver/new_http.h | 6 ++ src/httpserver/rest_interface.c | 137 +++++++++++--------------------- 5 files changed, 144 insertions(+), 100 deletions(-) create mode 100644 favicon.ico diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a0ccd5194c78f5ce2708e1c0e780ea77d18c78f GIT binary patch literal 1150 zcmcgqy9xq944gy3_9|;TAFYL@zaxHyUuEs5Soj&jniz&;vkNCE-Vw8zWM;CQz##89 zLVi~`&4DF=jf6mg7%mBr-XEVLUNJtg=Df}poQs9&Y=d4;E6-2WS;ObmH~VuJ_A=Y* zS|f6Jw!7>To%eQMn{(WK9dnV^SNY{?5${s(L51)6ao^sqJ&f*_caqvYxG%H$)J&^t zZq$lr-y>@{-#n)3%-5RV=I}nZJG0;8W{k7Ux&M<||LM;o@K^)4nZL Gqudv@ehZlZ literal 0 HcmV?d00001 diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index abdea3f58..be2840907 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -885,7 +885,11 @@ int http_fn_cfg_name(http_request_t* request) { poststr(request, "

Use this to change device names

"); add_label_text_field(request, "ShortName", "shortName", CFG_GetShortDeviceName(), "
"); - add_label_text_field(request, "Full Name", "name", CFG_GetDeviceName(), "
"); + + char escapedDeviceName[256]; + html_escape(CFG_GetDeviceName(), escapedDeviceName, 255); + add_label_text_field(request, "Full Name", "name", escapedDeviceName, "
"); + poststr(request, "

"); poststr(request, "" "" ""; @@ -136,6 +139,78 @@ int my_strnicmp(char* a, char* b, int len) { return 0; } + +/// @brief Escape special characters in html. +/// @param in +/// @param outBuffer +/// @param outBufferLength +/// @param script_safe Pass true, if the content part of script +void html_escape(char* in, char* outBuffer, int outBufferLength) { + int outPos = 0; + bool canCopy = true; + for (int i = 0; canCopy && (i < strlen(in)); i++) { + switch (in[i]) { + case '<': + if ((outPos + 5) < outBufferLength) { + outBuffer[outPos++] = '&'; + outBuffer[outPos++] = 'l'; + outBuffer[outPos++] = 't'; + outBuffer[outPos++] = ';'; + } + else { + canCopy = false; + } + break; + case '>': + if ((outPos + 5) < outBufferLength) { + outBuffer[outPos++] = '&'; + outBuffer[outPos++] = 'g'; + outBuffer[outPos++] = 't'; + outBuffer[outPos++] = ';'; + } + else { + canCopy = false; + } + break; + case '&': + if ((outPos + 6) < outBufferLength) { + outBuffer[outPos++] = '&'; + outBuffer[outPos++] = 'a'; + outBuffer[outPos++] = 'm'; + outBuffer[outPos++] = 'p'; + outBuffer[outPos++] = ';'; + } + else { + canCopy = false; + } + break; + case '"': + if ((outPos + 7) < outBufferLength) { + outBuffer[outPos++] = '&'; + outBuffer[outPos++] = 'q'; + outBuffer[outPos++] = 'u'; + outBuffer[outPos++] = 'o'; + outBuffer[outPos++] = 't'; + outBuffer[outPos++] = ';'; + } + else { + canCopy = false; + } + break; + default: + if ((outPos + 1) < outBufferLength) { + outBuffer[outPos++] = in[i]; + } + else { + canCopy = false; + } + break; + } + } + + outBuffer[outPos] = 0; +} + bool http_startsWith(const char* base, const char* substr) { while (*substr != 0) { if (*base != *substr) @@ -172,17 +247,23 @@ void http_setup(http_request_t* request, const char* type) { void http_html_start(http_request_t* request, const char* pagename) { poststr(request, htmlDoctype); - poststr(request, ""); - poststr(request, CFG_GetDeviceName()); // todo: check escaping + poststr(request, "<head><title>"); + + char escapedDeviceName[256]; + html_escape(CFG_GetDeviceName(), escapedDeviceName, 255); + poststr(request, escapedDeviceName); + if (pagename) { poststr(request, " - "); poststr(request, pagename); } poststr(request, ""); - poststr(request, htmlHeadMain); + poststr(request, htmlShortcutIcon); + poststr(request, htmlHeadMeta); poststr(request, htmlHeadStyle); + poststr(request, ""); poststr(request, htmlBodyStart); - poststr(request, CFG_GetDeviceName()); // todo: check escaping + poststr(request, escapedDeviceName); poststr(request, htmlBodyStart2); } @@ -429,7 +510,7 @@ int hprintf255(http_request_t* request, const char* fmt, ...) { va_list argList; //BaseType_t taken; char tmp[256]; - memset(tmp, 0, 256); + memset(tmp, 0, 256); va_start(argList, fmt); vsnprintf(tmp, 255, fmt, argList); va_end(argList); @@ -556,7 +637,7 @@ int HTTP_ProcessPacket(http_request_t* request) { int method = callbacks[i]->method; if (method == HTTP_ANY || method == request->method) { return callbacks[i]->callback(request); - } + } } } if (http_checkUrlBase(urlStr, "")) return http_fn_empty_url(request); diff --git a/src/httpserver/new_http.h b/src/httpserver/new_http.h index 8fb81dfff..19c41135d 100644 --- a/src/httpserver/new_http.h +++ b/src/httpserver/new_http.h @@ -8,6 +8,10 @@ extern const char httpMimeTypeText[]; // TEXT MIME type extern const char httpMimeTypeJson[]; extern const char httpMimeTypeBinary[]; +extern const char htmlShortcutIcon[]; +extern const char htmlDoctype[]; +extern const char htmlHeadMeta[]; + extern const char htmlFooterReturnToMenu[]; extern const char htmlFooterRefreshLink[]; extern const char htmlFooterReturnToCfgLink[]; @@ -81,4 +85,6 @@ typedef int (*http_callback_fn)(http_request_t* request); // 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); +void html_escape(char* in, char* outBuffer, int outBufferLength); + #endif diff --git a/src/httpserver/rest_interface.c b/src/httpserver/rest_interface.c index 97d298afb..15bbebb46 100644 --- a/src/httpserver/rest_interface.c +++ b/src/httpserver/rest_interface.c @@ -52,7 +52,6 @@ static int http_rest_get_logconfig(http_request_t* request); static int http_rest_get_lfs_file(http_request_t* request); static int http_rest_post_lfs_file(http_request_t* request); #endif -static int http_favicon(http_request_t* request); static int http_rest_post_reboot(http_request_t* request); static int http_rest_post_flash(http_request_t* request, int startaddr, int maxaddr); @@ -77,57 +76,8 @@ void init_rest() { HTTP_RegisterCallback("/api/", HTTP_GET, http_rest_get); HTTP_RegisterCallback("/api/", HTTP_POST, http_rest_post); HTTP_RegisterCallback("/app", HTTP_GET, http_rest_app); - HTTP_RegisterCallback("/favicon.ico", HTTP_GET, http_favicon); } -const char* apppage1 = -"" -"" -" " -" " -" " -" " -"" -"" -""; - - /* Extracts string token value into outBuffer (128 char). Returns true if the operation was successful. */ bool tryGetTokenString(const char* json, jsmntok_t* tok, char* outBuffer) { if (tok == NULL || tok->type != JSMN_STRING) { @@ -166,20 +116,20 @@ static int http_rest_get(http_request_t* request) { #ifdef BK_LITTLEFS if (!strcmp(request->url, "api/fsblock")) { - uint32_t newsize = CFG_GetLFS_Size(); - uint32_t newstart = (LFS_BLOCKS_END - newsize); + uint32_t newsize = CFG_GetLFS_Size(); + uint32_t newstart = (LFS_BLOCKS_END - newsize); - newsize = (newsize/LFS_BLOCK_SIZE)*LFS_BLOCK_SIZE; + newsize = (newsize / LFS_BLOCK_SIZE) * LFS_BLOCK_SIZE; - // double check again that we're within bounds - don't want - // boot overwrite or anything nasty.... - if (newstart < LFS_BLOCKS_START_MIN){ - return http_rest_error(request, -20, "LFS Size mismatch"); - } - if ((newstart + newsize > LFS_BLOCKS_END) || - (newstart + newsize < LFS_BLOCKS_START_MIN)){ - return http_rest_error(request, -20, "LFS Size mismatch"); - } + // double check again that we're within bounds - don't want + // boot overwrite or anything nasty.... + if (newstart < LFS_BLOCKS_START_MIN) { + return http_rest_error(request, -20, "LFS Size mismatch"); + } + if ((newstart + newsize > LFS_BLOCKS_END) || + (newstart + newsize < LFS_BLOCKS_START_MIN)) { + return http_rest_error(request, -20, "LFS Size mismatch"); + } return http_rest_get_flash(request, newstart, newsize); } @@ -261,20 +211,20 @@ static int http_rest_post(http_request_t* request) { if (lfs_present()) { release_lfs(); } - uint32_t newsize = CFG_GetLFS_Size(); - uint32_t newstart = (LFS_BLOCKS_END - newsize); + uint32_t newsize = CFG_GetLFS_Size(); + uint32_t newstart = (LFS_BLOCKS_END - newsize); - newsize = (newsize/LFS_BLOCK_SIZE)*LFS_BLOCK_SIZE; + newsize = (newsize / LFS_BLOCK_SIZE) * LFS_BLOCK_SIZE; - // double check again that we're within bounds - don't want - // boot overwrite or anything nasty.... - if (newstart < LFS_BLOCKS_START_MIN){ - return http_rest_error(request, -20, "LFS Size mismatch"); - } - if ((newstart + newsize > LFS_BLOCKS_END) || - (newstart + newsize < LFS_BLOCKS_START_MIN)){ - return http_rest_error(request, -20, "LFS Size mismatch"); - } + // double check again that we're within bounds - don't want + // boot overwrite or anything nasty.... + if (newstart < LFS_BLOCKS_START_MIN) { + return http_rest_error(request, -20, "LFS Size mismatch"); + } + if ((newstart + newsize > LFS_BLOCKS_END) || + (newstart + newsize < LFS_BLOCKS_START_MIN)) { + return http_rest_error(request, -20, "LFS Size mismatch"); + } // we are writing the lfs block int res = http_rest_post_flash(request, newstart, LFS_BLOCKS_END); @@ -308,13 +258,17 @@ static int http_rest_app(http_request_t* request) { const char* ourip = HAL_GetMyIPString(); //CFG_GetOurIP(); http_setup(request, httpMimeTypeHTML); if (webhost && ourip) { - poststr(request, apppage1); - poststr(request, webhost); - poststr(request, apppage2); - poststr(request, ourip); - poststr(request, apppage3); - poststr(request, webhost); - poststr(request, apppage4); + poststr(request, htmlDoctype); + + char escapedDeviceName[256]; + html_escape(CFG_GetDeviceName(), escapedDeviceName, 255); + hprintf255(request, "%s", escapedDeviceName); + + poststr(request, htmlShortcutIcon); + poststr(request, htmlHeadMeta); + hprintf255(request, "", webhost, ourip); + hprintf255(request, "", webhost); + poststr(request, ""); } else { http_html_start(request, "Not available"); @@ -567,18 +521,18 @@ exit: return 0; } -static int http_favicon(http_request_t* request) { - request->url = "api/lfs/favicon.ico"; - return http_rest_get_lfs_file(request); -} +// static int http_favicon(http_request_t* request) { +// request->url = "api/lfs/favicon.ico"; +// return http_rest_get_lfs_file(request); +// } #else -static int http_favicon(http_request_t* request) { - request->responseCode = HTTP_RESPONSE_NOT_FOUND; - http_setup(request, httpMimeTypeHTML); - poststr(request, NULL); - return 0; -} +// static int http_favicon(http_request_t* request) { +// request->responseCode = HTTP_RESPONSE_NOT_FOUND; +// http_setup(request, httpMimeTypeHTML); +// poststr(request, NULL); +// return 0; +// } #endif @@ -748,7 +702,6 @@ static int http_rest_get_info(http_request_t* request) { http_setup(request, httpMimeTypeJson); hprintf255(request, "{\"uptime_s\":%d,", Time_getUpTimeSeconds()); hprintf255(request, "\"build\":\"%s\",", g_build_str); - hprintf255(request, "\"sys\":\"%s\",", obktype); hprintf255(request, "\"ip\":\"%s\",", HAL_GetMyIPString()); hprintf255(request, "\"mac\":\"%s\",", HAL_GetMACStr(macstr)); hprintf255(request, "\"mqtthost\":\"%s:%d\",", CFG_GetMQTTHost(), CFG_GetMQTTPort()); From f7510a301e2881e657a778d506316bae2add43de Mon Sep 17 00:00:00 2001 From: Indu Prakash Date: Sun, 6 Nov 2022 19:08:39 -0600 Subject: [PATCH 2/8] Using sizeof --- src/httpserver/http_fns.c | 2 +- src/httpserver/new_http.c | 6 +++--- src/httpserver/rest_interface.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index be2840907..2bde44cd1 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -887,7 +887,7 @@ int http_fn_cfg_name(http_request_t* request) { add_label_text_field(request, "ShortName", "shortName", CFG_GetShortDeviceName(), ""); char escapedDeviceName[256]; - html_escape(CFG_GetDeviceName(), escapedDeviceName, 255); + html_escape(CFG_GetDeviceName(), escapedDeviceName, sizeof(escapedDeviceName)); add_label_text_field(request, "Full Name", "name", escapedDeviceName, "
"); poststr(request, "

"); diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c index 21a6a9664..e6958e046 100644 --- a/src/httpserver/new_http.c +++ b/src/httpserver/new_http.c @@ -250,7 +250,7 @@ void http_html_start(http_request_t* request, const char* pagename) { poststr(request, ""); char escapedDeviceName[256]; - html_escape(CFG_GetDeviceName(), escapedDeviceName, 255); + html_escape(CFG_GetDeviceName(), escapedDeviceName, sizeof(escapedDeviceName)); poststr(request, escapedDeviceName); if (pagename) { @@ -510,7 +510,7 @@ int hprintf255(http_request_t* request, const char* fmt, ...) { va_list argList; //BaseType_t taken; char tmp[256]; - memset(tmp, 0, 256); + memset(tmp, 0, sizeof(tmp)); va_start(argList, fmt); vsnprintf(tmp, 255, fmt, argList); va_end(argList); @@ -637,7 +637,7 @@ int HTTP_ProcessPacket(http_request_t* request) { int method = callbacks[i]->method; if (method == HTTP_ANY || method == request->method) { return callbacks[i]->callback(request); - } + } } } if (http_checkUrlBase(urlStr, "")) return http_fn_empty_url(request); diff --git a/src/httpserver/rest_interface.c b/src/httpserver/rest_interface.c index 15bbebb46..26fbd61b5 100644 --- a/src/httpserver/rest_interface.c +++ b/src/httpserver/rest_interface.c @@ -261,7 +261,7 @@ static int http_rest_app(http_request_t* request) { poststr(request, htmlDoctype); char escapedDeviceName[256]; - html_escape(CFG_GetDeviceName(), escapedDeviceName, 255); + html_escape(CFG_GetDeviceName(), escapedDeviceName, sizeof(escapedDeviceName)); hprintf255(request, "<head><title>%s", escapedDeviceName); poststr(request, htmlShortcutIcon); From 0bb4677a318a22acf2f453f5324df029d75b7a41 Mon Sep 17 00:00:00 2001 From: Indu Prakash Date: Mon, 7 Nov 2022 06:31:21 -0600 Subject: [PATCH 3/8] Created poststr_escaped --- src/httpserver/http_fns.c | 9 ++- src/httpserver/new_http.c | 112 ++++++++++++++------------------ src/httpserver/new_http.h | 3 +- src/httpserver/rest_interface.c | 6 +- 4 files changed, 55 insertions(+), 75 deletions(-) diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 2bde44cd1..03e84a23c 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -137,7 +137,9 @@ void add_label_input(http_request_t* request, char* inputType, char* label, char //These individual strings should be less than 256 .. yes hprintf255 uses 256 char buffer hprintf255(request, "
", fieldId, label); - hprintf255(request, "", inputType, fieldId, fieldId, value); + hprintf255(request, ""); } /// @brief Generates a pair of label and text field elements. @@ -885,10 +887,7 @@ int http_fn_cfg_name(http_request_t* request) { poststr(request, "

Use this to change device names

"); add_label_text_field(request, "ShortName", "shortName", CFG_GetShortDeviceName(), ""); - - char escapedDeviceName[256]; - html_escape(CFG_GetDeviceName(), escapedDeviceName, sizeof(escapedDeviceName)); - add_label_text_field(request, "Full Name", "name", escapedDeviceName, "
"); + add_label_text_field(request, "Full Name", "name", CFG_GetDeviceName(), "
"); poststr(request, "

"); poststr(request, "': - if ((outPos + 5) < outBufferLength) { - outBuffer[outPos++] = '&'; - outBuffer[outPos++] = 'g'; - outBuffer[outPos++] = 't'; - outBuffer[outPos++] = ';'; - } - else { - canCopy = false; - } + foundChar = true; break; case '&': - if ((outPos + 6) < outBufferLength) { - outBuffer[outPos++] = '&'; - outBuffer[outPos++] = 'a'; - outBuffer[outPos++] = 'm'; - outBuffer[outPos++] = 'p'; - outBuffer[outPos++] = ';'; - } - else { - canCopy = false; - } + foundChar = true; break; case '"': - if ((outPos + 7) < outBufferLength) { - outBuffer[outPos++] = '&'; - outBuffer[outPos++] = 'q'; - outBuffer[outPos++] = 'u'; - outBuffer[outPos++] = 'o'; - outBuffer[outPos++] = 't'; - outBuffer[outPos++] = ';'; - } - else { - canCopy = false; - } - break; - default: - if ((outPos + 1) < outBufferLength) { - outBuffer[outPos++] = in[i]; - } - else { - canCopy = false; - } + foundChar = true; break; } } - outBuffer[outPos] = 0; + if (foundChar) { + for (i = 0; i < len; i++) { + switch (str[i]) { + case '<': + postany(request, "<", 4); + break; + case '>': + postany(request, ">", 4); + break; + case '&': + postany(request, "&", 5); + break; + case '"': + postany(request, """, 6); + break; + default: + postany(request, str + i, 1); + break; + } + } + } + else { + postany(request, str, strlen(str)); + } } bool http_startsWith(const char* base, const char* substr) { @@ -248,14 +234,10 @@ void http_setup(http_request_t* request, const char* type) { void http_html_start(http_request_t* request, const char* pagename) { poststr(request, htmlDoctype); poststr(request, ""); - - char escapedDeviceName[256]; - html_escape(CFG_GetDeviceName(), escapedDeviceName, sizeof(escapedDeviceName)); - poststr(request, escapedDeviceName); + poststr_escaped(request, CFG_GetDeviceName()); if (pagename) { - poststr(request, " - "); - poststr(request, pagename); + hprintf255(request, " - %s", pagename); } poststr(request, ""); poststr(request, htmlShortcutIcon); @@ -263,7 +245,7 @@ void http_html_start(http_request_t* request, const char* pagename) { poststr(request, htmlHeadStyle); poststr(request, ""); poststr(request, htmlBodyStart); - poststr(request, escapedDeviceName); + poststr_escaped(request, CFG_GetDeviceName()); poststr(request, htmlBodyStart2); } diff --git a/src/httpserver/new_http.h b/src/httpserver/new_http.h index 19c41135d..5bd23b94f 100644 --- a/src/httpserver/new_http.h +++ b/src/httpserver/new_http.h @@ -61,6 +61,7 @@ void http_setup(http_request_t* request, const char* type); void http_html_start(http_request_t* request, const char* pagename); void http_html_end(http_request_t* request); int poststr(http_request_t* request, const char* str); +void poststr_escaped(http_request_t* request, 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); @@ -85,6 +86,4 @@ typedef int (*http_callback_fn)(http_request_t* request); // 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); -void html_escape(char* in, char* outBuffer, int outBufferLength); - #endif diff --git a/src/httpserver/rest_interface.c b/src/httpserver/rest_interface.c index 26fbd61b5..79a812d07 100644 --- a/src/httpserver/rest_interface.c +++ b/src/httpserver/rest_interface.c @@ -260,9 +260,9 @@ static int http_rest_app(http_request_t* request) { if (webhost && ourip) { poststr(request, htmlDoctype); - char escapedDeviceName[256]; - html_escape(CFG_GetDeviceName(), escapedDeviceName, sizeof(escapedDeviceName)); - hprintf255(request, "%s", escapedDeviceName); + poststr(request, ""); + poststr_escaped(request, CFG_GetDeviceName()); + poststr(request, ""); poststr(request, htmlShortcutIcon); poststr(request, htmlHeadMeta); From 3feb7ed8691a6cc48c0c06d3d0d734bc138d22ef Mon Sep 17 00:00:00 2001 From: Indu Prakash <6459774+iprak@users.noreply.github.com> Date: Mon, 7 Nov 2022 08:48:45 -0600 Subject: [PATCH 4/8] White space change to trigger rebuild 4258cd2afb57812049030e5c0fc7fa057b416270 seems to have addressed the build issue --- src/httpserver/new_http.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/httpserver/new_http.h b/src/httpserver/new_http.h index 5bd23b94f..21ecb2453 100644 --- a/src/httpserver/new_http.h +++ b/src/httpserver/new_http.h @@ -87,3 +87,4 @@ typedef int (*http_callback_fn)(http_request_t* request); int HTTP_RegisterCallback(const char* url, int method, http_callback_fn callback); #endif + From ef83601bb00dba27a432ca43ef64f6616aca3305 Mon Sep 17 00:00:00 2001 From: Indu Prakash Date: Tue, 8 Nov 2022 06:07:45 -0600 Subject: [PATCH 5/8] Accepting kelvin --- src/cmnds/cmd_public.h | 32 +++++++++++++++++--------------- src/httpserver/http_fns.c | 31 ++++++++++++++++++------------- src/httpserver/new_http.c | 2 +- src/httpserver/script.js | 7 +++++++ 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h index bec1204c8..b5943a777 100644 --- a/src/cmnds/cmd_public.h +++ b/src/cmnds/cmd_public.h @@ -3,7 +3,7 @@ #include "../new_common.h" -typedef int (*commandHandler_t)(const void *context, const char *cmd, const char *args, int flags); +typedef int (*commandHandler_t)(const void* context, const char* cmd, const char* args, int flags); // command was entered in console (web app etc) #define COMMAND_FLAG_SOURCE_CONSOLE 1 @@ -21,9 +21,9 @@ typedef int (*commandHandler_t)(const void *context, const char *cmd, const char // void CMD_Init(); -void CMD_RegisterCommand(const char *name, const char *args, commandHandler_t handler, const char *userDesc, void *context); -int CMD_ExecuteCommand(const char *s, int cmdFlags); -int CMD_ExecuteCommandArgs(const char *cmd, const char *args, int cmdFlags); +void CMD_RegisterCommand(const char* name, const char* args, commandHandler_t handler, const char* userDesc, void* context); +int CMD_ExecuteCommand(const char* s, int cmdFlags); +int CMD_ExecuteCommandArgs(const char* cmd, const char* args, int cmdFlags); enum EventCode { CMD_EVENT_NONE, @@ -43,12 +43,12 @@ enum EventCode { CMD_EVENT_CHANGE_VOLTAGE, // must match order in drv_bl0942.c CMD_EVENT_CHANGE_CURRENT, CMD_EVENT_CHANGE_POWER, - CMD_EVENT_CHANGE_CONSUMPTION_TOTAL, - CMD_EVENT_CHANGE_CONSUMPTION_LAST_HOUR, + CMD_EVENT_CHANGE_CONSUMPTION_TOTAL, + CMD_EVENT_CHANGE_CONSUMPTION_LAST_HOUR, // this is for ToggleChannelOnToggle CMD_EVENT_PIN_ONTOGGLE, - + // Argument is a string // You can fire an event when TuyaMCU or something receives given string CMD_EVENT_ON_UART, @@ -87,6 +87,8 @@ enum EventCode { #define HASS_TEMPERATURE_MIN 154 #define HASS_TEMPERATURE_MAX 500 +#define KELVIN_TEMPERATURE_MIN 2000 +#define KELVIN_TEMPERATURE_MAX 6500 // In general, LED can be in two modes: // - Temperature (Cool and Warm LEDs are on) @@ -104,13 +106,13 @@ enum LightMode { // cmd_tokenizer.c int Tokenizer_GetArgsCount(); -const char *Tokenizer_GetArg(int i); -const char *Tokenizer_GetArgFrom(int i); +const char* Tokenizer_GetArg(int i); +const char* Tokenizer_GetArgFrom(int i); int Tokenizer_GetArgInteger(int i); bool Tokenizer_IsArgInteger(int i); float Tokenizer_GetArgFloat(int i); int Tokenizer_GetArgIntegerRange(int i, int rangeMax, int rangeMin); -void Tokenizer_TokenizeString(const char *s, int flags); +void Tokenizer_TokenizeString(const char* s, int flags); // cmd_repeatingEvents.c void RepeatingEvents_Init(); void RepeatingEvents_OnEverySecond(); @@ -118,7 +120,7 @@ void RepeatingEvents_OnEverySecond(); void EventHandlers_Init(); // This is useful to fire an event when a certain UART string command is received. // For example, you can fire an event while getting 55 AA 01 02 00 03 FF 01 01 06 on UART.. -void EventHandlers_FireEvent_String(byte eventCode, const char *argument); +void EventHandlers_FireEvent_String(byte eventCode, const char* argument); // This is useful to fire an event when, for example, a button is pressed. // Then eventCode is a BUTTON_PRESS and argument is a button index. void EventHandlers_FireEvent(byte eventCode, int argument); @@ -140,15 +142,15 @@ void LED_SetTemperature(int tmpInteger, bool bApply); float LED_GetTemperature0to1Range(); void LED_SetTemperature0to1Range(float f); void LED_SetDimmer(int iVal); -int LED_SetBaseColor(const void *context, const char *cmd, const char *args, int bAll); +int LED_SetBaseColor(const void* context, const char* cmd, const char* args, int bAll); void LED_SetFinalCW(byte c, byte w); void LED_SetFinalRGB(byte r, byte g, byte b); -void LED_SetFinalRGBCW(byte *rgbcw); +void LED_SetFinalRGBCW(byte* rgbcw); void LED_NextColor(); void LED_ToggleEnabled(); void LED_SetEnableAll(int bEnable); int LED_GetEnableAll(); -void LED_GetBaseColorString(char * s); +void LED_GetBaseColorString(char* s); int LED_GetMode(); float LED_GetHue(); float LED_GetSaturation(); @@ -167,7 +169,7 @@ void CMD_StartTCPCommandLine(); void SVM_RunThreads(int deltaMS); void CMD_InitScripting(); -byte *LFS_ReadFile(const char *fname); +byte* LFS_ReadFile(const char* fname); #endif // __CMD_PUBLIC_H__ diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 1b8b47a36..4ec5c5421 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -223,7 +223,7 @@ int http_fn_index(http_request_t* request) { LED_SetBaseColor(0, "led_basecolor", tmpA, 0); // auto enable - but only for changes made from WWW panel // This happens when users changes COLOR - if(CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION)) { + if (CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION)) { LED_SetEnableAll(true); } } @@ -244,11 +244,11 @@ int http_fn_index(http_request_t* request) { hprintf255(request, "

Changed pwm %i to %i!

", j, newPWMValue); } CHANNEL_Set(j, newPWMValue, 1); - + if (j == SPECIAL_CHANNEL_TEMPERATURE) { // auto enable - but only for changes made from WWW panel // This happens when users changes TEMPERATURE - if(CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION)) { + if (CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION)) { LED_SetEnableAll(true); } } @@ -264,11 +264,11 @@ int http_fn_index(http_request_t* request) { hprintf255(request, "

Changed dimmer %i to %i!

", j, newDimmerValue); } CHANNEL_Set(j, newDimmerValue, 1); - + if (j == SPECIAL_CHANNEL_BRIGHTNESS) { // auto enable - but only for changes made from WWW panel // This happens when users changes DIMMER - if(CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION)) { + if (CFG_HasFlag(OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION)) { LED_SetEnableAll(true); } } @@ -553,15 +553,20 @@ int http_fn_index(http_request_t* request) { inputName = "pwm"; pwmValue = LED_GetTemperature(); + long pwmKelvin = 1000000 / pwmValue; poststr(request, ""); - hprintf255(request, "
LED Temperature Slider %s (cur=%i, min=%i, max=%i) Mired (Cool <--- ---> Warm)
", activeStr, pwmValue, HASS_TEMPERATURE_MIN, HASS_TEMPERATURE_MAX); - hprintf255(request, "", SPECIAL_CHANNEL_TEMPERATURE); - hprintf255(request, "", inputName, SPECIAL_CHANNEL_TEMPERATURE, pwmValue); - hprintf255(request, "", inputName, SPECIAL_CHANNEL_TEMPERATURE); - hprintf255(request, "", SPECIAL_CHANNEL_TEMPERATURE); - poststr(request, ""); + hprintf255(request, "
LED Temperature Slider %s (%ld K) (Warm <--- ---> Cool)
", activeStr, pwmKelvin); + hprintf255(request, "
", SPECIAL_CHANNEL_TEMPERATURE); + + //(KELVIN_TEMPERATURE_MAX - KELVIN_TEMPERATURE_MIN) / (HASS_TEMPERATURE_MAX - HASS_TEMPERATURE_MIN) = 13 + hprintf255(request, "", pwmKelvin); + + hprintf255(request, "", inputName, SPECIAL_CHANNEL_TEMPERATURE); + hprintf255(request, "", SPECIAL_CHANNEL_TEMPERATURE, inputName); + + poststr(request, "
"); } } @@ -1267,7 +1272,7 @@ int http_fn_cfg_quick(http_request_t* request) { http_html_start(request, "Quick Config"); poststr(request, "

Quick Config

"); - + /* WARNING! THIS IS OBSOLETE NOW! diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c index bac7621c9..b958fa303 100644 --- a/src/httpserver/new_http.c +++ b/src/httpserver/new_http.c @@ -619,7 +619,7 @@ const char htmlHeadStyle[] = "