13 if (index >= std::size(RC_SWITCH_PROTOCOLS))
54 for (int16_t i =
len - 1; i >= 0; i--) {
55 if (code & ((uint64_t) 1 << i)) {
67 if (!
src.peek_space(this->one_low_, 1))
70 if (!
src.peek_space(this->one_high_))
72 if (!
src.peek_mark(this->one_low_, 1))
82 if (!
src.peek_space(this->zero_low_, 1))
85 if (!
src.peek_space(this->zero_high_))
87 if (!
src.peek_mark(this->zero_low_, 1))
97 if (!
src.peek_space(this->sync_low_, 1))
103 if (!
src.peek_mark(this->sync_low_))
116 for (*out_nbits = 0; *out_nbits < 64; *out_nbits += 1) {
124 return *out_nbits >= 8;
132 for (
size_t i = 1; i < std::size(RC_SWITCH_PROTOCOLS); i++) {
135 if (protocol->
decode(
src, &
out.code, &out_nbits) && out_nbits >= 3) {
136 out.protocol =
static_cast<uint8_t
>(i);
145 for (int8_t i = nbits - 1; i >= 0; i--) {
147 if (code & (1 << i)) {
155 uint8_t *out_nbits) {
157 code = switch_group ^ 0b11111;
159 code |= switch_device ^ 0b11111;
161 code |=
state ? 0b01 : 0b10;
166 uint8_t *out_nbits) {
168 code |= (address_code == 1) ? 0 : 0b1000;
169 code |= (address_code == 2) ? 0 : 0b0100;
170 code |= (address_code == 3) ? 0 : 0b0010;
171 code |= (address_code == 4) ? 0 : 0b0001;
173 code |= (channel_code == 1) ? 0 : 0b1000;
174 code |= (channel_code == 2) ? 0 : 0b0100;
175 code |= (channel_code == 3) ? 0 : 0b0010;
176 code |= (channel_code == 4) ? 0 : 0b0001;
179 code |=
state ? 0b1 : 0b0;
184 uint8_t *out_nbits) {
186 code |= (family & 0b0001) ? 0b1000 : 0;
187 code |= (family & 0b0010) ? 0b0100 : 0;
188 code |= (family & 0b0100) ? 0b0010 : 0;
189 code |= (family & 0b1000) ? 0b0001 : 0;
191 code |= ((device - 1) & 0b01) ? 0b1000 : 0;
192 code |= ((device - 1) & 0b10) ? 0b0100 : 0;
193 code |= ((group - 1) & 0b01) ? 0b0010 : 0;
194 code |= ((group - 1) & 0b10) ? 0b0001 : 0;
197 code |=
state ? 0b1 : 0b0;
203 *out_code |= (group == 0) ? 0b11000000 : 0b01000000;
204 *out_code |= (group == 1) ? 0b00110000 : 0b00010000;
205 *out_code |= (group == 2) ? 0b00001100 : 0b00000100;
206 *out_code |= (group == 3) ? 0b00000011 : 0b00000001;
208 *out_code |= (device == 1) ? 0b110000 : 0b010000;
209 *out_code |= (device == 2) ? 0b001100 : 0b000100;
210 *out_code |= (device == 3) ? 0b000011 : 0b000001;
212 *out_code |= 0b000000;
214 *out_code |=
state ? 0b1100 : 0b0011;
220 for (
char c : data) {
229 for (
char c : data) {
237 uint64_t decoded_code;
238 uint8_t decoded_nbits;
245 for (
size_t i = 1; i < std::size(RC_SWITCH_PROTOCOLS); i++) {
250 if (protocol->
decode(
src, &out_data, &out_nbits) && out_nbits >= 3) {
252 for (uint8_t j = 0; j < out_nbits; j++)
253 buffer[j] = (out_data & ((uint64_t) 1 << (out_nbits - j - 1))) ?
'1' :
'0';
256 ESP_LOGI(TAG,
"Received RCSwitch Raw: protocol=%u data='%s'",
static_cast<unsigned>(i),
buffer);
void zero(RemoteTransmitData *dst) const
static void type_b_code(uint8_t address_code, uint8_t channel_code, bool state, uint64_t *out_code, uint8_t *out_nbits)
bool expect_one(RemoteReceiveData &src) const
bool expect_zero(RemoteReceiveData &src) const
bool decode(RemoteReceiveData &src, uint64_t *out_data, uint8_t *out_nbits) const
static void type_c_code(uint8_t family, uint8_t group, uint8_t device, bool state, uint64_t *out_code, uint8_t *out_nbits)
void transmit(RemoteTransmitData *dst, uint64_t code, uint8_t len) const
static void type_a_code(uint8_t switch_group, uint8_t switch_device, bool state, uint64_t *out_code, uint8_t *out_nbits)
void one(RemoteTransmitData *dst) const
void sync(RemoteTransmitData *dst) const
bool expect_sync(RemoteReceiveData &src) const
static void type_d_code(uint8_t group, uint8_t device, bool state, uint64_t *out_code, uint8_t *out_nbits)
static void simple_code_to_tristate(uint16_t code, uint8_t nbits, uint64_t *out_code)
bool dump(RemoteReceiveData src) override
bool matches(RemoteReceiveData src) override
const RCSwitchBase * protocol_
bool peek_mark(uint32_t length, uint32_t offset=0) const
void space(uint32_t length)
void set_carrier_frequency(uint32_t carrier_frequency)
void mark(uint32_t length)
std::vector< uint8_t > & out
uint64_t decode_binary_string_mask(const std::string &data)
RCSwitchBase rc_switch_protocol_copy(const RCSwitchBase *protocol)
RAM copy of a protocol stored in flash, made with progmem_memcpy (own name: rc_switch_protocol(0) sta...
ESPHOME_LOG_TAG(TAG, "remote.abbwelcome")
uint64_t decode_binary_string(const std::string &data)
RCSwitchBase rc_switch_protocol(uint8_t index)
RAM copy of RC_SWITCH_PROTOCOLS[index] (0 when out of range) for the transmit actions and the dumper,...
void progmem_memcpy(void *dst, const void *src, size_t len)