From 25a0e5bf7fefcc9ebadf297d3299d36180b69a2d Mon Sep 17 00:00:00 2001 From: arendst Date: Sun, 3 Dec 2017 15:00:31 +0100 Subject: [PATCH] Fix Sonoff Bridge learned key recognition * Fix Sonoff Bridge missed learned key if learned data contains 0x55 (End of Transmission) flag (#1095, #1294) --- sonoff/_releasenotes.ino | 1 + sonoff/xdrv_snfbridge.ino | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 114d40cf4..348368dd6 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -3,6 +3,7 @@ * Add (experimental) support for iTead SI7021 temperature and humidity sensor (#735) * Change ADS1115 default voltage range from +/-2V to +/-6V (#1289) * Add multipress support and more user configurable options to Sonoff Dual R2 (#1291) + * Fix missed learned key if learned data contains 0x55 (End of Transmission) flag (#1095, #1294) * * 5.10.0 20171201 * Upgrade library ArduinoJson to 5.11.2 diff --git a/sonoff/xdrv_snfbridge.ino b/sonoff/xdrv_snfbridge.ino index 79ebb2a29..d475860dd 100644 --- a/sonoff/xdrv_snfbridge.ino +++ b/sonoff/xdrv_snfbridge.ino @@ -31,6 +31,7 @@ const char kSonoffBridgeCommands[] PROGMEM = uint8_t sonoff_bridge_receive_flag = 0; uint8_t sonoff_bridge_learn_key = 1; uint8_t sonoff_bridge_learn_active = 0; +uint8_t sonoff_bridge_expected_bytes = 0; uint32_t sonoff_bridge_last_received_id = 0; uint32_t sonoff_bridge_last_send_code = 0; unsigned long sonoff_bridge_last_time = 0; @@ -64,7 +65,7 @@ void SonoffBridgeReceived() } else if (0xA3 == serial_in_buffer[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55 sonoff_bridge_learn_active = 0; - low_time = serial_in_buffer[3] << 8 | serial_in_buffer[4]; // Low time in uSec + low_time = serial_in_buffer[3] << 8 | serial_in_buffer[4]; // Low time in uSec high_time = serial_in_buffer[5] << 8 | serial_in_buffer[6]; // High time in uSec if (low_time && high_time) { for (byte i = 0; i < 9; i++) { @@ -81,7 +82,7 @@ void SonoffBridgeReceived() SonoffBridgeLearnFailed(); } else { sync_time = serial_in_buffer[1] << 8 | serial_in_buffer[2]; // Sync time in uSec - low_time = serial_in_buffer[3] << 8 | serial_in_buffer[4]; // Low time in uSec + low_time = serial_in_buffer[3] << 8 | serial_in_buffer[4]; // Low time in uSec high_time = serial_in_buffer[5] << 8 | serial_in_buffer[6]; // High time in uSec received_id = serial_in_buffer[7] << 16 | serial_in_buffer[8] << 8 | serial_in_buffer[9]; @@ -112,10 +113,17 @@ void SonoffBridgeReceived() boolean SonoffBridgeSerialInput() { + // iTead Rf Universal Transceiver Module Serial Protocol Version 1.0 (20170420) if (sonoff_bridge_receive_flag) { if (!((serial_in_byte_counter == 0) && (serial_in_byte == 0))) { // Skip leading 0 + if (!serial_in_byte_counter) { + sonoff_bridge_expected_bytes = 2; // 0xA0, 0xA1, 0xA2 + if (serial_in_byte >= 0xA3) { + sonoff_bridge_expected_bytes = 11; // 0xA3, 0xA4, 0xA5 + } + } serial_in_buffer[serial_in_byte_counter++] = serial_in_byte; - if (0x55 == serial_in_byte) { // 0x55 - End of text + if ((sonoff_bridge_expected_bytes == serial_in_byte_counter) && (0x55 == serial_in_byte)) { // 0x55 - End of text SonoffBridgeReceived(); sonoff_bridge_receive_flag = 0; return 1; @@ -123,7 +131,7 @@ boolean SonoffBridgeSerialInput() } serial_in_byte = 0; } - if (0xAA == serial_in_byte) { // 0xAA - Start of text + if (0xAA == serial_in_byte) { // 0xAA - Start of text serial_in_byte_counter = 0; serial_in_byte = 0; sonoff_bridge_receive_flag = 1;