ESPHome 2026.5.0b1
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
6static const char *const 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
15 dst->reserve(100);
16 dst->item(HEADER_HIGH_US, HEADER_LOW_US);
17 dst->set_carrier_frequency(35000);
18
19 uint32_t mask;
20 for (mask = 1UL << 15; mask != 0; mask >>= 1) {
21 if (data.address & mask) {
22 dst->item(BIT_HIGH_US, BIT_ONE_LOW_US);
23 } else {
24 dst->item(BIT_HIGH_US, BIT_ZERO_LOW_US);
25 }
26 }
27
28 for (mask = 1UL << 31; mask != 0; mask >>= 1) {
29 if (data.command & mask) {
30 dst->item(BIT_HIGH_US, BIT_ONE_LOW_US);
31 } else {
32 dst->item(BIT_HIGH_US, BIT_ZERO_LOW_US);
33 }
34 }
35 dst->mark(BIT_HIGH_US);
36}
37optional<PanasonicData> PanasonicProtocol::decode(RemoteReceiveData src) {
38 PanasonicData out{
39 .address = 0,
40 .command = 0,
41 };
42 if (!src.expect_item(HEADER_HIGH_US, HEADER_LOW_US))
43 return {};
44
45 uint32_t mask;
46 for (mask = 1UL << 15; mask != 0; mask >>= 1) {
47 if (src.expect_item(BIT_HIGH_US, BIT_ONE_LOW_US)) {
48 out.address |= mask;
49 } else if (src.expect_item(BIT_HIGH_US, BIT_ZERO_LOW_US)) {
50 out.address &= ~mask;
51 } else {
52 return {};
53 }
54 }
55
56 for (mask = 1UL << 31; mask != 0; mask >>= 1) {
57 if (src.expect_item(BIT_HIGH_US, BIT_ONE_LOW_US)) {
58 out.command |= mask;
59 } else if (src.expect_item(BIT_HIGH_US, BIT_ZERO_LOW_US)) {
60 out.command &= ~mask;
61 } else {
62 return {};
63 }
64 }
65
66 return out;
67}
69 ESP_LOGI(TAG, "Received Panasonic: address=0x%04X, command=0x%08" PRIX32, data.address, data.command);
70}
71
72} // namespace esphome::remote_base
void dump(const PanasonicData &data) override
void encode(RemoteTransmitData *dst, const PanasonicData &data) override
optional< PanasonicData > decode(RemoteReceiveData src) override
bool expect_item(uint32_t mark, uint32_t space)
void set_carrier_frequency(uint32_t carrier_frequency)
Definition remote_base.h:29
void item(uint32_t mark, uint32_t space)
Definition remote_base.h:24
static void uint32_t