mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	fixes
This commit is contained in:
		| @@ -731,7 +731,7 @@ message SubscribeLogsResponse { | ||||
|   option (no_delay) = false; | ||||
|  | ||||
|   LogLevel level = 1; | ||||
|   bytes message = 3 [(zero_copy) = true]; | ||||
|   bytes message = 3; | ||||
|   bool send_failed = 4; | ||||
| } | ||||
|  | ||||
| @@ -888,7 +888,7 @@ message CameraImageResponse { | ||||
|   option (ifdef) = "USE_CAMERA"; | ||||
|  | ||||
|   fixed32 key = 1; | ||||
|   bytes data = 2 [(zero_copy) = true]; | ||||
|   bytes data = 2; | ||||
|   bool done = 3; | ||||
|   uint32 device_id = 4 [(field_ifdef) = "USE_DEVICES"]; | ||||
| } | ||||
|   | ||||
| @@ -1497,7 +1497,9 @@ void APIConnection::execute_service(const ExecuteServiceRequest &msg) { | ||||
| NoiseEncryptionSetKeyResponse APIConnection::noise_encryption_set_key(const NoiseEncryptionSetKeyRequest &msg) { | ||||
|   psk_t psk{}; | ||||
|   NoiseEncryptionSetKeyResponse resp; | ||||
|   if (base64_decode(msg.key, psk.data(), msg.key.size()) != psk.size()) { | ||||
|   // Create temporary string from pointer/length for base64_decode | ||||
|   std::string key_str(reinterpret_cast<const char *>(msg.key_ptr_), msg.key_len_); | ||||
|   if (base64_decode(key_str, psk.data(), key_str.size()) != psk.size()) { | ||||
|     ESP_LOGW(TAG, "Invalid encryption key length"); | ||||
|     resp.success = false; | ||||
|     return resp; | ||||
|   | ||||
| @@ -27,5 +27,4 @@ extend google.protobuf.MessageOptions { | ||||
| extend google.protobuf.FieldOptions { | ||||
|     optional string field_ifdef = 1042; | ||||
|     optional uint32 fixed_array_size = 50007; | ||||
|     optional bool zero_copy = 1043 [default=false]; | ||||
| } | ||||
|   | ||||
| @@ -1972,12 +1972,12 @@ bool BluetoothGATTReadRequest::decode_varint(uint32_t field_id, ProtoVarInt valu | ||||
| void BluetoothGATTReadResponse::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_uint64(1, this->address); | ||||
|   buffer.encode_uint32(2, this->handle); | ||||
|   buffer.encode_bytes(3, reinterpret_cast<const uint8_t *>(this->data.data()), this->data.size()); | ||||
|   buffer.encode_bytes(3, this->data_ptr_, this->data_len_); | ||||
| } | ||||
| void BluetoothGATTReadResponse::calculate_size(uint32_t &total_size) const { | ||||
|   ProtoSize::add_uint64_field(total_size, 1, this->address); | ||||
|   ProtoSize::add_uint32_field(total_size, 1, this->handle); | ||||
|   ProtoSize::add_string_field(total_size, 1, this->data); | ||||
|   ProtoSize::add_bytes_field(total_size, 1, this->data_len_); | ||||
| } | ||||
| bool BluetoothGATTWriteRequest::decode_varint(uint32_t field_id, ProtoVarInt value) { | ||||
|   switch (field_id) { | ||||
| @@ -2060,12 +2060,12 @@ bool BluetoothGATTNotifyRequest::decode_varint(uint32_t field_id, ProtoVarInt va | ||||
| void BluetoothGATTNotifyDataResponse::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_uint64(1, this->address); | ||||
|   buffer.encode_uint32(2, this->handle); | ||||
|   buffer.encode_bytes(3, reinterpret_cast<const uint8_t *>(this->data.data()), this->data.size()); | ||||
|   buffer.encode_bytes(3, this->data_ptr_, this->data_len_); | ||||
| } | ||||
| void BluetoothGATTNotifyDataResponse::calculate_size(uint32_t &total_size) const { | ||||
|   ProtoSize::add_uint64_field(total_size, 1, this->address); | ||||
|   ProtoSize::add_uint32_field(total_size, 1, this->handle); | ||||
|   ProtoSize::add_string_field(total_size, 1, this->data); | ||||
|   ProtoSize::add_bytes_field(total_size, 1, this->data_len_); | ||||
| } | ||||
| void BluetoothConnectionsFreeResponse::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_uint32(1, this->free); | ||||
| @@ -2264,11 +2264,11 @@ bool VoiceAssistantAudio::decode_length(uint32_t field_id, ProtoLengthDelimited | ||||
|   return true; | ||||
| } | ||||
| void VoiceAssistantAudio::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_bytes(1, reinterpret_cast<const uint8_t *>(this->data.data()), this->data.size()); | ||||
|   buffer.encode_bytes(1, this->data_ptr_, this->data_len_); | ||||
|   buffer.encode_bool(2, this->end); | ||||
| } | ||||
| void VoiceAssistantAudio::calculate_size(uint32_t &total_size) const { | ||||
|   ProtoSize::add_string_field(total_size, 1, this->data); | ||||
|   ProtoSize::add_bytes_field(total_size, 1, this->data_len_); | ||||
|   ProtoSize::add_bool_field(total_size, 1, this->end); | ||||
| } | ||||
| bool VoiceAssistantTimerEventResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { | ||||
|   | ||||
| @@ -991,7 +991,12 @@ class NoiseEncryptionSetKeyRequest : public ProtoDecodableMessage { | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   const char *message_name() const override { return "noise_encryption_set_key_request"; } | ||||
| #endif | ||||
|   std::string key{}; | ||||
|   const uint8_t *key_ptr_{nullptr}; | ||||
|   size_t key_len_{0}; | ||||
|   void set_key(const uint8_t *data, size_t len) { | ||||
|     this->key_ptr_ = data; | ||||
|     this->key_len_ = len; | ||||
|   } | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   void dump_to(std::string &out) const override; | ||||
| #endif | ||||
| @@ -1890,7 +1895,12 @@ class BluetoothGATTReadResponse : public ProtoMessage { | ||||
| #endif | ||||
|   uint64_t address{0}; | ||||
|   uint32_t handle{0}; | ||||
|   std::string data{}; | ||||
|   const uint8_t *data_ptr_{nullptr}; | ||||
|   size_t data_len_{0}; | ||||
|   void set_data(const uint8_t *data, size_t len) { | ||||
|     this->data_ptr_ = data; | ||||
|     this->data_len_ = len; | ||||
|   } | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -1909,7 +1919,12 @@ class BluetoothGATTWriteRequest : public ProtoDecodableMessage { | ||||
|   uint64_t address{0}; | ||||
|   uint32_t handle{0}; | ||||
|   bool response{false}; | ||||
|   std::string data{}; | ||||
|   const uint8_t *data_ptr_{nullptr}; | ||||
|   size_t data_len_{0}; | ||||
|   void set_data(const uint8_t *data, size_t len) { | ||||
|     this->data_ptr_ = data; | ||||
|     this->data_len_ = len; | ||||
|   } | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   void dump_to(std::string &out) const override; | ||||
| #endif | ||||
| @@ -1943,7 +1958,12 @@ class BluetoothGATTWriteDescriptorRequest : public ProtoDecodableMessage { | ||||
| #endif | ||||
|   uint64_t address{0}; | ||||
|   uint32_t handle{0}; | ||||
|   std::string data{}; | ||||
|   const uint8_t *data_ptr_{nullptr}; | ||||
|   size_t data_len_{0}; | ||||
|   void set_data(const uint8_t *data, size_t len) { | ||||
|     this->data_ptr_ = data; | ||||
|     this->data_len_ = len; | ||||
|   } | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   void dump_to(std::string &out) const override; | ||||
| #endif | ||||
| @@ -1978,7 +1998,12 @@ class BluetoothGATTNotifyDataResponse : public ProtoMessage { | ||||
| #endif | ||||
|   uint64_t address{0}; | ||||
|   uint32_t handle{0}; | ||||
|   std::string data{}; | ||||
|   const uint8_t *data_ptr_{nullptr}; | ||||
|   size_t data_len_{0}; | ||||
|   void set_data(const uint8_t *data, size_t len) { | ||||
|     this->data_ptr_ = data; | ||||
|     this->data_len_ = len; | ||||
|   } | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -2271,7 +2296,12 @@ class VoiceAssistantAudio : public ProtoDecodableMessage { | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   const char *message_name() const override { return "voice_assistant_audio"; } | ||||
| #endif | ||||
|   std::string data{}; | ||||
|   const uint8_t *data_ptr_{nullptr}; | ||||
|   size_t data_len_{0}; | ||||
|   void set_data(const uint8_t *data, size_t len) { | ||||
|     this->data_ptr_ = data; | ||||
|     this->data_len_ = len; | ||||
|   } | ||||
|   bool end{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
|   | ||||
| @@ -1679,7 +1679,7 @@ void NoiseEncryptionSetKeyRequest::dump_to(std::string &out) const { | ||||
|   __attribute__((unused)) char buffer[64]; | ||||
|   out.append("NoiseEncryptionSetKeyRequest {\n"); | ||||
|   out.append("  key: "); | ||||
|   out.append(format_hex_pretty(this->key)); | ||||
|   out.append(format_hex_pretty(this->key_ptr_, this->key_len_)); | ||||
|   out.append("\n"); | ||||
|   out.append("}"); | ||||
| } | ||||
| @@ -3141,7 +3141,7 @@ void BluetoothGATTReadResponse::dump_to(std::string &out) const { | ||||
|   out.append("\n"); | ||||
|  | ||||
|   out.append("  data: "); | ||||
|   out.append(format_hex_pretty(this->data)); | ||||
|   out.append(format_hex_pretty(this->data_ptr_, this->data_len_)); | ||||
|   out.append("\n"); | ||||
|   out.append("}"); | ||||
| } | ||||
| @@ -3163,7 +3163,7 @@ void BluetoothGATTWriteRequest::dump_to(std::string &out) const { | ||||
|   out.append("\n"); | ||||
|  | ||||
|   out.append("  data: "); | ||||
|   out.append(format_hex_pretty(this->data)); | ||||
|   out.append(format_hex_pretty(this->data_ptr_, this->data_len_)); | ||||
|   out.append("\n"); | ||||
|   out.append("}"); | ||||
| } | ||||
| @@ -3195,7 +3195,7 @@ void BluetoothGATTWriteDescriptorRequest::dump_to(std::string &out) const { | ||||
|   out.append("\n"); | ||||
|  | ||||
|   out.append("  data: "); | ||||
|   out.append(format_hex_pretty(this->data)); | ||||
|   out.append(format_hex_pretty(this->data_ptr_, this->data_len_)); | ||||
|   out.append("\n"); | ||||
|   out.append("}"); | ||||
| } | ||||
| @@ -3231,7 +3231,7 @@ void BluetoothGATTNotifyDataResponse::dump_to(std::string &out) const { | ||||
|   out.append("\n"); | ||||
|  | ||||
|   out.append("  data: "); | ||||
|   out.append(format_hex_pretty(this->data)); | ||||
|   out.append(format_hex_pretty(this->data_ptr_, this->data_len_)); | ||||
|   out.append("\n"); | ||||
|   out.append("}"); | ||||
| } | ||||
| @@ -3485,7 +3485,7 @@ void VoiceAssistantAudio::dump_to(std::string &out) const { | ||||
|   __attribute__((unused)) char buffer[64]; | ||||
|   out.append("VoiceAssistantAudio {\n"); | ||||
|   out.append("  data: "); | ||||
|   out.append(format_hex_pretty(this->data)); | ||||
|   out.append(format_hex_pretty(this->data_ptr_, this->data_len_)); | ||||
|   out.append("\n"); | ||||
|  | ||||
|   out.append("  end: "); | ||||
|   | ||||
| @@ -235,9 +235,7 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga | ||||
|       api::BluetoothGATTReadResponse resp; | ||||
|       resp.address = this->address_; | ||||
|       resp.handle = param->read.handle; | ||||
|       resp.data.reserve(param->read.value_len); | ||||
|       // Use bulk insert instead of individual push_backs | ||||
|       resp.data.insert(resp.data.end(), param->read.value, param->read.value + param->read.value_len); | ||||
|       resp.set_data(param->read.value, param->read.value_len); | ||||
|       this->proxy_->get_api_connection()->send_message(resp, api::BluetoothGATTReadResponse::MESSAGE_TYPE); | ||||
|       break; | ||||
|     } | ||||
| @@ -288,9 +286,7 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga | ||||
|       api::BluetoothGATTNotifyDataResponse resp; | ||||
|       resp.address = this->address_; | ||||
|       resp.handle = param->notify.handle; | ||||
|       resp.data.reserve(param->notify.value_len); | ||||
|       // Use bulk insert instead of individual push_backs | ||||
|       resp.data.insert(resp.data.end(), param->notify.value, param->notify.value + param->notify.value_len); | ||||
|       resp.set_data(param->notify.value, param->notify.value_len); | ||||
|       this->proxy_->get_api_connection()->send_message(resp, api::BluetoothGATTNotifyDataResponse::MESSAGE_TYPE); | ||||
|       break; | ||||
|     } | ||||
| @@ -337,7 +333,8 @@ esp_err_t BluetoothConnection::read_characteristic(uint16_t handle) { | ||||
|   return ESP_OK; | ||||
| } | ||||
|  | ||||
| esp_err_t BluetoothConnection::write_characteristic(uint16_t handle, const std::string &data, bool response) { | ||||
| esp_err_t BluetoothConnection::write_characteristic(uint16_t handle, const uint8_t *data, size_t data_len, | ||||
|                                                     bool response) { | ||||
|   if (!this->connected()) { | ||||
|     ESP_LOGW(TAG, "[%d] [%s] Cannot write GATT characteristic, not connected.", this->connection_index_, | ||||
|              this->address_str_.c_str()); | ||||
| @@ -347,7 +344,7 @@ esp_err_t BluetoothConnection::write_characteristic(uint16_t handle, const std:: | ||||
|            handle); | ||||
|  | ||||
|   esp_err_t err = | ||||
|       esp_ble_gattc_write_char(this->gattc_if_, this->conn_id_, handle, data.size(), (uint8_t *) data.data(), | ||||
|       esp_ble_gattc_write_char(this->gattc_if_, this->conn_id_, handle, data_len, const_cast<uint8_t *>(data), | ||||
|                                response ? ESP_GATT_WRITE_TYPE_RSP : ESP_GATT_WRITE_TYPE_NO_RSP, ESP_GATT_AUTH_REQ_NONE); | ||||
|   if (err != ERR_OK) { | ||||
|     ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_write_char error, err=%d", this->connection_index_, | ||||
| @@ -375,7 +372,7 @@ esp_err_t BluetoothConnection::read_descriptor(uint16_t handle) { | ||||
|   return ESP_OK; | ||||
| } | ||||
|  | ||||
| esp_err_t BluetoothConnection::write_descriptor(uint16_t handle, const std::string &data, bool response) { | ||||
| esp_err_t BluetoothConnection::write_descriptor(uint16_t handle, const uint8_t *data, size_t data_len, bool response) { | ||||
|   if (!this->connected()) { | ||||
|     ESP_LOGW(TAG, "[%d] [%s] Cannot write GATT descriptor, not connected.", this->connection_index_, | ||||
|              this->address_str_.c_str()); | ||||
| @@ -385,7 +382,7 @@ esp_err_t BluetoothConnection::write_descriptor(uint16_t handle, const std::stri | ||||
|            handle); | ||||
|  | ||||
|   esp_err_t err = esp_ble_gattc_write_char_descr( | ||||
|       this->gattc_if_, this->conn_id_, handle, data.size(), (uint8_t *) data.data(), | ||||
|       this->gattc_if_, this->conn_id_, handle, data_len, const_cast<uint8_t *>(data), | ||||
|       response ? ESP_GATT_WRITE_TYPE_RSP : ESP_GATT_WRITE_TYPE_NO_RSP, ESP_GATT_AUTH_REQ_NONE); | ||||
|   if (err != ERR_OK) { | ||||
|     ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_write_char_descr error, err=%d", this->connection_index_, | ||||
|   | ||||
| @@ -19,9 +19,9 @@ class BluetoothConnection : public esp32_ble_client::BLEClientBase { | ||||
|   esp32_ble_tracker::AdvertisementParserType get_advertisement_parser_type() override; | ||||
|  | ||||
|   esp_err_t read_characteristic(uint16_t handle); | ||||
|   esp_err_t write_characteristic(uint16_t handle, const std::string &data, bool response); | ||||
|   esp_err_t write_characteristic(uint16_t handle, const uint8_t *data, size_t data_len, bool response); | ||||
|   esp_err_t read_descriptor(uint16_t handle); | ||||
|   esp_err_t write_descriptor(uint16_t handle, const std::string &data, bool response); | ||||
|   esp_err_t write_descriptor(uint16_t handle, const uint8_t *data, size_t data_len, bool response); | ||||
|  | ||||
|   esp_err_t notify_characteristic(uint16_t handle, bool enable); | ||||
|  | ||||
|   | ||||
| @@ -344,7 +344,7 @@ void BluetoothProxy::bluetooth_gatt_write(const api::BluetoothGATTWriteRequest & | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   auto err = connection->write_characteristic(msg.handle, msg.data, msg.response); | ||||
|   auto err = connection->write_characteristic(msg.handle, msg.data_ptr_, msg.data_len_, msg.response); | ||||
|   if (err != ESP_OK) { | ||||
|     this->send_gatt_error(msg.address, msg.handle, err); | ||||
|   } | ||||
| @@ -372,7 +372,7 @@ void BluetoothProxy::bluetooth_gatt_write_descriptor(const api::BluetoothGATTWri | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   auto err = connection->write_descriptor(msg.handle, msg.data, true); | ||||
|   auto err = connection->write_descriptor(msg.handle, msg.data_ptr_, msg.data_len_, true); | ||||
|   if (err != ESP_OK) { | ||||
|     this->send_gatt_error(msg.address, msg.handle, err); | ||||
|   } | ||||
|   | ||||
| @@ -273,7 +273,7 @@ void VoiceAssistant::loop() { | ||||
|         size_t read_bytes = this->ring_buffer_->read((void *) this->send_buffer_, SEND_BUFFER_SIZE, 0); | ||||
|         if (this->audio_mode_ == AUDIO_MODE_API) { | ||||
|           api::VoiceAssistantAudio msg; | ||||
|           msg.data.assign((char *) this->send_buffer_, read_bytes); | ||||
|           msg.set_data(this->send_buffer_, read_bytes); | ||||
|           this->api_client_->send_message(msg, api::VoiceAssistantAudio::MESSAGE_TYPE); | ||||
|         } else { | ||||
|           if (!this->udp_socket_running_) { | ||||
| @@ -839,12 +839,12 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) { | ||||
| void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) { | ||||
| #ifdef USE_SPEAKER  // We should never get to this function if there is no speaker anyway | ||||
|   if ((this->speaker_ != nullptr) && (this->speaker_buffer_ != nullptr)) { | ||||
|     if (this->speaker_buffer_index_ + msg.data.length() < SPEAKER_BUFFER_SIZE) { | ||||
|       memcpy(this->speaker_buffer_ + this->speaker_buffer_index_, msg.data.data(), msg.data.length()); | ||||
|       this->speaker_buffer_index_ += msg.data.length(); | ||||
|       this->speaker_buffer_size_ += msg.data.length(); | ||||
|       this->speaker_bytes_received_ += msg.data.length(); | ||||
|       ESP_LOGV(TAG, "Received audio: %u bytes from API", msg.data.length()); | ||||
|     if (this->speaker_buffer_index_ + msg.data_len_ < SPEAKER_BUFFER_SIZE) { | ||||
|       memcpy(this->speaker_buffer_ + this->speaker_buffer_index_, msg.data_ptr_, msg.data_len_); | ||||
|       this->speaker_buffer_index_ += msg.data_len_; | ||||
|       this->speaker_buffer_size_ += msg.data_len_; | ||||
|       this->speaker_bytes_received_ += msg.data_len_; | ||||
|       ESP_LOGV(TAG, "Received audio: %u bytes from API", msg.data_len_); | ||||
|     } else { | ||||
|       ESP_LOGE(TAG, "Cannot receive audio, buffer is full"); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user