Paperd.Ink Library 0.0.5
Library for interacting with Paperd.Ink devices.
Loading...
Searching...
No Matches
GxEPD2_270c.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: these e-papers require 3.3V supply AND data lines!
3//
4// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html
5// Controller: IL91874 : http://www.e-paper-display.com/download_detail/downloadsId=539.html
6//
7// Author: Jean-Marc Zingg
8//
9// Version: see library.properties
10//
11// Library: https://github.com/ZinggJM/GxEPD2
12
13#include "GxEPD2_270c.h"
14
15GxEPD2_270c::GxEPD2_270c(int16_t cs, int16_t dc, int16_t rst, int16_t busy) :
16 GxEPD2_EPD(cs, dc, rst, busy, LOW, 20000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
17{
18}
19
20void GxEPD2_270c::clearScreen(uint8_t value)
21{
22 clearScreen(value, 0xFF);
23}
24
25void GxEPD2_270c::clearScreen(uint8_t black_value, uint8_t red_value)
26{
27 _initial_write = false; // initial full screen buffer clean done
28 _Init_Part();
29 _setPartialRamArea_270c(0x14, 0, 0, WIDTH, HEIGHT);
30 for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
31 {
32 _writeData(~black_value);
33 }
34 _setPartialRamArea_270c(0x15, 0, 0, WIDTH, HEIGHT);
35 for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
36 {
37 _writeData(~red_value);
38 }
39 refresh(0, 0, WIDTH, HEIGHT);
40}
41
43{
44 writeScreenBuffer(value, 0xFF);
45}
46
47void GxEPD2_270c::writeScreenBuffer(uint8_t black_value, uint8_t color_value)
48{
49 _initial_write = false; // initial full screen buffer clean done
50 _Init_Part();
51 _setPartialRamArea_270c(0x14, 0, 0, WIDTH, HEIGHT);
52 for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
53 {
54 _writeData(~black_value);
55 }
56 _setPartialRamArea_270c(0x15, 0, 0, WIDTH, HEIGHT);
57 for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
58 {
59 _writeData(~color_value);
60 }
61}
62
63void GxEPD2_270c::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
64{
65 writeImage(bitmap, NULL, x, y, w, h, invert, mirror_y, pgm);
66}
67
68void GxEPD2_270c::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)
69{
70 if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
71 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
72 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded
73 x -= x % 8; // byte boundary
74 w = wb * 8; // byte boundary
75 int16_t x1 = x < 0 ? 0 : x; // limit
76 int16_t y1 = y < 0 ? 0 : y; // limit
77 int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
78 int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
79 int16_t dx = x1 - x;
80 int16_t dy = y1 - y;
81 w1 -= dx;
82 h1 -= dy;
83 if ((w1 <= 0) || (h1 <= 0)) return;
84 _Init_Part();
85 _setPartialRamArea_270c(0x14, x1, y1, w1, h1);
86 for (int16_t i = 0; i < h1; i++)
87 {
88 for (int16_t j = 0; j < w1 / 8; j++)
89 {
90 uint8_t data = 0xFF;
91 if (black)
92 {
93 // use wb, h of bitmap for index!
94 int16_t idx = mirror_y ? j + dx / 8 + ((h - 1 - (i + dy))) * wb : j + dx / 8 + (i + dy) * wb;
95 if (pgm)
96 {
97#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
98 data = pgm_read_byte(&black[idx]);
99#else
100 data = black[idx];
101#endif
102 }
103 else
104 {
105 data = black[idx];
106 }
107 if (invert) data = ~data;
108 }
109 _writeData(~data);
110 }
111 }
112 _setPartialRamArea_270c(0x15, x1, y1, w1, h1);
113 for (int16_t i = 0; i < h1; i++)
114 {
115 for (int16_t j = 0; j < w1 / 8; j++)
116 {
117 uint8_t data = 0xFF;
118 if (color)
119 {
120 // use wb, h of bitmap for index!
121 int16_t idx = mirror_y ? j + dx / 8 + ((h - 1 - (i + dy))) * wb : j + dx / 8 + (i + dy) * wb;
122 if (pgm)
123 {
124#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
125 data = pgm_read_byte(&color[idx]);
126#else
127 data = color[idx];
128#endif
129 }
130 else
131 {
132 data = color[idx];
133 }
134 if (invert) data = ~data;
135 }
136 _writeData(~data);
137 }
138 }
139 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
140}
141
142void GxEPD2_270c::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
143 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
144{
145 writeImagePart(bitmap, NULL, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
146}
147
148void GxEPD2_270c::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,
149 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
150{
151 if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
152 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
153 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return;
154 if ((x_part < 0) || (x_part >= w_bitmap)) return;
155 if ((y_part < 0) || (y_part >= h_bitmap)) return;
156 int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded
157 x_part -= x_part % 8; // byte boundary
158 w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit
159 h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit
160 x -= x % 8; // byte boundary
161 w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded
162 int16_t x1 = x < 0 ? 0 : x; // limit
163 int16_t y1 = y < 0 ? 0 : y; // limit
164 int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
165 int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
166 int16_t dx = x1 - x;
167 int16_t dy = y1 - y;
168 w1 -= dx;
169 h1 -= dy;
170 if ((w1 <= 0) || (h1 <= 0)) return;
171 if (!_using_partial_mode) _Init_Part();
172 _setPartialRamArea_270c(0x14, x1, y1, w1, h1);
173 for (int16_t i = 0; i < h1; i++)
174 {
175 for (int16_t j = 0; j < w1 / 8; j++)
176 {
177 uint8_t data;
178 // use wb_bitmap, h_bitmap of bitmap for index!
179 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;
180 if (pgm)
181 {
182#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
183 data = pgm_read_byte(&black[idx]);
184#else
185 data = black[idx];
186#endif
187 }
188 else
189 {
190 data = black[idx];
191 }
192 if (invert) data = ~data;
193 _writeData(~data);
194 }
195 }
196 _setPartialRamArea_270c(0x15, x1, y1, w1, h1);
197 for (int16_t i = 0; i < h1; i++)
198 {
199 for (int16_t j = 0; j < w1 / 8; j++)
200 {
201 uint8_t data = 0xFF;
202 if (color)
203 {
204 // use wb_bitmap, h_bitmap of bitmap for index!
205 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;
206 if (pgm)
207 {
208#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
209 data = pgm_read_byte(&color[idx]);
210#else
211 data = color[idx];
212#endif
213 }
214 else
215 {
216 data = color[idx];
217 }
218 if (invert) data = ~data;
219 }
220 _writeData(~data);
221 }
222 }
223 delay(1); // yield() to avoid WDT on ESP8266 and ESP32
224}
225
226void GxEPD2_270c::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)
227{
228 if (data1)
229 {
230 writeImage(data1, x, y, w, h, invert, mirror_y, pgm);
231 }
232}
233
234void GxEPD2_270c::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
235{
236 writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
237 refresh(x, y, w, h);
238}
239
240void GxEPD2_270c::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
241 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
242{
243 writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
244 refresh(x, y, w, h);
245}
246
247void GxEPD2_270c::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)
248{
249 writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
250 refresh(x, y, w, h);
251}
252
253void GxEPD2_270c::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,
254 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
255{
256 writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
257 refresh(x, y, w, h);
258}
259
260void GxEPD2_270c::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)
261{
262 writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
263 refresh(x, y, w, h);
264}
265
266void GxEPD2_270c::refresh(bool partial_update_mode)
267{
268 if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
269 else _Update_Full();
270}
271
272void GxEPD2_270c::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
273{
274 // intersection with screen
275 int16_t w1 = x < 0 ? w + x : w; // reduce
276 int16_t h1 = y < 0 ? h + y : h; // reduce
277 int16_t x1 = x < 0 ? 0 : x; // limit
278 int16_t y1 = y < 0 ? 0 : y; // limit
279 w1 = x1 + w1 < int16_t(WIDTH) ? w1 : int16_t(WIDTH) - x1; // limit
280 h1 = y1 + h1 < int16_t(HEIGHT) ? h1 : int16_t(HEIGHT) - y1; // limit
281 if ((w1 <= 0) || (h1 <= 0)) return;
282 // make x1, w1 multiple of 8
283 w1 += x1 % 8;
284 if (w1 % 8 > 0) w1 += 8 - w1 % 8;
285 x1 -= x1 % 8;
286 //_refreshWindow(x1, y1, w1, h1);
287 w1 = (w1 + 7 + (x1 % 8)) & 0xfff8; // byte boundary exclusive (round up)
288 h1 = gx_uint16_min(h1, 256); // strange controller error
289 _writeCommand(0x16);
290 _writeData(x1 >> 8);
291 _writeData(x1 & 0xf8);
292 _writeData(y1 >> 8);
293 _writeData(y1 & 0xff);
294 _writeData(w1 >> 8);
295 _writeData(w1 & 0xf8);
296 _writeData(h1 >> 8);
297 _writeData(h1 & 0xff);
299}
300
302{
303 _PowerOff();
304}
305
307{
308 _PowerOff();
309 if (_rst >= 0)
310 {
311 _writeCommand(0x07); // deep sleep
312 _writeData(0xA5); // check code
313 _hibernating = true;
314 }
315}
316
317void GxEPD2_270c::_setPartialRamArea_270c(uint8_t cmd, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
318{
319 w = (w + 7 + (x % 8)) & 0xfff8; // byte boundary exclusive (round up)
320 _writeCommand(cmd);
321 _writeData(x >> 8);
322 _writeData(x & 0xf8);
323 _writeData(y >> 8);
324 _writeData(y & 0xff);
325 _writeData(w >> 8);
326 _writeData(w & 0xf8);
327 _writeData(h >> 8);
328 _writeData(h & 0xff);
329}
330
331void GxEPD2_270c::_PowerOn()
332{
333 if (!_power_is_on)
334 {
335 _writeCommand(0x04);
336 _waitWhileBusy("_PowerOn", power_on_time);
337 }
338 _power_is_on = true;
339}
340
341void GxEPD2_270c::_PowerOff()
342{
343 _writeCommand(0x02); // power off
344 _waitWhileBusy("_PowerOff", power_off_time);
345 _power_is_on = false;
346}
347
348void GxEPD2_270c::_InitDisplay()
349{
350 if (_hibernating) _reset();
351 _writeCommand(0x01);
352 _writeData (0x03);
353 _writeData (0x00);
354 _writeData (0x2b);
355 _writeData (0x2b);
356 _writeData (0x09);
357 _writeCommand(0x06);
358 _writeData (0x07);
359 _writeData (0x07);
360 _writeData (0x17);
361 _writeCommand(0xF8);
362 _writeData (0x60);
363 _writeData (0xA5);
364 _writeCommand(0xF8);
365 _writeData (0x89);
366 _writeData (0xA5);
367 _writeCommand(0xF8);
368 _writeData (0x90);
369 _writeData (0x00);
370 _writeCommand(0xF8);
371 _writeData (0x93);
372 _writeData (0x2A);
373 _writeCommand(0xF8);
374 _writeData (0x73);
375 _writeData (0x41);
376 _writeCommand(0x16);
377 _writeData(0x00);
378 //_writeCommand(0x04);
379 //_waitWhileBusy("_wakeUp Power On");
380 _writeCommand(0x00);
381 _writeData(0xaf); // by register LUT
382 _writeCommand(0x30);
383 _writeData (0x3a);
384 _writeCommand(0x61);
385 _writeData (0x00);
386 _writeData (0xb0); //176
387 _writeData (0x01);
388 _writeData (0x08); //264
389 _writeCommand(0x82);
390 _writeData (0x12);
391 _writeCommand(0X50);
392 _writeData(0x87);
393}
394
395const uint8_t GxEPD2_270c::lut_20_vcomDC[] PROGMEM =
396{
397 0x00 , 0x00,
398 0x00 , 0x1A , 0x1A , 0x00 , 0x00 , 0x01,
399 0x00 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
400 0x00 , 0x0E , 0x01 , 0x0E , 0x01 , 0x10,
401 0x00 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
402 0x00 , 0x04 , 0x10 , 0x00 , 0x00 , 0x05,
403 0x00 , 0x03 , 0x0E , 0x00 , 0x00 , 0x0A,
404 0x00 , 0x23 , 0x00 , 0x00 , 0x00 , 0x01
405};
406//R21H
407const uint8_t GxEPD2_270c::lut_21[] PROGMEM = {
408 0x90 , 0x1A , 0x1A , 0x00 , 0x00 , 0x01,
409 0x40 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
410 0x84 , 0x0E , 0x01 , 0x0E , 0x01 , 0x10,
411 0x80 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
412 0x00 , 0x04 , 0x10 , 0x00 , 0x00 , 0x05,
413 0x00 , 0x03 , 0x0E , 0x00 , 0x00 , 0x0A,
414 0x00 , 0x23 , 0x00 , 0x00 , 0x00 , 0x01
415};
416//R22H r
417const uint8_t GxEPD2_270c::lut_22_red[] PROGMEM = {
418 0xA0 , 0x1A , 0x1A , 0x00 , 0x00 , 0x01,
419 0x00 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
420 0x84 , 0x0E , 0x01 , 0x0E , 0x01 , 0x10,
421 0x90 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
422 0xB0 , 0x04 , 0x10 , 0x00 , 0x00 , 0x05,
423 0xB0 , 0x03 , 0x0E , 0x00 , 0x00 , 0x0A,
424 0xC0 , 0x23 , 0x00 , 0x00 , 0x00 , 0x01
425};
426//R23H w
427const uint8_t GxEPD2_270c::lut_23_white[] PROGMEM = {
428 0x90 , 0x1A , 0x1A , 0x00 , 0x00 , 0x01,
429 0x40 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
430 0x84 , 0x0E , 0x01 , 0x0E , 0x01 , 0x10,
431 0x80 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
432 0x00 , 0x04 , 0x10 , 0x00 , 0x00 , 0x05,
433 0x00 , 0x03 , 0x0E , 0x00 , 0x00 , 0x0A,
434 0x00 , 0x23 , 0x00 , 0x00 , 0x00 , 0x01
435};
436//R24H b
437const uint8_t GxEPD2_270c::lut_24_black[] PROGMEM = {
438 0x90 , 0x1A , 0x1A , 0x00 , 0x00 , 0x01,
439 0x20 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
440 0x84 , 0x0E , 0x01 , 0x0E , 0x01 , 0x10,
441 0x10 , 0x0A , 0x0A , 0x00 , 0x00 , 0x08,
442 0x00 , 0x04 , 0x10 , 0x00 , 0x00 , 0x05,
443 0x00 , 0x03 , 0x0E , 0x00 , 0x00 , 0x0A,
444 0x00 , 0x23 , 0x00 , 0x00 , 0x00 , 0x01
445};
446
447void GxEPD2_270c::_Init_Full()
448{
449 _InitDisplay();
450 _writeCommand(0x20); //vcom
451 _writeDataPGM_sCS(lut_20_vcomDC, sizeof(lut_20_vcomDC));
452 _writeCommand(0x21); //ww --
453 _writeDataPGM_sCS(lut_21, sizeof(lut_21));
454 _writeCommand(0x22); //bw r
455 _writeDataPGM_sCS(lut_22_red, sizeof(lut_22_red));
456 _writeCommand(0x23); //wb w
457 _writeDataPGM_sCS(lut_23_white, sizeof(lut_23_white));
458 _writeCommand(0x24); //bb b
459 _writeDataPGM_sCS(lut_24_black, sizeof(lut_24_black));
460 _PowerOn();
461}
462
463void GxEPD2_270c::_Init_Part()
464{
465 _InitDisplay();
466 _writeCommand(0x20); //vcom
467 _writeDataPGM_sCS(lut_20_vcomDC, sizeof(lut_20_vcomDC));
468 _writeCommand(0x21); //ww --
469 _writeDataPGM_sCS(lut_21, sizeof(lut_21));
470 _writeCommand(0x22); //bw r
471 _writeDataPGM_sCS(lut_22_red, sizeof(lut_22_red));
472 _writeCommand(0x23); //wb w
473 _writeDataPGM_sCS(lut_23_white, sizeof(lut_23_white));
474 _writeCommand(0x24); //bb b
475 _writeDataPGM_sCS(lut_24_black, sizeof(lut_24_black));
476 _PowerOn();
477}
478
479void GxEPD2_270c::_Update_Full()
480{
481 _writeCommand(0x12); //display refresh
482 _waitWhileBusy("_Update_Full", full_refresh_time);
483}
484
485void GxEPD2_270c::_Update_Part()
486{
487 _writeCommand(0x12); //display refresh
488 _waitWhileBusy("_Update_Part", partial_refresh_time);
489}
const uint8_t GxEPD2_270c::lut_20_vcomDC[] PROGMEM
void writeScreenBuffer(uint8_t value=0xFF)
static const uint16_t HEIGHT
Definition GxEPD2_270c.h:24
static const uint16_t power_off_time
Definition GxEPD2_270c.h:30
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)
static const uint16_t power_on_time
Definition GxEPD2_270c.h:29
static const uint16_t full_refresh_time
Definition GxEPD2_270c.h:31
void refresh(bool partial_update_mode=false)
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)
GxEPD2_270c(int16_t cs, int16_t dc, int16_t rst, int16_t busy)
static const uint16_t WIDTH
Definition GxEPD2_270c.h:22
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 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)
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 partial_refresh_time
Definition GxEPD2_270c.h:32
void clearScreen(uint8_t value=0xFF)
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 _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
void _reset()
void _writeDataPGM_sCS(const uint8_t *data, uint16_t n, int16_t fill_with_zeroes=0)
bool _initial_write
Definition GxEPD2_EPD.h:117
int16_t _rst
Definition GxEPD2_EPD.h:112
static uint16_t gx_uint16_min(uint16_t a, uint16_t b)
Definition GxEPD2_EPD.h:89
bool _hibernating
Definition GxEPD2_EPD.h:118