Fix seen dangling ptr issue

This commit is contained in:
DTTerastar 2021-04-02 07:56:27 -04:00
parent 51c7acfa8c
commit b05f831f9a
4 changed files with 36 additions and 27 deletions

View File

@ -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;
}

View File

@ -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<Differential<float>> output;

View File

@ -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<BleFingerprint *> getSeen() { return seen; }
private:
int totalSeen = 0;
std::set<BleFingerprint *> 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<BleFingerprint *> seen(fingerprints);
if (xSemaphoreGive(fingerprintSemaphore) != pdTRUE)
log_e("Couldn't give semaphore!");
for (auto it = seen.begin(); it != seen.end(); ++it)
{
totalSeen++;

View File

@ -49,7 +49,7 @@ TaskHandle_t scannerTask;
bool updateInProgress = false;
String localIp;
int reconnectAttempts = 0;
int reconnectTries = 0;
int sendFailures = 0;
String mqttHost;