-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblescanner.cpp
78 lines (63 loc) · 2.42 KB
/
blescanner.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "blescanner.hpp"
#include <algorithm>
BLEScanner::BLEScanner(QObject *parent) : QObject(parent)
{
m_agent = new QBluetoothDeviceDiscoveryAgent{this};
m_agent->setLowEnergyDiscoveryTimeout(5000);
QObject::connect(m_agent, &QBluetoothDeviceDiscoveryAgent::canceled, this,
&BLEScanner::scanCancelled);
// wtf who with the sane mind put a signal and method with the same name in
// this fucking class
QObject::connect(m_agent,
static_cast<void (QBluetoothDeviceDiscoveryAgent::*)(
QBluetoothDeviceDiscoveryAgent::Error)>(
&QBluetoothDeviceDiscoveryAgent::error),
[&](QBluetoothDeviceDiscoveryAgent::Error error_code) {
emit scanError(error_code, m_agent->errorString());
});
QObject::connect(m_agent, &QBluetoothDeviceDiscoveryAgent::finished,
[&]() { emit scanCompleted(devicesFound()); });
QObject::connect(m_agent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered,
this, &BLEScanner::handleDeviceDiscovered);
}
void BLEScanner::scan(BLEScanner::ScanType type) {
m_devices.clear();
switch (type) {
case ScanType::LowEnergy:
m_agent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
break;
case ScanType::Normal:
m_agent->start(QBluetoothDeviceDiscoveryAgent::ClassicMethod);
break;
}
}
auto BLEScanner::isBusy() -> bool {
return (m_agent != nullptr && m_agent->isActive());
}
auto BLEScanner::getDeviceByName(const QString &name)
-> QBluetoothDeviceInfo * {
auto found_it =
std::find_if(m_devices.begin(), m_devices.end(),
[&](auto device) { return device.name() == name; });
if (found_it != m_devices.end()) {
return found_it;
}
return nullptr;
}
auto BLEScanner::getDeviceByAddress(const QBluetoothAddress &address)
-> QBluetoothDeviceInfo * {
auto found_it =
std::find_if(m_devices.begin(), m_devices.end(),
[&](auto device) { return device.address() == address; });
if (found_it != m_devices.end()) {
return found_it;
}
return nullptr;
}
auto BLEScanner::devicesFound() const -> DeviceList::size_type {
return m_devices.size();
}
auto BLEScanner::deviceList() const -> DeviceList const & { return m_devices; }
void BLEScanner::handleDeviceDiscovered(const QBluetoothDeviceInfo &device) {
m_devices.append(device);
}