-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmj_ht_sensor.cpp
66 lines (55 loc) · 1.72 KB
/
mj_ht_sensor.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
#include "mj_ht_sensor.h"
#include <BLEDevice.h>
#include <Arduino.h>
#include <cmath>
static BLEUUID SERVICE_UUID("226c0000-6476-4566-7562-66734470666d");
static BLEUUID CHAR_UUID("226caa55-6476-4566-7562-66734470666d");
static BLEUUID DESC_UUID("00002902-0000-1000-8000-00805f9b34fb");
MjHtSensor* MjHtSensor::instance_;
MjHtSensor::MjHtSensor(BLEAddress peerAddress)
: peerAddress_(peerAddress),
temperature_(INFINITY), humidity_(INFINITY),
updateTime_(0)
{
client_ = BLEDevice::createClient();
instance_ = this;
}
bool MjHtSensor::available() const
{
return std::isfinite(temperature_) && std::isfinite(humidity_);
}
bool MjHtSensor::requestUpdate()
{
if (!client_->connect(peerAddress_)) {
return false;
}
BLERemoteService* service = client_->getService(SERVICE_UUID);
if (!service) return false;
BLERemoteCharacteristic* characteristic = service->getCharacteristic(CHAR_UUID);
if (!characteristic) return false;
BLERemoteDescriptor* desc = characteristic->getDescriptor(DESC_UUID);
if (!desc) return false;
semaphore_.take();
characteristic->registerForNotify(&MjHtSensor::notifyCallback);
desc->writeValue((uint8_t*)"\x01\x00", 2, true);
semaphore_.wait();
client_->disconnect();
return true;
}
void MjHtSensor::notifyCallback(
BLERemoteCharacteristic* characteristic,
uint8_t* rawData,
size_t length,
bool isNotify)
{
if (!characteristic->getUUID().equals(CHAR_UUID)) return;
if (length < 1) return;
std::string data((char*)rawData, length-1);
float temp, hum;
if (sscanf(data.c_str(), "T=%f H=%f", &temp, &hum) == 2) {
instance_->temperature_ = temp;
instance_->humidity_ = hum;
instance_->updateTime_ = millis();
instance_->semaphore_.give();
}
}