From 67699e952eda9dd77d1e9cd1cf4d5c2f4ca7b358 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sat, 20 May 2023 21:31:39 +0200 Subject: [PATCH] removed shiftx --- TODO.md | 11 +++-- components/ehmtxv2/EHMTX.cpp | 76 ++++++++++++++++-------------- components/ehmtxv2/EHMTX.h | 3 +- components/ehmtxv2/EHMTX_queue.cpp | 28 +++++++---- 4 files changed, 68 insertions(+), 50 deletions(-) diff --git a/TODO.md b/TODO.md index e990520..25e8427 100644 --- a/TODO.md +++ b/TODO.md @@ -2,17 +2,18 @@ ## function +- [ ] screen_time on ms sec base +- [ ] scroll left to right +- [ ] seconds point moveable - [x] alarm on all screens but full screen - [x] indicator on all screens but full screen and clock - [x] refreshing an icon screen should extend the display time -- [ ] scroll left to right - [x] size of indicator and alarm - [x] center text - [x] alarm independent of screen - [x] del_screen with * and filter by type, do delete all clocks etc. - [x] force_screen with * and filter by type, do delete all clocks etc. - [x] gauge with color and del_gaugeall clocks etc. -- [ ] seconds point moveable - [x] seconds point to clock screen only - [x] rainbow icon and text - [x] del_slot still active? @@ -22,16 +23,16 @@ ## user experience - [ ] blueprints -- [x] Color in blueprints -- [ ] all modes in one blueprint - [ ] external HTML with more blueprint helpers (icons and modes) +- [ ] ~~all modes in one blueprint~~ +- [x] Color in blueprints - [x] default values for all functions - [x] provide sample font from [url](https://www.pentacom.jp/pentacom/bitfontmaker2/) - [x] start animation ## style -- [ ] in screen rename text_color to color +- [x] ~~in screen rename text_color to color~~ - [x] default_font before alarm parameter - [x] screen_time instead of showtime - [x] lifetime instead of durations diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index 941ad6a..e11d3b2 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -21,6 +21,7 @@ namespace esphome this->gauge_color = Color(CD_RED, CD_GREEN, CD_BLUE); this->gauge_value = 0; this->next_action_time = 0; + this->last_scroll_time = 0; this->screen_pointer = MAXQUEUE; for (uint8_t i = 0; i < MAXQUEUE; i++) @@ -370,64 +371,67 @@ namespace esphome if (this->is_running) { + if (millis() - this->last_scroll_time >= this->scroll_interval) + { + this->scroll_step++; + this->last_scroll_time = millis(); + if (this->scroll_step > this->queue[this->screen_pointer]->scroll_reset) + { + ESP_LOGD(TAG, "end scroll at: %d",this->scroll_step); + this->scroll_step = 0; + } + } + if (ts > this->next_action_time) { this->remove_expired_queue_element(); this->screen_pointer = this->find_last_clock(); + this->scroll_step = 0; + if (this->screen_pointer == MAXQUEUE) { this->screen_pointer = find_oldest_queue_element(); } - if (millis() - this->last_scroll_time >= this->scroll_interval) - { - this->scroll_step++; - this->last_scroll_time = millis(); - if (this->scroll_step > this->queue[this->screen_pointer]->pixels_ + 32) + if (this->screen_pointer != MAXQUEUE) + { + this->queue[this->screen_pointer]->last_time = ts + this->queue[this->screen_pointer]->screen_time_; + if (this->queue[this->screen_pointer]->icon < this->icon_count) { - this->scroll_step = 0; + this->icons[this->queue[this->screen_pointer]->icon]->set_frame(0); } - if (this->screen_pointer != MAXQUEUE) + this->next_action_time = this->queue[this->screen_pointer]->last_time; + // Todo switch for Triggers + if (this->queue[this->screen_pointer]->mode == MODE_CLOCK) { - this->scroll_step = 0; - this->queue[this->screen_pointer]->last_time = ts + this->queue[this->screen_pointer]->screen_time_; - if (this->queue[this->screen_pointer]->icon < this->icon_count) + for (auto *t : on_next_clock_triggers_) { - this->icons[this->queue[this->screen_pointer]->icon]->set_frame(0); - } - this->next_action_time = this->queue[this->screen_pointer]->last_time; - // Todo switch for Triggers - if (this->queue[this->screen_pointer]->mode == MODE_CLOCK) - { - for (auto *t : on_next_clock_triggers_) - { - t->process(); - } - } - else - { - for (auto *t : on_next_screen_triggers_) - { - t->process(this->queue[this->screen_pointer]->icon_name, this->queue[this->screen_pointer]->text); - } + t->process(); } } else { - ESP_LOGW(TAG, "tick: nothing to do. Restarting clock display!"); - this->clock_screen(24 * 60, this->clock_time, false, C_RED, C_GREEN, C_BLUE); - this->date_screen(24 * 60, (int)this->clock_time / 2, false, C_RED, C_GREEN, C_BLUE); - this->next_action_time = ts + this->clock_time; + for (auto *t : on_next_screen_triggers_) + { + t->process(this->queue[this->screen_pointer]->icon_name, this->queue[this->screen_pointer]->text); + } } } + else + { + ESP_LOGW(TAG, "tick: nothing to do. Restarting clock display!"); + this->clock_screen(24 * 60, this->clock_time, false, C_RED, C_GREEN, C_BLUE); + this->date_screen(24 * 60, (int)this->clock_time / 2, false, C_RED, C_GREEN, C_BLUE); + this->next_action_time = ts + this->clock_time; + } } } else - { - uint8_t w = (1 + (uint8_t)(32 / 16) * (this->boot_anim / 16)) % 32; - this->display->rectangle(0, 2, w, 4, this->rainbow_color); // Color(120, 190, 40)); - this->boot_anim++; - } + { + uint8_t w = (1 + (uint8_t)(32 / 16) * (this->boot_anim / 16)) % 32; + this->display->rectangle(0, 2, w, 4, this->rainbow_color); // Color(120, 190, 40)); + this->boot_anim++; + } } void EHMTX::skip_screen() diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index c475da7..037aa98 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -95,6 +95,7 @@ namespace esphome uint16_t frame_interval; // ms to next_frame() uint16_t clock_interval; uint16_t hold_time; // seconds display of screen_time to extend + uint8_t icon_count; // max iconnumber -1 unsigned long last_scroll_time; unsigned long last_rainbow_time; @@ -141,7 +142,6 @@ namespace esphome void hide_gauge(); void hide_indicator(); void hide_alarm(); - void full_screen(std::string icon, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME); void icon_screen(std::string icon, std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME,bool default_font=true,int r=C_RED, int g=C_GREEN, int b=C_BLUE); void text_screen(std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true, int r=C_RED, int g=C_GREEN, int b=C_BLUE); @@ -182,6 +182,7 @@ namespace esphome time_t endtime; time_t last_time; uint8_t icon; + uint16_t scroll_reset; Color text_color; show_mode mode; diff --git a/components/ehmtxv2/EHMTX_queue.cpp b/components/ehmtxv2/EHMTX_queue.cpp index a7124ab..34422c9 100644 --- a/components/ehmtxv2/EHMTX_queue.cpp +++ b/components/ehmtxv2/EHMTX_queue.cpp @@ -64,6 +64,7 @@ namespace esphome { uint8_t width = 32; uint8_t startx = 0; + int result = 0; switch (this->mode) { case MODE_RAINBOW_ICON: @@ -86,26 +87,27 @@ namespace esphome { if (this->pixels_ < width) { - return 32 - ceil((width - this->pixels_) / 2); + result = 32 - ceil((width - this->pixels_) / 2); } else { - return startx + this->config_->scroll_step; + result = startx + this->config_->scroll_step; } } else { if (this->pixels_ < width) { - return startx + ceil((width - this->pixels_) / 2); + result = startx + ceil((width - this->pixels_) / 2); } else { - return startx - this->config_->scroll_step + width; + result = startx - this->config_->scroll_step + width; } } + return result; } - + void EHMTX_queue::update_screen() { if (millis() - this->config_->last_rainbow_time >= this->config_->rainbow_interval) @@ -259,6 +261,11 @@ namespace esphome { int x, y, w, h; float display_duration; + + uint8_t width = 32; + uint8_t startx = 0; + uint16_t max_steps = 0; + if (this->default_font) { this->config_->display->get_text_bounds(0, 0, text.c_str(), this->config_->default_font, display::TextAlign::LEFT, &x, &y, &w, &h); @@ -282,12 +289,14 @@ namespace esphome } else { - display_duration = ceil((28 + (this->config_->scroll_count * (32 + this->pixels_)) * this->config_->scroll_interval) / 1000); + max_steps = (this->config_->scroll_count + 1) * (width - startx) + this->config_->scroll_count * this->pixels_; + display_duration = ceil((max_steps * this->config_->scroll_interval) / 1000); this->screen_time_ = (display_duration > screen_time) ? display_duration : screen_time; } break; case MODE_RAINBOW_ICON: case MODE_ICON_SCREEN: + startx = 8; if (this->pixels_ < 23) { this->screen_time_ = screen_time; @@ -295,7 +304,8 @@ namespace esphome } else { - display_duration = ceil((this->config_->scroll_count * (TEXTSTARTOFFSET + this->pixels_) * this->config_->scroll_interval) / 1000); + max_steps = (this->config_->scroll_count + 1) * (width - startx) + this->config_->scroll_count * this->pixels_; + display_duration = ceil((max_steps * this->config_->scroll_interval) / 1000); this->screen_time_ = (display_duration > screen_time) ? display_duration : screen_time; } break; @@ -303,6 +313,8 @@ namespace esphome break; } - ESP_LOGD(TAG, "calc_scroll_time: mode: %d text: \"%s\" pixels %d calculated: %d defined: %d", this->mode, text.c_str(), this->pixels_, this->screen_time_, screen_time); + this->scroll_reset = (width - startx) + this->pixels_;; + + ESP_LOGD(TAG, "calc_scroll_time: mode: %d text: \"%s\" pixels %d calculated: %d defined: %d max_steps: %d", this->mode, text.c_str(), this->pixels_, this->screen_time_, screen_time, this->scroll_reset); } }