18#ifndef NIMBLE_CPP_SCAN_H_
19#define NIMBLE_CPP_SCAN_H_
21#include "syscfg/syscfg.h"
22#if CONFIG_BT_NIMBLE_ENABLED && MYNEWT_VAL(BLE_ROLE_OBSERVER)
24# include "NimBLEAdvertisedDevice.h"
25# include "NimBLEUtils.h"
27# ifdef USING_NIMBLE_ARDUINO_HEADERS
28# include "nimble/nimble/host/include/host/ble_gap.h"
30# include "host/ble_gap.h"
39class NimBLEAdvertisedDevice;
40class NimBLEScanCallbacks;
50class NimBLEScanResults {
54 const NimBLEAdvertisedDevice* getDevice(uint32_t idx)
const;
55 const NimBLEAdvertisedDevice* getDevice(
const NimBLEAddress& address)
const;
56 std::vector<NimBLEAdvertisedDevice*>::const_iterator begin()
const;
57 std::vector<NimBLEAdvertisedDevice*>::const_iterator end()
const;
61 std::vector<NimBLEAdvertisedDevice*> m_deviceVec;
71 bool start(uint32_t duration,
bool isContinue =
false,
bool restart =
true);
73 void setScanCallbacks(NimBLEScanCallbacks* pScanCallbacks,
bool wantDuplicates =
false);
74 void setActiveScan(
bool active);
75 void setInterval(uint16_t intervalMs);
76 void setWindow(uint16_t windowMs);
77 void setDuplicateFilter(uint8_t enabled);
78 void setLimitedOnly(
bool enabled);
79 void setFilterPolicy(uint8_t filter);
82 NimBLEScanResults getResults();
83 NimBLEScanResults getResults(uint32_t duration,
bool is_continue =
false);
84 void setMaxResults(uint8_t maxResults);
86 void erase(
const NimBLEAdvertisedDevice* device);
87 void setScanResponseTimeout(uint32_t timeoutMs);
88 std::string getStatsString()
const {
return m_stats.toString(); }
90# if MYNEWT_VAL(BLE_EXT_ADV)
91 enum Phy { SCAN_1M = 0x01, SCAN_CODED = 0x02, SCAN_ALL = 0x03 };
92 void setPhy(Phy phyMask);
93 void setPeriod(uint32_t periodMs);
100# if MYNEWT_VAL(NIMBLE_CPP_LOG_LEVEL) >= 4
101 uint32_t devCount = 0;
102 uint32_t dupCount = 0;
103 uint32_t srMinMs = UINT32_MAX;
104 uint32_t srMaxMs = 0;
105 uint64_t srTotalMs = 0;
106 uint32_t srCount = 0;
107 uint32_t orphanedSrCount = 0;
108 uint32_t missedSrCount = 0;
113 srMinMs = UINT32_MAX;
121 void incDevCount() { devCount++; }
122 void incDupCount() { dupCount++; }
123 void incMissedSrCount() { missedSrCount++; }
124 void incOrphanedSrCount() { orphanedSrCount++; }
126 std::string toString()
const {
132 " Devices seen : %" PRIu32
"\n"
133 " Duplicate advs : %" PRIu32
"\n"
134 " Scan responses : %" PRIu32
"\n"
135 " SR timing (ms) : min=%" PRIu32
", max=%" PRIu32
", avg=%" PRIu64
"\n"
136 " Orphaned SR : %" PRIu32
"\n"
137 " Missed SR : %" PRIu32
"\n",
141 srCount ? srMinMs : 0,
142 srCount ? srMaxMs : 0,
143 srCount ? srTotalMs / srCount : 0,
150 void recordSrTime(uint32_t ticks) {
152 ble_npl_time_ticks_to_ms(ticks, &ms);
166 void incDevCount() {}
167 void incDupCount() {}
168 void incMissedSrCount() {}
169 void incOrphanedSrCount() {}
170 std::string toString()
const {
return ""; }
171 void recordSrTime(uint32_t ticks) {}
177 static int handleGapEvent(ble_gap_event* event,
void* arg);
179 static void srTimerCb(ble_npl_event* event);
182 void addWaitingDevice(NimBLEAdvertisedDevice* pDev);
183 void removeWaitingDevice(NimBLEAdvertisedDevice* pDev);
184 void clearWaitingList();
185 void resetWaitingTimer();
187 NimBLEScanCallbacks* m_pScanCallbacks;
188 ble_gap_disc_params m_scanParams;
189 NimBLEScanResults m_scanResults;
191 ble_npl_callout m_srTimer{};
192 ble_npl_time_t m_srTimeoutTicks{};
193 uint8_t m_maxResults;
194 NimBLEAdvertisedDevice* m_pWaitingListHead{};
195 NimBLEAdvertisedDevice* m_pWaitingListTail{};
197# if MYNEWT_VAL(BLE_EXT_ADV)
198 uint8_t m_phy{SCAN_ALL};
199 uint16_t m_period{0};
206class NimBLEScanCallbacks {
208 virtual ~NimBLEScanCallbacks() {}
214 virtual void onDiscovered(
const NimBLEAdvertisedDevice* advertisedDevice);
220 virtual void onResult(
const NimBLEAdvertisedDevice* advertisedDevice);
227 virtual void onScanEnd(
const NimBLEScanResults& scanResults,
int reason);
A BLE device address.
Definition NimBLEAddress.h:42
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:119
A structure to hold data for a task that is waiting for a response.
Definition NimBLEUtils.h:53