Updated displays

Signed-off-by: jayofelony <oudshoorn.jeroen@gmail.com>
This commit is contained in:
jayofelony
2024-06-05 10:50:15 +02:00
parent 20bae7adaa
commit cbc601e38b
3 changed files with 179 additions and 48 deletions

View File

@ -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,9 +102,41 @@ 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()
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
@ -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 ...")
@ -128,5 +164,3 @@ 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 ###

View File

@ -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]

View File

@ -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,39 +179,78 @@ class EPD:
return buf
def display(self, imageblack, imagered):
high = self.height
if (self.width % 8 == 0):
wide = self.width // 8
else:
wide = self.width // 8 + 1
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(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)
self.send_data2(imageblack)
for j in range(0, high):
for i in range(0, wide):
self.send_data(imageblack[i + j * wide])
self.send_command(0x13)
self.send_data2(imagered)
for j in range(0, high):
for i in range(0, wide):
self.send_data(imagered[i + j * wide])
self.send_command(0x12)
epdconfig.delay_ms(20)
self.ReadBusy()
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
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(0x26)
for j in range(0, high):
for i in range(0, wide):
self.send_data(0x00)
else:
self.send_command(0x10)
self.send_data2([0xff] * int(self.height * linewidth))
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))
for j in range(0, high):
for i in range(0, wide):
self.send_data(0xff)
self.send_command(0x12)
epdconfig.delay_ms(20)
self.ReadBusy()
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
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)