Paperd.Ink Library 0.0.5
Library for interacting with Paperd.Ink devices.
Loading...
Searching...
No Matches
GxEPD2_260.cpp
Go to the documentation of this file.
1// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
2// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines!
3//
4// based on Demo Example from Good Display: http://www.e-paper-display.com/download_detail/downloadsId=623.html
5// Panel: GDEW026T0 : http://www.e-paper-display.com/products_detail/productId=398.html
6// Controller: IL0373 : http://www.e-paper-display.com/download_detail/downloadsId=535.html
7//
8// Author: Jean-Marc Zingg
9//
10// Version: see library.properties
11//
12// Library: https://github.com/ZinggJM/GxEPD2
13
14#include "GxEPD2_260.h"
15
16GxEPD2_260::GxEPD2_260(int16_t cs, int16_t dc, int16_t rst, int16_t busy) :
17 GxEPD2_EPD(cs, dc, rst, busy, LOW, 10000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
18{
19}
20
21void GxEPD2_260::clearScreen(uint8_t value)
22{
23 writeScreenBuffer(value);
24 refresh(true);
25 writeScreenBuffer(value);
26}
27
29{
30 _initial_write = false; // initial full screen buffer clean done
31 if (!_using_partial_mode) _Init_Part();
33 {
34 _writeCommand(0x10); // init old data
35 for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
36 {
37 _writeData(value);
38 }
39 }
40 _writeCommand(0x13);
41 for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
42 {
43 _writeData(value);
44 }
45}
46
47void GxEPD2_260::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
48{
49 if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
50 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
51 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded
52 x -= x % 8; // byte boundary
53 w = wb * 8; // byte boundary
54 int16_t x1 = x < 0 ? 0 : x; // limit
55 int16_t y1 = y < 0 ? 0 : y; // limit
56 int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
57 int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
58 int16_t dx = x1 - x;
59 int16_t dy = y1 - y;
60 w1 -= dx;
61 h1 -= dy;
62 if ((w1 <= 0) || (h1 <= 0)) return;
63 if (!_using_partial_mode) _Init_Part();
64 _writeCommand(0x91); // partial in
65 _setPartialRamArea(x1, y1, w1, h1);
66 _writeCommand(0x13);
67 for (int16_t i = 0; i < h1; i++)
68 {
69 for (int16_t j = 0; j < w1 / 8; j++)
70 {
71 uint8_t data;
72 // use wb, h of bitmap for index!
73 int16_t idx = mirror_y ? j + dx / 8 + ((h - 1 - (i + dy))) * wb : j + dx / 8 + (i + dy) * wb;
74 if (pgm)
75 {
76#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
77 data = pgm_read_byte(&bitmap[idx]);
78#else
79 data = bitmap[idx];
80#endif
81 }
82 else
83 {
84 data = bitmap[idx];
85 }
86 if (invert) data = ~data;
87 _writeData(data);
88 }
89 }
90 _writeCommand(0x92); // partial out
91 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
92}
93
94void GxEPD2_260::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
95 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
96{
97 if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
98 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
99 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return;
100 if ((x_part < 0) || (x_part >= w_bitmap)) return;
101 if ((y_part < 0) || (y_part >= h_bitmap)) return;
102 int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded
103 x_part -= x_part % 8; // byte boundary
104 w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit
105 h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit
106 x -= x % 8; // byte boundary
107 w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded
108 int16_t x1 = x < 0 ? 0 : x; // limit
109 int16_t y1 = y < 0 ? 0 : y; // limit
110 int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
111 int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
112 int16_t dx = x1 - x;
113 int16_t dy = y1 - y;
114 w1 -= dx;
115 h1 -= dy;
116 if ((w1 <= 0) || (h1 <= 0)) return;
117 if (!_using_partial_mode) _Init_Part();
118 _writeCommand(0x91); // partial in
119 _setPartialRamArea(x1, y1, w1, h1);
120 _writeCommand(0x13);
121 for (int16_t i = 0; i < h1; i++)
122 {
123 for (int16_t j = 0; j < w1 / 8; j++)
124 {
125 uint8_t data;
126 // use wb_bitmap, h_bitmap of bitmap for index!
127 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;
128 if (pgm)
129 {
130#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
131 data = pgm_read_byte(&bitmap[idx]);
132#else
133 data = bitmap[idx];
134#endif
135 }
136 else
137 {
138 data = bitmap[idx];
139 }
140 if (invert) data = ~data;
141 _writeData(data);
142 }
143 }
144 _writeCommand(0x92); // partial out
145 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
146}
147
148void GxEPD2_260::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)
149{
150 if (black)
151 {
152 writeImage(black, x, y, w, h, invert, mirror_y, pgm);
153 }
154}
155
156void GxEPD2_260::writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
157 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
158{
159 if (black)
160 {
161 writeImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
162 }
163}
164
165void GxEPD2_260::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)
166{
167 if (data1)
168 {
169 writeImage(data1, x, y, w, h, invert, mirror_y, pgm);
170 }
171}
172
173void GxEPD2_260::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{
175 writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
176 refresh(x, y, w, h);
177 writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
178}
179
180void GxEPD2_260::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
181 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
182{
183 writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
184 refresh(x, y, w, h);
185 writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
186}
187
188void GxEPD2_260::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{
190 writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
191 refresh(x, y, w, h);
192 writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
193}
194
195void GxEPD2_260::drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
196 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
197{
198 writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
199 refresh(x, y, w, h);
200 writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
201}
202
203void GxEPD2_260::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{
205 writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
206 refresh(x, y, w, h);
207 writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
208}
209
210void GxEPD2_260::refresh(bool partial_update_mode)
211{
212 if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
213 else
214 {
215 if (_using_partial_mode) _Init_Full();
216 _Update_Full();
217 _initial_refresh = false; // initial full update done
218 }
219}
220
221void GxEPD2_260::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
222{
223 if (_initial_refresh) return refresh(false); // initial update needs be full update
224 // intersection with screen
225 int16_t w1 = x < 0 ? w + x : w; // reduce
226 int16_t h1 = y < 0 ? h + y : h; // reduce
227 int16_t x1 = x < 0 ? 0 : x; // limit
228 int16_t y1 = y < 0 ? 0 : y; // limit
229 w1 = x1 + w1 < int16_t(WIDTH) ? w1 : int16_t(WIDTH) - x1; // limit
230 h1 = y1 + h1 < int16_t(HEIGHT) ? h1 : int16_t(HEIGHT) - y1; // limit
231 if ((w1 <= 0) || (h1 <= 0)) return;
232 // make x1, w1 multiple of 8
233 w1 += x1 % 8;
234 if (w1 % 8 > 0) w1 += 8 - w1 % 8;
235 x1 -= x1 % 8;
236 if (!_using_partial_mode) _Init_Part();
237 if (usePartialUpdateWindow) _writeCommand(0x91); // partial in
238 _setPartialRamArea(x1, y1, w1, h1);
239 _Update_Part();
240 if (usePartialUpdateWindow) _writeCommand(0x92); // partial out
241}
242
244{
245 _PowerOff();
246}
247
249{
250 _PowerOff();
251 if (_rst >= 0)
252 {
253 _writeCommand(0x07); // deep sleep
254 _writeData(0xA5); // check code
255 _hibernating = true;
256 }
257}
258
259void GxEPD2_260::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
260{
261 uint16_t xe = (x + w - 1) | 0x0007; // byte boundary inclusive (last byte)
262 uint16_t ye = y + h - 1;
263 x &= 0xFFF8; // byte boundary
264 _writeCommand(0x90); // partial window
265 _writeData(x % 256);
266 _writeData(xe % 256);
267 _writeData(y / 256);
268 _writeData(y % 256);
269 _writeData(ye / 256);
270 _writeData(ye % 256);
271 _writeData(0x00);
272}
273
274void GxEPD2_260::_PowerOn()
275{
276 if (!_power_is_on)
277 {
278 _writeCommand(0x04);
279 _waitWhileBusy("_PowerOn", power_on_time);
280 }
281 _power_is_on = true;
282}
283
284void GxEPD2_260::_PowerOff()
285{
286 _writeCommand(0x02); // power off
287 _waitWhileBusy("_PowerOff", power_off_time);
288 _power_is_on = false;
289 _using_partial_mode = false;
290}
291
292void GxEPD2_260::_InitDisplay()
293{
294 if (_hibernating) _reset();
295 _writeCommand(0x01); // POWER SETTING
296 _writeData (0x03);
297 _writeData (0x00);
298 _writeData (0x2b);
299 _writeData (0x2b);
300 _writeData (0x03);
301 _writeCommand(0x06); // boost soft start
302 _writeData (0x17); // A
303 _writeData (0x17); // B
304 _writeData (0x17); // C
305 _writeCommand(0x00); // panel setting
306 _writeData(0xbf); // LUT from REG 128x296
307 _writeData(0x0d); // VCOM to 0V fast
308 _writeCommand(0x30); // PLL setting
309 _writeData (0x3a); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZ
310 _writeCommand(0x61); //resolution setting
312 _writeData (HEIGHT / 256);
313 _writeData (HEIGHT % 256);
314 _writeCommand(0x82); // vcom_DC setting
315 //_writeData (0x00); // -0.1
316 //_writeData (0x08); // -0.1 + 8 * -0.05 = -0.5V from demo
317 //_writeData (0x12); // -0.1 + 18 * -0.05 = -1.0V from OTP, slightly better
318 _writeData (0x1c); // -0.1 + 28 * -0.05 = -1.5V test, better
319 //_writeData (0x26); // -0.1 + 38 * -0.05 = -2.0V test, same
320 //_writeData (0x30); // -0.1 + 48 * -0.05 = -2.5V test, darker
321 _writeCommand(0x50); //VCOM AND DATA INTERVAL SETTING
322 _writeData(0x17); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
323}
324
325const unsigned char GxEPD2_260::lut_20_vcom0_full[] PROGMEM =
326{
327 0x00, 0x08, 0x00, 0x00, 0x00, 0x02,
328 0x60, 0x28, 0x28, 0x00, 0x00, 0x01,
329 0x00, 0x14, 0x00, 0x00, 0x00, 0x01,
330 0x00, 0x12, 0x12, 0x00, 0x00, 0x01,
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00
335};
336
337const unsigned char GxEPD2_260::lut_21_ww_full[] PROGMEM =
338{
339 0x40, 0x08, 0x00, 0x00, 0x00, 0x02,
340 0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
341 0x40, 0x14, 0x00, 0x00, 0x00, 0x01,
342 0xA0, 0x12, 0x12, 0x00, 0x00, 0x01,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
346};
347
348const unsigned char GxEPD2_260::lut_22_bw_full[] PROGMEM =
349{
350 0x40, 0x08, 0x00, 0x00, 0x00, 0x02,
351 0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
352 0x40, 0x14, 0x00, 0x00, 0x00, 0x01,
353 0xA0, 0x12, 0x12, 0x00, 0x00, 0x01,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
357};
358
359const unsigned char GxEPD2_260::lut_23_wb_full[] PROGMEM =
360{
361 0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
362 0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
363 0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
364 0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
368};
369
370const unsigned char GxEPD2_260::lut_24_bb_full[] PROGMEM =
371{
372 0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
373 0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
374 0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
375 0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
379};
380
381// partial update waveform
382
383// same waveform as by demo code from Good Display
384//#define T1 0 // color change charge balance pre-phase
385//#define T2 0 // color change or sustain charge balance pre-phase
386//#define T3 25 // color change or sustain phase
387//#define T4 0 // color change phase
388
389// new waveform created by Jean-Marc Zingg for actual panel
390#define T1 60 // color change charge balance pre-phase
391#define T2 2 // color change or sustain charge balance pre-phase
392#define T3 6 // color change or sustain phase
393#define T4 60 // color change phase
394
395// for new waveform without sustain phase: uncomment next 4 lines, good enough for fat fonts
396#undef T2
397#undef T3
398#define T2 0 // color change or sustain charge balance pre-phase
399#define T3 0 // color change or sustain phase
400
401// "balanced flash once" variant
402//#define T1 0 // color change charge balance pre-phase
403//#define T2 60 // color change or sustain charge balance pre-phase
404//#define T3 60 // color change or sustain phase
405//#define T4 0 // color change phase
406
407const unsigned char GxEPD2_260::lut_20_vcom0_partial[] PROGMEM =
408{
409 0x00, T1, T2, T3, T4, 1, // 00 00 00 00
410};
411
412const unsigned char GxEPD2_260::lut_21_ww_partial[] PROGMEM =
413{ // 10 w
414 0x18, T1, T2, T3, T4, 1, // 00 01 10 00
415};
416
417const unsigned char GxEPD2_260::lut_22_bw_partial[] PROGMEM =
418{ // 10 w
419 0x5A, T1, T2, T3, T4, 1, // 01 01 10 10
420};
421
422const unsigned char GxEPD2_260::lut_23_wb_partial[] PROGMEM =
423{ // 01 b
424 0xA5, T1, T2, T3, T4, 1, // 10 10 01 01
425};
426
427const unsigned char GxEPD2_260::lut_24_bb_partial[] PROGMEM =
428{ // 01 b
429 0x24, T1, T2, T3, T4, 1, // 00 10 01 00
430};
431
432void GxEPD2_260::_Init_Full()
433{
434 _InitDisplay();
435 _writeCommand(0x20);
436 _writeDataPGM(lut_20_vcom0_full, sizeof(lut_20_vcom0_full));
437 _writeCommand(0x21);
438 _writeDataPGM(lut_21_ww_full, sizeof(lut_21_ww_full));
439 _writeCommand(0x22);
440 _writeDataPGM(lut_22_bw_full, sizeof(lut_22_bw_full));
441 _writeCommand(0x23);
442 _writeDataPGM(lut_23_wb_full, sizeof(lut_23_wb_full));
443 _writeCommand(0x24);
444 _writeDataPGM(lut_24_bb_full, sizeof(lut_24_bb_full));
445 _PowerOn();
446 _using_partial_mode = false;
447}
448
449void GxEPD2_260::_Init_Part()
450{
451 _InitDisplay();
452 _writeCommand(0x20);
453 _writeDataPGM(lut_20_vcom0_partial, sizeof(lut_20_vcom0_partial), 44 - sizeof(lut_20_vcom0_partial));
454 _writeCommand(0x21);
455 _writeDataPGM(lut_21_ww_partial, sizeof(lut_21_ww_partial), 42 - sizeof(lut_21_ww_partial));
456 _writeCommand(0x22);
457 _writeDataPGM(lut_22_bw_partial, sizeof(lut_22_bw_partial), 42 - sizeof(lut_22_bw_partial));
458 _writeCommand(0x23);
459 _writeDataPGM(lut_23_wb_partial, sizeof(lut_23_wb_partial), 42 - sizeof(lut_23_wb_partial));
460 _writeCommand(0x24);
461 _writeDataPGM(lut_24_bb_partial, sizeof(lut_24_bb_partial), 42 - sizeof(lut_24_bb_partial));
462 _PowerOn();
463 _using_partial_mode = true;
464}
465
466void GxEPD2_260::_Update_Full()
467{
468 _writeCommand(0x12); //display refresh
469 _waitWhileBusy("_Update_Full", full_refresh_time);
470}
471
472void GxEPD2_260::_Update_Part()
473{
474 _writeCommand(0x12); //display refresh
475 _waitWhileBusy("_Update_Part", partial_refresh_time);
476}
#define T2
#define T3
#define T4
const unsigned char GxEPD2_260::lut_20_vcom0_full[] PROGMEM
#define T1
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)
GxEPD2_260(int16_t cs, int16_t dc, int16_t rst, int16_t busy)
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 bool usePartialUpdateWindow
Definition GxEPD2_260.h:28
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)
static const uint16_t power_off_time
Definition GxEPD2_260.h:31
void refresh(bool partial_update_mode=false)
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)
void hibernate()
static const uint16_t power_on_time
Definition GxEPD2_260.h:30
void writeScreenBuffer(uint8_t value=0xFF)
static const uint16_t WIDTH
Definition GxEPD2_260.h:23
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 powerOff()
static const uint16_t HEIGHT
Definition GxEPD2_260.h:24
static const uint16_t full_refresh_time
Definition GxEPD2_260.h:32
void clearScreen(uint8_t value=0xFF)
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 partial_refresh_time
Definition GxEPD2_260.h:33
void _writeCommand(uint8_t c)
void _writeData(uint8_t d)
bool _using_partial_mode
Definition GxEPD2_EPD.h:118
void _waitWhileBusy(const char *comment=0, uint16_t busy_time=5000)
bool _power_is_on
Definition GxEPD2_EPD.h:118
bool _initial_refresh
Definition GxEPD2_EPD.h:117
void _reset()
bool _initial_write
Definition GxEPD2_EPD.h:117
int16_t _rst
Definition GxEPD2_EPD.h:112
bool _hibernating
Definition GxEPD2_EPD.h:118
void _writeDataPGM(const uint8_t *data, uint16_t n, int16_t fill_with_zeroes=0)