Changes for bytebuffer update;

set_value core function takes a vector instead of a ByteBuffer
lambda for set_value requires a vector
Sundry cleanup.
This commit is contained in:
clydebarrow 2024-11-01 12:24:56 +11:00
parent c3c49288ad
commit 2727e7bce1
9 changed files with 48 additions and 39 deletions

View file

@ -7,16 +7,16 @@ import esphome.config_validation as cv
from esphome.const import (
CONF_ID,
CONF_MODEL,
CONF_UUID,
CONF_SERVICES,
CONF_VALUE,
CONF_NOTIFY,
CONF_ON_CONNECT,
CONF_ON_DISCONNECT,
CONF_SERVICES,
CONF_UUID,
CONF_VALUE,
)
from esphome.core import CORE
AUTO_LOAD = ["esp32_ble"]
AUTO_LOAD = ["esp32_ble", "bytebuffer"]
CODEOWNERS = ["@jesserockz", "@clydebarrow", "@Rapsssito"]
DEPENDENCIES = ["esp32"]
@ -67,8 +67,9 @@ BLECharacteristicSetValueAction = esp32_ble_server_automations_ns.class_(
BLECharacteristicNotifyAction = esp32_ble_server_automations_ns.class_(
"BLECharacteristicNotifyAction", automation.Action
)
ByteBuffer_ns = cg.esphome_ns.namespace("ByteBuffer")
ByteBuffer = cg.esphome_ns.class_("ByteBuffer")
bytebuffer_ns = cg.esphome_ns.namespace("bytebuffer")
ByteBuffer_ns = bytebuffer_ns.namespace("ByteBuffer")
ByteBuffer = bytebuffer_ns.class_("ByteBuffer")
PROPERTY_MAP = {
@ -331,8 +332,7 @@ async def parse_value(value, str_encoding, buffer_id, args, byte_length=None):
return await cg.templatable(
value,
args,
ByteBuffer,
ByteBuffer_ns.wrap,
cg.std_vector.template(cg.uint8),
)
val, val_method = bytebuffer_parser_(value, str_encoding)
@ -356,11 +356,11 @@ async def parse_value(value, str_encoding, buffer_id, args, byte_length=None):
def calculate_num_handles(service_config):
total = 1
for char_conf in service_config[CONF_CHARACTERISTICS]:
total += 2 # One for the char_conf itself and one for the value
for _ in char_conf[CONF_DESCRIPTORS]:
total += 1
total = 1 + len(service_config[CONF_CHARACTERISTICS]) * 2
total += sum(
len(char_conf[CONF_DESCRIPTORS])
for char_conf in service_config[CONF_CHARACTERISTICS]
)
return total
@ -416,7 +416,7 @@ async def to_code_characteristic(service_var, char_conf):
value_action = await ble_server_characteristic_set_value(
action_conf,
char_conf[CONF_CHAR_VALUE_ACTION_ID_],
cg.TemplateArguments(None),
cg.TemplateArguments(),
{},
)
cg.add(value_action.play())

View file

@ -32,11 +32,16 @@ BLECharacteristic::BLECharacteristic(const ESPBTUUID uuid, uint32_t properties)
this->set_write_no_response_property((properties & PROPERTY_WRITE_NR) != 0);
}
void BLECharacteristic::set_value(ByteBuffer buffer) {
void BLECharacteristic::set_value(ByteBuffer buffer) { this->set_value(buffer.get_data()); }
void BLECharacteristic::set_value(const std::vector<uint8_t> &buffer) {
xSemaphoreTake(this->set_value_lock_, 0L);
this->value_ = buffer.get_data();
this->value_ = buffer;
xSemaphoreGive(this->set_value_lock_);
}
void BLECharacteristic::set_value(const std::string &buffer) {
this->set_value(std::vector<uint8_t>(buffer.begin(), buffer.end()));
}
void BLECharacteristic::notify() {
if (this->service_ == nullptr || this->service_->get_server() == nullptr ||

View file

@ -3,7 +3,7 @@
#include "ble_descriptor.h"
#include "esphome/components/esp32_ble/ble_uuid.h"
#include "esphome/core/event_emitter.h"
#include "esphome/core/bytebuffer.h"
#include "esphome/components/bytebuffer/bytebuffer.h"
#include <vector>
#include <unordered_map>
@ -22,6 +22,7 @@ namespace esphome {
namespace esp32_ble_server {
using namespace esp32_ble;
using namespace bytebuffer;
class BLEService;
@ -42,6 +43,8 @@ class BLECharacteristic : public EventEmitter<BLECharacteristicEvt::VectorEvt, s
~BLECharacteristic();
void set_value(ByteBuffer buffer);
void set_value(const std::vector<uint8_t> &buffer);
void set_value(const std::string &buffer);
void set_broadcast_property(bool value);
void set_indicate_property(bool value);

View file

@ -2,7 +2,7 @@
#include "esphome/components/esp32_ble/ble_uuid.h"
#include "esphome/core/event_emitter.h"
#include "esphome/core/bytebuffer.h"
#include "esphome/components/bytebuffer/bytebuffer.h"
#ifdef USE_ESP32
@ -13,6 +13,7 @@ namespace esphome {
namespace esp32_ble_server {
using namespace esp32_ble;
using namespace bytebuffer;
class BLECharacteristic;

View file

@ -4,7 +4,6 @@
#include "esphome/core/log.h"
#include "esphome/core/application.h"
#include "esphome/core/version.h"
#include "esphome/core/bytebuffer.h"
#ifdef USE_ESP32
@ -112,21 +111,20 @@ bool BLEServer::create_device_characteristics_() {
if (this->model_.has_value()) {
BLECharacteristic *model =
this->device_information_service_->create_characteristic(MODEL_UUID, BLECharacteristic::PROPERTY_READ);
model->set_value(ByteBuffer::wrap(std::vector<uint8_t>(this->model_.value().begin(), this->model_.value().end())));
model->set_value(this->model_.value());
} else {
BLECharacteristic *model =
this->device_information_service_->create_characteristic(MODEL_UUID, BLECharacteristic::PROPERTY_READ);
model->set_value(ByteBuffer::wrap(ESPHOME_BOARD));
model->set_value(std::string(ESPHOME_BOARD));
}
BLECharacteristic *version =
this->device_information_service_->create_characteristic(VERSION_UUID, BLECharacteristic::PROPERTY_READ);
version->set_value(ByteBuffer::wrap("ESPHome " ESPHOME_VERSION));
version->set_value(std::string("ESPHome " ESPHOME_VERSION));
BLECharacteristic *manufacturer =
this->device_information_service_->create_characteristic(MANUFACTURER_UUID, BLECharacteristic::PROPERTY_READ);
manufacturer->set_value(
ByteBuffer::wrap(std::vector<uint8_t>(this->manufacturer_.begin(), this->manufacturer_.end())));
manufacturer->set_value(this->manufacturer_);
return true;
}

View file

@ -4,13 +4,10 @@
#include "ble_characteristic.h"
#include "esphome/components/esp32_ble/ble.h"
#include "esphome/components/esp32_ble/ble_advertising.h"
#include "esphome/components/esp32_ble/ble_uuid.h"
#include "esphome/components/esp32_ble/queue.h"
#include "esphome/core/automation.h"
#include "esphome/components/bytebuffer/bytebuffer.h"
#include "esphome/core/component.h"
#include "esphome/core/helpers.h"
#include "esphome/core/preferences.h"
#include <memory>
#include <vector>
@ -19,13 +16,13 @@
#ifdef USE_ESP32
#include <esp_gap_ble_api.h>
#include <esp_gatts_api.h>
namespace esphome {
namespace esp32_ble_server {
using namespace esp32_ble;
using namespace bytebuffer;
namespace BLEServerEvt {
enum EmptyEvt {
@ -78,16 +75,16 @@ class BLEServer : public Component,
void add_client_(uint16_t conn_id) { this->clients_.insert(conn_id); }
void remove_client_(uint16_t conn_id) { this->clients_.erase(conn_id); }
std::string manufacturer_;
optional<std::string> model_;
std::vector<uint8_t> manufacturer_data_;
std::string manufacturer_{};
optional<std::string> model_{};
std::vector<uint8_t> manufacturer_data_{};
esp_gatt_if_t gatts_if_{0};
bool registered_{false};
std::unordered_set<uint16_t> clients_;
std::unordered_map<std::string, BLEService *> services_;
std::vector<BLEService *> services_to_start_;
BLEService *device_information_service_;
std::unordered_map<std::string, BLEService *> services_{};
std::vector<BLEService *> services_to_start_{};
BLEService *device_information_service_{};
enum State : uint8_t {
INIT = 0x00,

View file

@ -6,7 +6,6 @@
#include "esphome/core/event_emitter.h"
#include "esphome/core/automation.h"
#include "esphome/core/bytebuffer.h"
#include <vector>
#include <unordered_map>
@ -59,7 +58,8 @@ class BLECharacteristicSetValueActionManager
template<typename... Ts> class BLECharacteristicSetValueAction : public Action<Ts...> {
public:
BLECharacteristicSetValueAction(BLECharacteristic *characteristic) : parent_(characteristic) {}
TEMPLATABLE_VALUE(ByteBuffer, buffer)
TEMPLATABLE_VALUE(std::vector<uint8_t>, buffer)
void set_buffer(ByteBuffer buffer) { this->set_buffer(buffer.get_data()); }
void play(Ts... x) override {
// If the listener is already set, do nothing
if (BLECharacteristicSetValueActionManager::get_instance()->get_listener(this->parent_) == this->listener_id_)

View file

@ -4,13 +4,15 @@
#include "esphome/components/esp32_ble_server/ble_2902.h"
#include "esphome/core/application.h"
#include "esphome/core/log.h"
#include "esphome/core/bytebuffer.h"
#include "esphome/components/bytebuffer/bytebuffer.h"
#ifdef USE_ESP32
namespace esphome {
namespace esp32_improv {
using namespace bytebuffer;
static const char *const TAG = "esp32_improv.component";
static const char *const ESPHOME_MY_LINK = "https://my.home-assistant.io/redirect/config_flow_start?domain=esphome";

View file

@ -45,6 +45,9 @@ esp32_ble_server:
ESP_LOGD("BLE", "Characteristic received: %s from %d", std::string(x.begin(), x.end()).c_str(), id);
- ble_server.characteristic.set_value:
id: test_change_characteristic
value: !lambda 'return ByteBuffer::wrap({0x00, 0x01, 0x02});'
value: !lambda 'return bytebuffer::ByteBuffer::wrap({0x00, 0x01, 0x02}).get_data();'
- ble_server.characteristic.set_value:
id: test_change_characteristic
value: [1, 2, 3, 4]
- ble_server.characteristic.notify:
id: test_notify_characteristic