ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
lcd_menu.cpp
Go to the documentation of this file.
1#include "lcd_menu.h"
2#include "esphome/core/log.h"
3#include <algorithm>
4
6
7ESPHOME_LOG_TAG(TAG, "lcd_menu");
8
10 if (this->display_->is_failed()) {
11 this->mark_failed(LOG_STR("The connected display failed, the menu is disabled"));
12 return;
13 }
14
16}
17
19
21 ESP_LOGCONFIG(TAG,
22 "LCD Menu\n"
23 " Columns: %u, Rows: %u\n"
24 " Mark characters: %02x, %02x, %02x, %02x",
25 this->columns_, this->rows_, this->mark_selected_, this->mark_editing_, this->mark_submenu_,
26 this->mark_back_);
27}
28
29void LCDCharacterMenuComponent::draw_item(const display_menu_base::MenuItem *item, uint8_t row, bool selected) {
30 char data[this->columns_ + 1]; // Bounded to 65 through the config
31
32 memset(data, ' ', this->columns_);
33
34 if (selected) {
35 data[0] = (this->editing_ || (this->mode_ == display_menu_base::MENU_MODE_JOYSTICK && item->get_immediate_edit()))
36 ? this->mark_editing_
37 : this->mark_selected_;
38 }
39
40 switch (item->get_type()) {
42 data[this->columns_ - 1] = this->mark_submenu_;
43 break;
45 data[this->columns_ - 1] = this->mark_back_;
46 break;
47 default:
48 break;
49 }
50
51 auto text = item->get_text();
52 size_t n = std::min(text.size(), (size_t) this->columns_ - 2);
53 memcpy(data + 1, item->get_text().c_str(), n);
54
55 if (item->has_value()) {
56 std::string value = item->get_value_text();
57
58 // Maximum: start mark, at least two chars of label, space, '[', value, ']',
59 // end mark. Config guarantees columns >= 12
60 size_t val_width = std::min((size_t) this->columns_ - 7, value.length());
61 memcpy(data + this->columns_ - val_width - 4, " [", 2);
62 memcpy(data + this->columns_ - val_width - 2, value.c_str(), val_width);
63 data[this->columns_ - 2] = ']';
64 }
65
66 data[this->columns_] = '\0';
67
68 this->display_->print(0, row, data);
69}
70
71} // namespace esphome::lcd_menu
void mark_failed()
Mark this component as failed.
virtual void setup()
Where the component's initialization should happen.
Definition component.cpp:84
bool is_failed() const
Definition component.h:274
virtual std::string get_value_text() const
Definition menu_item.h:53
virtual bool has_value() const
Definition menu_item.h:52
MenuItemType get_type() const
Definition menu_item.h:44
virtual bool get_immediate_edit() const
Definition menu_item.h:51
void print(uint8_t column, uint8_t row, const char *str)
Print the given text at the specified column and row.
void draw_item(const display_menu_base::MenuItem *item, uint8_t row, bool selected) override
Definition lcd_menu.cpp:29
ESPHOME_LOG_TAG(TAG, "lcd_menu")
constexpr float PROCESSOR
For components that use data from sensors like displays.
Definition component.h:47