diff --git a/pwnagotchi/ui/hw/libs/waveshare/epaper/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/epaper/epdconfig.py index 91e59855..75e1d1a0 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/epaper/epdconfig.py +++ b/pwnagotchi/ui/hw/libs/waveshare/epaper/epdconfig.py @@ -31,6 +31,9 @@ import os import logging import sys import time +import subprocess + +from ctypes import * logger = logging.getLogger(__name__) @@ -42,6 +45,8 @@ class RaspberryPi: CS_PIN = 8 BUSY_PIN = 24 PWR_PIN = 18 + MOSI_PIN = 10 + SCLK_PIN = 11 def __init__(self): import spidev @@ -97,13 +102,45 @@ class RaspberryPi: def spi_writebyte2(self, data): self.SPI.writebytes2(data) - def module_init(self): + def DEV_SPI_write(self, data): + self.DEV_SPI.DEV_SPI_SendData(data) + + def DEV_SPI_nwrite(self, data): + self.DEV_SPI.DEV_SPI_SendnData(data) + + def DEV_SPI_read(self): + return self.DEV_SPI.DEV_SPI_ReadData() + + def module_init(self, cleanup=False): self.GPIO_PWR_PIN.on() - # SPI device, bus = 0, device = 0 - self.SPI.open(0, 0) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 + if cleanup: + find_dirs = [ + os.path.dirname(os.path.realpath(__file__)), + '/usr/local/lib', + '/usr/lib', + ] + self.DEV_SPI = None + for find_dir in find_dirs: + val = int(os.popen('getconf LONG_BIT').read()) + logging.debug("System is %d bit" % val) + if val == 64: + so_filename = os.path.join(find_dir, 'DEV_Config_64.so') + else: + so_filename = os.path.join(find_dir, 'DEV_Config_32.so') + if os.path.exists(so_filename): + self.DEV_SPI = CDLL(so_filename) + break + if self.DEV_SPI is None: + RuntimeError('Cannot find DEV_Config.so') + + self.DEV_SPI.DEV_Module_Init() + + else: + # SPI device, bus = 0, device = 0 + self.SPI.open(0, 0) + self.SPI.max_speed_hz = 4000000 + self.SPI.mode = 0b00 return 0 def module_exit(self, cleanup=False): @@ -112,7 +149,6 @@ class RaspberryPi: self.GPIO_RST_PIN.off() self.GPIO_DC_PIN.off() - self.GPIO_CS_PIN.off() self.GPIO_PWR_PIN.off() logger.debug("close 5V, Module enters 0 power consumption ...") @@ -127,6 +163,4 @@ class RaspberryPi: implementation = RaspberryPi() for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - -### END OF FILE ### \ No newline at end of file + setattr(sys.modules[__name__], func, getattr(implementation, func)) \ No newline at end of file diff --git a/pwnagotchi/ui/hw/libs/waveshare/epaper/v2in7_v2/epd2in7_V2.py b/pwnagotchi/ui/hw/libs/waveshare/epaper/v2in7_v2/epd2in7_V2.py index c12e2650..951d4d0b 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/epaper/v2in7_v2/epd2in7_V2.py +++ b/pwnagotchi/ui/hw/libs/waveshare/epaper/v2in7_v2/epd2in7_V2.py @@ -446,7 +446,7 @@ class EPD: def display_4Gray(self, image): self.send_command(0x24) - for i in range(0, 48000): # 5808*4 46464 + for i in range(0, 5808): # 5808*4 46464 temp3 = 0 for j in range(0, 2): temp1 = image[i * 2 + j] @@ -478,7 +478,7 @@ class EPD: self.send_data(temp3) self.send_command(0x26) - for i in range(0, 48000): # 5808*4 46464 + for i in range(0, 5808): # 5808*4 46464 temp3 = 0 for j in range(0, 2): temp1 = image[i * 2 + j] diff --git a/pwnagotchi/ui/hw/libs/waveshare/epaper/v4in2b_v2/epd4in2b_V2.py b/pwnagotchi/ui/hw/libs/waveshare/epaper/v4in2b_v2/epd4in2b_V2.py index 7843f829..a3745135 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/epaper/v4in2b_v2/epd4in2b_V2.py +++ b/pwnagotchi/ui/hw/libs/waveshare/epaper/v4in2b_v2/epd4in2b_V2.py @@ -28,7 +28,7 @@ # import logging -from pwnagotchi.ui.hw.libs.waveshare.epaper import epdconfig +from .. import epdconfig # Display resolution EPD_WIDTH = 400 @@ -45,6 +45,10 @@ class EPD: self.cs_pin = epdconfig.CS_PIN self.width = EPD_WIDTH self.height = EPD_HEIGHT + self.flag = 0 + + if (epdconfig.module_init(cleanup=True) != 0): + return -1 # Hardware reset def reset(self): @@ -58,13 +62,13 @@ class EPD: def send_command(self, command): epdconfig.digital_write(self.dc_pin, 0) epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) + epdconfig.DEV_SPI_write(command) epdconfig.digital_write(self.cs_pin, 1) def send_data(self, data): epdconfig.digital_write(self.dc_pin, 1) epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) + epdconfig.DEV_SPI_write(data) epdconfig.digital_write(self.cs_pin, 1) # send a lot of data @@ -76,23 +80,77 @@ class EPD: def ReadBusy(self): logger.debug("e-Paper busy") - self.send_command(0x71) - while (epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy - self.send_command(0x71) - epdconfig.delay_ms(20) + if (self.flag == 1): + while (epdconfig.digital_read(self.busy_pin) == 1): + epdconfig.delay_ms(100) + + else: + while (epdconfig.digital_read(self.busy_pin) == 0): + epdconfig.delay_ms(100) logger.debug("e-Paper busy release") + def TurnOnDisplay(self): + if (self.flag == 1): + self.send_command(0x22) + self.send_data(0xF7) + self.send_command(0x20) + self.ReadBusy() + + else: + self.send_command(0x12) + epdconfig.delay_ms(100) + self.ReadBusy() + def init(self): - if (epdconfig.module_init() != 0): - return -1 - + i = 0x00 self.reset() + self.send_command(0x2F) + epdconfig.delay_ms(100) + epdconfig.digital_write(self.dc_pin, 1) + epdconfig.digital_write(self.cs_pin, 0) + i = epdconfig.DEV_SPI_read() + epdconfig.digital_write(self.cs_pin, 1) + # print(i) - self.send_command(0x04); - self.ReadBusy(); + if (i == 0x01): + self.flag = 1 + self.ReadBusy() + self.send_command(0x12) + self.ReadBusy() - self.send_command(0x00); - self.send_data(0x0f); + self.send_command(0x3C) + self.send_data(0x05) + + self.send_command(0x18) + self.send_data(0x80) + + self.send_command(0x11) + self.send_data(0x03) + + self.send_command(0x44) + self.send_data(0x00) + self.send_data(self.width // 8 - 1) + + self.send_command(0x45) + self.send_data(0x00) + self.send_data(0x00) + self.send_data((self.height - 1) % 256) + self.send_data((self.height - 1) // 256) + + self.send_command(0x4E) + self.send_data(0x00) + self.send_command(0x4F) + self.send_data(0x00) + self.send_data(0x00) + self.ReadBusy() + + else: + self.flag = 0 + self.send_command(0x04) # POWER_ON + self.ReadBusy() + + self.send_command(0x00) # panel setting + self.send_data(0x0f) return 0 @@ -121,40 +179,79 @@ class EPD: return buf def display(self, imageblack, imagered): - self.send_command(0x10) - self.send_data2(imageblack) + high = self.height + if (self.width % 8 == 0): + wide = self.width // 8 + else: + wide = self.width // 8 + 1 - self.send_command(0x13) - self.send_data2(imagered) + if (self.flag == 1): + self.send_command(0x24) + for j in range(0, high): + for i in range(0, wide): + self.send_data(imageblack[i + j * wide]) - self.send_command(0x12) - epdconfig.delay_ms(20) - self.ReadBusy() + self.send_command(0x26) + for j in range(0, high): + for i in range(0, wide): + self.send_data(~imagered[i + j * wide]) + + else: + self.send_command(0x10) + for j in range(0, high): + for i in range(0, wide): + self.send_data(imageblack[i + j * wide]) + + self.send_command(0x13) + for j in range(0, high): + for i in range(0, wide): + self.send_data(imagered[i + j * wide]) + + self.TurnOnDisplay() def Clear(self): - if self.width % 8 == 0: - linewidth = int(self.width / 8) + high = self.height + if (self.width % 8 == 0): + wide = self.width // 8 else: - linewidth = int(self.width / 8) + 1 + wide = self.width // 8 + 1 - self.send_command(0x10) - self.send_data2([0xff] * int(self.height * linewidth)) + if (self.flag == 1): + self.send_command(0x24) + for j in range(0, high): + for i in range(0, wide): + self.send_data(0xff) - self.send_command(0x13) - self.send_data2([0xff] * int(self.height * linewidth)) + self.send_command(0x26) + for j in range(0, high): + for i in range(0, wide): + self.send_data(0x00) - self.send_command(0x12) - epdconfig.delay_ms(20) - self.ReadBusy() + else: + self.send_command(0x10) + for j in range(0, high): + for i in range(0, wide): + self.send_data(0xff) + + self.send_command(0x13) + for j in range(0, high): + for i in range(0, wide): + self.send_data(0xff) + + self.TurnOnDisplay() def sleep(self): - self.send_command(0X50) - self.send_data(0xf7) # border floating + if (self.flag == 1): + self.send_command(0X10) + self.send_data(0x03) - self.send_command(0X02) # power off - self.ReadBusy() # waiting for the electronic paper IC to release the idle signal - self.send_command(0X07) # deep sleep - self.send_data(0xA5) + else: + self.send_command(0X50) + self.send_data(0xf7) + self.send_command(0X02) + self.ReadBusy() + self.send_command(0X07) + self.send_data(0xA5) epdconfig.delay_ms(2000) epdconfig.module_exit()