mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +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; | ||||
|  | ||||
|   using transform_func_t = std::function<optional<bool>(ModbusBinarySensor *, bool, const std::vector<uint8_t> &)>; | ||||
|   void set_template(transform_func_t &&f) { this->transform_func_ = f; } | ||||
|   using transform_func_t = optional<bool> (*)(ModbusBinarySensor *, bool, const std::vector<uint8_t> &); | ||||
|   void set_template(transform_func_t f) { this->transform_func_ = f; } | ||||
|  | ||||
|  protected: | ||||
|   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_write_multiply(float factor) { this->multiply_by_ = factor; } | ||||
|  | ||||
|   using transform_func_t = std::function<optional<float>(ModbusNumber *, float, const std::vector<uint8_t> &)>; | ||||
|   using write_transform_func_t = std::function<optional<float>(ModbusNumber *, float, std::vector<uint16_t> &)>; | ||||
|   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; } | ||||
|   using transform_func_t = optional<float> (*)(ModbusNumber *, float, const std::vector<uint8_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_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; } | ||||
|  | ||||
|  protected: | ||||
|   | ||||
| @@ -29,8 +29,8 @@ class ModbusFloatOutput : public output::FloatOutput, public Component, public S | ||||
|   // Do nothing | ||||
|   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> &)>; | ||||
|   void set_write_template(write_transform_func_t &&f) { this->write_transform_func_ = f; } | ||||
|   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_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; } | ||||
|  | ||||
|  protected: | ||||
| @@ -60,8 +60,8 @@ class ModbusBinaryOutput : public output::BinaryOutput, public Component, public | ||||
|   // Do nothing | ||||
|   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> &)>; | ||||
|   void set_write_template(write_transform_func_t &&f) { this->write_transform_func_ = f; } | ||||
|   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_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; } | ||||
|  | ||||
|  protected: | ||||
|   | ||||
| @@ -26,16 +26,15 @@ class ModbusSelect : public Component, public select::Select, public SensorItem | ||||
|     this->mapping_ = std::move(mapping); | ||||
|   } | ||||
|  | ||||
|   using transform_func_t = | ||||
|       std::function<optional<std::string>(ModbusSelect *const, int64_t, const std::vector<uint8_t> &)>; | ||||
|   using write_transform_func_t = | ||||
|       std::function<optional<int64_t>(ModbusSelect *const, const std::string &, int64_t, std::vector<uint16_t> &)>; | ||||
|   using transform_func_t = 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, | ||||
|                                                        std::vector<uint16_t> &); | ||||
|  | ||||
|   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_optimistic(bool optimistic) { this->optimistic_ = optimistic; } | ||||
|   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_template(transform_func_t f) { this->transform_func_ = f; } | ||||
|   void set_write_template(write_transform_func_t f) { this->write_transform_func_ = f; } | ||||
|  | ||||
|   void dump_config() 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 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: | ||||
|   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 set_parent(ModbusController *parent) { this->parent_ = parent; } | ||||
|  | ||||
|   using transform_func_t = std::function<optional<bool>(ModbusSwitch *, bool, const std::vector<uint8_t> &)>; | ||||
|   using write_transform_func_t = std::function<optional<bool>(ModbusSwitch *, bool, std::vector<uint8_t> &)>; | ||||
|   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; } | ||||
|   using transform_func_t = optional<bool> (*)(ModbusSwitch *, bool, const 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_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; } | ||||
|  | ||||
|  protected: | ||||
|   | ||||
| @@ -30,9 +30,8 @@ class ModbusTextSensor : public Component, public text_sensor::TextSensor, publi | ||||
|   void dump_config() override; | ||||
|  | ||||
|   void parse_and_publish(const std::vector<uint8_t> &data) override; | ||||
|   using transform_func_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; } | ||||
|   using transform_func_t = optional<std::string> (*)(ModbusTextSensor *, std::string, const std::vector<uint8_t> &); | ||||
|   void set_template(transform_func_t f) { this->transform_func_ = f; } | ||||
|  | ||||
|  protected: | ||||
|   optional<transform_func_t> transform_func_{nullopt}; | ||||
|   | ||||
| @@ -56,6 +56,14 @@ binary_sensor: | ||||
|     register_type: read | ||||
|     address: 0x3200 | ||||
|     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: | ||||
|   - platform: modbus_controller | ||||
| @@ -65,6 +73,16 @@ number: | ||||
|     address: 0x9001 | ||||
|     value_type: U_WORD | ||||
|     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: | ||||
|   - platform: modbus_controller | ||||
| @@ -74,6 +92,14 @@ output: | ||||
|     register_type: holding | ||||
|     value_type: U_WORD | ||||
|     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: | ||||
|   - platform: modbus_controller | ||||
| @@ -87,6 +113,34 @@ select: | ||||
|       "One": 1 | ||||
|       "Two": 2 | ||||
|       "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: | ||||
|   - platform: modbus_controller | ||||
| @@ -97,6 +151,15 @@ sensor: | ||||
|     address: 0x9001 | ||||
|     unit_of_measurement: "AH" | ||||
|     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: | ||||
|   - platform: modbus_controller | ||||
| @@ -106,6 +169,16 @@ switch: | ||||
|     register_type: coil | ||||
|     address: 0x15 | ||||
|     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: | ||||
|   - platform: modbus_controller | ||||
| @@ -117,3 +190,13 @@ text_sensor: | ||||
|     register_count: 3 | ||||
|     raw_encode: HEXBYTES | ||||
|     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