You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.1 KiB
73 lines
2.1 KiB
#include "system_reset.h"
|
|
|
|
#include <esp_log.h>
|
|
#include <nvs_flash.h>
|
|
#include <driver/gpio.h>
|
|
#include <esp_partition.h>
|
|
#include <esp_system.h>
|
|
#include <freertos/FreeRTOS.h>
|
|
|
|
|
|
#define TAG "SystemReset"
|
|
|
|
|
|
SystemReset::SystemReset(gpio_num_t reset_nvs_pin, gpio_num_t reset_factory_pin) : reset_nvs_pin_(reset_nvs_pin), reset_factory_pin_(reset_factory_pin) {
|
|
// Configure GPIO1, GPIO2 as INPUT, reset NVS flash if the button is pressed
|
|
gpio_config_t io_conf;
|
|
io_conf.intr_type = GPIO_INTR_DISABLE;
|
|
io_conf.mode = GPIO_MODE_INPUT;
|
|
io_conf.pin_bit_mask = (1ULL << reset_nvs_pin_) | (1ULL << reset_factory_pin_);
|
|
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
|
|
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
|
|
gpio_config(&io_conf);
|
|
}
|
|
|
|
|
|
void SystemReset::CheckButtons() {
|
|
if (gpio_get_level(reset_factory_pin_) == 0) {
|
|
ESP_LOGI(TAG, "Button is pressed, reset to factory");
|
|
ResetNvsFlash();
|
|
ResetToFactory();
|
|
}
|
|
|
|
if (gpio_get_level(reset_nvs_pin_) == 0) {
|
|
ESP_LOGI(TAG, "Button is pressed, reset NVS flash");
|
|
ResetNvsFlash();
|
|
}
|
|
}
|
|
|
|
void SystemReset::ResetNvsFlash() {
|
|
ESP_LOGI(TAG, "Resetting NVS flash");
|
|
esp_err_t ret = nvs_flash_erase();
|
|
if (ret != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to erase NVS flash");
|
|
}
|
|
ret = nvs_flash_init();
|
|
if (ret != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to initialize NVS flash");
|
|
}
|
|
}
|
|
|
|
void SystemReset::ResetToFactory() {
|
|
ESP_LOGI(TAG, "Resetting to factory");
|
|
// Erase otadata partition
|
|
const esp_partition_t* partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_OTA, NULL);
|
|
if (partition == NULL) {
|
|
ESP_LOGE(TAG, "Failed to find otadata partition");
|
|
return;
|
|
}
|
|
esp_partition_erase_range(partition, 0, partition->size);
|
|
ESP_LOGI(TAG, "Erased otadata partition");
|
|
|
|
// Reboot in 3 seconds
|
|
RestartInSeconds(3);
|
|
}
|
|
|
|
void SystemReset::RestartInSeconds(int seconds) {
|
|
for (int i = seconds; i > 0; i--) {
|
|
ESP_LOGI(TAG, "Resetting in %d seconds", i);
|
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
|
}
|
|
esp_restart();
|
|
}
|