espvban/ESPIDFNEW/main/http_control.c
2024-08-29 21:38:48 +02:00

167 lines
4.6 KiB
C

#include "http_control.h"
#include "esp_log.h"
#include <string.h>
#include "../html/volume.html.h"
/* Our URI handler function to be called during GET /uri request */
esp_err_t get_handler(httpd_req_t *req)
{
/* Send a simple response */
const char resp[] = "URI GET Response";
httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
esp_err_t index_handler(httpd_req_t *req)
{
/* Send a simple response */
httpd_resp_send(req, volume_HTML_String, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
esp_err_t volumeChangeCB(httpd_req_t *req)
{
char buffer[100];
if (httpd_req_get_url_query_str(req, buffer, 100) == ESP_OK)
{
char param[20];
httpd_query_key_value(buffer, "channel", param, 10);
int channelNo = atoi(param);
httpd_query_key_value(req->uri, "value", param, 10);
int volume = atoi(param);
ESP_LOGI("HTTP", "Channel %d: %d", channelNo, volume);
}
else
{
char buffer[100];
snprintf(buffer,100,"{\"channel1\":%d,\"channel2\":%d}",0,0);
httpd_resp_send(req, buffer, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
/* Send a simple response */
const char resp[] = "200 OK";
httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
esp_err_t getVolumeLevel(httpd_req_t *req)
{
int uriLen =strlen(req->uri);
char channelNo =req->uri[uriLen-1];
switch(channelNo)
{
case '1':
httpd_resp_send(req, "0", HTTPD_RESP_USE_STRLEN);
break;
case '2':
httpd_resp_send(req, "0", HTTPD_RESP_USE_STRLEN);
break;
default:
httpd_resp_send(req, "ERROR", HTTPD_RESP_USE_STRLEN);
break;
}
return ESP_OK;
}
/* Our URI handler function to be called during POST /uri request */
esp_err_t post_handler(httpd_req_t *req)
{
/* Destination buffer for content of HTTP POST request.
* httpd_req_recv() accepts char* only, but content could
* as well be any binary data (needs type casting).
* In case of string data, null termination will be absent, and
* content length would give length of string */
char content[100];
/* Truncate if content length larger than the buffer */
size_t recv_size = MIN(req->content_len, sizeof(content));
int ret = httpd_req_recv(req, content, recv_size);
if (ret <= 0)
{ /* 0 return value indicates connection closed */
/* Check if timeout occurred */
if (ret == HTTPD_SOCK_ERR_TIMEOUT)
{
/* In case of timeout one can choose to retry calling
* httpd_req_recv(), but to keep it simple, here we
* respond with an HTTP 408 (Request Timeout) error */
httpd_resp_send_408(req);
}
/* In case of error, returning ESP_FAIL will
* ensure that the underlying socket is closed */
return ESP_FAIL;
}
/* Send a simple response */
const char resp[] = "URI POST Response";
httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
/* URI handler structure for GET /uri */
httpd_uri_t uri_get = {
.uri = "/uri",
.method = HTTP_GET,
.handler = get_handler,
.user_ctx = NULL};
/* URI handler structure for POST /uri */
httpd_uri_t uri_post = {
.uri = "/uri",
.method = HTTP_POST,
.handler = post_handler,
.user_ctx = NULL};
httpd_uri_t index_get = {
.uri = "/",
.method = HTTP_GET,
.handler = index_handler,
.user_ctx = NULL};
httpd_uri_t volumeChangeGet = {
.uri = "/volume",
.method = HTTP_GET,
.handler = volumeChangeCB,
.user_ctx = NULL};
httpd_uri_t channel1_volume_get = {
.uri = "/volume/channel*",
.method = HTTP_GET,
.handler = getVolumeLevel,
.user_ctx = NULL};
/* Function for starting the webserver */
httpd_handle_t start_webserver(void)
{
/* Generate default configuration */
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
/* Empty handle to esp_http_server */
httpd_handle_t server = NULL;
config.uri_match_fn = httpd_uri_match_wildcard;
config.max_uri_handlers = 16;
/* Start the httpd server */
if (httpd_start(&server, &config) == ESP_OK)
{
/* Register URI handlers */
httpd_register_uri_handler(server, &index_get);
httpd_register_uri_handler(server, &volumeChangeGet);
httpd_register_uri_handler(server, &channel1_volume_get);
}
/* If server failed to start, handle will be NULL */
return server;
}
/* Function for stopping the webserver */
void stop_webserver(httpd_handle_t server)
{
if (server)
{
/* Stop the httpd server */
httpd_stop(server);
}
}