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;