From de4c461081d783baf42ff57ebe27f25aaad2a884 Mon Sep 17 00:00:00 2001 From: DTTerastar Date: Tue, 30 Mar 2021 13:24:02 -0400 Subject: [PATCH] Add reset reasons --- src/Settings.h | 5 ++ src/main.cpp | 202 ++-------------------------------------------- src/main.h | 213 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 226 insertions(+), 194 deletions(-) create mode 100644 src/main.h diff --git a/src/Settings.h b/src/Settings.h index 6885ca1..975f1fa 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -78,3 +78,8 @@ // Maximum distance (in meters) to report. Devices that are calculated to be further than this distance in meters will not be reported #define MAX_DISTANCE 16 +// Max number of mac addresses to keep track of +#define MAX_MAC_ADDRESSES 50 + +// Number of seconds between update checks +#define CHECK_FOR_UPDATES_INTERVAL 300 diff --git a/src/main.cpp b/src/main.cpp index 9b0d6c2..f339160 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,81 +1,4 @@ -/* - ESP32 Bluetooth Low Energy presence detection, for use with MQTT. - - Project and documentation are available on GitHub at https://jptrsn.github.io/ESP32-mqtt-room/ - - Some giants upon whose shoulders the project stands -- major thanks to: - - pcbreflux for the original version of this code, as well as the eddystone handlers https://github.com/pcbreflux - - Andreis Speiss for his work on YouTube and his invaluable github at https://github.com/sensorsiot. - - Sidddy for the implementation of Mi Flora plant sensor support. https://github.com/sidddy/flora - - Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp - Ported to Arduino ESP32 by Evandro Copercini -*/ -#include -extern "C" -{ -#include "freertos/FreeRTOS.h" -#include "freertos/timers.h" -} -#include "soc/timer_group_struct.h" -#include "soc/timer_group_reg.h" - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include "NimBLEEddystoneURL.h" -#include "NimBLEEddystoneTLM.h" -#include "NimBLEBeacon.h" - -#include - -#include "Settings.h" - -#include "BleFingerprint.h" - -#ifdef M5STICK -#ifdef PLUS -#include -#else -#include -#endif -#endif - -#define MAX_MAC_ADDRESSES 50 -#define CHECK_FOR_UPDATES_INTERVAL 300 - -AsyncMqttClient mqttClient; -TimerHandle_t reconnectTimer; -TaskHandle_t scannerTask; - -bool updateInProgress = false; -String localIp; -int retryAttempts = 0; -int sendFailures = 0; - -String mqttHost; -int mqttPort; -String mqttUser; -String mqttPass; -String availabilityTopic; -String room; - -static std::list fingerprints; +#include BleFingerprint *getFingerprint(BLEAdvertisedDevice *advertisedDevice) { @@ -105,11 +28,6 @@ BleFingerprint *getFingerprint(BLEAdvertisedDevice *advertisedDevice) return created; } -unsigned long getUptimeSeconds(void) -{ - return esp_timer_get_time() / 1e6; -} - bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts = -1) { StaticJsonDocument<512> tele; @@ -131,10 +49,13 @@ bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts if (sendFailures > 0) tele["sendFails"] = sendFailures; - tele["free_heap"] = ESP.getFreeHeap(); - tele["min_free_heap"] = ESP.getMinFreeHeap(); - tele["heap_size"] = ESP.getHeapSize(); - tele["max_alloc_heap"] = ESP.getMaxAllocHeap(); + tele["resetCore0"] = resetReason(rtc_get_reset_reason(0)); + tele["resetCore1"] = resetReason(rtc_get_reset_reason(1)); + + tele["freeHeap"] = ESP.getFreeHeap(); + tele["minFreeHeap"] = ESP.getMinFreeHeap(); + tele["heapSize"] = ESP.getHeapSize(); + tele["maxAllocHeap"] = ESP.getMaxAllocHeap(); char teleMessageBuffer[512]; serializeJson(tele, teleMessageBuffer); @@ -357,113 +278,6 @@ void scanForDevices(void *parameter) } } -void configureOTA() -{ - ArduinoOTA - .onStart([]() { - Serial.println("OTA Start"); - updateInProgress = true; - mqttClient.disconnect(true); - }) - .onEnd([]() { - updateInProgress = false; - digitalWrite(LED_BUILTIN, !LED_BUILTIN_ON); - Serial.println("\n\rEnd"); - }) - .onProgress([](unsigned int progress, unsigned int total) { - byte percent = (progress / (total / 100)); - Serial.printf("Progress: %u\r\n", percent); - digitalWrite(LED_BUILTIN, percent % 2); - }) - .onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) - Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) - Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) - Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) - Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) - Serial.println("End Failed"); - ESP.restart(); - }); - ArduinoOTA.setHostname(WiFi.getHostname()); - ArduinoOTA.setPort(3232); - ArduinoOTA.begin(); -} - -void setClock() -{ - configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC - - time_t now = time(nullptr); - while (now < 8 * 3600 * 2) - { - yield(); - delay(500); - now = time(nullptr); - } - - struct tm timeinfo; - gmtime_r(&now, &timeinfo); - log_i(F("NTP synced, current time: %s"), asctime(&timeinfo)); -} - -void firmwareUpdate() -{ -#ifdef VERSION - static long lastFirmwareCheck = 0; - long uptime = getUptimeSeconds(); - if (uptime - lastFirmwareCheck < CHECK_FOR_UPDATES_INTERVAL) - return; - - lastFirmwareCheck = uptime; - - HTTPClient http; - WiFiClientSecure client; - client.setInsecure(); - - String firmwareUrl = Sprintf("https://github.com/DTTerastar/ESP32-mqtt-room/releases/latest/download/%s.bin", FIRMWARE); - if (!http.begin(client, firmwareUrl)) - return; - - int httpCode = http.sendRequest("HEAD"); - if (httpCode < 300 || httpCode > 400 || http.getLocation().indexOf(String(VERSION)) > 0) - { - Serial.printf("Not updating from: %s\n", http.getLocation().c_str()); - http.end(); - return; - } - - updateInProgress = true; - Serial.printf("Updating from: %s\n", firmwareUrl.c_str()); - mqttClient.disconnect(true); - - httpUpdate.setLedPin(LED_BUILTIN, LED_BUILTIN_ON); - httpUpdate.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); - t_httpUpdate_return ret = httpUpdate.update(client, firmwareUrl); - - switch (ret) - { - case HTTP_UPDATE_FAILED: - log_e("Http Update Failed (Error=%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str()); - break; - - case HTTP_UPDATE_NO_UPDATES: - log_i("No Update!"); - break; - - case HTTP_UPDATE_OK: - log_w("Update OK!"); - break; - } - - updateInProgress = false; -#endif -} - void spiffsInit() { int ledState = HIGH; diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..4012905 --- /dev/null +++ b/src/main.h @@ -0,0 +1,213 @@ +#include +#include + +#include +extern "C" +{ +#include "freertos/FreeRTOS.h" +#include "freertos/timers.h" +} +#include "soc/timer_group_struct.h" +#include "soc/timer_group_reg.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "NimBLEEddystoneURL.h" +#include "NimBLEEddystoneTLM.h" +#include "NimBLEBeacon.h" + +#include + +#include "Settings.h" + +#include "BleFingerprint.h" + +#ifdef M5STICK +#ifdef PLUS +#include +#else +#include +#endif +#endif + +AsyncMqttClient mqttClient; +TimerHandle_t reconnectTimer; +TaskHandle_t scannerTask; + +bool updateInProgress = false; +String localIp; +int retryAttempts = 0; +int sendFailures = 0; + +String mqttHost; +int mqttPort; +String mqttUser; +String mqttPass; +String availabilityTopic; +String room; + +static std::list fingerprints; + +String resetReason(RESET_REASON reason) +{ + switch (reason) + { + case POWERON_RESET: + return "PowerOn"; /**<1, Vbat power on reset*/ + case SW_RESET: + return "Sofware"; /**<3, Software reset digital core*/ + case OWDT_RESET: + return "LegacyWdt"; /**<4, Legacy watch dog reset digital core*/ + case DEEPSLEEP_RESET: + return "DeepSleep"; /**<5, Deep Sleep reset digital core*/ + case SDIO_RESET: + return "Sdio"; /**<6, Reset by SLC module, reset digital core*/ + case TG0WDT_SYS_RESET: + return "Tg0WdtSys"; /**<7, Timer Group0 Watch dog reset digital core*/ + case TG1WDT_SYS_RESET: + return "Tg1WdtSys"; /**<8, Timer Group1 Watch dog reset digital core*/ + case RTCWDT_SYS_RESET: + return "RtcWdtSys"; /**<9, RTC Watch dog Reset digital core*/ + case INTRUSION_RESET: + return "Intrusion"; /**<10, Instrusion tested to reset CPU*/ + case TGWDT_CPU_RESET: + return "TgWdtCpu"; /**<11, Time Group reset CPU*/ + case SW_CPU_RESET: + return "SoftwareCpu"; /**<12, Software reset CPU*/ + case RTCWDT_CPU_RESET: + return "RtcWdtCpu"; /**<13, RTC Watch dog Reset CPU*/ + case EXT_CPU_RESET: + return "ExtCpu"; /**<14, for APP CPU, reseted by PRO CPU*/ + case RTCWDT_BROWN_OUT_RESET: + return "RtcWdtBrownOut"; /**<15, Reset when the vdd voltage is not stable*/ + case RTCWDT_RTC_RESET: + return "RtcWdtRtc"; /**<16, RTC Watch dog reset digital core and rtc module*/ + default: + return "Unknown"; + } +} + +unsigned long getUptimeSeconds(void) +{ + return esp_timer_get_time() / 1e6; +} + +void setClock() +{ + configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC + + time_t now = time(nullptr); + while (now < 8 * 3600 * 2) + { + yield(); + delay(500); + now = time(nullptr); + } + + struct tm timeinfo; + gmtime_r(&now, &timeinfo); + log_i(F("NTP synced, current time: %s"), asctime(&timeinfo)); +} + +void configureOTA() +{ + ArduinoOTA + .onStart([]() { + Serial.println("OTA Start"); + updateInProgress = true; + mqttClient.disconnect(true); + }) + .onEnd([]() { + updateInProgress = false; + digitalWrite(LED_BUILTIN, !LED_BUILTIN_ON); + Serial.println("\n\rEnd"); + }) + .onProgress([](unsigned int progress, unsigned int total) { + byte percent = (progress / (total / 100)); + Serial.printf("Progress: %u\r\n", percent); + digitalWrite(LED_BUILTIN, percent % 2); + }) + .onError([](ota_error_t error) { + Serial.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) + Serial.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) + Serial.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) + Serial.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) + Serial.println("Receive Failed"); + else if (error == OTA_END_ERROR) + Serial.println("End Failed"); + ESP.restart(); + }); + ArduinoOTA.setHostname(WiFi.getHostname()); + ArduinoOTA.setPort(3232); + ArduinoOTA.begin(); +} + +void firmwareUpdate() +{ +#ifdef VERSION + static long lastFirmwareCheck = 0; + long uptime = getUptimeSeconds(); + if (uptime - lastFirmwareCheck < CHECK_FOR_UPDATES_INTERVAL) + return; + + lastFirmwareCheck = uptime; + + HTTPClient http; + WiFiClientSecure client; + client.setInsecure(); + + String firmwareUrl = Sprintf("https://github.com/DTTerastar/ESP32-mqtt-room/releases/latest/download/%s.bin", FIRMWARE); + if (!http.begin(client, firmwareUrl)) + return; + + int httpCode = http.sendRequest("HEAD"); + if (httpCode < 300 || httpCode > 400 || http.getLocation().indexOf(String(VERSION)) > 0) + { + Serial.printf("Not updating from: %s\n", http.getLocation().c_str()); + http.end(); + return; + } + + updateInProgress = true; + Serial.printf("Updating from: %s\n", firmwareUrl.c_str()); + mqttClient.disconnect(true); + + httpUpdate.setLedPin(LED_BUILTIN, LED_BUILTIN_ON); + httpUpdate.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); + t_httpUpdate_return ret = httpUpdate.update(client, firmwareUrl); + + switch (ret) + { + case HTTP_UPDATE_FAILED: + log_e("Http Update Failed (Error=%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str()); + break; + + case HTTP_UPDATE_NO_UPDATES: + log_i("No Update!"); + break; + + case HTTP_UPDATE_OK: + log_w("Update OK!"); + break; + } + + updateInProgress = false; +#endif +}