mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Fix decode and encode for RC5-protocol (#1047)
* Fix receive and transmit for RC5-protocol Receive did not work as a sequence of two high or low puleses are detected as one long pulse. Transmit was extended to respect the field bit in order to enable codes up to 127. * Fix code formatting
This commit is contained in:
		| @@ -420,7 +420,7 @@ def raw_action(var, config, args): | ||||
| RC5Data, RC5BinarySensor, RC5Trigger, RC5Action, RC5Dumper = declare_protocol('RC5') | ||||
| RC5_SCHEMA = cv.Schema({ | ||||
|     cv.Required(CONF_ADDRESS): cv.All(cv.hex_int, cv.Range(min=0, max=0x1F)), | ||||
|     cv.Required(CONF_COMMAND): cv.All(cv.hex_int, cv.Range(min=0, max=0x3F)), | ||||
|     cv.Required(CONF_COMMAND): cv.All(cv.hex_int, cv.Range(min=0, max=0x7F)), | ||||
| }) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -14,10 +14,16 @@ void RC5Protocol::encode(RemoteTransmitData *dst, const RC5Data &data) { | ||||
|   dst->set_carrier_frequency(36000); | ||||
|  | ||||
|   uint64_t out_data = 0; | ||||
|   uint8_t command = data.command; | ||||
|   if (data.command >= 64) { | ||||
|     out_data |= 0b10 << 12; | ||||
|     command = command - 64; | ||||
|   } else { | ||||
|     out_data |= 0b11 << 12; | ||||
|   } | ||||
|   out_data |= TOGGLE << 11; | ||||
|   out_data |= data.address << 6; | ||||
|   out_data |= data.command; | ||||
|   out_data |= command; | ||||
|  | ||||
|   for (uint64_t mask = 1UL << (NBITS - 1); mask != 0; mask >>= 1) { | ||||
|     if (out_data & mask) { | ||||
| @@ -35,22 +41,44 @@ optional<RC5Data> RC5Protocol::decode(RemoteReceiveData src) { | ||||
|       .address = 0, | ||||
|       .command = 0, | ||||
|   }; | ||||
|   src.expect_space(BIT_TIME_US); | ||||
|   if (!src.expect_mark(BIT_TIME_US) || !src.expect_space(BIT_TIME_US) || !src.expect_mark(BIT_TIME_US)) | ||||
|   int field_bit = 0; | ||||
|  | ||||
|   if (src.expect_space(BIT_TIME_US) && src.expect_mark(BIT_TIME_US)) { | ||||
|     field_bit = 1; | ||||
|   } else if (src.expect_space(2 * BIT_TIME_US)) { | ||||
|     field_bit = 0; | ||||
|   } else { | ||||
|     return {}; | ||||
|   } | ||||
|  | ||||
|   if (!(((src.expect_space(BIT_TIME_US) || src.peek_space(2 * BIT_TIME_US)) || | ||||
|          (src.expect_mark(BIT_TIME_US) || src.peek_mark(2 * BIT_TIME_US))) && | ||||
|         (((src.expect_mark(BIT_TIME_US) || src.expect_mark(2 * BIT_TIME_US)) && | ||||
|           (src.expect_space(BIT_TIME_US) || src.peek_space(2 * BIT_TIME_US))) || | ||||
|          ((src.expect_space(BIT_TIME_US) || src.expect_space(2 * BIT_TIME_US)) && | ||||
|           (src.expect_mark(BIT_TIME_US) || src.peek_mark(2 * BIT_TIME_US)))))) { | ||||
|     return {}; | ||||
|   } | ||||
|  | ||||
|   uint64_t out_data = 0; | ||||
|   for (int bit = NBITS - 3; bit >= 0; bit--) { | ||||
|     if (src.expect_space(BIT_TIME_US) && src.expect_mark(BIT_TIME_US)) { | ||||
|       out_data |= 1 << bit; | ||||
|     } else if (src.expect_mark(BIT_TIME_US) && src.expect_space(BIT_TIME_US)) { | ||||
|   for (int bit = NBITS - 4; bit >= 1; bit--) { | ||||
|     if ((src.expect_space(BIT_TIME_US) || src.expect_space(2 * BIT_TIME_US)) && | ||||
|         (src.expect_mark(BIT_TIME_US) || src.peek_mark(2 * BIT_TIME_US))) { | ||||
|       out_data |= 0 << bit; | ||||
|     } else if ((src.expect_mark(BIT_TIME_US) || src.expect_mark(2 * BIT_TIME_US)) && | ||||
|                (src.expect_space(BIT_TIME_US) || src.peek_space(2 * BIT_TIME_US))) { | ||||
|       out_data |= 1 << bit; | ||||
|     } else { | ||||
|       return {}; | ||||
|     } | ||||
|   } | ||||
|   if (src.expect_space(BIT_TIME_US) || src.expect_space(2 * BIT_TIME_US)) { | ||||
|     out_data |= 0; | ||||
|   } else if (src.expect_mark(BIT_TIME_US) || src.expect_mark(2 * BIT_TIME_US)) { | ||||
|     out_data |= 1; | ||||
|   } | ||||
|  | ||||
|   out.command = out_data & 0x3F; | ||||
|   out.command = (out_data & 0x3F) + (1 - field_bit) * 64; | ||||
|   out.address = (out_data >> 6) & 0x1F; | ||||
|   return out; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user