🎛️ Adds system service

This commit is contained in:
Rune Harlyk
2024-11-01 13:41:24 +01:00
parent 3054d5eb12
commit 9f3c4ffdf2
18 changed files with 237 additions and 442 deletions
@@ -0,0 +1,145 @@
#include "system_service.h"
namespace system_service {
static const char *TAG = "SystemService";
esp_err_t handleReset(PsychicRequest *request) {
reset();
return request->reply(200);
}
esp_err_t handleRestart(PsychicRequest *request) {
restart();
return request->reply(200);
}
esp_err_t handleSleep(PsychicRequest *request) {
sleep();
return request->reply(200);
}
esp_err_t getStatus(PsychicRequest *request) {
PsychicJsonResponse response = PsychicJsonResponse(request, false);
JsonObject root = response.getRoot();
status(root);
return response.send();
}
esp_err_t getMetrics(PsychicRequest *request) {
PsychicJsonResponse response = PsychicJsonResponse(request, false);
JsonObject root = response.getRoot();
metrics(root);
return response.send();
}
void reset() {
ESP_LOGI(TAG, "Resetting device");
File root = ESPFS.open(FS_CONFIG_DIRECTORY);
File file;
while (file = root.openNextFile()) {
String path = file.path();
file.close();
ESPFS.remove(path);
}
restart();
}
void restart() {
xTaskCreate(
[](void *pvParameters) {
for (;;) {
delay(250);
MDNS.end();
delay(100);
WiFi.disconnect(true);
delay(500);
ESP.restart();
}
},
"Restart task", 4096, nullptr, 10, nullptr);
}
void sleep() {
xTaskCreate(
[](void *pvParameters) {
for (;;) {
delay(250);
MDNS.end();
delay(100);
WiFi.disconnect(true);
delay(500);
uint64_t bitmask = (uint64_t)1 << (WAKEUP_PIN_NUMBER);
#ifdef CONFIG_IDF_TARGET_ESP32C3
esp_deep_sleep_enable_gpio_wakeup(bitmask, (esp_deepsleep_gpio_wake_up_mode_t)WAKEUP_SIGNAL);
#else
esp_sleep_enable_ext1_wakeup(bitmask, (esp_sleep_ext1_wakeup_mode_t)WAKEUP_SIGNAL);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
#endif
esp_deep_sleep_start();
}
},
"Sleep task", 4096, nullptr, 10, nullptr);
ESP_LOGI(TAG, "Setting device to sleep");
}
void status(JsonObject &root) {
root["esp_platform"] = ESP_PLATFORM;
root["firmware_version"] = APP_VERSION;
root["max_alloc_heap"] = ESP.getMaxAllocHeap();
root["psram_size"] = ESP.getPsramSize();
root["free_psram"] = ESP.getFreePsram();
root["cpu_freq_mhz"] = ESP.getCpuFreqMHz();
root["cpu_type"] = ESP.getChipModel();
root["cpu_rev"] = ESP.getChipRevision();
root["cpu_cores"] = ESP.getChipCores();
root["free_heap"] = ESP.getFreeHeap();
root["min_free_heap"] = ESP.getMinFreeHeap();
root["sketch_size"] = ESP.getSketchSize();
root["free_sketch_space"] = ESP.getFreeSketchSpace();
root["sdk_version"] = ESP.getSdkVersion();
root["arduino_version"] = ARDUINO_VERSION;
root["flash_chip_size"] = ESP.getFlashChipSize();
root["flash_chip_speed"] = ESP.getFlashChipSpeed();
root["fs_total"] = ESPFS.totalBytes();
root["fs_used"] = ESPFS.usedBytes();
root["core_temp"] = temperatureRead();
root["cpu_reset_reason"] = resetReason(rtc_get_reset_reason(0));
root["uptime"] = millis() / 1000;
}
void metrics(JsonObject &root) {
root["uptime"] = millis() / 1000;
root["free_heap"] = ESP.getFreeHeap();
root["total_heap"] = ESP.getHeapSize();
root["min_free_heap"] = ESP.getMinFreeHeap();
root["max_alloc_heap"] = ESP.getMaxAllocHeap();
root["fs_used"] = ESPFS.usedBytes();
root["fs_total"] = ESPFS.totalBytes();
root["core_temp"] = temperatureRead();
}
const char *resetReason(int reason) {
switch (reason) {
case 1: return "Vbat power on reset";
case 3: return "Software reset digital core";
case 4: return "Legacy watch dog reset digital core";
case 5: return "Deep Sleep reset digital core";
case 6: return "Reset by SLC module, reset digital core";
case 7: return "Timer Group0 Watch dog reset digital core";
case 8: return "Timer Group1 Watch dog reset digital core";
case 9: return "RTC Watch dog Reset digital core";
case 10: return "Intrusion tested to reset CPU";
case 11: return "Time Group reset CPU";
case 12: return "Software reset CPU";
case 13: return "RTC Watch dog Reset CPU";
case 14: return "for APP CPU, reset by PRO CPU";
case 15: return "Reset when the vdd voltage is not stable";
case 16: return "RTC Watch dog reset digital core and rtc module";
default: return "NO_MEAN";
}
}
} // namespace system_service