bitmap screen

pull/17/head
LuBeDa 3 years ago
parent 27f43f8b95
commit 9d262dc530

@ -151,6 +151,22 @@ full_screen => {"icon_name", "lifetime", "screen_time"}
void full_screen(string iconname, int =D_LIFETIME, int screen_time=D_SCREEN_TIME); void full_screen(string iconname, int =D_LIFETIME, int screen_time=D_SCREEN_TIME);
``` ```
##### bitmap screen
For 8x32 images as text. You can generate this images with e.g. [Pixel Bitmap Creator (8x32)](https://pixelit.bastelbunker.de/PixelCreator)
###### service via API
```c
bitmap_screen => {"[0,4523,0,2342,0,..... (256 values 16bit values rgb565)]", "lifetime", "screen_time"}
```
###### Lambda
```c
void bitmap_screen(string text, int =D_LIFETIME, int screen_time=D_SCREEN_TIME);
```
#### Display Elements #### Display Elements
![elements](./images/elements.png) ![elements](./images/elements.png)

@ -9,7 +9,7 @@ namespace esphome
this->display_indicator = 0; this->display_indicator = 0;
this->display_alarm = 0; this->display_alarm = 0;
this->clock_time = 10; this->clock_time = 10;
this->clock_intervall = 90; this->clock_interval = 90;
this->hold_time = 10; this->hold_time = 10;
this->icon_count = 0; this->icon_count = 0;
this->hue_ = 0; this->hue_ = 0;
@ -29,8 +29,6 @@ namespace esphome
{ {
this->queue[i] = new EHMTX_queue(this); this->queue[i] = new EHMTX_queue(this);
} }
this->clock_screen(14 * 24 * 60, this->clock_time, false, C_RED, C_GREEN, C_BLUE);
this->date_screen(14 * 24 * 60, (int)this->clock_time / 2, false, C_RED, C_GREEN, C_BLUE);
} }
void EHMTX::set_time_format(std::string s) void EHMTX::set_time_format(std::string s)
@ -105,12 +103,38 @@ namespace esphome
} }
} }
void EHMTX::get_string(std::string text) void EHMTX::bitmap_screen(std::string text, int lifetime, int screen_time)
{ {
ESP_LOGD(TAG, "get_string: %s",text.c_str()); ESP_LOGD(TAG, "bitmap screen: lifetime: %d screen_time: %d", lifetime, screen_time);
json::parse_json(text,[](JsonObject root) { const size_t CAPACITY = JSON_ARRAY_SIZE(256);
ESP_LOGD(TAG, "string1: %s int1", root["string"],root["int"]); StaticJsonDocument<CAPACITY> doc;
}); deserializeJson(doc, text);
JsonArray array = doc.as<JsonArray>();
// extract the values
uint16_t i = 0;
for (JsonVariant v : array)
{
uint16_t buf = v.as<int>();
unsigned char b = (((buf)&0x001F) << 3);
unsigned char g = (((buf)&0x07E0) >> 3); // Fixed: shift >> 5 and << 2
unsigned char r = (((buf)&0xF800) >> 8); // shift >> 11 and << 3
Color c = Color(r, g, b);
this->bitmap[i++] = c;
}
EHMTX_queue *screen = this->find_free_queue_element();
screen->text = "";
screen->endtime = this->clock->now().timestamp + lifetime * 60;
screen->mode = MODE_BITMAP_SCREEN;
screen->screen_time_ = screen_time;
for (auto *t : on_add_screen_triggers_)
{
t->process("bitmap", (uint8_t)screen->mode);
}
screen->status();
} }
uint8_t EHMTX::find_icon(std::string name) uint8_t EHMTX::find_icon(std::string name)
@ -198,6 +222,7 @@ namespace esphome
register_service(&EHMTX::rainbow_text_screen, "rainbow_text_screen", {"text", "lifetime", "screen_time", "default_font"}); register_service(&EHMTX::rainbow_text_screen, "rainbow_text_screen", {"text", "lifetime", "screen_time", "default_font"});
register_service(&EHMTX::clock_screen, "clock_screen", {"lifetime", "screen_time", "default_font", "r", "g", "b"}); register_service(&EHMTX::clock_screen, "clock_screen", {"lifetime", "screen_time", "default_font", "r", "g", "b"});
register_service(&EHMTX::bitmap_screen, "bitmap_screen", {"text", "lifetime", "screen_time"});
register_service(&EHMTX::rainbow_clock_screen, "rainbow_clock_screen", {"lifetime", "screen_time", "default_font"}); register_service(&EHMTX::rainbow_clock_screen, "rainbow_clock_screen", {"lifetime", "screen_time", "default_font"});
register_service(&EHMTX::date_screen, "date_screen", {"lifetime", "screen_time", "default_font", "r", "g", "b"}); register_service(&EHMTX::date_screen, "date_screen", {"lifetime", "screen_time", "default_font", "r", "g", "b"});
@ -244,6 +269,8 @@ namespace esphome
if (this->clock->now().is_valid()) if (this->clock->now().is_valid())
{ {
ESP_LOGD(TAG, "time sync => start running"); ESP_LOGD(TAG, "time sync => start running");
this->clock_screen(14 * 24 * 60, this->clock_time, false, C_RED, C_GREEN, C_BLUE);
this->date_screen(14 * 24 * 60, (int)this->clock_time / 2, false, C_RED, C_GREEN, C_BLUE);
this->is_running = true; this->is_running = true;
} }
} }
@ -329,7 +356,7 @@ namespace esphome
this->queue[i]->endtime = 0; this->queue[i]->endtime = 0;
if (this->queue[i]->mode != MODE_EMPTY) if (this->queue[i]->mode != MODE_EMPTY)
{ {
ESP_LOGD(TAG, "remove expired queue element: slot %d: icon_name: %s text: %s", i, this->queue[i]->icon_name.c_str(), this->queue[i]->text.c_str()); ESP_LOGD(TAG, "remove expired queue element: slot %d: mode: %d icon_name: %s text: %s", i, this->queue[i]->mode, this->queue[i]->icon_name.c_str(), this->queue[i]->text.c_str());
for (auto *t : on_expired_screen_triggers_) for (auto *t : on_expired_screen_triggers_)
{ {
infotext = ""; infotext = "";
@ -912,6 +939,10 @@ namespace esphome
{ {
ESP_LOGCONFIG(TAG, "weekstart: sunday"); ESP_LOGCONFIG(TAG, "weekstart: sunday");
} }
if (this->clock->now().is_valid())
{
this->is_running = true;
}
} }
void EHMTX::add_icon(EHMTX_Icon *icon) void EHMTX::add_icon(EHMTX_Icon *icon)

@ -23,7 +23,7 @@ const uint8_t TEXTSTARTOFFSET = (32 - 8);
const uint16_t POLLINGINTERVAL = 1000; const uint16_t POLLINGINTERVAL = 1000;
static const char *const EHMTX_VERSION = "Version: 2023.5.0 beta"; static const char *const EHMTX_VERSION = "Version: 2023.5.0 beta";
static const char *const TAG = "EHMTXv2"; static const char *const TAG = "EHMTXv2";
enum show_mode : uint8_t { MODE_EMPTY = 0,MODE_BLANK = 1, MODE_CLOCK = 2, MODE_DATE = 3, MODE_FULL_SCREEN = 4, MODE_ICON_SCREEN = 5, MODE_TEXT_SCREEN = 6 , MODE_RAINBOW_ICON = 7,MODE_RAINBOW_TEXT = 8, MODE_RAINBOW_CLOCK = 9,MODE_RAINBOW_DATE=10 }; enum show_mode : uint8_t { MODE_EMPTY = 0,MODE_BLANK = 1, MODE_CLOCK = 2, MODE_DATE = 3, MODE_FULL_SCREEN = 4, MODE_ICON_SCREEN = 5, MODE_TEXT_SCREEN = 6 , MODE_RAINBOW_ICON = 7,MODE_RAINBOW_TEXT = 8, MODE_RAINBOW_CLOCK = 9,MODE_RAINBOW_DATE=10,MODE_BITMAP_SCREEN=11 };
namespace esphome namespace esphome
{ {
@ -72,6 +72,7 @@ namespace esphome
uint16_t clock_time; uint16_t clock_time;
uint16_t scroll_step; uint16_t scroll_step;
uint8_t scroll_count; uint8_t scroll_count;
Color bitmap[256];
void remove_expired_queue_element(); void remove_expired_queue_element();
uint8_t find_oldest_queue_element(); uint8_t find_oldest_queue_element();
uint8_t find_icon_in_queue(std::string); uint8_t find_icon_in_queue(std::string);
@ -149,6 +150,7 @@ namespace esphome
void clock_screen(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 clock_screen(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 date_screen(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 date_screen(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 blank_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME); void blank_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME);
void bitmap_screen(std::string text,int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME);
void rainbow_icon_screen(std::string icon_name, std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true); void rainbow_icon_screen(std::string icon_name, std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true);
void rainbow_text_screen(std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true); void rainbow_text_screen(std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true);
void rainbow_clock_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true); void rainbow_clock_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true);

@ -54,6 +54,9 @@ namespace esphome
case MODE_RAINBOW_DATE: case MODE_RAINBOW_DATE:
ESP_LOGD(TAG, "queue: date for: %d sec", this->screen_time_); ESP_LOGD(TAG, "queue: date for: %d sec", this->screen_time_);
break; break;
case MODE_BITMAP_SCREEN:
ESP_LOGD(TAG, "queue: bitmap for: %d sec", this->screen_time_);
break;
default: default:
ESP_LOGD(TAG, "queue: UPPS"); ESP_LOGD(TAG, "queue: UPPS");
break; break;
@ -148,6 +151,15 @@ namespace esphome
break; break;
case MODE_BLANK: case MODE_BLANK:
break; break;
case MODE_BITMAP_SCREEN:
for (uint8_t x = 0; x < 32; x++)
{
for (uint8_t y = 0; y < 8; y++)
{
this->config_->display->draw_pixel_at(x, y, this->config_->bitmap[x + y * 32]);
}
}
break;
case MODE_RAINBOW_CLOCK: case MODE_RAINBOW_CLOCK:
case MODE_CLOCK: case MODE_CLOCK:
if (this->config_->clock->now().is_valid()) // valid time if (this->config_->clock->now().is_valid()) // valid time

Loading…
Cancel
Save