mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	wip
This commit is contained in:
		| @@ -13,12 +13,23 @@ | ||||
| namespace esphome { | ||||
| namespace template_ { | ||||
|  | ||||
| class TemplateDate : public datetime::DateEntity, public PollingComponent { | ||||
| template<typename F> class TemplateDateBase : public datetime::DateEntity, public PollingComponent { | ||||
|  public: | ||||
|   void set_template(std::function<optional<ESPTime>()> &&f) { this->f_ = f; } | ||||
|   void update() override { | ||||
|     if (!this->f_.has_value()) | ||||
|       return; | ||||
|  | ||||
|     auto val = (*this->f_)(); | ||||
|     if (!val.has_value()) | ||||
|       return; | ||||
|  | ||||
|     this->year_ = val->year; | ||||
|     this->month_ = val->month; | ||||
|     this->day_ = val->day_of_month; | ||||
|     this->publish_state(); | ||||
|   } | ||||
|  | ||||
|   void setup() override; | ||||
|   void update() override; | ||||
|   void dump_config() override; | ||||
|   float get_setup_priority() const override { return setup_priority::HARDWARE; } | ||||
|  | ||||
| @@ -35,11 +46,26 @@ class TemplateDate : public datetime::DateEntity, public PollingComponent { | ||||
|   ESPTime initial_value_{}; | ||||
|   bool restore_value_{false}; | ||||
|   Trigger<ESPTime> *set_trigger_ = new Trigger<ESPTime>(); | ||||
|   optional<std::function<optional<ESPTime>()>> f_; | ||||
|   optional<F> f_; | ||||
|  | ||||
|   ESPPreferenceObject pref_; | ||||
| }; | ||||
|  | ||||
| class TemplateDate : public TemplateDateBase<std::function<optional<ESPTime>()>> { | ||||
|  public: | ||||
|   void set_template(std::function<optional<ESPTime>()> &&f) { this->f_ = f; } | ||||
| }; | ||||
|  | ||||
| /** Optimized template date for stateless lambdas (no capture). | ||||
|  * | ||||
|  * Uses function pointers instead of std::function to reduce memory overhead. | ||||
|  * Memory: 4 bytes (function pointer on 32-bit) vs 32 bytes (std::function) per lambda. | ||||
|  */ | ||||
| class StatelessTemplateDate : public TemplateDateBase<optional<ESPTime> (*)()> { | ||||
|  public: | ||||
|   explicit StatelessTemplateDate(optional<ESPTime> (*f)()) { this->f_ = f; } | ||||
| }; | ||||
|  | ||||
| }  // namespace template_ | ||||
| }  // namespace esphome | ||||
|  | ||||
|   | ||||
| @@ -13,12 +13,23 @@ | ||||
| namespace esphome { | ||||
| namespace template_ { | ||||
|  | ||||
| class TemplateTime : public datetime::TimeEntity, public PollingComponent { | ||||
| template<typename F> class TemplateTimeBase : public datetime::TimeEntity, public PollingComponent { | ||||
|  public: | ||||
|   void set_template(std::function<optional<ESPTime>()> &&f) { this->f_ = f; } | ||||
|   void update() override { | ||||
|     if (!this->f_.has_value()) | ||||
|       return; | ||||
|  | ||||
|     auto val = (*this->f_)(); | ||||
|     if (!val.has_value()) | ||||
|       return; | ||||
|  | ||||
|     this->hour_ = val->hour; | ||||
|     this->minute_ = val->minute; | ||||
|     this->second_ = val->second; | ||||
|     this->publish_state(); | ||||
|   } | ||||
|  | ||||
|   void setup() override; | ||||
|   void update() override; | ||||
|   void dump_config() override; | ||||
|   float get_setup_priority() const override { return setup_priority::HARDWARE; } | ||||
|  | ||||
| @@ -35,11 +46,26 @@ class TemplateTime : public datetime::TimeEntity, public PollingComponent { | ||||
|   ESPTime initial_value_{}; | ||||
|   bool restore_value_{false}; | ||||
|   Trigger<ESPTime> *set_trigger_ = new Trigger<ESPTime>(); | ||||
|   optional<std::function<optional<ESPTime>()>> f_; | ||||
|   optional<F> f_; | ||||
|  | ||||
|   ESPPreferenceObject pref_; | ||||
| }; | ||||
|  | ||||
| class TemplateTime : public TemplateTimeBase<std::function<optional<ESPTime>()>> { | ||||
|  public: | ||||
|   void set_template(std::function<optional<ESPTime>()> &&f) { this->f_ = f; } | ||||
| }; | ||||
|  | ||||
| /** Optimized template time for stateless lambdas (no capture). | ||||
|  * | ||||
|  * Uses function pointers instead of std::function to reduce memory overhead. | ||||
|  * Memory: 4 bytes (function pointer on 32-bit) vs 32 bytes (std::function) per lambda. | ||||
|  */ | ||||
| class StatelessTemplateTime : public TemplateTimeBase<optional<ESPTime> (*)()> { | ||||
|  public: | ||||
|   explicit StatelessTemplateTime(optional<ESPTime> (*f)()) { this->f_ = f; } | ||||
| }; | ||||
|  | ||||
| }  // namespace template_ | ||||
| }  // namespace esphome | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user