Question concerning use of GDEY029T94 with GxEPD2

// uncomment next line to use HSPI for EPD (and VSPI for SD), e.g. with Waveshare ESP32 Driver Board
#define USE_HSPI_FOR_EPD

// base class GxEPD2_GFX can be used to pass references or pointers to the display instance as parameter, uses ~1.2k more code
// enable or disable GxEPD2_GFX base class
#define ENABLE_GxEPD2_GFX 0

// uncomment next line to use class GFX of library GFX_Root instead of Adafruit_GFX
//#include <GFX.h>
// Note: if you use this with ENABLE_GxEPD2_GFX 1:
//       uncomment it in GxEPD2_GFX.h too, or add #include <GFX.h> before any #include <GxEPD2_GFX.h>
#include <Arduino.h>
#include <SPI.h>
#include <GxEPD2_BW.h>
#include <GxEPD2_3C.h>
#include <GxEPD2_4C.h>
#include <GxEPD2_7C.h>
#include <Fonts/FreeMonoBold9pt7b.h>
/*
  *CS=15, DC=27, RST=26, BUSY=25 sck=13, miso=12,mosi=14, ss=15
  */
// select the display class (only one), matching the kind of display panel
#define GxEPD2_DISPLAY_CLASS GxEPD2_BW

// select the display driver class (only one) for your  panel
//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5D // GDEW029T5D  128x296, UC8151D, (WFT0290CZ10)
#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15)

// somehow there should be an easier way to do this
#define GxEPD2_BW_IS_GxEPD2_BW true
#define IS_GxEPD(c, x) (c##x)
#define IS_GxEPD2_BW(x) IS_GxEPD(GxEPD2_BW_IS_, x)

#if defined(ESP32)
#define MAX_DISPLAY_BUFFER_SIZE 65536ul // e.g.
#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS)
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
#endif
GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25));
#endif


#include "bitmaps/Bitmaps128x296.h" // 2.9"  b/w

#if defined(ESP32) && defined(USE_HSPI_FOR_EPD)
SPIClass hspi(HSPI);
#endif

void helloWorld();

void setup()
{
  display.fillScreen(GxEPD_BLACK);
  Serial.begin(115200);
  Serial.println();
  Serial.println("setup");
  // *** special handling for Waveshare ESP32 Driver board *** //
  // ********************************************************* //
#if defined(ESP32) && defined(USE_HSPI_FOR_EPD)
  hspi.begin(13, 12, 14, 15); // remap hspi for EPD (swap pins)
  display.epd2.selectSPI(hspi, SPISettings(4000000, MSBFIRST, SPI_MODE0));
#endif
  // *** end of special handling for Waveshare ESP32 Driver board *** //
  // **************************************************************** //
  display.init(115200);
  // first update should be full refresh
  helloWorld();
  delay(1000);


  /*if (display.epd2.hasPartialUpdate)
  {
    showPartialUpdate();
    delay(1000);
  } */// else // on GDEW0154Z04 only full update available, doesn't look nice
}

void loop()
{
  
}

// note for partial update window and setPartialWindow() method:
// partial update window size and position is on byte boundary in physical x direction
// the size is increased in setPartialWindow() if x or w are not multiple of 8 for even rotation, y or h for odd rotation
// see also comment in GxEPD2_BW.h, GxEPD2_3C.h or GxEPD2_GFX.h for method setPartialWindow()

const char HelloWorld[] = "9/30";
const char HelloArduino[] = "Hello Arduino!";
const char HelloEpaper[] = "Hello E-Paper!";
//阴码,逐行式,顺向
void helloWorld()
{
  //Serial.println("helloWorld");
  display.setRotation(1);
  display.setFont(&FreeMonoBold9pt7b);
  display.setTextSize(3);
  display.setTextColor(GxEPD_BLACK);
  int16_t tbx, tby; uint16_t tbw, tbh;
  //返回当前字体/大小确定字符串的大小,x当前光标x,y当前光标y,tbx边界x,tby边界y,tbw边界宽度,tbh边界高度
  display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
  // center bounding box by transposition of origin:
  uint16_t x = ((display.width() - tbw) / 2) - tbx;
  uint16_t y = ((display.height() - tbh) / 2) - tby;
  display.setFullWindow();
  display.firstPage();
  do
  {
    display.fillScreen(GxEPD_WHITE);
    display.setCursor(x, y);

                        //                           H x
                        //                           ————————————————296
                        // x   y                    V|
                        //                          y|
                        //                           128
    display.drawLine(0,0,296,128,0x00);                    
    display.print(HelloWorld);
    Serial.print(HelloWorld);
  }
  while (display.nextPage());
}
setup
_Update_Full : 1721998
Busy Timeout!
_Update_Full : 10001038
Busy Timeout!
_Update_Part : 10001046
Busy Timeout!
_Update_Part : 10001046
Busy Timeout!
_Update_Part : 10001042
Busy Timeout!
_Update_Full : 10001052
Busy Timeout!
_Update_Full : 10001044
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038
Busy Timeout!
_Update_Part : 10001038