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);