Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
0634843815 | |||
928ee7b152 | |||
3da62ad3c9 |
@@ -44,7 +44,7 @@ bool BleFingerprint::shouldHide(const std::string &s) {
|
|||||||
bool BleFingerprint::setId(const std::string &newId, short newIdType, const std::string &newName) {
|
bool BleFingerprint::setId(const std::string &newId, short newIdType, const std::string &newName) {
|
||||||
if (idType < 0 && newIdType < 0 && newIdType >= idType) return false;
|
if (idType < 0 && newIdType < 0 && newIdType >= idType) return false;
|
||||||
if (idType > 0 && newIdType <= idType) return false;
|
if (idType > 0 && newIdType <= idType) return false;
|
||||||
// ESP_LOGD("setId: %s %d %s OLD idType: %d\r\n", newId.c_str(), newIdType, newName.c_str(), idType);
|
ESP_LOGD(TAG, "setId: %s %d %s OLD idType: %d\r\n", newId.c_str(), newIdType, newName.c_str(), idType);
|
||||||
|
|
||||||
ignore = newIdType < 0;
|
ignore = newIdType < 0;
|
||||||
idType = newIdType;
|
idType = newIdType;
|
||||||
@@ -166,7 +166,7 @@ bool ble_ll_resolv_rpa(const uint8_t *rpa, const uint8_t *irk) {
|
|||||||
|
|
||||||
if (ecb.cipher_text[15] != rpa[0] || ecb.cipher_text[14] != rpa[1] || ecb.cipher_text[13] != rpa[2]) return false;
|
if (ecb.cipher_text[15] != rpa[0] || ecb.cipher_text[14] != rpa[1] || ecb.cipher_text[13] != rpa[2]) return false;
|
||||||
|
|
||||||
// ESP_LOGD("RPA resolved %d %02x%02x%02x %02x%02x%02x\r\n", err, rpa[0], rpa[1], rpa[2], ecb.cipher_text[15], ecb.cipher_text[14], ecb.cipher_text[13]);
|
// ESP_LOGD(TAG, "RPA resolved %d %02x%02x%02x %02x%02x%02x\r\n", err, rpa[0], rpa[1], rpa[2], ecb.cipher_text[15], ecb.cipher_text[14], ecb.cipher_text[13]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -209,7 +209,7 @@ void BleFingerprint::fingerprintServiceAdvertisements(NimBLEAdvertisedDevice *ad
|
|||||||
for (auto i = 0; i < serviceAdvCount; i++) {
|
for (auto i = 0; i < serviceAdvCount; i++) {
|
||||||
auto uuid = advertisedDevice->getServiceUUID(i);
|
auto uuid = advertisedDevice->getServiceUUID(i);
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
ESP_LOGD("Verbose | %s | %-58s%ddBm AD: %s\r\n", getMac().c_str(), getId().c_str(), rssi, advertisedDevice->getServiceUUID(i).toString().c_str());
|
ESP_LOGD(TAG, "Verbose | %s | %-58s%ddBm AD: %s\r\n", getMac().c_str(), getId().c_str(), rssi, advertisedDevice->getServiceUUID(i).toString().c_str());
|
||||||
#endif
|
#endif
|
||||||
if (uuid == tileUUID) {
|
if (uuid == tileUUID) {
|
||||||
asRssi = BleFingerprintCollection::rxRefRssi + TILE_TX;
|
asRssi = BleFingerprintCollection::rxRefRssi + TILE_TX;
|
||||||
@@ -267,7 +267,7 @@ void BleFingerprint::fingerprintServiceData(NimBLEAdvertisedDevice *advertisedDe
|
|||||||
BLEUUID uuid = advertisedDevice->getServiceDataUUID(i);
|
BLEUUID uuid = advertisedDevice->getServiceDataUUID(i);
|
||||||
std::string strServiceData = advertisedDevice->getServiceData(i);
|
std::string strServiceData = advertisedDevice->getServiceData(i);
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
ESP_LOGD("Verbose | %s | %-58s%ddBm SD: %s/%s\r\n", getMac().c_str(), getId().c_str(), rssi, uuid.toString().c_str(), hexStr(strServiceData).c_str());
|
ESP_LOGD(TAG, "Verbose | %s | %-58s%ddBm SD: %s/%s\r\n", getMac().c_str(), getId().c_str(), rssi, uuid.toString().c_str(), hexStr(strServiceData).c_str());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (uuid == exposureUUID) { // found COVID-19 exposure tracker
|
if (uuid == exposureUUID) { // found COVID-19 exposure tracker
|
||||||
@@ -286,7 +286,7 @@ void BleFingerprint::fingerprintServiceData(NimBLEAdvertisedDevice *advertisedDe
|
|||||||
mv = *(uint16_t *)(serviceData + 10);
|
mv = *(uint16_t *)(serviceData + 10);
|
||||||
battery = serviceData[12];
|
battery = serviceData[12];
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
ESP_LOGD("Temp: %.1f°, Humidity: %.1f%%, mV: %hu, Battery: %hhu%%, flg: 0x%02hhx, cout: %hhu\r\n", temp, humidity, mv, battery, serviceData[14], serviceData[13]);
|
ESP_LOGD(TAG, "Temp: %.1f°, Humidity: %.1f%%, mV: %hu, Battery: %hhu%%, flg: 0x%02hhx, cout: %hhu\r\n", temp, humidity, mv, battery, serviceData[14], serviceData[13]);
|
||||||
#endif
|
#endif
|
||||||
setId("miTherm:" + getMac(), ID_TYPE_MITHERM);
|
setId("miTherm:" + getMac(), ID_TYPE_MITHERM);
|
||||||
} else if (strServiceData.length() == 13) { // format atc1441
|
} else if (strServiceData.length() == 13) { // format atc1441
|
||||||
@@ -298,7 +298,7 @@ void BleFingerprint::fingerprintServiceData(NimBLEAdvertisedDevice *advertisedDe
|
|||||||
battery = serviceData[9];
|
battery = serviceData[9];
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
ESP_LOGD("Temp: %.1f°, Humidity: %.1f%%, mV: %hu, Battery: %hhu%%, cout: %hhu\r\n", temp, humidity, mv, battery, serviceData[12]);
|
ESP_LOGD(TAG, "Temp: %.1f°, Humidity: %.1f%%, mV: %hu, Battery: %hhu%%, cout: %hhu\r\n", temp, humidity, mv, battery, serviceData[12]);
|
||||||
#endif
|
#endif
|
||||||
setId("miTherm:" + getMac(), ID_TYPE_MITHERM);
|
setId("miTherm:" + getMac(), ID_TYPE_MITHERM);
|
||||||
}
|
}
|
||||||
@@ -339,7 +339,7 @@ void BleFingerprint::fingerprintServiceData(NimBLEAdvertisedDevice *advertisedDe
|
|||||||
void BleFingerprint::fingerprintManufactureData(NimBLEAdvertisedDevice *advertisedDevice, bool haveTxPower, int8_t txPower) {
|
void BleFingerprint::fingerprintManufactureData(NimBLEAdvertisedDevice *advertisedDevice, bool haveTxPower, int8_t txPower) {
|
||||||
std::string strManufacturerData = advertisedDevice->getManufacturerData();
|
std::string strManufacturerData = advertisedDevice->getManufacturerData();
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
ESP_LOGD("Verbose | %s | %-58s%ddBm MD: %s\r\n", getMac().c_str(), getId().c_str(), rssi, hexStr(strManufacturerData).c_str());
|
ESP_LOGD(TAG, "Verbose | %s | %-58s%ddBm MD: %s\r\n", getMac().c_str(), getId().c_str(), rssi, hexStr(strManufacturerData).c_str());
|
||||||
#endif
|
#endif
|
||||||
if (strManufacturerData.length() >= 2) {
|
if (strManufacturerData.length() >= 2) {
|
||||||
std::string manuf = Sprintf("%02x%02x", strManufacturerData[1], strManufacturerData[0]);
|
std::string manuf = Sprintf("%02x%02x", strManufacturerData[1], strManufacturerData[0]);
|
||||||
@@ -492,7 +492,7 @@ bool BleFingerprint::query() {
|
|||||||
|
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
ESP_LOGD("%u Query | %s | %-58s%ddBm %lums\r\n", xPortGetCoreID(), getMac().c_str(), id.c_str(), rssi, now - lastSeenMillis);
|
ESP_LOGD(TAG, "%u Query | %s | %-58s%ddBm %lums\r\n", xPortGetCoreID(), getMac().c_str(), id.c_str(), rssi, now - lastSeenMillis);
|
||||||
|
|
||||||
NimBLEClient *pClient = NimBLEDevice::getClientListSize() ? NimBLEDevice::getClientByPeerAddress(address) : nullptr;
|
NimBLEClient *pClient = NimBLEDevice::getClientListSize() ? NimBLEDevice::getClientByPeerAddress(address) : nullptr;
|
||||||
if (!pClient) pClient = NimBLEDevice::getDisconnectedClient();
|
if (!pClient) pClient = NimBLEDevice::getDisconnectedClient();
|
||||||
@@ -518,7 +518,7 @@ bool BleFingerprint::query() {
|
|||||||
} else {
|
} else {
|
||||||
qryAttempts++;
|
qryAttempts++;
|
||||||
qryDelayMillis = std::min(int(pow(10, qryAttempts)), 60000);
|
qryDelayMillis = std::min(int(pow(10, qryAttempts)), 60000);
|
||||||
ESP_LOGD("%u QryErr | %s | %-58s%ddBm Try %d, retry after %dms\r\n", xPortGetCoreID(), getMac().c_str(), id.c_str(), rssi, qryAttempts, qryDelayMillis);
|
ESP_LOGD(TAG, "%u QryErr | %s | %-58s%ddBm Try %d, retry after %dms\r\n", xPortGetCoreID(), getMac().c_str(), id.c_str(), rssi, qryAttempts, qryDelayMillis);
|
||||||
}
|
}
|
||||||
isQuerying = false;
|
isQuerying = false;
|
||||||
return true;
|
return true;
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
#include "esphome/core/hal.h"
|
#include "esphome/core/hal.h"
|
||||||
#include "esphome/core/time.h"
|
#include "esphome/core/time.h"
|
||||||
|
|
||||||
#define log_e ESP_LOGE
|
#define TAG "esp32_presense"
|
||||||
#define millis esphome::millis
|
#define millis esphome::millis
|
||||||
// #define delay esphome::delay
|
// #define delay esphome::delay
|
||||||
|
|
||||||
@@ -71,6 +71,8 @@
|
|||||||
#define ID_TYPE_KNOWN_MAC short(210)
|
#define ID_TYPE_KNOWN_MAC short(210)
|
||||||
#define ID_TYPE_ALIAS short(250)
|
#define ID_TYPE_ALIAS short(250)
|
||||||
|
|
||||||
|
using namespace esphome;
|
||||||
|
|
||||||
class BleFingerprint {
|
class BleFingerprint {
|
||||||
public:
|
public:
|
||||||
BleFingerprint(NimBLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff);
|
BleFingerprint(NimBLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff);
|
||||||
|
@@ -67,7 +67,7 @@ void Seen(BLEAdvertisedDevice *advertisedDevice) {
|
|||||||
|
|
||||||
bool addOrReplace(DeviceConfig config) {
|
bool addOrReplace(DeviceConfig config) {
|
||||||
if (xSemaphoreTake(deviceConfigMutex, MAX_WAIT) != pdTRUE)
|
if (xSemaphoreTake(deviceConfigMutex, MAX_WAIT) != pdTRUE)
|
||||||
log_e("Couldn't take deviceConfigMutex in addOrReplace!");
|
ESP_LOGE(TAG, "Couldn't take deviceConfigMutex in addOrReplace!");
|
||||||
|
|
||||||
for (auto &it : deviceConfigs) {
|
for (auto &it : deviceConfigs) {
|
||||||
if (it.id == config.id) {
|
if (it.id == config.id) {
|
||||||
@@ -198,7 +198,7 @@ void CleanupOldFingerprints() {
|
|||||||
if (!any) {
|
if (!any) {
|
||||||
auto uptime = (unsigned long)(esp_timer_get_time() / 1000000ULL);
|
auto uptime = (unsigned long)(esp_timer_get_time() / 1000000ULL);
|
||||||
if (uptime > ALLOW_BLE_CONTROLLER_RESTART_AFTER_SECS) {
|
if (uptime > ALLOW_BLE_CONTROLLER_RESTART_AFTER_SECS) {
|
||||||
ESP_LOGE("Bluetooth controller seems stuck, restarting");
|
ESP_LOGE(TAG, "Bluetooth controller seems stuck, restarting");
|
||||||
esp_restart();
|
esp_restart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ BleFingerprint *getFingerprintInternal(BLEAdvertisedDevice *advertisedDevice) {
|
|||||||
|
|
||||||
BleFingerprint *GetFingerprint(BLEAdvertisedDevice *advertisedDevice) {
|
BleFingerprint *GetFingerprint(BLEAdvertisedDevice *advertisedDevice) {
|
||||||
if (xSemaphoreTake(fingerprintMutex, MAX_WAIT) != pdTRUE)
|
if (xSemaphoreTake(fingerprintMutex, MAX_WAIT) != pdTRUE)
|
||||||
log_e("Couldn't take semaphore!");
|
ESP_LOGE(TAG, "Couldn't take semaphore!");
|
||||||
auto f = getFingerprintInternal(advertisedDevice);
|
auto f = getFingerprintInternal(advertisedDevice);
|
||||||
xSemaphoreGive(fingerprintMutex);
|
xSemaphoreGive(fingerprintMutex);
|
||||||
return f;
|
return f;
|
||||||
@@ -235,7 +235,7 @@ BleFingerprint *GetFingerprint(BLEAdvertisedDevice *advertisedDevice) {
|
|||||||
|
|
||||||
const std::vector<BleFingerprint *> GetCopy() {
|
const std::vector<BleFingerprint *> GetCopy() {
|
||||||
if (xSemaphoreTake(fingerprintMutex, MAX_WAIT) != pdTRUE)
|
if (xSemaphoreTake(fingerprintMutex, MAX_WAIT) != pdTRUE)
|
||||||
log_e("Couldn't take fingerprintMutex!");
|
ESP_LOGE(TAG, "Couldn't take fingerprintMutex!");
|
||||||
CleanupOldFingerprints();
|
CleanupOldFingerprints();
|
||||||
std::vector<BleFingerprint *> copy(fingerprints);
|
std::vector<BleFingerprint *> copy(fingerprints);
|
||||||
xSemaphoreGive(fingerprintMutex);
|
xSemaphoreGive(fingerprintMutex);
|
||||||
@@ -253,7 +253,7 @@ bool FindDeviceConfig(const std::string &id, DeviceConfig &config) {
|
|||||||
xSemaphoreGive(deviceConfigMutex);
|
xSemaphoreGive(deviceConfigMutex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
log_e("Couldn't take deviceConfigMutex!");
|
ESP_LOGE(TAG, "Couldn't take deviceConfigMutex!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
#include "MiFloraHandler.h"
|
#include "MiFloraHandler.h"
|
||||||
|
#include "NimBLEAttValue.h"
|
||||||
|
|
||||||
namespace MiFloraHandler {
|
namespace MiFloraHandler {
|
||||||
|
|
||||||
@@ -10,7 +11,7 @@ bool readSensorData(BLERemoteService* floraService, DynamicJsonDocument* doc) {
|
|||||||
floraCharacteristic = floraService->getCharacteristic(uuid_sensor_data);
|
floraCharacteristic = floraService->getCharacteristic(uuid_sensor_data);
|
||||||
|
|
||||||
if (floraCharacteristic == nullptr) {
|
if (floraCharacteristic == nullptr) {
|
||||||
ESP_LOGD("-- Can't read characteristics");
|
ESP_LOGD(TAG, "-- Can't read characteristics");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,7 +21,7 @@ bool readSensorData(BLERemoteService* floraService, DynamicJsonDocument* doc) {
|
|||||||
value = floraCharacteristic->readValue();
|
value = floraCharacteristic->readValue();
|
||||||
|
|
||||||
if (value.size() == 0) {
|
if (value.size() == 0) {
|
||||||
ESP_LOGD("Reading Value failed");
|
ESP_LOGD(TAG, "Reading Value failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +48,7 @@ bool readBatteryData(BLERemoteService* floraService, DynamicJsonDocument* doc) {
|
|||||||
floraCharacteristic = floraService->getCharacteristic(uuid_version_battery);
|
floraCharacteristic = floraService->getCharacteristic(uuid_version_battery);
|
||||||
|
|
||||||
if (floraCharacteristic == nullptr) {
|
if (floraCharacteristic == nullptr) {
|
||||||
ESP_LOGD("-- Can't read characteristics");
|
ESP_LOGD(TAG, "-- Can't read characteristics");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
NimBLEAttValue val;
|
NimBLEAttValue val;
|
||||||
@@ -55,7 +56,7 @@ bool readBatteryData(BLERemoteService* floraService, DynamicJsonDocument* doc) {
|
|||||||
val = floraCharacteristic->readValue();
|
val = floraCharacteristic->readValue();
|
||||||
|
|
||||||
if (val.size() == 0) {
|
if (val.size() == 0) {
|
||||||
ESP_LOGD("Reading Value failed");
|
ESP_LOGD(TAG, "Reading Value failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,15 +101,15 @@ bool getFloraData(DynamicJsonDocument* doc, BLERemoteService* floraService, BleF
|
|||||||
fillDeviceData(doc, f);
|
fillDeviceData(doc, f);
|
||||||
|
|
||||||
if (!MiFloraHandler::readBatteryData(floraService, doc))
|
if (!MiFloraHandler::readBatteryData(floraService, doc))
|
||||||
ESP_LOGD("Failed reading battery data");
|
ESP_LOGD(TAG, "Failed reading battery data");
|
||||||
|
|
||||||
if (MiFloraHandler::forceFloraServiceDataMode(floraService)) {
|
if (MiFloraHandler::forceFloraServiceDataMode(floraService)) {
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGD("Failed to force data reading mode");
|
ESP_LOGD(TAG, "Failed to force data reading mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MiFloraHandler::readSensorData(floraService, doc))
|
if (!MiFloraHandler::readSensorData(floraService, doc))
|
||||||
ESP_LOGD("Failed reading sensor data");
|
ESP_LOGD(TAG, "Failed reading sensor data");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -120,7 +121,7 @@ bool requestData(NimBLEClient* pClient, BleFingerprint* fingerprint) // Getting
|
|||||||
NimBLERemoteService* floraService = pClient->getService(serviceUUID);
|
NimBLERemoteService* floraService = pClient->getService(serviceUUID);
|
||||||
|
|
||||||
if (floraService == nullptr) {
|
if (floraService == nullptr) {
|
||||||
ESP_LOGD("Getting MiFlora service failed");
|
ESP_LOGD(TAG, "Getting MiFlora service failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -7,14 +7,14 @@ bool requestData(NimBLEClient* pClient, BleFingerprint* f) {
|
|||||||
std::string sName = pClient->getValue(genericAccessService, nameChar);
|
std::string sName = pClient->getValue(genericAccessService, nameChar);
|
||||||
if (!sName.empty() && sMdl.find(sName) == std::string::npos && sName != "Apple Watch") {
|
if (!sName.empty() && sMdl.find(sName) == std::string::npos && sName != "Apple Watch") {
|
||||||
if (f->setId(std::string("name:") + kebabify(sName).c_str(), ID_TYPE_QUERY_NAME, std::string(sName.c_str()))) {
|
if (f->setId(std::string("name:") + kebabify(sName).c_str(), ID_TYPE_QUERY_NAME, std::string(sName.c_str()))) {
|
||||||
ESP_LOGD("\u001b[38;5;104m%u Name | %s | %-58s%ddBm %s\u001b[0m\r\n", xPortGetCoreID(), f->getMac().c_str(), f->getId().c_str(), f->getRssi(), sName.c_str());
|
// ESP_LOGD("\u001b[38;5;104m%u Name | %s | %-58s%ddBm %s\u001b[0m\r\n", xPortGetCoreID(), f->getMac().c_str(), f->getId().c_str(), f->getRssi(), sName.c_str());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sMdl.empty()) {
|
if (!sMdl.empty()) {
|
||||||
if (f->setId(std::string("apple:") + kebabify(sMdl).c_str(), ID_TYPE_QUERY_MODEL, std::string(sMdl.c_str()))) {
|
if (f->setId(std::string("apple:") + kebabify(sMdl).c_str(), ID_TYPE_QUERY_MODEL, std::string(sMdl.c_str()))) {
|
||||||
ESP_LOGD("\u001b[38;5;136m%u Model | %s | %-58s%ddBm %s\u001b[0m\r\n", xPortGetCoreID(), f->getMac().c_str(), f->getId().c_str(), f->getRssi(), sMdl.c_str());
|
// ESP_LOGD("\u001b[38;5;136m%u Model | %s | %-58s%ddBm %s\u001b[0m\r\n", xPortGetCoreID(), f->getMac().c_str(), f->getId().c_str(), f->getRssi(), sMdl.c_str());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -42,11 +42,7 @@ async def to_code(config):
|
|||||||
add_idf_sdkconfig_option("CONFIG_BT_NIMBLE_ENABLED", True)
|
add_idf_sdkconfig_option("CONFIG_BT_NIMBLE_ENABLED", True)
|
||||||
add_idf_sdkconfig_option("CONFIG_MBEDTLS_HARDWARE_AES", False)
|
add_idf_sdkconfig_option("CONFIG_MBEDTLS_HARDWARE_AES", False)
|
||||||
|
|
||||||
cg.add_library(
|
cg.add_library("esp-nimble-cpp", repository="https://github.com/h2zero/esp-nimble-cpp#v1.4.1", version="v1.4.1")
|
||||||
name="esp-nimble-cpp",
|
|
||||||
repository="https://github.com/h2zero/esp-nimble-cpp",
|
|
||||||
version="1.4.1"
|
|
||||||
)
|
|
||||||
|
|
||||||
# await nimble_tracker.device_listener_to_code(var, config)
|
# await nimble_tracker.device_listener_to_code(var, config)
|
||||||
# await nimble_tracker.register_ble_device(var, config)
|
# await nimble_tracker.register_ble_device(var, config)
|
3
components/esp32_presense/defaults.h
Normal file
3
components/esp32_presense/defaults.h
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#define BLE_SCAN_INTERVAL 0x80
|
||||||
|
#define BLE_SCAN_WINDOW 0x80
|
||||||
|
#define SCAN_TASK_STACK_SIZE 2562
|
@@ -1,4 +1,5 @@
|
|||||||
#include "esp32_presense.h"
|
#include "esp32_presense.h"
|
||||||
|
#include "defaults.h"
|
||||||
|
|
||||||
namespace esphome
|
namespace esphome
|
||||||
{
|
{
|
||||||
@@ -9,16 +10,87 @@ namespace esphome
|
|||||||
unsigned int totalFpQueried = 0;
|
unsigned int totalFpQueried = 0;
|
||||||
unsigned int totalFpReported = 0;
|
unsigned int totalFpReported = 0;
|
||||||
|
|
||||||
|
TimerHandle_t reconnectTimer;
|
||||||
|
TaskHandle_t scanTaskHandle;
|
||||||
|
|
||||||
|
unsigned long updateStartedMillis = 0;
|
||||||
|
unsigned long lastTeleMillis = 0;
|
||||||
|
int reconnectTries = 0;
|
||||||
|
int teleFails = 0;
|
||||||
|
int reportFailed = 0;
|
||||||
|
bool online = false; // Have we successfully sent status=online
|
||||||
|
bool sentDiscovery = false; // Have we successfully sent discovery
|
||||||
|
UBaseType_t bleStack = 0;
|
||||||
|
|
||||||
|
bool discovery, publishTele, publishRooms, publishDevices;
|
||||||
|
|
||||||
|
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
|
||||||
|
void onResult(BLEAdvertisedDevice *advertisedDevice) {
|
||||||
|
bleStack = uxTaskGetStackHighWaterMark(nullptr);
|
||||||
|
BleFingerprintCollection::Seen(advertisedDevice);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void scanTask(void *parameter) {
|
||||||
|
NimBLEDevice::init("ESPresense");
|
||||||
|
// Enrollment::Setup();
|
||||||
|
NimBLEDevice::setMTU(23);
|
||||||
|
|
||||||
|
auto pBLEScan = NimBLEDevice::getScan();
|
||||||
|
pBLEScan->setInterval(BLE_SCAN_INTERVAL);
|
||||||
|
pBLEScan->setWindow(BLE_SCAN_WINDOW);
|
||||||
|
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks(), true);
|
||||||
|
pBLEScan->setActiveScan(false);
|
||||||
|
pBLEScan->setDuplicateFilter(false);
|
||||||
|
pBLEScan->setMaxResults(0);
|
||||||
|
if (!pBLEScan->start(0, nullptr, false))
|
||||||
|
ESP_LOGE(TAG, "Error starting continuous ble scan");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
for (auto &f : BleFingerprintCollection::fingerprints)
|
||||||
|
if (f->query())
|
||||||
|
totalFpQueried++;
|
||||||
|
|
||||||
|
// Enrollment::Loop();
|
||||||
|
|
||||||
|
if (!pBLEScan->isScanning()) {
|
||||||
|
if (!pBLEScan->start(0, nullptr, true))
|
||||||
|
ESP_LOGE(TAG, "Error re-starting continuous ble scan");
|
||||||
|
delay(3000); // If we stopped scanning, don't query for 3 seconds in order for us to catch any missed broadcasts
|
||||||
|
} else {
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP32Presense::setup()
|
||||||
|
{
|
||||||
|
ESP_LOGD("SETUP1")
|
||||||
|
BleFingerprintCollection::Setup();
|
||||||
|
ESP_LOGD("SETUP2")
|
||||||
|
xTaskCreatePinnedToCore(scanTask, "scanTask", SCAN_TASK_STACK_SIZE, nullptr, 1, &scanTaskHandle, CONFIG_BT_NIMBLE_PINNED_TO_CORE);
|
||||||
|
ESP_LOGD("SETUP3")
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP32Presense::loop()
|
||||||
|
{
|
||||||
|
ESP_LOGD("LOOP1")
|
||||||
|
reportLoop();
|
||||||
|
ESP_LOGD("LOOP2")
|
||||||
|
}
|
||||||
|
|
||||||
void ESP32Presense::reportLoop()
|
void ESP32Presense::reportLoop()
|
||||||
{
|
{
|
||||||
auto copy = BleFingerprintCollection::GetCopy();
|
auto copy = BleFingerprintCollection::GetCopy();
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
|
|
||||||
for (auto &i : copy)
|
for (auto &i : copy)
|
||||||
if (i->shouldCount())
|
if (i->shouldCount())
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
|
yield();
|
||||||
sendTelemetry(totalSeen, totalFpSeen, totalFpQueried, totalFpReported, count);
|
sendTelemetry(totalSeen, totalFpSeen, totalFpQueried, totalFpReported, count);
|
||||||
|
yield();
|
||||||
|
|
||||||
auto reported = 0;
|
auto reported = 0;
|
||||||
for (auto &f : copy) {
|
for (auto &f : copy) {
|
||||||
|
@@ -26,8 +26,8 @@ namespace esphome
|
|||||||
unsigned int count
|
unsigned int count
|
||||||
);
|
);
|
||||||
public:
|
public:
|
||||||
void setup() {};
|
void setup();
|
||||||
void loop() {};
|
void loop();
|
||||||
void reportLoop();
|
void reportLoop();
|
||||||
// void on_result(nimble_distance_custom::NimbleDistanceCustomResult&) override;
|
// void on_result(nimble_distance_custom::NimbleDistanceCustomResult&) override;
|
||||||
void set_room(std::string room) { room_ = room; }
|
void set_room(std::string room) { room_ = room; }
|
||||||
|
Reference in New Issue
Block a user