From f1894a2b477d0468dc70fd5b8337f16d30efd90f Mon Sep 17 00:00:00 2001 From: kislovdm Date: Mon, 21 Jul 2025 23:02:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coffee-philips-5400.yaml | 12 +-- components/saeco_series_6000/crc_test.cpp | 70 ----------------- components/saeco_series_6000/platformio.ini | 1 - .../saeco_series_6000/saeco_series_6000.cpp | 75 ++++++++++++------- .../saeco_series_6000/saeco_series_6000.h | 3 + 5 files changed, 57 insertions(+), 104 deletions(-) delete mode 100644 components/saeco_series_6000/crc_test.cpp delete mode 100644 components/saeco_series_6000/platformio.ini diff --git a/coffee-philips-5400.yaml b/coffee-philips-5400.yaml index cab9587..a5bda73 100644 --- a/coffee-philips-5400.yaml +++ b/coffee-philips-5400.yaml @@ -175,14 +175,16 @@ text_sensor: button: - platform: template - name: "Отправить три пакета" + name: "Отправить три пакета строками" on_press: then: - lambda: |- - std::vector> pkts = { - {0xAA,0xAA,0xAA,0x90,0x0B,0x0A,0x05,0x03,0x00,0x02,0x00,0x00,0x64,0x00,0x00,0x00,0x39,0xBF,0x5B,0x74,0x55}, - }; - id(saeco_series_6000_component)->send_packets_to_mainboard(pkts, 50); + id(saeco_series_6000_component)->send_packets_to_mainboard( + std::vector{ + "AA AA AA 93 0B 01 01 60 7F F8 EC 55", + "AA AA AA 90 17 0A 05 03 00 02 00 00 64 00 00 00 44 1F 49 7D 55", + "AA AA AA 91 0D 01 03 75 AA 72 AC 55" + }, 50); #[20:45:34][I][saeco_series_6000:079]: Packet from Display: AA AA AA 93 0A 01 01 57 15 3A ED 55 #[20:45:34][I][saeco_series_6000:079]: Packet from Display: AA AA AA 90 0B 0A 05 03 00 02 00 00 64 00 00 00 39 BF 5B 74 55 diff --git a/components/saeco_series_6000/crc_test.cpp b/components/saeco_series_6000/crc_test.cpp deleted file mode 100644 index 1231524..0000000 --- a/components/saeco_series_6000/crc_test.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include -#include -#include - -static const uint8_t BitReverse[256] = { - 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0, - 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8, - 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4, - 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC, - 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2, - 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA, - 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6, - 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE, - 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1, - 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9, - 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5, - 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD, - 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3, - 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB, - 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7, - 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF -}; - -uint32_t calc_crc(const std::vector& data, size_t start, size_t end) { - uint32_t crc = 0xFFFFFFFF; - const uint32_t POLY = 0x04C11DB7; - if (start >= end) return 0; - uint8_t val = data[start]; - ((uint8_t*)(&crc))[3] ^= BitReverse[val]; - for (uint8_t j = 0; j < 8; j++) { - if (crc & 0x80000000) { - crc = (crc << 1) ^ POLY; - } else { - crc <<= 1; - } - } - for (size_t i = start + 1; i < end; i++) { - uint8_t v = data[i]; - ((uint8_t*)(&crc))[3] ^= BitReverse[v]; - for (uint8_t j = 0; j < 8; j++) { - if (crc & 0x80000000) { - crc = (crc << 1) ^ POLY; - } else { - crc <<= 1; - } - } - } - uint32_t t32 = 0; - ((uint8_t*)(&t32))[0] = BitReverse[((uint8_t*)(&crc))[3]]; - ((uint8_t*)(&t32))[1] = BitReverse[((uint8_t*)(&crc))[2]]; - ((uint8_t*)(&t32))[2] = BitReverse[((uint8_t*)(&crc))[1]]; - ((uint8_t*)(&t32))[3] = BitReverse[((uint8_t*)(&crc))[0]]; - crc = t32 ^ 0xFFFFFFFF; - return crc; -} - -int main() { - // Пример команды (без CRC и 0x55): - std::vector pkt = { - 0xAA,0xAA,0xAA,0x90,0x0B,0x0A,0x05,0x03,0x00,0x02,0x00,0x00,0x64,0x00,0x00,0x00,0x39,0xBF,0x5B,0x74,0x55 - }; - size_t preamble = 3; - size_t crc_start = preamble; - size_t crc_end = pkt.size() - 5; - uint32_t crc = calc_crc(pkt, crc_start, crc_end); - printf("CRC for test packet: %08X\n", crc); - // assert(crc == 0x????????); // подставьте ожидаемое значение CRC - return 0; -} \ No newline at end of file diff --git a/components/saeco_series_6000/platformio.ini b/components/saeco_series_6000/platformio.ini deleted file mode 100644 index 8b13789..0000000 --- a/components/saeco_series_6000/platformio.ini +++ /dev/null @@ -1 +0,0 @@ - diff --git a/components/saeco_series_6000/saeco_series_6000.cpp b/components/saeco_series_6000/saeco_series_6000.cpp index 2e10609..51bc1dd 100644 --- a/components/saeco_series_6000/saeco_series_6000.cpp +++ b/components/saeco_series_6000/saeco_series_6000.cpp @@ -208,10 +208,8 @@ void SaecoSeries6000::dump_config() { void SaecoSeries6000::send_packet_to_mainboard(const std::vector &data) { ESP_LOGI(TAG, "Send to Mainboard pressed."); - if (uart_mainboard_ != nullptr) { - for (auto b : data) { - uart_mainboard_->write_byte(b); - } + for (auto b : data) { + uart_mainboard_->write_byte(b); } } @@ -269,23 +267,42 @@ uint32_t SaecoSeries6000::calc_crc(const std::vector& data, size_t star return crc; } +std::vector SaecoSeries6000::parse_hex_string_to_bytes(const std::string& hex_string) { + std::vector pkt; + size_t pos = 0; + while (pos < hex_string.size()) { + while (pos < hex_string.size() && isspace(hex_string[pos])) ++pos; + if (pos >= hex_string.size()) break; + char* endptr = nullptr; + uint8_t byte = static_cast(std::strtoul(hex_string.c_str() + pos, &endptr, 16)); + pkt.push_back(byte); + if (endptr == nullptr || endptr == hex_string.c_str() + pos) break; + pos = endptr - hex_string.c_str(); + } + return pkt; +} + +void SaecoSeries6000::send_packets_to_mainboard(const std::string& hex_packet, uint32_t delay_ms) { + std::vector> pkts = {parse_hex_string_to_bytes(hex_packet)}; + send_packets_to_mainboard(pkts, delay_ms); +} + +void SaecoSeries6000::send_packets_to_mainboard(const std::vector& hex_packets, uint32_t delay_ms) { + std::vector> pkts; + for (const auto& s : hex_packets) { + pkts.push_back(parse_hex_string_to_bytes(s)); + } + send_packets_to_mainboard(pkts, delay_ms); +} + void SaecoSeries6000::send_packets_to_mainboard(const std::vector> &packets, uint32_t delay_ms) { uint8_t counter = (last_display_counter_ + 1) & 0xFF; for (size_t i = 0; i < packets.size(); ++i) { std::vector pkt = packets[i]; + // Заменяем байт счетчика (4-й байт) if (pkt.size() > 4) { pkt[4] = counter; } - // Логируем пакет ДО пересчёта CRC - { - std::string log_str; - char buf[8]; - for (auto b : pkt) { - snprintf(buf, sizeof(buf), "%02X ", b); - log_str += buf; - } - ESP_LOGI(TAG, "Packet before CRC: %s", log_str.c_str()); - } // Пересчёт CRC: ищем преамбулу 0xAA 0xAA 0xAA, считаем CRC по данным между преамбулой и последними 5 байтами if (pkt.size() > 8) { size_t preamble = 0; @@ -296,24 +313,26 @@ void SaecoSeries6000::send_packets_to_mainboard(const std::vector> 24) & 0xFF; - pkt[pkt.size()-4] = (crc >> 16) & 0xFF; - pkt[pkt.size()-3] = (crc >> 8) & 0xFF; - pkt[pkt.size()-2] = (crc) & 0xFF; + pkt[pkt.size()-2] = (crc >> 24) & 0xFF; + pkt[pkt.size()-3] = (crc >> 16) & 0xFF; + pkt[pkt.size()-4] = (crc >> 8) & 0xFF; + pkt[pkt.size()-5] = crc & 0xFF; + // pkt[pkt.size()-5] = (crc >> 24) & 0xFF; + // pkt[pkt.size()-4] = (crc >> 16) & 0xFF; + // pkt[pkt.size()-3] = (crc >> 8) & 0xFF; + // pkt[pkt.size()-2] = (crc) & 0xFF; } - // Логируем пакет ПОСЛЕ пересчёта CRC - { - std::string log_str; - char buf[8]; - for (auto b : pkt) { - snprintf(buf, sizeof(buf), "%02X ", b); - log_str += buf; - } - ESP_LOGI(TAG, "Packet after CRC: %s", log_str.c_str()); + // Логируем пакет перед отправкой + std::string log_str; + char buf[8]; + for (auto b : pkt) { + snprintf(buf, sizeof(buf), "%02X ", b); + log_str += buf; } + ESP_LOGI(TAG, "Send to Mainboard: %s", log_str.c_str()); send_packet_to_mainboard(pkt); counter = (counter + 1) & 0xFF; - delay(delay_ms); // пауза между пакетами + delay(delay_ms); } last_display_counter_ = (counter - 1) & 0xFF; } diff --git a/components/saeco_series_6000/saeco_series_6000.h b/components/saeco_series_6000/saeco_series_6000.h index 65f1908..4e77ac8 100644 --- a/components/saeco_series_6000/saeco_series_6000.h +++ b/components/saeco_series_6000/saeco_series_6000.h @@ -23,6 +23,8 @@ class SaecoSeries6000 : public Component { void dump_config() override; void send_packet_to_mainboard(const std::vector &data); void send_packets_to_mainboard(const std::vector> &packets, uint32_t delay_ms = 10); + void send_packets_to_mainboard(const std::vector& hex_packets, uint32_t delay_ms = 10); + void send_packets_to_mainboard(const std::string& hex_packet, uint32_t delay_ms = 10); protected: uart::UARTComponent *uart_display_; @@ -56,6 +58,7 @@ class SaecoSeries6000 : public Component { void pub_status(uint8_t status); static const uint8_t BitReverse[256]; uint32_t calc_crc(const std::vector& data, size_t start, size_t end); + std::vector parse_hex_string_to_bytes(const std::string& hex_string); }; class SaecoSendPacketsButton : public esphome::button::Button, public esphome::Component {