16  GxEPD2_EPD(cs, dc, rst, busy, LOW, 10000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
 
 
   32  for (uint32_t i = 0; i < uint32_t(
WIDTH) * uint32_t(
HEIGHT) / 8; i++)
 
   39    for (uint32_t i = 0; i < uint32_t(
WIDTH) * uint32_t(
HEIGHT) / 8; i++)
 
 
   46void GxEPD2_290_T5::writeImage(
const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
   50  int16_t wb = (w + 7) / 8; 
 
   53  int16_t x1 = x < 0 ? 0 : x; 
 
   54  int16_t y1 = y < 0 ? 0 : y; 
 
   55  int16_t w1 = x + w < int16_t(
WIDTH) ? w : int16_t(
WIDTH) - x; 
 
   56  int16_t h1 = y + h < int16_t(
HEIGHT) ? h : int16_t(
HEIGHT) - y; 
 
   61  if ((w1 <= 0) || (h1 <= 0)) 
return;
 
   64  _setPartialRamArea(x1, y1, w1, h1);
 
   66  for (int16_t i = 0; i < h1; i++)
 
   68    for (int16_t j = 0; j < w1 / 8; j++)
 
   72      int16_t idx = mirror_y ? j + dx / 8 + ((h - 1 - (i + dy))) * wb : j + dx / 8 + (i + dy) * wb;
 
   75#if defined(__AVR) || defined(ESP8266) || defined(ESP32) 
   76        data = pgm_read_byte(&bitmap[idx]);
 
   85      if (invert) data = ~data;
 
 
   94                                   int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
   98  if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) 
return;
 
   99  if ((x_part < 0) || (x_part >= w_bitmap)) 
return;
 
  100  if ((y_part < 0) || (y_part >= h_bitmap)) 
return;
 
  101  int16_t wb_bitmap = (w_bitmap + 7) / 8; 
 
  102  x_part -= x_part % 8; 
 
  103  w = w_bitmap - x_part < w ? w_bitmap - x_part : w; 
 
  104  h = h_bitmap - y_part < h ? h_bitmap - y_part : h; 
 
  106  w = 8 * ((w + 7) / 8); 
 
  107  int16_t x1 = x < 0 ? 0 : x; 
 
  108  int16_t y1 = y < 0 ? 0 : y; 
 
  109  int16_t w1 = x + w < int16_t(
WIDTH) ? w : int16_t(
WIDTH) - x; 
 
  110  int16_t h1 = y + h < int16_t(
HEIGHT) ? h : int16_t(
HEIGHT) - y; 
 
  115  if ((w1 <= 0) || (h1 <= 0)) 
return;
 
  118  _setPartialRamArea(x1, y1, w1, h1);
 
  120  for (int16_t i = 0; i < h1; i++)
 
  122    for (int16_t j = 0; j < w1 / 8; j++)
 
  126      int16_t idx = mirror_y ? x_part / 8 + j + dx / 8 + ((h_bitmap - 1 - (y_part + i + dy))) * wb_bitmap : x_part / 8 + j + dx / 8 + (y_part + i + dy) * wb_bitmap;
 
  129#if defined(__AVR) || defined(ESP8266) || defined(ESP32) 
  130        data = pgm_read_byte(&bitmap[idx]);
 
  139      if (invert) data = ~data;
 
 
  147void GxEPD2_290_T5::writeImage(
const uint8_t* black, 
const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  151    writeImage(black, x, y, w, h, invert, mirror_y, pgm);
 
 
  156                                   int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  160    writeImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 
 
  164void GxEPD2_290_T5::writeNative(
const uint8_t* data1, 
const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  168    writeImage(data1, x, y, w, h, invert, mirror_y, pgm);
 
 
  172void GxEPD2_290_T5::drawImage(
const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  174  writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
 
  176  writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
 
 
  180                                  int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  182  writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 
  184  writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 
 
  187void GxEPD2_290_T5::drawImage(
const uint8_t* black, 
const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  189  writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
 
  191  writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
 
 
  195                                  int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  197  writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 
  199  writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 
 
  202void GxEPD2_290_T5::drawNative(
const uint8_t* data1, 
const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, 
bool invert, 
bool mirror_y, 
bool pgm)
 
  204  writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
 
  206  writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
 
 
  224  int16_t w1 = x < 0 ? w + x : w; 
 
  225  int16_t h1 = y < 0 ? h + y : h; 
 
  226  int16_t x1 = x < 0 ? 0 : x; 
 
  227  int16_t y1 = y < 0 ? 0 : y; 
 
  228  w1 = x1 + w1 < int16_t(
WIDTH) ? w1 : int16_t(
WIDTH) - x1; 
 
  229  h1 = y1 + h1 < int16_t(
HEIGHT) ? h1 : int16_t(
HEIGHT) - y1; 
 
  230  if ((w1 <= 0) || (h1 <= 0)) 
return; 
 
  233  if (w1 % 8 > 0) w1 += 8 - w1 % 8;
 
  237  _setPartialRamArea(x1, y1, w1, h1);
 
 
  258void GxEPD2_290_T5::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
 
  260  uint16_t xe = (x + w - 1) | 0x0007; 
 
  261  uint16_t ye = y + h - 1;
 
  276void GxEPD2_290_T5::_PowerOn()
 
  286void GxEPD2_290_T5::_PowerOff()
 
  294void GxEPD2_290_T5::_InitDisplay()
 
  321const unsigned char GxEPD2_290_T5::lut_20_vcomDC[] 
PROGMEM =
 
  323  0x00, 0x08, 0x00, 0x00, 0x00, 0x02,
 
  324  0x60, 0x28, 0x28, 0x00, 0x00, 0x01,
 
  325  0x00, 0x14, 0x00, 0x00, 0x00, 0x01,
 
  326  0x00, 0x12, 0x12, 0x00, 0x00, 0x01,
 
  327  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  328  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  329  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
 
  333const unsigned char GxEPD2_290_T5::lut_21_ww[] 
PROGMEM =
 
  335  0x40, 0x08, 0x00, 0x00, 0x00, 0x02,
 
  336  0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
 
  337  0x40, 0x14, 0x00, 0x00, 0x00, 0x01,
 
  338  0xA0, 0x12, 0x12, 0x00, 0x00, 0x01,
 
  339  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  340  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  341  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  344const unsigned char GxEPD2_290_T5::lut_22_bw[] 
PROGMEM =
 
  346  0x40, 0x08, 0x00, 0x00, 0x00, 0x02,
 
  347  0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
 
  348  0x40, 0x14, 0x00, 0x00, 0x00, 0x01,
 
  349  0xA0, 0x12, 0x12, 0x00, 0x00, 0x01,
 
  350  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  351  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  352  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  355const unsigned char GxEPD2_290_T5::lut_23_wb[] 
PROGMEM =
 
  357  0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
 
  358  0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
 
  359  0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
 
  360  0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
 
  361  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  362  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  363  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  366const unsigned char GxEPD2_290_T5::lut_24_bb[] 
PROGMEM =
 
  368  0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
 
  369  0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
 
  370  0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
 
  371  0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
 
  372  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  373  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  374  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  380const unsigned char GxEPD2_290_T5::lut_20_vcomDC_partial[] 
PROGMEM =
 
  382  0x00, 
Tx19, 0x01, 0x00, 0x00, 0x01,
 
  383  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  384  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  385  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  386  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  387  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  388  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  392const unsigned char GxEPD2_290_T5::lut_21_ww_partial[] 
PROGMEM =
 
  394  0x00, 
Tx19, 0x01, 0x00, 0x00, 0x01,
 
  395  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  396  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  397  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  398  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  399  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  400  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  403const unsigned char GxEPD2_290_T5::lut_22_bw_partial[] 
PROGMEM =
 
  405  0x80, 
Tx19, 0x01, 0x00, 0x00, 0x01,
 
  406  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  407  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  408  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  409  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  410  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  411  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  414const unsigned char GxEPD2_290_T5::lut_23_wb_partial[] 
PROGMEM =
 
  416  0x40, 
Tx19, 0x01, 0x00, 0x00, 0x01,
 
  417  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  418  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  419  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  420  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  421  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  422  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  425const unsigned char GxEPD2_290_T5::lut_24_bb_partial[] 
PROGMEM =
 
  427  0x00, 
Tx19, 0x01, 0x00, 0x00, 0x01,
 
  428  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  429  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  430  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  431  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  432  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  433  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  436void GxEPD2_290_T5::_Init_Full()
 
  457void GxEPD2_290_T5::_Init_Part()
 
  465  _writeDataPGM(lut_20_vcomDC_partial, 
sizeof(lut_20_vcomDC_partial));
 
  478void GxEPD2_290_T5::_Update_Full()
 
  484void GxEPD2_290_T5::_Update_Part()
 
const unsigned char GxEPD2_290_T5::lut_20_vcomDC[] PROGMEM
 
void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert=false, bool mirror_y=false, bool pgm=false)
 
static const uint16_t power_on_time
 
static const uint16_t full_refresh_time
 
GxEPD2_290_T5(int16_t cs, int16_t dc, int16_t rst, int16_t busy)
 
void clearScreen(uint8_t value=0xFF)
 
void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert=false, bool mirror_y=false, bool pgm=false)
 
void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert=false, bool mirror_y=false, bool pgm=false)
 
static const uint16_t WIDTH
 
void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert=false, bool mirror_y=false, bool pgm=false)
 
void refresh(bool partial_update_mode=false)
 
static const uint16_t partial_refresh_time
 
void writeNative(const uint8_t *data1, const uint8_t *data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert=false, bool mirror_y=false, bool pgm=false)
 
void writeScreenBuffer(uint8_t value=0xFF)
 
static const uint16_t power_off_time
 
static const bool hasFastPartialUpdate
 
void drawNative(const uint8_t *data1, const uint8_t *data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert=false, bool mirror_y=false, bool pgm=false)
 
static const uint16_t HEIGHT
 
void _writeCommand(uint8_t c)
 
void _writeData(uint8_t d)
 
void _waitWhileBusy(const char *comment=0, uint16_t busy_time=5000)
 
void _writeDataPGM(const uint8_t *data, uint16_t n, int16_t fill_with_zeroes=0)