Remove BLEServiceComponent redundancy

This commit is contained in:
Rapsssito 2024-06-20 23:03:41 +02:00
parent 0913772e26
commit 4282918581
7 changed files with 45 additions and 22 deletions

View file

@ -165,8 +165,8 @@ void BLEServer::gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t ga
ESP_LOGD(TAG, "BLE Client connected");
this->add_client_(param->connect.conn_id, (void *) this);
this->connected_clients_++;
for (auto *component : this->service_components_) {
component->on_client_connect();
for (auto &pair : this->services_) {
pair.second->emit_client_connect(param->connect.conn_id);
}
break;
}
@ -175,8 +175,8 @@ void BLEServer::gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t ga
if (this->remove_client_(param->disconnect.conn_id))
this->connected_clients_--;
this->parent_->advertising_start();
for (auto *component : this->service_components_) {
component->on_client_disconnect();
for (auto &pair : this->services_) {
pair.second->emit_client_disconnect(param->disconnect.conn_id);
}
break;
}

View file

@ -25,14 +25,6 @@ namespace esp32_ble_server {
using namespace esp32_ble;
class BLEServiceComponent {
public:
virtual void on_client_connect(){};
virtual void on_client_disconnect(){};
virtual void start();
virtual void stop();
};
class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEventHandler, public Parented<ESP32BLE> {
public:
void setup() override;
@ -64,8 +56,6 @@ class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEv
void ble_before_disabled_event_handler() override;
void register_service_component(BLEServiceComponent *component) { this->service_components_.push_back(component); }
protected:
static std::string get_service_key(ESPBTUUID uuid, uint8_t inst_id);
bool create_device_characteristics_();
@ -85,8 +75,6 @@ class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEv
std::unordered_map<std::string, BLEService *> services_;
BLEService *device_information_service_;
std::vector<BLEServiceComponent *> service_components_;
enum State : uint8_t {
INIT = 0x00,
REGISTERING,

View file

@ -86,6 +86,13 @@ bool BLEService::do_create_characteristics_() {
return true;
}
void BLEService::enqueue_start() {
if (this->init_state_ == CREATED)
this->start();
else
this->should_start_ = true;
}
void BLEService::start() {
if (this->do_create_characteristics_())
return;

View file

@ -42,6 +42,7 @@ class BLEService {
void do_delete();
void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param);
void enqueue_start();
void start();
void stop();
@ -51,6 +52,10 @@ class BLEService {
bool is_running() { return this->running_state_ == RUNNING; }
bool is_starting() { return this->running_state_ == STARTING; }
bool is_deleted() { return this->init_state_ == DELETED; }
void on_client_connect(const std::function<void(const uint16_t)> &&func) { this->on_client_connect_ = func; }
void on_client_disconnect(const std::function<void(const uint16_t)> &&func) { this->on_client_disconnect_ = func; }
void emit_client_connect(const uint16_t conn_id) { this->on_client_connect_(conn_id); }
void emit_client_disconnect(const uint16_t conn_id) { this->on_client_disconnect_(conn_id); }
protected:
std::vector<BLECharacteristic *> characteristics_;
@ -63,6 +68,8 @@ class BLEService {
uint8_t inst_id_;
bool advertise_{false};
bool should_start_{false};
std::function<void(const uint16_t)> on_client_connect_;
std::function<void(const uint16_t)> on_client_disconnect_;
bool do_create_characteristics_();
void stop_();

View file

@ -76,6 +76,7 @@ void ESP32ImprovComponent::loop() {
// Setup the service
ESP_LOGD(TAG, "Creating Improv service");
this->service_ = global_ble_server->create_service(ESPBTUUID::from_raw(improv::SERVICE_UUID), true);
this->service_->on_client_disconnect([this]() { this->set_error_(improv::ERROR_NONE); });
this->setup_characteristics();
}
@ -330,8 +331,6 @@ void ESP32ImprovComponent::on_wifi_connect_timeout_() {
wifi::global_wifi_component->clear_sta();
}
void ESP32ImprovComponent::on_client_disconnect() { this->set_error_(improv::ERROR_NONE); };
ESP32ImprovComponent *global_improv_component = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
} // namespace esp32_improv

View file

@ -28,18 +28,17 @@ namespace esp32_improv {
using namespace esp32_ble_server;
class ESP32ImprovComponent : public Component, public BLEServiceComponent {
class ESP32ImprovComponent : public Component {
public:
ESP32ImprovComponent();
void dump_config() override;
void loop() override;
void setup() override;
void setup_characteristics();
void on_client_disconnect() override;
float get_setup_priority() const override;
void start() override;
void stop() override;
void start();
void stop();
bool is_active() const { return this->state_ != improv::STATE_STOPPED; }
#ifdef USE_BINARY_SENSOR

View file

@ -294,6 +294,29 @@ esp32_ble:
esp32_ble_server:
manufacturer: ESPHome
model: Test5
services:
- uuid: 2a24b789-7aab-4535-af3e-ee76a35cc42d
advertise: true
characteristics:
- uuid: cad48e28-7fbe-41cf-bae9-d77a6c233423
name: "Test Characteristic"
properties:
- READ
- WRITE
- NOTIFY
permissions:
- READ
- WRITE
value: "Hello World"
on_write:
then:
- logger.log: "Characteristic written"
on_read:
then:
- logger.log: "Characteristic read"
on_notify:
then:
- logger.log: "Characteristic notified"
esp32_improv:
authorizer: io0_button