12 uint16_t number_of_registers) {
14 "Received read holding/input registers for device 0x%X. FC: 0x%X. Start address: 0x%X. Number of registers: "
16 this->
address_, function_code, start_address, number_of_registers);
19 ESP_LOGW(TAG,
"Invalid number of registers %d. Sending exception response.", number_of_registers);
24 std::vector<uint16_t> sixteen_bit_response;
25 for (uint16_t current_address = start_address; current_address < start_address + number_of_registers;) {
28 if (server_register->address == current_address) {
29 if (!server_register->read_lambda) {
32 int64_t value = server_register->read_lambda();
33 ESP_LOGV(TAG,
"Matched register. Address: 0x%02X. Value type: %zu. Register count: %u. Value: %s.",
34 server_register->address,
static_cast<size_t>(server_register->value_type),
35 server_register->register_count, server_register->format_value(value).c_str());
37 std::vector<uint16_t> payload;
38 payload.reserve(server_register->register_count * 2);
40 sixteen_bit_response.insert(sixteen_bit_response.end(), payload.cbegin(), payload.cend());
41 current_address += server_register->register_count;
51 "Could not match any register to address 0x%02X, but default allowed. "
52 "Returning default value: %d.",
58 "Could not match any register to address 0x%02X and default not allowed. Sending exception response.",
66 std::vector<uint8_t> response;
67 for (
auto v : sixteen_bit_response) {
69 response.push_back(decoded_value[0]);
70 response.push_back(decoded_value[1]);
73 this->
send(function_code, start_address, number_of_registers, response.size(), response.data());
77 uint16_t number_of_registers;
78 uint16_t payload_offset;
81 if (data.size() < 5) {
82 ESP_LOGW(TAG,
"Write multiple registers data too short (%zu bytes)", data.size());
86 number_of_registers = uint16_t(data[3]) | (uint16_t(data[2]) << 8);
88 ESP_LOGW(TAG,
"Invalid number of registers %d. Sending exception response.", number_of_registers);
94 ESP_LOGW(TAG,
"Payload size of %d bytes is not 2 times the number of registers (%d). Sending exception response.",
100 ESP_LOGW(TAG,
"Write multiple registers payload truncated (%zu bytes, expected %u)", data.size(),
107 if (data.size() < 4) {
108 ESP_LOGW(TAG,
"Write single register data too short (%zu bytes)", data.size());
112 number_of_registers = 1;
115 ESP_LOGW(TAG,
"Invalid function code 0x%X. Sending exception response.", function_code);
120 uint16_t start_address = uint16_t(data[1]) | (uint16_t(data[0]) << 8);
122 "Received write holding registers for device 0x%X. FC: 0x%X. Start address: 0x%X. Number of registers: "
124 this->
address_, function_code, start_address, number_of_registers);
126 auto for_each_register = [
this, start_address, number_of_registers, payload_offset](
127 const std::function<bool(
ServerRegister *, uint16_t offset)> &callback) ->
bool {
128 uint16_t offset = payload_offset;
129 for (uint16_t current_address = start_address; current_address < start_address + number_of_registers;) {
132 if (server_register->address == current_address) {
133 ok = callback(server_register, offset);
134 current_address += server_register->register_count;
135 offset += server_register->register_count *
sizeof(uint16_t);
148 if (!for_each_register([](
ServerRegister *server_register, uint16_t offset) ->
bool {
156 if (!for_each_register([&data](
ServerRegister *server_register, uint16_t offset) {
164 std::vector<uint8_t> response;
167 response.push_back(function_code);
168 response.insert(response.end(), data.begin(), data.begin() + 4);