From 2b5bd4b1ca37cfb59a876237827b1dee3b506a98 Mon Sep 17 00:00:00 2001 From: DTTerastar Date: Thu, 16 Sep 2021 19:36:52 -0400 Subject: [PATCH] Fix rss@1m when multiple packets received --- CHANGELOG.md | 3 ++- lib/BleFingerprint/BleFingerprint.cpp | 13 +++++-------- lib/BleFingerprint/BleFingerprint.h | 15 ++++++++++++++- lib/BleFingerprint/util.h | 6 ------ 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 757a970..40c2c13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Breaking Change: iBeacon id's were backwards, they are now correct and match HA Companion - Bump NimBLE to 1.3.1 - Add support for blinking m5atom led, red=no wifi, blue=no mqtt, blinking white is packet seen +- Fix rssi@1m when multiple packets from same mac ## [1.5.0] -- Nothing changed, changes missed this release +- Nothing changed, intended changes are in 1.5.1 ## [1.4.4] diff --git a/lib/BleFingerprint/BleFingerprint.cpp b/lib/BleFingerprint/BleFingerprint.cpp index a567116..6d6a373 100644 --- a/lib/BleFingerprint/BleFingerprint.cpp +++ b/lib/BleFingerprint/BleFingerprint.cpp @@ -10,15 +10,13 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float fcmi address = advertisedDevice->getAddress(); newest = recent = oldest = rssi = advertisedDevice->getRSSI(); - calRssi = advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0; - fingerprint(advertisedDevice); - - if (calRssi > 0) calRssi = defaultTxPower; } void BleFingerprint::fingerprint(BLEAdvertisedDevice *advertisedDevice) { + calcRssi = advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : NO_RSSI; + if (advertisedDevice->haveName()) name = String(advertisedDevice->getName().c_str()); @@ -45,7 +43,7 @@ void BleFingerprint::fingerprint(BLEAdvertisedDevice *advertisedDevice) BLEEddystoneURL oBeacon = BLEEddystoneURL(); oBeacon.setData(strServiceData); url = String(oBeacon.getDecodedURL().c_str()); - calRssi = oBeacon.getPower(); + calRssi = oBeacon.getPower() - 41; } else if (strServiceData[0] == EDDYSTONE_TLM_FRAME_TYPE) { @@ -150,9 +148,8 @@ void BleFingerprint::seen(BLEAdvertisedDevice *advertisedDevice) rssi = median_of_3(oldest, recent, newest); fingerprint(advertisedDevice); - if (!calRssi) calRssi = defaultTxPower; - float ratio = (calRssi - rssi) / 35.0f; + float ratio = (get1mRssi() - rssi) / 35.0f; raw = pow(10, ratio); if (filter()) @@ -210,7 +207,7 @@ bool BleFingerprint::report(JsonDocument *doc, int maxDistance) (*doc)[F("id")] = getId(); if (!name.isEmpty()) (*doc)[F("name")] = name; - (*doc)[F("rssi@1m")] = calRssi; + (*doc)[F("rssi@1m")] = get1mRssi(); (*doc)[F("rssi")] = rssi; (*doc)[F("mac")] = mac; diff --git a/lib/BleFingerprint/BleFingerprint.h b/lib/BleFingerprint/BleFingerprint.h index eea7388..67ceaac 100644 --- a/lib/BleFingerprint/BleFingerprint.h +++ b/lib/BleFingerprint/BleFingerprint.h @@ -9,6 +9,13 @@ #include #include +#define NO_RSSI -32768 +#ifdef TX_DEFAULT +static const int defaultTxPower = TX_DEFAULT; +#else +static const int defaultTxPower = -59; +#endif + #define Sprintf(f, ...) ( \ { \ char *s; \ @@ -40,6 +47,12 @@ public: return getMac(); } String getMac() { return SMacf(address); } + int get1mRssi() + { + if (calRssi != NO_RSSI) return calRssi; + if (calcRssi != NO_RSSI) return calcRssi; + return defaultTxPower; + } float getDistance() { return output.value.position; } int getRSSI() { return rssi; } @@ -55,7 +68,7 @@ private: bool hasValue = false, close = false, reported = false, macPublic = false; NimBLEAddress address; String pid, sid, name, url; - int rssi = -100, calRssi = 0; + int rssi = -100, calRssi = NO_RSSI, calcRssi = NO_RSSI; int newest = -100; int recent = -100; int oldest = -100; diff --git a/lib/BleFingerprint/util.h b/lib/BleFingerprint/util.h index 717c420..b636b7a 100644 --- a/lib/BleFingerprint/util.h +++ b/lib/BleFingerprint/util.h @@ -4,12 +4,6 @@ #define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00) >> 8) + (((x)&0xFF) << 8)) -#ifdef TX_DEFAULT -static const int defaultTxPower = TX_DEFAULT; -#else -static const int defaultTxPower = -59; -#endif - static BLEUUID eddystoneUUID((uint16_t)0xFEAA); static BLEUUID tileUUID((uint16_t)0xFEED); static BLEUUID exposureUUID((uint16_t)0xFD6F);