/* SYSTEM MODULE Copyright (C) 2018 by Xose PĂ©rez */ #include // ----------------------------------------------------------------------------- unsigned long _loopDelay = 0; bool _system_send_heartbeat = false; // ----------------------------------------------------------------------------- #if SYSTEM_CHECK_ENABLED // Call this method on boot with start=true to increase the crash counter // Call it again once the system is stable to decrease the counter // If the counter reaches SYSTEM_CHECK_MAX then the system is flagged as unstable // setting _systemOK = false; // // An unstable system will only have serial access, WiFi in AP mode and OTA bool _systemStable = true; void systemCheck(bool stable) { unsigned char value = EEPROM.read(EEPROM_CRASH_COUNTER); if (stable) { value = 0; DEBUG_MSG_P(PSTR("[MAIN] System OK\n")); } else { if (++value > SYSTEM_CHECK_MAX) { _systemStable = false; value = 0; DEBUG_MSG_P(PSTR("[MAIN] System UNSTABLE\n")); } } EEPROM.write(EEPROM_CRASH_COUNTER, value); EEPROM.commit(); } bool systemCheck() { return _systemStable; } void systemCheckLoop() { static bool checked = false; if (!checked && (millis() > SYSTEM_CHECK_TIME)) { // Check system as stable systemCheck(true); checked = true; } } #endif // ----------------------------------------------------------------------------- void systemSendHeartbeat() { _system_send_heartbeat = true; } void systemLoop() { // Check system stability #if SYSTEM_CHECK_ENABLED systemCheckLoop(); #endif #if HEARTBEAT_ENABLED // Heartbeat static unsigned long last = 0; if (_system_send_heartbeat || (last == 0) || (millis() - last > HEARTBEAT_INTERVAL)) { _system_send_heartbeat = false; last = millis(); heartbeat(); } #endif // HEARTBEAT_ENABLED // Power saving delay delay(_loopDelay); } void systemSetup() { EEPROM.begin(EEPROM_SIZE); #if DEBUG_SERIAL_SUPPORT DEBUG_PORT.begin(SERIAL_BAUDRATE); #if DEBUG_ESP_WIFI DEBUG_PORT.setDebugOutput(true); #endif #elif defined(SERIAL_BAUDRATE) Serial.begin(SERIAL_BAUDRATE); #endif #if SPIFFS_SUPPORT SPIFFS.begin(); #endif // Question system stability #if SYSTEM_CHECK_ENABLED systemCheck(false); #endif #if defined(ESPLIVE) //The ESPLive has an ADC MUX which needs to be configured. pinMode(16, OUTPUT); digitalWrite(16, HIGH); //Defualt CT input (pin B, solder jumper B) #endif // Cache loop delay value to speed things (recommended max 250ms) _loopDelay = atol(getSetting("loopDelay", LOOP_DELAY_TIME).c_str()); // Register Loop espurnaRegisterLoop(systemLoop); }