Files
dc-sensor/firmware/main/src/controller.c
T
Sven Luthi e3d4023d35 new file: firmware/main/include/controller.h
deleted:    firmware/main/include/http_client.h
	modified:   firmware/main/include/leds.h
	renamed:    firmware/main/src/http_client.c -> firmware/main/src/controller.c
	modified:   firmware/main/src/leds.c
	modified:   firmware/main/src/main.c
	modified:   firmware/main/src/sht31.c
Restructured
2024-08-12 15:15:33 +02:00

136 lines
4.2 KiB
C

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_system.h>
#include <esp_log.h>
//#include <esp_event_loop.h>
#include <nvs_flash.h>
#include <esp_wifi.h>
#include <esp_http_client.h>
#include <cJSON.h>
#include <string.h>
#include "controller.h"
#include "functions.h"
#define MAX_HTTP_OUTPUT_BUFFER 2048
static const char * TAG = "controller.c";
esp_err_t controller_init() {
return ESP_OK;
}
static esp_err_t http_get_event_handler(esp_http_client_event_t *evt)
{
switch (evt->event_id) {
case HTTP_EVENT_ERROR:
ESP_LOGI("HTTP_EVENT", "HTTP_EVENT_ERROR");
break;
case HTTP_EVENT_ON_CONNECTED:
ESP_LOGI("HTTP_EVENT", "HTTP_EVENT_ON_CONNECTED");
break;
case HTTP_EVENT_HEADER_SENT:
ESP_LOGI("HTTP_EVENT", "HTTP_EVENT_HEADER_SENT");
break;
case HTTP_EVENT_ON_HEADER:
ESP_LOGI("HTTP_EVENT", "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
break;
case HTTP_EVENT_ON_DATA:
ESP_LOGI("HTTP_EVENT", "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
if (!esp_http_client_is_chunked_response(evt->client)) {
// Write out data
printf("%.*s", evt->data_len, (char*)evt->data);
}
break;
case HTTP_EVENT_ON_FINISH:
ESP_LOGI("HTTP_EVENT", "HTTP_EVENT_ON_FINISH");
break;
case HTTP_EVENT_DISCONNECTED:
ESP_LOGI("HTTP_EVENT", "HTTP_EVENT_DISCONNECTED");
break;
}
return ESP_OK;
}
static bool register_device(unsigned *id) {
static esp_http_client_config_t register_config = {
.url = "http://tempcontroller.luethi.co/api/config",
.event_handler = NULL,
.method = HTTP_METHOD_POST,
};
return 1; //1 as test ID
}
static bool send_sensor_data(unsigned id, float humidity, float temperature) {
esp_err_t err;
int content_length = 0;
char output_buffer[MAX_HTTP_OUTPUT_BUFFER];
static esp_http_client_config_t config = {
.url = "http://tempcontroller.luethi.co/api/report",
.event_handler = NULL,
.method = HTTP_METHOD_POST,
};
// Create cJSON object
cJSON *json_payload = cJSON_CreateObject();
if (json_payload == NULL) {
ESP_LOGE(TAG, "Failed to create JSON object");
return ESP_FAIL;
}
cJSON_AddNumberToObject(json_payload, "temperature", temperature);
cJSON_AddNumberToObject(json_payload, "humidity", humidity);
cJSON_AddNumberToObject(json_payload, "id", id);
/*
char tmp[100] = "{\"humidity\": ";
strcat(tmp, floatToString(humidity));
strcat(tmp, ",\"temperature\": ");
strcat(tmp, floatToString(temperature));
strcat(tmp, ",\"id\": ");
strcat(tmp, intToString(id));
strcat(tmp, "}");
*/
// Print JSON object
char *json_string = cJSON_PrintUnformatted(json_payload);
if (json_string == NULL) {
ESP_LOGE(TAG, "Failed to print JSON string");
cJSON_Delete(json_payload);
return ESP_FAIL;
}
ESP_LOGI(TAG, "Set up htttp client...");
esp_http_client_handle_t client = esp_http_client_init(&config);
// Set HTTP headers
esp_http_client_set_header(client, "Content-Type", "application/json");
// Set POST data
esp_http_client_set_post_field(client, json_string, strlen(json_string));
// Perform the HTTP POST request
err = esp_http_client_perform(client);
if (err == ESP_OK) {
ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d",
esp_http_client_get_status_code(client),
esp_http_client_get_content_length(client));
content_length = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER);
if (content_length >= 0) {
output_buffer[content_length] = 0; // Null-terminate the response
ESP_LOGI(TAG, "Response: %s", output_buffer);
} else {
ESP_LOGE(TAG, "Failed to read response");
}
} else {
ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
return 1;
}
// Cleanup
esp_http_client_cleanup(client);
cJSON_Delete(json_payload);
free(json_string);
return 0;
}