mirror of
https://github.com/esphome/esphome.git
synced 2026-10-12 17:23:04 +00:00
83 lines
2.3 KiB
C++
83 lines
2.3 KiB
C++
#include "epaper_spi_4bpp.h"
|
|
|
|
#include "esphome/core/log.h"
|
|
|
|
namespace esphome::epaper_spi {
|
|
|
|
static constexpr const char *const TAG = "epaper_spi.4bpp";
|
|
|
|
void EPaper4bpp::fill(Color color) {
|
|
// If clipping is active, fall back to base implementation
|
|
if (this->get_clipping().is_set()) {
|
|
EPaperBase::fill(color);
|
|
return;
|
|
}
|
|
|
|
auto pixel_color = this->color_to_native(color);
|
|
|
|
// We store 2 pixels per byte
|
|
this->buffer_.fill(pixel_color + (pixel_color << 4));
|
|
|
|
// Whole buffer just changed; mark the entire canvas dirty.
|
|
this->x_low_ = 0;
|
|
this->y_low_ = 0;
|
|
this->x_high_ = this->width_;
|
|
this->y_high_ = this->height_;
|
|
}
|
|
|
|
void EPaper4bpp::clear() {
|
|
// clear buffer to white, just like real paper.
|
|
this->fill(COLOR_ON);
|
|
}
|
|
|
|
void HOT EPaper4bpp::draw_pixel_at(int x, int y, Color color) {
|
|
if (!this->rotate_coordinates_(x, y))
|
|
return;
|
|
auto pixel_bits = this->color_to_native(color);
|
|
uint32_t pixel_position = x + y * this->get_width_internal();
|
|
uint32_t byte_position = pixel_position / 2;
|
|
auto original = this->buffer_[byte_position];
|
|
if ((pixel_position & 1) != 0) {
|
|
this->buffer_[byte_position] = (original & 0xF0) | pixel_bits;
|
|
} else {
|
|
this->buffer_[byte_position] = (original & 0x0F) | (pixel_bits << 4);
|
|
}
|
|
}
|
|
|
|
bool HOT EPaper4bpp::transfer_data() {
|
|
const uint32_t start_time = App.get_loop_component_start_time();
|
|
const size_t buffer_length = this->buffer_length_;
|
|
if (this->current_data_index_ == 0) {
|
|
this->command(CMD_TRANSFER_DATA);
|
|
}
|
|
|
|
size_t buf_idx = 0;
|
|
uint8_t bytes_to_send[MAX_TRANSFER_SIZE];
|
|
while (this->current_data_index_ != buffer_length) {
|
|
bytes_to_send[buf_idx++] = this->buffer_[this->current_data_index_++];
|
|
|
|
if (buf_idx == sizeof bytes_to_send) {
|
|
this->start_data_();
|
|
this->write_array(bytes_to_send, buf_idx);
|
|
this->disable();
|
|
ESP_LOGV(TAG, "Wrote %d bytes at %ums", buf_idx, (unsigned) millis());
|
|
buf_idx = 0;
|
|
|
|
if (millis() - start_time > MAX_TRANSFER_TIME) {
|
|
// Let the main loop run and come back next loop
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
// Finished the entire dataset
|
|
if (buf_idx != 0) {
|
|
this->start_data_();
|
|
this->write_array(bytes_to_send, buf_idx);
|
|
this->disable();
|
|
}
|
|
this->current_data_index_ = 0;
|
|
return true;
|
|
}
|
|
|
|
} // namespace esphome::epaper_spi
|