#include "cJSON.h" #include "esp_http_server.h" #include "esp_system.h" #include "esp_timer.h" #include "types.hpp" internal void restart_timer_callback(void *arg) { esp_restart(); } internal esp_err_t api_system_reboot_handler(httpd_req_t *req) { httpd_resp_set_type(req, "application/json"); httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "status", "rebooting"); const char *response_text = cJSON_Print(root); httpd_resp_sendstr(req, response_text); free((void *)response_text); cJSON_Delete(root); const esp_timer_create_args_t restart_timer_args = { .callback = &restart_timer_callback, .arg = (void *)0, .dispatch_method = ESP_TIMER_TASK, .name = "restart_timer", .skip_unhandled_events = false}; esp_timer_handle_t restart_timer; esp_timer_create(&restart_timer_args, &restart_timer); // Schedule reboot 1 second (in microseconds) from now to allow HTTP response // to flush esp_timer_start_once(restart_timer, 1'000'000); return ESP_OK; } internal const httpd_uri_t api_system_reboot_uri = { .uri = "/api/system/reboot", .method = HTTP_POST, .handler = api_system_reboot_handler, .user_ctx = NULL};