#include "BootOptions.h" #include "Config.h" #include #ifdef BOARD_ESP8266 #include #endif #ifdef PLATFORM_PHOTON LEDStatus serialStatus = LEDStatus(RGB_COLOR_ORANGE, LED_PATTERN_FADE, LED_SPEED_FAST, LED_PRIORITY_BACKGROUND); LEDStatus configStatus = LEDStatus(RGB_COLOR_YELLOW, LED_PATTERN_FADE, LED_SPEED_NORMAL, LED_PRIORITY_IMPORTANT); retained bool LAST_BOOT_WAS_FLASH; retained bool LAST_BOOT_WAS_SERIAL; #endif #ifndef __NOINIT_ATTR // Pre-defined on esp32 #define __NOINIT_ATTR __attribute__ ((section (".noinit"))) #endif #define SAFE_MODE_MAGIC 6942 __NOINIT_ATTR uint8_t s_rebootCount; __NOINIT_ATTR uint16_t s_forceSafeMode; void BootOptions::forceSafeMode() { s_forceSafeMode = SAFE_MODE_MAGIC; } void BootOptions::initPins() { #ifdef PLATFORM_PHOTON pinMode(2, INPUT_PULLDOWN); pinMode(3, INPUT_PULLDOWN); pinMode(4, INPUT_PULLDOWN); #endif } BootOptions::BootOptions() { #ifdef PLATFORM_PHOTON isSetup = digitalRead(2) == HIGH; isSerial = digitalRead(3) == HIGH || LAST_BOOT_WAS_SERIAL; isFlash = digitalRead(4) == HIGH; LAST_BOOT_WAS_FLASH = isFlash; LAST_BOOT_WAS_SERIAL |= isSerial; lastBootWasFlash = LAST_BOOT_WAS_FLASH; configStatus.setActive(isSetup); serialStatus.setActive(isSerial); #endif #ifdef BOARD_ESP32 resetReason = esp_reset_reason(); crashCount = s_rebootCount; if (resetReason >= 4) { // TODO: These values are defined in // esp32/rom/rtc.h, but not sure if that's included // on platformio builds if (crashCount++ >= 3) { // Boot into safe mode if the watchdog reset us three times in a row. isSafeMode = true; } } else { crashCount = 0; } s_rebootCount = crashCount; #endif #ifdef BOARD_ESP8266 struct rst_info resetInfo = *ESP.getResetInfoPtr(); resetReason = resetInfo.reason; crashCount = s_rebootCount; if (resetInfo.reason == REASON_SOFT_WDT_RST || resetInfo.reason == REASON_WDT_RST || resetInfo.reason == REASON_EXCEPTION_RST) { if (crashCount++ >= 3) { // Boot into safe mode if the watchdog reset us three times in a row. isSafeMode = true; } } else { crashCount = 0; } s_rebootCount = crashCount; if (resetInfo.reason > 0 && s_forceSafeMode == SAFE_MODE_MAGIC) { isSafeMode = true; s_forceSafeMode = 0; } #endif } void BootOptions::waitForRelease() { #ifdef PLATFORM_PHOTON while(digitalRead(2) == HIGH || digitalRead(3) == HIGH) {}; #endif }