#include "param.h" #include "http_server.h" #include #include #include #include void cmd_handle(color_int_t)( const char* attr, sockbuf_t* sockbuf, color_int_t* ptr) { char buf_[32]; char* value = read_token(sockbuf, buf_, sizeof(buf_)); if (!value) { sockbuf_write(sockbuf, "Missing color value\n"); return; } char* p = value; if (*p == '#') { p++; } else if (!strncasecmp(p, "0x", 2)) { p += 2; } char* end = NULL; unsigned long parsed = strtoul(p, &end, 16); if (end == p || *end != '\0' || parsed > 0xFFFFFFUL) { sockbuf_write(sockbuf, "Invalid color; expected hex like RRGGBB\n"); return; } *ptr = (color_int_t)parsed; snprintf(buf_, sizeof(buf_), "%s = 0x%06lx\n", attr, parsed); sockbuf_write(sockbuf, buf_); } size_t serialize_to_json(color_int_t)( char** out, size_t len, const char* attr, const char* dn, color_int_t value) { size_t newlen = snprintf( *out, len, "\"%s\":{\"type\":\"color\",\"value\":\"#%06lx\",\"disp\":\"%s\"}", attr, (unsigned long)(value & 0xFFFFFF), dn); *out += newlen; return len - newlen; } #define TAG "param_color" void http_handle(color_int_t)(httpd_req_t* req, color_int_t* val) { char buf[128]; int buf_len = httpd_req_get_url_query_len(req) + 1; if (buf_len > 1) { if (buf_len > sizeof(buf)) { ESP_LOGI(TAG, "Invalid request. Query string too long."); httpd_resp_set_status(req, HTTPD_400); return; } if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { char param[32]; if (httpd_query_key_value(buf, "set", param, sizeof(param)) == ESP_OK) { char* p = param; if (*p == '#') { p++; } else if (!strncasecmp(p, "0x", 2)) { p += 2; } char* end = NULL; unsigned long parsed = strtoul(p, &end, 16); if (end == p || *end != '\0' || parsed > 0xFFFFFFUL) { ESP_LOGI(TAG, "Invalid request. Invalid color value."); httpd_resp_set_status(req, HTTPD_400); return; } *val = (color_int_t)parsed; } } } httpd_resp_set_status(req, HTTPD_204); } void print(color_int_t)( sockbuf_t* sockbuf, const char* attr, color_int_t val) { char buf[128]; snprintf(buf, sizeof(buf), "%s: 0x%06lx :: color\n", attr, (unsigned long)val); sockbuf_write(sockbuf, buf); }