ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
panasonic_protocol.cpp
Go to the documentation of this file.
2#include "esphome/core/log.h"
3
4namespace esphome::remote_base {
5
6ESPHOME_LOG_TAG(TAG, "remote.panasonic");
7
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;
13
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;
19
20static void encode_bits(RemoteTransmitData *dst, uint32_t value, uint8_t nbits) {
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);
23 }
24}
25
26static bool decode_bits(RemoteReceiveData &src, uint32_t &value, uint8_t nbits) {
27 value = 0;
28 for (uint32_t mask = 1UL << (nbits - 1); mask != 0; mask >>= 1) {
29 if (src.expect_item(BIT_HIGH_US, BIT_ONE_LOW_US)) {
30 value |= mask;
31 } else if (!src.expect_item(BIT_HIGH_US, BIT_ZERO_LOW_US)) {
32 return false;
33 }
34 }
35 return true;
36}
37
39 if (data.nbits != NBITS_SHORT && data.nbits != NBITS_LONG) {
40 ESP_LOGW(TAG, "Unsupported nbits %u, expected 48 or 56", data.nbits);
41 return;
42 }
43 // Header, one item per bit, trailing mark
44 dst->reserve(3 + 2 * data.nbits);
45 dst->set_carrier_frequency(data.carrier_frequency);
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);
50 }
51 encode_bits(dst, data.command, NBITS_COMMAND);
52 dst->mark(BIT_HIGH_US);
53}
54
56 if (!src.expect_item(HEADER_HIGH_US, HEADER_LOW_US))
57 return {};
58
60 uint32_t word;
61 if (!decode_bits(src, address, NBITS_ADDRESS) || !decode_bits(src, word, NBITS_COMMAND))
62 return {};
63
65 out.address = address;
66 uint32_t tail;
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;
71 } else {
72 out.command = word;
73 }
74 return out;
75}
76
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);
80}
81
82} // namespace esphome::remote_base
uint8_t address
Definition bl0906.h:4
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)
Definition remote_base.h:64
void item(uint32_t mark, uint32_t space)
Definition remote_base.h:43
std::vector< uint8_t > & out
Definition gif.cpp:49
ESPHOME_LOG_TAG(TAG, "remote.abbwelcome")
const void * src
Definition hal.h:68
static void uint32_t