Waveshare 2.9 296x128 rev 2.1 V2 FPC-7519revb on Python

Hi! IM going crazy here.
Im using raspberrypi_jestonnano and custom config because I have limited pins.
Pins are
VCC - 3.3
GND - GND
DIN - MOSI
CLK - CLK
CS - CE0
DC - TX
RST - RX
BUSY - MISO
THis is going to the adafruit MATRIX hat + RTC. So far I can get a refresh blinking, border around the screen, but the rest is garbled with a couple vertical lines of what looks like barcode. No matter what I try for LUT. Im going crazy for the last two days. What am I missing here?

UPDATE, IM CLOSE. I went from just garbled pixels, to half black and half white with bar at the top.
Now I have my text image but I cant seem to get the orientation correct. The physical screen is landscape, the X on the screen goes corner to corner in the right orientation, but the text is incorrect. Top Left and Top right are on the right side, and Bottom Left and Bottom right are on the left. As well as it looks to be bumped downa bit with a bar at the top going horizontal with pixels, and then slight cut off at the bottom. So the Y axis is off a bit?

import epdconfig_custom as epdconfig
import logging
from enum import Enum
import time
from PIL import Image

logger = logging.getLogger(name)

Display resolution for 2.9 inch EPD (native portrait)

EPD_WIDTH = 128
EPD_HEIGHT = 296

EPD Commands - Common for SSD1680/SSD1681 controllers on 2.9inch e-paper

DRIVER_OUTPUT_CONTROL = 0x01
BOOSTER_SOFT_START_CONTROL = 0x0C
GATE_SETTING = 0x03
DEEP_SLEEP_MODE = 0x10
DATA_ENTRY_MODE = 0x11
SW_RESET = 0x12
TEMPERATURE_SENSOR_CONTROL = 0x1A
MASTER_ACTIVATION = 0x20
DISPLAY_UPDATE_CONTROL_1 = 0x21
DISPLAY_UPDATE_CONTROL_2 = 0x22
WRITE_RAM = 0x24
READ_RAM = 0x2E
WRITE_VCOM_REGISTER = 0x2C
VCOM_REGISTRATION = 0x2B
SET_LUT_REGISTER = 0x32
SET_DUMMY_LINE_PERIOD = 0x3A
SET_GATE_TIME = 0x3B
GATE_DRIVER_VOLTAGE_CONTROL = 0x3B
CHANNEL_SELECT = 0x3C
BORDER_WAVEFORM_CONTROL = 0x3C
TEMPERATURE_SENSOR_WRITE = 0x40
TEMPERATURE_SENSOR_READ = 0x41
VCOM_AND_DATA_INTERVAL_SETTING = 0x50
SET_RAM_X_ADDRESS_START_END_POSITION = 0x44
SET_RAM_Y_ADDRESS_START_END_END_POSITION = 0x45
SET_RAM_X_ADDRESS_COUNTER = 0x4E
SET_RAM_Y_ADDRESS_COUNTER = 0x4F
TERMINATE_FRAME_READ_WRITE = 0xFF

