mirror of
https://github.com/esphome/esphome.git
synced 2025-10-31 23:21:54 +00:00
[modbus_controller] Optimize lambdas to use function pointers instead of std::function
This commit is contained in:
@@ -33,8 +33,8 @@ class ModbusBinarySensor : public Component, public binary_sensor::BinarySensor,
|
|||||||
|
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
|
|
||||||
using transform_func_t = std::function<optional<bool>(ModbusBinarySensor *, bool, const std::vector<uint8_t> &)>;
|
using transform_func_t = optional<bool> (*)(ModbusBinarySensor *, bool, const std::vector<uint8_t> &);
|
||||||
void set_template(transform_func_t &&f) { this->transform_func_ = f; }
|
void set_template(transform_func_t f) { this->transform_func_ = f; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
optional<transform_func_t> transform_func_{nullopt};
|
optional<transform_func_t> transform_func_{nullopt};
|
||||||
|
|||||||
@@ -31,10 +31,10 @@ class ModbusNumber : public number::Number, public Component, public SensorItem
|
|||||||
void set_parent(ModbusController *parent) { this->parent_ = parent; }
|
void set_parent(ModbusController *parent) { this->parent_ = parent; }
|
||||||
void set_write_multiply(float factor) { this->multiply_by_ = factor; }
|
void set_write_multiply(float factor) { this->multiply_by_ = factor; }
|
||||||
|
|
||||||
using transform_func_t = std::function<optional<float>(ModbusNumber *, float, const std::vector<uint8_t> &)>;
|
using transform_func_t = optional<float> (*)(ModbusNumber *, float, const std::vector<uint8_t> &);
|
||||||
using write_transform_func_t = std::function<optional<float>(ModbusNumber *, float, std::vector<uint16_t> &)>;
|
using write_transform_func_t = optional<float> (*)(ModbusNumber *, float, std::vector<uint16_t> &);
|
||||||
void set_template(transform_func_t &&f) { this->transform_func_ = f; }
|
void set_template(transform_func_t f) { this->transform_func_ = f; }
|
||||||
void set_write_template(write_transform_func_t &&f) { this->write_transform_func_ = f; }
|
void set_write_template(write_transform_func_t f) { this->write_transform_func_ = f; }
|
||||||
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ class ModbusFloatOutput : public output::FloatOutput, public Component, public S
|
|||||||
// Do nothing
|
// Do nothing
|
||||||
void parse_and_publish(const std::vector<uint8_t> &data) override{};
|
void parse_and_publish(const std::vector<uint8_t> &data) override{};
|
||||||
|
|
||||||
using write_transform_func_t = std::function<optional<float>(ModbusFloatOutput *, float, std::vector<uint16_t> &)>;
|
using write_transform_func_t = optional<float> (*)(ModbusFloatOutput *, float, std::vector<uint16_t> &);
|
||||||
void set_write_template(write_transform_func_t &&f) { this->write_transform_func_ = f; }
|
void set_write_template(write_transform_func_t f) { this->write_transform_func_ = f; }
|
||||||
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -60,8 +60,8 @@ class ModbusBinaryOutput : public output::BinaryOutput, public Component, public
|
|||||||
// Do nothing
|
// Do nothing
|
||||||
void parse_and_publish(const std::vector<uint8_t> &data) override{};
|
void parse_and_publish(const std::vector<uint8_t> &data) override{};
|
||||||
|
|
||||||
using write_transform_func_t = std::function<optional<bool>(ModbusBinaryOutput *, bool, std::vector<uint8_t> &)>;
|
using write_transform_func_t = optional<bool> (*)(ModbusBinaryOutput *, bool, std::vector<uint8_t> &);
|
||||||
void set_write_template(write_transform_func_t &&f) { this->write_transform_func_ = f; }
|
void set_write_template(write_transform_func_t f) { this->write_transform_func_ = f; }
|
||||||
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -26,16 +26,15 @@ class ModbusSelect : public Component, public select::Select, public SensorItem
|
|||||||
this->mapping_ = std::move(mapping);
|
this->mapping_ = std::move(mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
using transform_func_t =
|
using transform_func_t = optional<std::string> (*)(ModbusSelect *const, int64_t, const std::vector<uint8_t> &);
|
||||||
std::function<optional<std::string>(ModbusSelect *const, int64_t, const std::vector<uint8_t> &)>;
|
using write_transform_func_t = optional<int64_t> (*)(ModbusSelect *const, const std::string &, int64_t,
|
||||||
using write_transform_func_t =
|
std::vector<uint16_t> &);
|
||||||
std::function<optional<int64_t>(ModbusSelect *const, const std::string &, int64_t, std::vector<uint16_t> &)>;
|
|
||||||
|
|
||||||
void set_parent(ModbusController *const parent) { this->parent_ = parent; }
|
void set_parent(ModbusController *const parent) { this->parent_ = parent; }
|
||||||
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
||||||
void set_optimistic(bool optimistic) { this->optimistic_ = optimistic; }
|
void set_optimistic(bool optimistic) { this->optimistic_ = optimistic; }
|
||||||
void set_template(transform_func_t &&f) { this->transform_func_ = f; }
|
void set_template(transform_func_t f) { this->transform_func_ = f; }
|
||||||
void set_write_template(write_transform_func_t &&f) { this->write_transform_func_ = f; }
|
void set_write_template(write_transform_func_t f) { this->write_transform_func_ = f; }
|
||||||
|
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ class ModbusSensor : public Component, public sensor::Sensor, public SensorItem
|
|||||||
|
|
||||||
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
using transform_func_t = std::function<optional<float>(ModbusSensor *, float, const std::vector<uint8_t> &)>;
|
using transform_func_t = optional<float> (*)(ModbusSensor *, float, const std::vector<uint8_t> &);
|
||||||
|
|
||||||
void set_template(transform_func_t &&f) { this->transform_func_ = f; }
|
void set_template(transform_func_t f) { this->transform_func_ = f; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
optional<transform_func_t> transform_func_{nullopt};
|
optional<transform_func_t> transform_func_{nullopt};
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ class ModbusSwitch : public Component, public switch_::Switch, public SensorItem
|
|||||||
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
||||||
void set_parent(ModbusController *parent) { this->parent_ = parent; }
|
void set_parent(ModbusController *parent) { this->parent_ = parent; }
|
||||||
|
|
||||||
using transform_func_t = std::function<optional<bool>(ModbusSwitch *, bool, const std::vector<uint8_t> &)>;
|
using transform_func_t = optional<bool> (*)(ModbusSwitch *, bool, const std::vector<uint8_t> &);
|
||||||
using write_transform_func_t = std::function<optional<bool>(ModbusSwitch *, bool, std::vector<uint8_t> &)>;
|
using write_transform_func_t = optional<bool> (*)(ModbusSwitch *, bool, std::vector<uint8_t> &);
|
||||||
void set_template(transform_func_t &&f) { this->publish_transform_func_ = f; }
|
void set_template(transform_func_t f) { this->publish_transform_func_ = f; }
|
||||||
void set_write_template(write_transform_func_t &&f) { this->write_transform_func_ = f; }
|
void set_write_template(write_transform_func_t f) { this->write_transform_func_ = f; }
|
||||||
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -30,9 +30,8 @@ class ModbusTextSensor : public Component, public text_sensor::TextSensor, publi
|
|||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
|
|
||||||
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
void parse_and_publish(const std::vector<uint8_t> &data) override;
|
||||||
using transform_func_t =
|
using transform_func_t = optional<std::string> (*)(ModbusTextSensor *, std::string, const std::vector<uint8_t> &);
|
||||||
std::function<optional<std::string>(ModbusTextSensor *, std::string, const std::vector<uint8_t> &)>;
|
void set_template(transform_func_t f) { this->transform_func_ = f; }
|
||||||
void set_template(transform_func_t &&f) { this->transform_func_ = f; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
optional<transform_func_t> transform_func_{nullopt};
|
optional<transform_func_t> transform_func_{nullopt};
|
||||||
|
|||||||
@@ -56,6 +56,14 @@ binary_sensor:
|
|||||||
register_type: read
|
register_type: read
|
||||||
address: 0x3200
|
address: 0x3200
|
||||||
bitmask: 0x80
|
bitmask: 0x80
|
||||||
|
- platform: modbus_controller
|
||||||
|
modbus_controller_id: modbus_controller1
|
||||||
|
id: modbus_binary_sensor2
|
||||||
|
name: Test Binary Sensor with Lambda
|
||||||
|
register_type: read
|
||||||
|
address: 0x3201
|
||||||
|
lambda: |-
|
||||||
|
return x;
|
||||||
|
|
||||||
number:
|
number:
|
||||||
- platform: modbus_controller
|
- platform: modbus_controller
|
||||||
@@ -65,6 +73,16 @@ number:
|
|||||||
address: 0x9001
|
address: 0x9001
|
||||||
value_type: U_WORD
|
value_type: U_WORD
|
||||||
multiply: 1.0
|
multiply: 1.0
|
||||||
|
- platform: modbus_controller
|
||||||
|
modbus_controller_id: modbus_controller1
|
||||||
|
id: modbus_number2
|
||||||
|
name: Test Number with Lambda
|
||||||
|
address: 0x9002
|
||||||
|
value_type: U_WORD
|
||||||
|
lambda: |-
|
||||||
|
return x * 2.0;
|
||||||
|
write_lambda: |-
|
||||||
|
return x / 2.0;
|
||||||
|
|
||||||
output:
|
output:
|
||||||
- platform: modbus_controller
|
- platform: modbus_controller
|
||||||
@@ -74,6 +92,14 @@ output:
|
|||||||
register_type: holding
|
register_type: holding
|
||||||
value_type: U_WORD
|
value_type: U_WORD
|
||||||
multiply: 1000
|
multiply: 1000
|
||||||
|
- platform: modbus_controller
|
||||||
|
modbus_controller_id: modbus_controller1
|
||||||
|
id: modbus_output2
|
||||||
|
address: 2049
|
||||||
|
register_type: holding
|
||||||
|
value_type: U_WORD
|
||||||
|
write_lambda: |-
|
||||||
|
return x * 100.0;
|
||||||
|
|
||||||
select:
|
select:
|
||||||
- platform: modbus_controller
|
- platform: modbus_controller
|
||||||
@@ -87,6 +113,34 @@ select:
|
|||||||
"One": 1
|
"One": 1
|
||||||
"Two": 2
|
"Two": 2
|
||||||
"Three": 3
|
"Three": 3
|
||||||
|
- platform: modbus_controller
|
||||||
|
modbus_controller_id: modbus_controller1
|
||||||
|
id: modbus_select2
|
||||||
|
name: Test Select with Lambda
|
||||||
|
address: 1001
|
||||||
|
value_type: U_WORD
|
||||||
|
optionsmap:
|
||||||
|
"Off": 0
|
||||||
|
"On": 1
|
||||||
|
"Two": 2
|
||||||
|
lambda: |-
|
||||||
|
ESP_LOGD("Reg1001", "Received value %lld", x);
|
||||||
|
if (x > 1) {
|
||||||
|
return std::string("Two");
|
||||||
|
} else if (x == 1) {
|
||||||
|
return std::string("On");
|
||||||
|
}
|
||||||
|
return std::string("Off");
|
||||||
|
write_lambda: |-
|
||||||
|
ESP_LOGD("Reg1001", "Set option to %s (%lld)", x.c_str(), value);
|
||||||
|
if (x == "On") {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (x == "Two") {
|
||||||
|
payload.push_back(0x0002);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
|
||||||
sensor:
|
sensor:
|
||||||
- platform: modbus_controller
|
- platform: modbus_controller
|
||||||
@@ -97,6 +151,15 @@ sensor:
|
|||||||
address: 0x9001
|
address: 0x9001
|
||||||
unit_of_measurement: "AH"
|
unit_of_measurement: "AH"
|
||||||
value_type: U_WORD
|
value_type: U_WORD
|
||||||
|
- platform: modbus_controller
|
||||||
|
modbus_controller_id: modbus_controller1
|
||||||
|
id: modbus_sensor2
|
||||||
|
name: Test Sensor with Lambda
|
||||||
|
register_type: holding
|
||||||
|
address: 0x9002
|
||||||
|
value_type: U_WORD
|
||||||
|
lambda: |-
|
||||||
|
return x / 10.0;
|
||||||
|
|
||||||
switch:
|
switch:
|
||||||
- platform: modbus_controller
|
- platform: modbus_controller
|
||||||
@@ -106,6 +169,16 @@ switch:
|
|||||||
register_type: coil
|
register_type: coil
|
||||||
address: 0x15
|
address: 0x15
|
||||||
bitmask: 1
|
bitmask: 1
|
||||||
|
- platform: modbus_controller
|
||||||
|
modbus_controller_id: modbus_controller1
|
||||||
|
id: modbus_switch2
|
||||||
|
name: Test Switch with Lambda
|
||||||
|
register_type: coil
|
||||||
|
address: 0x16
|
||||||
|
lambda: |-
|
||||||
|
return !x;
|
||||||
|
write_lambda: |-
|
||||||
|
return !x;
|
||||||
|
|
||||||
text_sensor:
|
text_sensor:
|
||||||
- platform: modbus_controller
|
- platform: modbus_controller
|
||||||
@@ -117,3 +190,13 @@ text_sensor:
|
|||||||
register_count: 3
|
register_count: 3
|
||||||
raw_encode: HEXBYTES
|
raw_encode: HEXBYTES
|
||||||
response_size: 6
|
response_size: 6
|
||||||
|
- platform: modbus_controller
|
||||||
|
modbus_controller_id: modbus_controller1
|
||||||
|
id: modbus_text_sensor2
|
||||||
|
name: Test Text Sensor with Lambda
|
||||||
|
register_type: holding
|
||||||
|
address: 0x9014
|
||||||
|
register_count: 2
|
||||||
|
response_size: 4
|
||||||
|
lambda: |-
|
||||||
|
return "Modified: " + x;
|
||||||
|
|||||||
Reference in New Issue
Block a user