From b05f831f9aa77012c9152225175f89c3340c92c7 Mon Sep 17 00:00:00 2001 From: DTTerastar Date: Fri, 2 Apr 2021 07:56:27 -0400 Subject: [PATCH] Fix seen dangling ptr issue --- lib/BleFingerprint/BleFingerprint.cpp | 22 +++++++++++++----- lib/BleFingerprint/BleFingerprint.h | 7 +++--- src/main.cpp | 32 +++++++++++++-------------- src/main.h | 2 +- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/lib/BleFingerprint/BleFingerprint.cpp b/lib/BleFingerprint/BleFingerprint.cpp index a67626e..4fb69aa 100644 --- a/lib/BleFingerprint/BleFingerprint.cpp +++ b/lib/BleFingerprint/BleFingerprint.cpp @@ -12,7 +12,7 @@ static const int defaultTxPower = -59; #define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00) >> 8) + (((x)&0xFF) << 8)) #define Sprintf(f, ...) ({ char* s; asprintf(&s, f, __VA_ARGS__); String r = s; free(s); r; }) -#define SDateTimef(f) ({ struct tm firstSeenTm; gmtime_r(&f, &firstSeenTm); Sprintf("%d/%d/%d %d:%.2d:%.2d", firstSeenTm.tm_mon, firstSeenTm.tm_mday, 1900 + firstSeenTm.tm_year, firstSeenTm.tm_hour, firstSeenTm.tm_min, firstSeenTm.tm_sec); }) +//define SDateTimef(f) ({ struct tm firstSeenTm; gmtime_r(&f, &firstSeenTm); Sprintf("%d/%d/%d %d:%.2d:%.2d", firstSeenTm.tm_mon, firstSeenTm.tm_mday, 1900 + firstSeenTm.tm_year, firstSeenTm.tm_hour, firstSeenTm.tm_min, firstSeenTm.tm_sec); }) #define SMacf(f) ({ auto nativeAddress = f.getNative(); Sprintf("%02x%02x%02x%02x%02x%02x", nativeAddress[5], nativeAddress[4], nativeAddress[3], nativeAddress[2], nativeAddress[1], nativeAddress[0]); }) static String getProximityUUIDString(BLEBeacon beacon) @@ -45,7 +45,7 @@ BleFingerprint::~BleFingerprint() BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice) { - firstSeen = time(nullptr); + firstSeenMicros = esp_timer_get_time(); address = advertisedDevice->getAddress(); String mac_address = SMacf(address); @@ -167,7 +167,7 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice) void BleFingerprint::seen(BLEAdvertisedDevice *advertisedDevice) { - lastSeen = time(nullptr); + lastSeenMicros = esp_timer_get_time(); rssi = advertisedDevice->getRSSI(); if (!calRssi) @@ -176,6 +176,7 @@ void BleFingerprint::seen(BLEAdvertisedDevice *advertisedDevice) float ratio = (calRssi - rssi) / 35.0f; raw = pow(10, ratio); setDistance(raw); + reported = false; } void BleFingerprint::setDistance(float distFl) @@ -207,6 +208,18 @@ bool BleFingerprint::report(JsonDocument *doc, int maxDistance) if (maxDistance > 0 && output.value.position > maxDistance) return false; + if (reported) + return false; + + auto now = esp_timer_get_time(); + + if (abs(output.value.position - lastReported) < 0.05f && abs(now - lastReportedMicros) < 5000000) + return false; + + lastReportedMicros = now; + lastReported = output.value.position; + reported = true; + String mac = SMacf(address); if (output.value.position < 0.5) { @@ -235,8 +248,5 @@ bool BleFingerprint::report(JsonDocument *doc, int maxDistance) (*doc)[F("distance")] = round(output.value.position * 100.0f) / 100.0f; (*doc)[F("speed")] = round(output.value.speed * 1e7f) / 10.0f; - (*doc)[F("first")] = SDateTimef(firstSeen); - (*doc)[F("last")] = SDateTimef(lastSeen); - return true; } diff --git a/lib/BleFingerprint/BleFingerprint.h b/lib/BleFingerprint/BleFingerprint.h index 17c4476..eb59ad1 100644 --- a/lib/BleFingerprint/BleFingerprint.h +++ b/lib/BleFingerprint/BleFingerprint.h @@ -28,13 +28,12 @@ public: void setAddress(NimBLEAddress newAddr) { address = newAddr; } private: - bool hasValue = false, enroll = false; + bool hasValue = false, enroll = false, reported = false; NimBLEAddress address; String id, name, url; int rssi, calRssi; - float raw; - time_t firstSeen; - time_t lastSeen; + float raw, lastReported = 0; + long firstSeenMicros, lastSeenMicros = 0, lastReportedMicros = 0; Reading> output; diff --git a/src/main.cpp b/src/main.cpp index 6988f93..f6dcf9c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -58,16 +58,14 @@ bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts tele["adverts"] = totalAdverts; if (sendFailures > 0) tele["sendFails"] = sendFailures; - if (reconnectAttempts > 0) - tele["reconnectAttempts"] = reconnectAttempts; - - tele["resetCore0"] = resetReason(rtc_get_reset_reason(0)); - tele["resetCore1"] = resetReason(rtc_get_reset_reason(1)); + if (reconnectTries > 0) + tele["reconnectTries"] = reconnectTries; tele["freeHeap"] = ESP.getFreeHeap(); tele["minFreeHeap"] = ESP.getMinFreeHeap(); tele["heapSize"] = ESP.getHeapSize(); tele["maxAllocHeap"] = ESP.getMaxAllocHeap(); + tele["resetReason"] = resetReason(rtc_get_reset_reason(0)); char teleMessageBuffer[512]; serializeJson(tele, teleMessageBuffer); @@ -88,16 +86,15 @@ void connectToWifi() { Serial.printf("Connecting to WiFi (%s)...", WiFi.macAddress().c_str()); - // Set custom callback functions WiFiSettings.onSuccess = []() { - digitalWrite(LED_BUILTIN, LED_BUILTIN_ON); // Turn LED on + digitalWrite(LED_BUILTIN, LED_BUILTIN_ON); }; WiFiSettings.onFailure = []() { - digitalWrite(LED_BUILTIN, !LED_BUILTIN_ON); // Turn LED off + digitalWrite(LED_BUILTIN, !LED_BUILTIN_ON); }; WiFiSettings.onWaitLoop = []() { - digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // Toggle LED - return 500; // Delay next function call by 500ms + digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); + return 500; }; WiFiSettings.onPortalWaitLoop = []() { if (getUptimeSeconds() > 600) @@ -133,7 +130,7 @@ void connectToWifi() void onMqttConnect(bool sessionPresent) { Serial.println("Connected to MQTT"); - reconnectAttempts = 0; + reconnectTries = 0; if (mqttClient.publish(availabilityTopic.c_str(), 0, 1, "CONNECTED") == true) { @@ -161,7 +158,7 @@ void reconnect(TimerHandle_t xTimer) if (WiFi.isConnected() && mqttClient.connected()) return; - if (reconnectAttempts++ > 10) + if (reconnectTries++ > 10) { log_e("Too many reconnect attempts; Restarting"); ESP.restart(); @@ -191,11 +188,9 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { public: int getTotalAdverts() { return totalSeen; } - std::set getSeen() { return seen; } private: int totalSeen = 0; - std::set seen; void onResult(BLEAdvertisedDevice *advertisedDevice) { @@ -205,7 +200,6 @@ private: digitalWrite(LED_BUILTIN, LED_BUILTIN_ON); BleFingerprint *f = getFingerprint(advertisedDevice); f->seen(advertisedDevice); - seen.insert(f); digitalWrite(LED_BUILTIN, !LED_BUILTIN_ON); } }; @@ -268,7 +262,13 @@ void scanForDevices(void *parameter) int totalSeen = 0; int totalReported = 0; - auto seen = results.getSeen(); + + if (xSemaphoreTake(fingerprintSemaphore, 1000) != pdTRUE) + log_e("Couldn't take semaphore!"); + std::list seen(fingerprints); + if (xSemaphoreGive(fingerprintSemaphore) != pdTRUE) + log_e("Couldn't give semaphore!"); + for (auto it = seen.begin(); it != seen.end(); ++it) { totalSeen++; diff --git a/src/main.h b/src/main.h index e4b8659..04b5609 100644 --- a/src/main.h +++ b/src/main.h @@ -49,7 +49,7 @@ TaskHandle_t scannerTask; bool updateInProgress = false; String localIp; -int reconnectAttempts = 0; +int reconnectTries = 0; int sendFailures = 0; String mqttHost;