1
0
mirror of https://github.com/esphome/esphome.git synced 2026-02-08 00:31:58 +00:00

[remote_base] Add zero-copy packed sint32 decoder for #12985 (#13093)

This commit is contained in:
Keith Burzinski
2026-01-09 04:06:03 -06:00
committed by GitHub
parent 62cb08c3dc
commit c40f44f4bd
2 changed files with 38 additions and 0 deletions

View File

@@ -128,6 +128,39 @@ void RemoteReceiverBase::call_dumpers_() {
void RemoteReceiverBinarySensorBase::dump_config() { LOG_BINARY_SENSOR("", "Remote Receiver Binary Sensor", this); }
/* RemoteTransmitData */
void RemoteTransmitData::set_data_from_packed_sint32(const uint8_t *data, size_t len, size_t count) {
this->data_.clear();
this->data_.reserve(count);
while (len > 0) {
// Parse varint (inline, no dependency on api component)
uint32_t raw = 0;
uint32_t shift = 0;
uint32_t consumed = 0;
for (; consumed < len && consumed < 5; consumed++) {
uint8_t byte = data[consumed];
raw |= (byte & 0x7F) << shift;
if ((byte & 0x80) == 0) {
consumed++;
break;
}
shift += 7;
}
if (consumed == 0)
break; // Parse error
// Zigzag decode: (n >> 1) ^ -(n & 1)
int32_t decoded = static_cast<int32_t>((raw >> 1) ^ (~(raw & 1) + 1));
this->data_.push_back(decoded);
data += consumed;
len -= consumed;
}
}
/* RemoteTransmitterBase */
void RemoteTransmitterBase::send_(uint32_t send_times, uint32_t send_wait) {
#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
const auto &vec = this->temp_.get_data();

View File

@@ -31,6 +31,11 @@ class RemoteTransmitData {
uint32_t get_carrier_frequency() const { return this->carrier_frequency_; }
const RawTimings &get_data() const { return this->data_; }
void set_data(const RawTimings &data) { this->data_ = data; }
/// Set data from packed protobuf sint32 buffer (zigzag + varint encoded)
/// @param data Pointer to packed zigzag-varint-encoded sint32 values
/// @param len Length of the buffer in bytes
/// @param count Number of values (for reserve optimization)
void set_data_from_packed_sint32(const uint8_t *data, size_t len, size_t count);
void reset() {
this->data_.clear();
this->carrier_frequency_ = 0;