BLE-Gamepad-Client 0.3.2
Loading...
Searching...
No Matches
utils.h
1#pragma once
2
3#include <NimBLEDevice.h>
4#include <string>
5#include "logger.h"
6
7namespace blegc {
8
9 static auto* LOG_TAG = "utils";
10
11 static bool isNull(const NimBLEUUID& uuid) { return uuid.bitSize() == 0; }
12
13 static std::string remoteCharToStr(const NimBLERemoteCharacteristic* pChar) {
14 auto str = pChar->toString();
15
16 std::string::size_type pos = str.find('\n');
17 if (pos != std::string::npos) {
18 return str.substr(0, pos);
19 }
20 return str;
21 }
22
23 static bool discoverAttributes(const NimBLEAddress address) {
24 auto* pClient = BLEDevice::getClientByPeerAddress(address);
25 if (!pClient) {
26 BLEGC_LOGE(LOG_TAG, "BLE client not found, address %s", std::string(address).c_str());
27 return false;
28 }
29 if (!pClient->discoverAttributes()) {
30 BLEGC_LOGE(LOG_TAG, "Failed to discover attributes, address %s", std::string(address).c_str());
31 return false;
32 }
33
34#if CONFIG_BT_BLEGC_LOG_LEVEL >= 4
35 for (auto& pService : pClient->getServices(false)) {
36 BLEGC_LOGD(LOG_TAG, "Discovered service %s", std::string(pService->getUUID()).c_str());
37 for (auto& pChar : pService->getCharacteristics(false)) {
38 BLEGC_LOGD(LOG_TAG, "Discovered characteristic %s", remoteCharToStr(pChar).c_str());
39 }
40 }
41#endif
42 return true;
43 }
44
45 using BLECharacteristicFilter = std::function<bool(NimBLERemoteCharacteristic*)>;
46
47 static NimBLERemoteCharacteristic* findCharacteristic(
48 const NimBLEAddress address,
49 const NimBLEUUID& serviceUUID,
50 const NimBLEUUID& characteristicUUID = NimBLEUUID(),
51 const BLECharacteristicFilter& filter = [](NimBLERemoteCharacteristic*) { return true; }) {
52 BLEGC_LOGD(LOG_TAG, "Looking up for characteristic, service uuid: %s, characteristic uuid: %s.",
53 std::string(serviceUUID).c_str(),
54 isNull(characteristicUUID) ? "null" : std::string(characteristicUUID).c_str());
55
56 auto* pBleClient = NimBLEDevice::getClientByPeerAddress(address);
57 if (!pBleClient) {
58 BLEGC_LOGE(LOG_TAG, "BLE client not found, address %s", std::string(address).c_str());
59 return nullptr;
60 }
61
62 auto* pService = pBleClient->getService(serviceUUID);
63 if (!pService) {
64 BLEGC_LOGE(LOG_TAG, "Service not found, service uuid: %s", std::string(serviceUUID).c_str());
65 return nullptr;
66 }
67
68 for (auto* pChar : pService->getCharacteristics(false)) {
69 if (!isNull(characteristicUUID) && characteristicUUID != pChar->getUUID()) {
70 continue;
71 }
72
73 if (!filter(pChar)) {
74 continue;
75 }
76
77 return pChar;
78 }
79
80 BLEGC_LOGE(LOG_TAG, "Characteristic not found, service uuid: %s, characteristic uuid: %s.", std::string(serviceUUID).c_str(),
81 isNull(characteristicUUID) ? "null" : std::string(characteristicUUID).c_str());
82
83 return nullptr;
84 }
85};