Full update LUT (from Waveshare 2.9" V2 / SSD1680)

LUT_FULL_UPDATE = [
0x80, 0x4A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x4A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x4A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x4A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x4A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]

Partial update LUT (common)

LUT_PARTIAL_UPDATE_ACTUAL = [
0x10, 0x18, 0x18, 0x08, 0x18, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0x15,
0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
]

class EPD_MODE(Enum):
FULL_UPDATE = 0
PARTIAL_UPDATE = 1

class EPD:
def init(self):
self.reset_pin = epdconfig.RST_PIN
self.dc_pin = epdconfig.DC_PIN
self.busy_pin = epdconfig.BUSY_PIN

    # Native portrait geometry (controller RAM)
    self.width = EPD_WIDTH    # X (bytes will be width//8)
    self.height = EPD_HEIGHT  # Y

    if epdconfig.module_init() != 0:
        logger.error("EPD config module initialization failed.")
        raise IOError("Failed to initialize EPD hardware.")

def digital_write(self, pin, value):
    epdconfig.digital_write(pin, value)

def digital_read(self, pin):
    return epdconfig.digital_read(pin)

def delay_ms(self, delaytime):
    epdconfig.delay_ms(delaytime)

def spi_writebyte(self, data):
    epdconfig.spi_writebyte(data)

def send_command(self, command):
    self.digital_write(self.dc_pin, 0)
    self.spi_writebyte([command])

def send_data(self, data):
    self.digital_write(self.dc_pin, 1)
    if isinstance(data, int):
        self.spi_writebyte([data])
    elif isinstance(data, (list, tuple, bytearray)):
        self.spi_writebyte(list(data))
    else:
        logger.warning(f"send_data received unexpected type: {type(data)}. Converting to list.")
        self.spi_writebyte([data])

def Reset(self):
    self.digital_write(self.reset_pin, 1)
    self.delay_ms(200)
    self.digital_write(self.reset_pin, 0)
    self.delay_ms(5)
    self.digital_write(self.reset_pin, 1)
    self.delay_ms(200)

def ReadBusy(self):
    timeout_start = time.time()
    timeout_duration = 30  # seconds
    while self.digital_read(self.busy_pin) == 1:
        self.delay_ms(10)
        if (time.time() - timeout_start) > timeout_duration:
            raise RuntimeError("EPD ReadBusy timeout.")

# init: Y- (fix wrap) and X- (fix mirror)
def init(self):
    self.Reset()

    # Driver Output Control (0x01)
    self.send_command(DRIVER_OUTPUT_CONTROL)
    self.send_data((self.height - 1) & 0xFF)
    self.send_data(((self.height - 1) >> 8) & 0xFF)
    self.send_data(0x00)

    # Booster Soft Start Control (0x0C)
    self.send_command(BOOSTER_SOFT_START_CONTROL)
    self.send_data(0xD7); self.send_data(0xD6); self.send_data(0x9D)

    # Write VCOM Register (0x2C)
    self.send_command(WRITE_VCOM_REGISTER)
    self.send_data(0xA8)

    # Set Dummy Line Period (0x3A)
    self.send_command(SET_DUMMY_LINE_PERIOD); self.send_data(0x1A)

    # Set Gate Time (0x3B)
    self.send_command(SET_GATE_TIME); self.send_data(0x08)

    # Data Entry Mode (0x11): X- , Y-  (was 0x03 X+,Y+ and then 0x01 X+,Y-)
    self.send_command(DATA_ENTRY_MODE)
    self.send_data(0x00)

    # RAM X window: start = (width/8 - 1) ... end = 0   (reverse X to match X-)
    self.send_command(SET_RAM_X_ADDRESS_START_END_POSITION)
    self.send_data((self.width // 8 - 1) & 0xFF)  # X start
    self.send_data(0x00)                          # X end

    # RAM Y window: start = height-1 ... end = 0   (Y-)
    self.send_command(SET_RAM_Y_ADDRESS_START_END_END_POSITION)
    self.send_data((self.height - 1) & 0xFF)            # Y start L
    self.send_data(((self.height - 1) >> 8) & 0xFF)     # Y start H
    self.send_data(0x00)                                # Y end L
    self.send_data(0x00)                                # Y end H

    # LUT
    self.send_command(SET_LUT_REGISTER); self.send_data(LUT_FULL_UPDATE)

    # Seed X/Y counters to their respective starts
    self.send_command(SET_RAM_X_ADDRESS_COUNTER); self.send_data((self.width // 8 - 1) & 0xFF)
    self.send_command(SET_RAM_Y_ADDRESS_COUNTER)
    self.send_data((self.height - 1) & 0xFF); self.send_data(((self.height - 1) >> 8) & 0xFF)

    self.ReadBusy()

def getbuffer(self, image):
    """
    Expect a portrait PIL image 128x296 ('1' mode).
    Packs into bytes (1=white, 0=black -> controller expects 0=white,1=black so invert).
    """
    if image.mode != '1':
        image = image.convert('1')
    if image.size != (self.width, self.height):
        image = image.resize((self.width, self.height))

    buf = bytearray(self.width * self.height // 8)

    # Pack left->right within each byte; top->bottom across rows
    for y in range(self.height):
        base = y * (self.width // 8)
        for x in range(self.width // 8):
            byte_val = 0
            px = x * 8
            for bit in range(8):
                if image.getpixel((px + bit, y)) == 0:  # black
                    byte_val |= (0x80 >> bit)
            buf[base + x] = (~byte_val) & 0xFF  # invert polarity

    return buf

def _seed_address_counters(self):
    """Re-seed X/Y RAM address counters before a write."""
    self.send_command(SET_RAM_X_ADDRESS_COUNTER)
    self.send_data((self.width // 8 - 1) & 0xFF)
    self.send_command(SET_RAM_Y_ADDRESS_COUNTER)
    self.send_data((self.height - 1) & 0xFF)
    self.send_data(((self.height - 1) >> 8) & 0xFF)

def display(self, image_buffer):
    self._seed_address_counters()
    self.send_command(WRITE_RAM)
    total = self.height * (self.width // 8)
    for i in range(total):
        self.send_data(image_buffer[i])
    self.TurnOnDisplay()

def TurnOnDisplay(self):
    self.send_command(DISPLAY_UPDATE_CONTROL_2); self.send_data(0xF7)
    self.send_command(MASTER_ACTIVATION)
    self.ReadBusy()

def Clear(self, color=0xFF):
    self._seed_address_counters()
    self.send_command(WRITE_RAM)
    total = self.height * (self.width // 8)
    for _ in range(total):
        self.send_data(color)
    self.TurnOnDisplay()

def sleep(self):
    self.send_command(DEEP_SLEEP_MODE); self.send_data(0x01)
    epdconfig.delay_ms(100)

def Dev_exit(self):
    epdconfig.module_exit()

Here is the code
here is what im getting.

help!