diff --git a/esphome/components/modbus_client/modbus_client.cpp b/esphome/components/modbus_client/modbus_client.cpp index 3c9571b04af..c263b110083 100644 --- a/esphome/components/modbus_client/modbus_client.cpp +++ b/esphome/components/modbus_client/modbus_client.cpp @@ -1,46 +1,41 @@ #include "modbus_client.h" +#include "esphome/core/hal.h" + +#include namespace esphome::modbus_client { using modbus::helpers::PduBuffer; -#ifdef USE_ESP8266 PduBuffer static_write_registers_pdu(uint16_t start, const uint16_t *values, size_t len) { +#ifdef USE_ESP8266 std::array staging; progmem_memcpy(staging.data(), values, len * sizeof(uint16_t)); - return modbus::helpers::create_write_registers_pdu(start, std::span(staging.data(), len)); -} - -PduBuffer static_write_coils_pdu(uint16_t start, const uint8_t *packed, uint16_t count) { - std::array staging; - const size_t len = modbus::packed_bit_bytes(count); - progmem_memcpy(staging.data(), packed, len); - return modbus::helpers::create_write_coils_pdu( - start, modbus::PackedBits(std::span(staging.data(), len), count)); -} - -PduBuffer static_read_write_registers_pdu(uint16_t read_start, uint16_t read_count, uint16_t write_start, - const uint16_t *values, size_t len) { - std::array staging; - progmem_memcpy(staging.data(), values, len * sizeof(uint16_t)); - return modbus::helpers::create_read_write_multiple_registers_pdu(read_start, read_count, write_start, - std::span(staging.data(), len)); -} -#else -PduBuffer static_write_registers_pdu(uint16_t start, const uint16_t *values, size_t len) { + values = staging.data(); +#endif return modbus::helpers::create_write_registers_pdu(start, std::span(values, len)); } PduBuffer static_write_coils_pdu(uint16_t start, const uint8_t *packed, uint16_t count) { - return modbus::helpers::create_write_coils_pdu( - start, modbus::PackedBits(std::span(packed, modbus::packed_bit_bytes(count)), count)); + const size_t len = modbus::packed_bit_bytes(count); +#ifdef USE_ESP8266 + std::array staging; + progmem_memcpy(staging.data(), packed, len); + packed = staging.data(); +#endif + return modbus::helpers::create_write_coils_pdu(start, + modbus::PackedBits(std::span(packed, len), count)); } PduBuffer static_read_write_registers_pdu(uint16_t read_start, uint16_t read_count, uint16_t write_start, const uint16_t *values, size_t len) { +#ifdef USE_ESP8266 + std::array staging; + progmem_memcpy(staging.data(), values, len * sizeof(uint16_t)); + values = staging.data(); +#endif return modbus::helpers::create_read_write_multiple_registers_pdu(read_start, read_count, write_start, std::span(values, len)); } -#endif } // namespace esphome::modbus_client diff --git a/esphome/components/modbus_client/modbus_client.h b/esphome/components/modbus_client/modbus_client.h index e7db77379b8..0cdaf90c35f 100644 --- a/esphome/components/modbus_client/modbus_client.h +++ b/esphome/components/modbus_client/modbus_client.h @@ -3,9 +3,7 @@ #include "esphome/components/modbus/modbus.h" #include "esphome/components/modbus/modbus_helpers.h" #include "esphome/core/automation.h" -#include "esphome/core/hal.h" -#include #include #include