ESPHome  2025.2.0
ble_server_automations.cpp
Go to the documentation of this file.
2 
3 #ifdef USE_ESP32
4 
5 namespace esphome {
6 namespace esp32_ble_server {
7 // Interface to interact with ESPHome automations and triggers
8 namespace esp32_ble_server_automations {
9 
10 using 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 set_listener(BLECharacteristic *characteristic, EventEmitterListenerID listener_id, const std::function< void()> &pre_notify_listener)
EventEmitterListenerID on(EvtType event, std::function< void(Args...)> listener)
Definition: event_emitter.h:19
static Trigger< uint16_t > * create_server_on_disconnect_trigger(BLEServer *server)
void trigger(Ts... x)
Inform the parent automation that the event has triggered.
Definition: automation.h:95
static Trigger< std::vector< uint8_t >, uint16_t > * create_characteristic_on_write_trigger(BLECharacteristic *characteristic)
static Trigger< uint16_t > * create_server_on_connect_trigger(BLEServer *server)
uint32_t EventEmitterListenerID
Definition: event_emitter.h:12
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
static Trigger< std::vector< uint8_t >, uint16_t > * create_descriptor_on_write_trigger(BLEDescriptor *descriptor)