diff --git a/esphome/components/dynamic_lamp/__init__.py b/esphome/components/dynamic_lamp/__init__.py new file mode 100644 index 0000000000..9a785bc59d --- /dev/null +++ b/esphome/components/dynamic_lamp/__init__.py @@ -0,0 +1,14 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ID + +dynamic_lamp_ns = cg.esphome_ns.namespace('dynamic_lamp') +DynamicLamp = dynamic_lamp_ns.class_('DynamicLamp', cg.Component) + +CONFIG_SCHEMA = cv.Schema({ + cv.GenerateID(): cv.declare_id(DynamicLamp) +}).extend(cv.COMPONENT_SCHEMA) + +def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + yield cg.register_component(var, config) diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.cpp b/esphome/components/dynamic_lamp/dynamic_lamp.cpp new file mode 100644 index 0000000000..be752deb32 --- /dev/null +++ b/esphome/components/dynamic_lamp/dynamic_lamp.cpp @@ -0,0 +1,56 @@ +#include "esphome/core/log.h" +#include "dynamic_lamp.h" + +namespace esphome { +namespace dynamic_lamp { + +static const char *TAG = "dynamic_lamp"; + +void DynamicLamp::setup() { + uint8_t i = 0; + bool valid = true; + this->save_mode_ = SAVE_MODE_NONE; //Currently only none & fram supported + + if(this->save_mode_ == 0) { + for (i=0; i < 16; i++) { + this->active_lamps_[i].active = false; + } + } else { + while(i < 16) { + this->restore_lamp_values_(i); + } + } +} + +void DynamicLamp::loop() { + +} + +void DynamicLamp::dump_config(){ + ESP_LOGCONFIG(TAG, "Dynamic Lamp feature loaded"); + switch(this->save_mode_) { + case SAVE_MODE_NONE: + ESP_LOGCONFIG(TAG, "Save mode set to NONE"); + case SAVE_MODE_FRAM: + ESP_LOGCONFIG(TAG, "Save mode set to FRAM"); + break; + default: + ESP_LOGCONFIG(TAG, "Currently only NONE(0) && FRAM(1) save modes supported, ignoring value %" PRIu8 " and defaulting to NONE!", this->save_mode_); + this->save_mode_ = 0; + } +} + +void DynamicLamp::set_lamp_count(uint8_t lamp_count) { + +} + +void DynamicLamp::set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value) { + +} + +void DynamicLamp::restore_lamp_values_(uint8_t lamp_number) { + this->active_lamps_[lamp_number].active = false; +} + +} // namespace dynamic_lamp +} // namespace esphome diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.cpp.save b/esphome/components/dynamic_lamp/dynamic_lamp.cpp.save new file mode 100644 index 0000000000..8be85cf3f4 --- /dev/null +++ b/esphome/components/dynamic_lamp/dynamic_lamp.cpp.save @@ -0,0 +1,57 @@ +#include "esphome/core/log.h" +#include "dynamic_lamp.h" + +namespace esphome { +namespace dynamic_lamp { + +static const char *TAG = "dynamic_lamp"; + +void DynamicLamp::setup() { + uint8_t i = 0; + bool valid = true; + this->save_mode_ = SAVE_MODE_NONE; //Currently only none & fram supported + + if(this->save_mode_ == 0) { + for (i=0; i < 16; i++) { + this->active_lamps_[i].active = false; + } + } else { + while(i < 16) { + this->restore_lamp_values_(i); + } + } +} + +void DynamicLamp::loop() { + +} + +void DynamicLamp::dump_config(){ + ESP_LOGCONFIG(TAG, "Dynamic Lamp feature loaded"); + switch(this->save_mode_) { + case SAVE_MODE_NONE: + ESP_LOGCONFIG(TAG, "Save mode set to NONE"); + case SAVE_MODE_FRAM: + ESP_LOGCONFIG(TAG, "Save mode set to FRAM"); + break; + default: + ESP_LOGCONFIG(TAG, "Currently only NONE(0) && FRAM(1) save modes supported, ignoring value %" PRIu8 " and defaulting to NONE!", this->save_mode_); + this->save_mode_ = 0; + } +} + +void DynamicLamp::set_lamp_count(uint8_t lamp_count) { + +} + +void DynamicLamp::set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value) { + +} + +void DynamicLamp::restore_lamp_values_(uint8_t lamp_number) { + switch(this->save_mode_) + this->active_lamps_[lamp_number].active = false; +} + +} // namespace dynamic_lamp +} // namespace esphome diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.h b/esphome/components/dynamic_lamp/dynamic_lamp.h new file mode 100644 index 0000000000..31186323a1 --- /dev/null +++ b/esphome/components/dynamic_lamp/dynamic_lamp.h @@ -0,0 +1,51 @@ +#pragma once + +#include "esphome/core/component.h" + +namespace esphome { +namespace dynamic_lamp { + +enum SupportedSaveModes : uint8_t { + SAVE_MODE_NONE = 0, + SAVE_MODE_FRAM = 1 +}; + +enum LinkedOutputModeIdx : uint8_t { + MODE_EQUAL = 0, + MODE_STATIC = 1, + MODE_PERCENT = 2, + MODE_FUNCTION = 3 +}; + +struct LinkedOutput { + bool active = false; + uint8_t mode = 0; + optional min_value; + optional max_value; + bool update_level = false; +}; + +struct CombinedLamp { + bool active = false; + LinkedOutput used_outputs[16]; +}; + +class DynamicLamp : public Component { + public: + void setup() override; + void loop() override; + void dump_config() override; + void set_lamp_count(uint8_t lamp_count); + + protected: + void restore_lamp_values_(uint8_t lamp_number); + void set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value); + + CombinedLamp active_lamps_[16]; + uint8_t lamp_count_; + uint8_t save_mode_; +}; + + +} // namespace dynamic_lamp +} // namespace esphome