8#include <hal/gpio_hal.h>
12static const char *
const TAG =
"inkplate";
16 this->
pin_lut_[i] = ((i & 0b00000011) << 4) | (((i & 0b00001100) >> 2) << 18) | (((i & 0b00010000) >> 4) << 23) |
17 (((i & 0b11100000) >> 5) << 25);
79 if (this->
glut_ !=
nullptr) {
81 this->
glut_ =
nullptr;
83 if (this->
glut2_ !=
nullptr) {
90 ESP_LOGE(TAG,
"Could not allocate buffer for display!");
96 if (this->
glut_ ==
nullptr) {
97 ESP_LOGE(TAG,
"Could not allocate glut!");
102 if (this->
glut2_ ==
nullptr) {
103 ESP_LOGE(TAG,
"Could not allocate glut2!");
108 for (uint8_t i = 0; i < GLUT_SIZE; i++) {
109 for (
uint32_t j = 0; j < 256; j++) {
111 this->
glut_[i * 256 + j] = ((
z & 0b00000011) << 4) | (((
z & 0b00001100) >> 2) << 18) |
112 (((
z & 0b00010000) >> 4) << 23) | (((
z & 0b11100000) >> 5) << 25);
114 this->
glut2_[i * 256 + j] = ((
z & 0b00000011) << 4) | (((
z & 0b00001100) >> 2) << 18) |
115 (((
z & 0b00010000) >> 4) << 23) | (((
z & 0b11100000) >> 5) << 25);
122 ESP_LOGE(TAG,
"Could not allocate partial buffer for display!");
128 ESP_LOGE(TAG,
"Could not allocate partial buffer 2 for display!");
137 memset(this->
buffer_, 0, buffer_size);
180 uint8_t gs = ((color.
red * 2126 / 10000) + (color.
green * 7152 / 10000) + (color.
blue * 722 / 10000)) >> 5;
181 this->
buffer_[
pos] = (PIXEL_MASK_GLUT[x_sub] & current) | (x_sub ? gs : gs << 4);
193 LOG_DISPLAY(
"",
"Inkplate",
this);
196 " Partial Updating: %s\n"
197 " Full Update Every: %" PRIu32,
200 LOG_PIN(
" CKV Pin: ", this->
ckv_pin_);
201 LOG_PIN(
" CL Pin: ", this->
cl_pin_);
204 LOG_PIN(
" LE Pin: ", this->
le_pin_);
205 LOG_PIN(
" OE Pin: ", this->
oe_pin_);
207 LOG_PIN(
" SPH Pin: ", this->
sph_pin_);
208 LOG_PIN(
" SPV Pin: ", this->
spv_pin_);
221 LOG_UPDATE_INTERVAL(
this);
225 ESP_LOGV(TAG,
"Eink off called");
253 ESP_LOGV(TAG,
"Eink on called");
282 if ((
millis() - timer) >= 250) {
283 ESP_LOGW(TAG,
"Power supply not detected");
298 return data == 0b11111010;
304 ESP_LOGV(TAG,
"Fill called");
309 Display::fill(color);
310 ESP_LOGV(TAG,
"Fill finished (%" PRIu32
"ms)",
millis() - start_time);
315 uint8_t
fill = ((color.
red * 2126 / 10000) + (color.
green * 7152 / 10000) + (color.
blue * 722 / 10000)) >> 5;
318 uint8_t
fill = color.
is_on() ? 0x00 : 0xFF;
322 ESP_LOGV(TAG,
"Fill finished (%" PRIu32
"ms)",
millis() - start_time);
326 ESP_LOGV(TAG,
"Display called");
333 ESP_LOGV(TAG,
"Display finished (partial) (%" PRIu32
"ms)",
millis() - start_time);
338 ESP_LOGV(TAG,
"Display finished (full) (%" PRIu32
"ms)",
millis() - start_time);
342 ESP_LOGV(TAG,
"Display1b called");
348 uint8_t buffer_value;
349 const uint8_t *buffer_ptr;
413 ESP_LOGV(TAG,
"Display1b start loops (%" PRIu32
"ms)",
millis() - start_time);
415 for (uint8_t k = 0; k < rep; k++) {
419 buffer_value = *(buffer_ptr--);
420 data = this->
model_ ==
INKPLATE_6_PLUS ? LUTW[(~buffer_value >> 4) & 0x0F] : LUTB[(buffer_value >> 4) & 0x0F];
423 GPIO.out_w1ts = this->
pin_lut_[data] | clock;
424 GPIO.out_w1tc = data_mask | clock;
427 buffer_value = *(buffer_ptr--);
428 data = this->
model_ ==
INKPLATE_6_PLUS ? LUTW[(~buffer_value >> 4) & 0x0F] : LUTB[(buffer_value >> 4) & 0x0F];
429 GPIO.out_w1ts = this->
pin_lut_[data] | clock;
430 GPIO.out_w1tc = data_mask | clock;
432 GPIO.out_w1ts = this->
pin_lut_[data] | clock;
433 GPIO.out_w1tc = data_mask | clock;
437 GPIO.out_w1ts = clock;
438 GPIO.out_w1tc = data_mask | clock;
444 ESP_LOGV(TAG,
"Display1b first loop x %d (%" PRIu32
"ms)", 4,
millis() - start_time);
449 buffer_value = *(buffer_ptr--);
450 data = this->
model_ ==
INKPLATE_6_PLUS ? LUTB[(buffer_value >> 4) & 0x0F] : LUT2[(buffer_value >> 4) & 0x0F];
453 GPIO.out_w1ts = this->
pin_lut_[data] | clock;
454 GPIO.out_w1tc = data_mask | clock;
457 buffer_value = *(buffer_ptr--);
458 data = this->
model_ ==
INKPLATE_6_PLUS ? LUTB[(buffer_value >> 4) & 0x0F] : LUT2[(buffer_value >> 4) & 0x0F];
459 GPIO.out_w1ts = this->
pin_lut_[data] | clock;
460 GPIO.out_w1tc = data_mask | clock;
462 GPIO.out_w1ts = this->
pin_lut_[data] | clock;
463 GPIO.out_w1tc = data_mask | clock;
467 GPIO.out_w1ts = clock;
468 GPIO.out_w1tc = data_mask | clock;
473 ESP_LOGV(TAG,
"Display1b second loop (%" PRIu32
"ms)",
millis() - start_time);
483 GPIO.out_w1ts = send | clock;
484 GPIO.out_w1tc = data_mask | clock;
486 GPIO.out_w1ts = send | clock;
487 GPIO.out_w1tc = data_mask | clock;
488 GPIO.out_w1ts = send | clock;
489 GPIO.out_w1tc = data_mask | clock;
493 GPIO.out_w1ts = clock;
494 GPIO.out_w1tc = data_mask | clock;
499 ESP_LOGV(TAG,
"Display1b third loop (%" PRIu32
"ms)",
millis() - start_time);
505 ESP_LOGV(TAG,
"Display1b finished (%" PRIu32
"ms)",
millis() - start_time);
509 ESP_LOGV(TAG,
"Display3b called");
583 uint8_t glut_size = 9;
584 for (
int k = 0; k < glut_size; k++) {
589 data |= this->
glut_[k * 256 + this->buffer_[--
pos]];
591 data = this->
glut2_[k * 256 + this->buffer_[--
pos]];
592 data |= this->
glut_[k * 256 + this->buffer_[--
pos]];
593 GPIO.out_w1ts = data | clock;
594 GPIO.out_w1tc = data_mask | clock;
597 data = this->
glut2_[k * 256 + this->buffer_[--
pos]];
598 data |= this->
glut_[k * 256 + this->buffer_[--
pos]];
599 GPIO.out_w1ts = data | clock;
600 GPIO.out_w1tc = data_mask | clock;
601 data = this->
glut2_[k * 256 + this->buffer_[--
pos]];
602 data |= this->
glut_[k * 256 + this->buffer_[--
pos]];
603 GPIO.out_w1ts = data | clock;
604 GPIO.out_w1tc = data_mask | clock;
608 GPIO.out_w1ts = clock;
609 GPIO.out_w1tc = data_mask | clock;
618 ESP_LOGV(TAG,
"Display3b finished (%" PRIu32
"ms)",
millis() - start_time);
622 ESP_LOGV(TAG,
"Partial update called");
633 uint8_t diffw, diffb;
645 ESP_LOGV(TAG,
"Partial update buffer built after (%" PRIu32
"ms)",
millis() - start_time);
652 for (
int k = 0; k < rep; k++) {
656 data = *(data_ptr--);
659 data = *(data_ptr--);
660 GPIO.out_w1ts = this->
pin_lut_[data] | clock;
661 GPIO.out_w1tc = data_mask | clock;
665 GPIO.out_w1ts = clock;
666 GPIO.out_w1tc = data_mask | clock;
671 ESP_LOGV(TAG,
"Partial update loop k=%d (%" PRIu32
"ms)", k,
millis() - start_time);
679 ESP_LOGV(TAG,
"Partial update finished (%" PRIu32
"ms)",
millis() - start_time);
710 GPIO.out_w1ts = d | clock;
724 ESP_LOGV(TAG,
"Clean called");
734 ESP_LOGV(TAG,
"Clean finished (%" PRIu32
"ms)",
millis() - start_time);
738 ESP_LOGV(TAG,
"Clean fast called with: (%d, %d)", c, rep);
753 uint32_t send = ((data & 0b00000011) << 4) | (((data & 0b00001100) >> 2) << 18) | (((data & 0b00010000) >> 4) << 23) |
754 (((data & 0b11100000) >> 5) << 25);
757 for (
int k = 0; k < rep; k++) {
761 GPIO.out_w1ts = send | clock;
762 GPIO.out_w1tc = clock;
764 GPIO.out_w1ts = clock;
765 GPIO.out_w1tc = clock;
766 GPIO.out_w1ts = clock;
767 GPIO.out_w1tc = clock;
771 GPIO.out_w1ts = send | clock;
772 GPIO.out_w1tc = clock;
777 ESP_LOGV(TAG,
"Clean fast rep loop %d finished (%" PRIu32
"ms)", k,
millis() - start_time);
779 ESP_LOGV(TAG,
"Clean fast finished (%" PRIu32
"ms)",
millis() - start_time);
void mark_failed()
Mark this component as failed.
virtual void pin_mode(gpio::Flags flags)=0
virtual void digital_write(bool value)=0
virtual uint8_t get_pin() const =0
An STL allocator that uses SPI or internal RAM.
void deallocate(T *p, size_t n)
Rect get_clipping() const
Get the current the clipping rectangle.
bool write_byte(uint8_t a_register, uint8_t data) const
ErrorCode read_register(uint8_t a_register, uint8_t *data, size_t len)
reads an array of bytes from a specific register in the I²C device
bool write_bytes(uint8_t a_register, const uint8_t *data, uint8_t len) const
size_t get_buffer_length_()
InternalGPIOPin * cl_pin_
void fill(Color color) override
InternalGPIOPin * display_data_0_pin_
uint32_t partial_updates_
void clean_fast_(uint8_t c, uint8_t rep)
void hscan_start_(uint32_t d)
InternalGPIOPin * display_data_7_pin_
InternalGPIOPin * le_pin_
uint32_t get_data_pin_mask_()
InternalGPIOPin * display_data_4_pin_
GPIOPin * gpio0_enable_pin_
InternalGPIOPin * display_data_1_pin_
void draw_absolute_pixel_internal(int x, int y, Color color) override
uint32_t full_update_every_
uint8_t waveform_[GLUT_COUNT][GLUT_SIZE]
void dump_config() override
int get_width_internal() override
InternalGPIOPin * display_data_6_pin_
bool read_power_status_()
InternalGPIOPin * display_data_3_pin_
InternalGPIOPin * display_data_5_pin_
InternalGPIOPin * display_data_2_pin_
int get_height_internal() override
float get_setup_priority() const override
uint8_t * partial_buffer_2_
void initialize_()
Allocate buffers.
uint8_t * partial_buffer_
@ ERROR_OK
No error found during execution of method.
constexpr float PROCESSOR
For components that use data from sensors like displays.
void IRAM_ATTR HOT delayMicroseconds(uint32_t us)
void HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()
bool is_on() ESPHOME_ALWAYS_INLINE