ESPHome 2025.5.0
Loading...
Searching...
No Matches
ble_server_automations.cpp
Go to the documentation of this file.
2
3#ifdef USE_ESP32
4
5namespace esphome {
6namespace esp32_ble_server {
7// Interface to interact with ESPHome automations and triggers
8namespace esp32_ble_server_automations {
9
10using namespace esp32_ble;
11
13 BLECharacteristic *characteristic) {
14 Trigger<std::vector<uint8_t>, uint16_t> *on_write_trigger = // NOLINT(cppcoreguidelines-owning-memory)
15 new Trigger<std::vector<uint8_t>, uint16_t>();
16 characteristic->EventEmitter<BLECharacteristicEvt::VectorEvt, std::vector<uint8_t>, uint16_t>::on(
18 [on_write_trigger](const std::vector<uint8_t> &data, uint16_t id) { on_write_trigger->trigger(data, id); });
19 return on_write_trigger;
20}
21
23 Trigger<std::vector<uint8_t>, uint16_t> *on_write_trigger = // NOLINT(cppcoreguidelines-owning-memory)
24 new Trigger<std::vector<uint8_t>, uint16_t>();
25 descriptor->on(
27 [on_write_trigger](const std::vector<uint8_t> &data, uint16_t id) { on_write_trigger->trigger(data, id); });
28 return on_write_trigger;
29}
30
32 Trigger<uint16_t> *on_connect_trigger = new Trigger<uint16_t>(); // NOLINT(cppcoreguidelines-owning-memory)
34 [on_connect_trigger](uint16_t conn_id) { on_connect_trigger->trigger(conn_id); });
35 return on_connect_trigger;
36}
37
39 Trigger<uint16_t> *on_disconnect_trigger = new Trigger<uint16_t>(); // NOLINT(cppcoreguidelines-owning-memory)
41 [on_disconnect_trigger](uint16_t conn_id) { on_disconnect_trigger->trigger(conn_id); });
42 return on_disconnect_trigger;
43}
44
46 EventEmitterListenerID listener_id,
47 const std::function<void()> &pre_notify_listener) {
48 // Check if there is already a listener for this characteristic
49 if (this->listeners_.count(characteristic) > 0) {
50 // Unpack the pair listener_id, pre_notify_listener_id
51 auto listener_pairs = this->listeners_[characteristic];
52 EventEmitterListenerID old_listener_id = listener_pairs.first;
53 EventEmitterListenerID old_pre_notify_listener_id = listener_pairs.second;
54 // Remove the previous listener
55 characteristic->EventEmitter<BLECharacteristicEvt::EmptyEvt, uint16_t>::off(BLECharacteristicEvt::EmptyEvt::ON_READ,
56 old_listener_id);
57 // Remove the pre-notify listener
58 this->off(BLECharacteristicSetValueActionEvt::PRE_NOTIFY, old_pre_notify_listener_id);
59 }
60 // Create a new listener for the pre-notify event
61 EventEmitterListenerID pre_notify_listener_id =
63 [pre_notify_listener, characteristic](const BLECharacteristic *evt_characteristic) {
64 // Only call the pre-notify listener if the characteristic is the one we are interested in
65 if (characteristic == evt_characteristic) {
66 pre_notify_listener();
67 }
68 });
69 // Save the pair listener_id, pre_notify_listener_id to the map
70 this->listeners_[characteristic] = std::make_pair(listener_id, pre_notify_listener_id);
71}
72
73} // namespace esp32_ble_server_automations
74} // namespace esp32_ble_server
75} // namespace esphome
76
77#endif
void trigger(Ts... x)
Inform the parent automation that the event has triggered.
Definition automation.h:96
void set_listener(BLECharacteristic *characteristic, EventEmitterListenerID listener_id, const std::function< void()> &pre_notify_listener)
static Trigger< std::vector< uint8_t >, uint16_t > * create_characteristic_on_write_trigger(BLECharacteristic *characteristic)
static Trigger< uint16_t > * create_server_on_disconnect_trigger(BLEServer *server)
static Trigger< uint16_t > * create_server_on_connect_trigger(BLEServer *server)
static Trigger< std::vector< uint8_t >, uint16_t > * create_descriptor_on_write_trigger(BLEDescriptor *descriptor)
EventEmitterListenerID on(EvtType event, std::function< void(Args...)> listener)
void off(BLECharacteristicSetValueActionEvt event, EventEmitterListenerID id)
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7