8static constexpr uint32_t HEADER_HIGH_US = 3502;
9static constexpr uint32_t HEADER_LOW_US = 1750;
10static constexpr uint32_t BIT_HIGH_US = 502;
11static constexpr uint32_t BIT_ZERO_LOW_US = 400;
12static constexpr uint32_t BIT_ONE_LOW_US = 1244;
14static constexpr uint8_t NBITS_ADDRESS = 16;
15static constexpr uint8_t NBITS_ADDRESS_2 = 8;
16static constexpr uint8_t NBITS_COMMAND = 32;
17static constexpr uint8_t NBITS_SHORT = NBITS_ADDRESS + NBITS_COMMAND;
18static constexpr uint8_t NBITS_LONG = NBITS_SHORT + NBITS_ADDRESS_2;
21 for (
uint32_t mask = 1UL << (nbits - 1); mask != 0; mask >>= 1) {
22 dst->
item(BIT_HIGH_US, (value & mask) ? BIT_ONE_LOW_US : BIT_ZERO_LOW_US);
26static bool decode_bits(RemoteReceiveData &
src,
uint32_t &value, uint8_t nbits) {
28 for (
uint32_t mask = 1UL << (nbits - 1); mask != 0; mask >>= 1) {
29 if (
src.expect_item(BIT_HIGH_US, BIT_ONE_LOW_US)) {
31 }
else if (!
src.expect_item(BIT_HIGH_US, BIT_ZERO_LOW_US)) {
39 if (data.nbits != NBITS_SHORT && data.nbits != NBITS_LONG) {
40 ESP_LOGW(TAG,
"Unsupported nbits %u, expected 48 or 56", data.nbits);
44 dst->
reserve(3 + 2 * data.nbits);
46 dst->
item(HEADER_HIGH_US, HEADER_LOW_US);
47 encode_bits(dst, data.address, NBITS_ADDRESS);
48 if (data.nbits == NBITS_LONG) {
49 encode_bits(dst, data.address_2, NBITS_ADDRESS_2);
51 encode_bits(dst, data.command, NBITS_COMMAND);
52 dst->
mark(BIT_HIGH_US);
56 if (!
src.expect_item(HEADER_HIGH_US, HEADER_LOW_US))
61 if (!decode_bits(
src,
address, NBITS_ADDRESS) || !decode_bits(
src, word, NBITS_COMMAND))
67 if (decode_bits(
src, tail, NBITS_ADDRESS_2)) {
68 out.nbits = NBITS_LONG;
69 out.address_2 = word >> 24;
70 out.command = (word << 8) | tail;
78 ESP_LOGI(TAG,
"Received Panasonic: nbits=%u, address=0x%04X, address_2=0x%02X, command=0x%08" PRIX32, data.nbits,
79 data.address, data.address_2, data.command);
optional< PanasonicData > decode(RemoteReceiveData src)
void encode(RemoteTransmitData *dst, const PanasonicData &data)
void dump(const PanasonicData &data)
void set_carrier_frequency(uint32_t carrier_frequency)
void mark(uint32_t length)
void item(uint32_t mark, uint32_t space)
void reserve(uint32_t len)
std::vector< uint8_t > & out
ESPHOME_LOG_TAG(TAG, "remote.abbwelcome")