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 logging
import sys import sys
import time import time
import subprocess
from ctypes import *
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -42,6 +45,8 @@ class RaspberryPi:
CS_PIN = 8 CS_PIN = 8
BUSY_PIN = 24 BUSY_PIN = 24
PWR_PIN = 18 PWR_PIN = 18
MOSI_PIN = 10
SCLK_PIN = 11
def __init__(self): def __init__(self):
import spidev import spidev
@ -97,9 +102,41 @@ class RaspberryPi:
def spi_writebyte2(self, data): def spi_writebyte2(self, data):
self.SPI.writebytes2(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() 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 # SPI device, bus = 0, device = 0
self.SPI.open(0, 0) self.SPI.open(0, 0)
self.SPI.max_speed_hz = 4000000 self.SPI.max_speed_hz = 4000000
@ -112,7 +149,6 @@ class RaspberryPi:
self.GPIO_RST_PIN.off() self.GPIO_RST_PIN.off()
self.GPIO_DC_PIN.off() self.GPIO_DC_PIN.off()
self.GPIO_CS_PIN.off()
self.GPIO_PWR_PIN.off() self.GPIO_PWR_PIN.off()
logger.debug("close 5V, Module enters 0 power consumption ...") 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('_')]: for func in [x for x in dir(implementation) if not x.startswith('_')]:
setattr(sys.modules[__name__], func, getattr(implementation, func)) setattr(sys.modules[__name__], func, getattr(implementation, func))
### END OF FILE ###

View File

@ -446,7 +446,7 @@ class EPD:
def display_4Gray(self, image): def display_4Gray(self, image):
self.send_command(0x24) self.send_command(0x24)
for i in range(0, 48000): # 5808*4 46464 for i in range(0, 5808): # 5808*4 46464
temp3 = 0 temp3 = 0
for j in range(0, 2): for j in range(0, 2):
temp1 = image[i * 2 + j] temp1 = image[i * 2 + j]
@ -478,7 +478,7 @@ class EPD:
self.send_data(temp3) self.send_data(temp3)
self.send_command(0x26) self.send_command(0x26)
for i in range(0, 48000): # 5808*4 46464 for i in range(0, 5808): # 5808*4 46464
temp3 = 0 temp3 = 0
for j in range(0, 2): for j in range(0, 2):
temp1 = image[i * 2 + j] temp1 = image[i * 2 + j]

View File

@ -28,7 +28,7 @@
# #
import logging import logging
from pwnagotchi.ui.hw.libs.waveshare.epaper import epdconfig from .. import epdconfig
# Display resolution # Display resolution
EPD_WIDTH = 400 EPD_WIDTH = 400
@ -45,6 +45,10 @@ class EPD:
self.cs_pin = epdconfig.CS_PIN self.cs_pin = epdconfig.CS_PIN
self.width = EPD_WIDTH self.width = EPD_WIDTH
self.height = EPD_HEIGHT self.height = EPD_HEIGHT
self.flag = 0
if (epdconfig.module_init(cleanup=True) != 0):
return -1
# Hardware reset # Hardware reset
def reset(self): def reset(self):
@ -58,13 +62,13 @@ class EPD:
def send_command(self, command): def send_command(self, command):
epdconfig.digital_write(self.dc_pin, 0) epdconfig.digital_write(self.dc_pin, 0)
epdconfig.digital_write(self.cs_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) epdconfig.digital_write(self.cs_pin, 1)
def send_data(self, data): def send_data(self, data):
epdconfig.digital_write(self.dc_pin, 1) epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0) epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte([data]) epdconfig.DEV_SPI_write(data)
epdconfig.digital_write(self.cs_pin, 1) epdconfig.digital_write(self.cs_pin, 1)
# send a lot of data # send a lot of data
@ -76,23 +80,77 @@ class EPD:
def ReadBusy(self): def ReadBusy(self):
logger.debug("e-Paper busy") logger.debug("e-Paper busy")
self.send_command(0x71) if (self.flag == 1):
while (epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy while (epdconfig.digital_read(self.busy_pin) == 1):
self.send_command(0x71) epdconfig.delay_ms(100)
epdconfig.delay_ms(20)
else:
while (epdconfig.digital_read(self.busy_pin) == 0):
epdconfig.delay_ms(100)
logger.debug("e-Paper busy release") 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): def init(self):
if (epdconfig.module_init() != 0): i = 0x00
return -1
self.reset() 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); if (i == 0x01):
self.ReadBusy(); self.flag = 1
self.ReadBusy()
self.send_command(0x12)
self.ReadBusy()
self.send_command(0x00); self.send_command(0x3C)
self.send_data(0x0f); 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 return 0
@ -121,39 +179,78 @@ class EPD:
return buf return buf
def display(self, imageblack, imagered): 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_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_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) self.TurnOnDisplay()
epdconfig.delay_ms(20)
self.ReadBusy()
def Clear(self): def Clear(self):
if self.width % 8 == 0: high = self.height
linewidth = int(self.width / 8) if (self.width % 8 == 0):
wide = self.width // 8
else: 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_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_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) self.TurnOnDisplay()
epdconfig.delay_ms(20)
self.ReadBusy()
def sleep(self): def sleep(self):
self.send_command(0X50) if (self.flag == 1):
self.send_data(0xf7) # border floating self.send_command(0X10)
self.send_data(0x03)
self.send_command(0X02) # power off else:
self.ReadBusy() # waiting for the electronic paper IC to release the idle signal self.send_command(0X50)
self.send_command(0X07) # deep sleep self.send_data(0xf7)
self.send_command(0X02)
self.ReadBusy()
self.send_command(0X07)
self.send_data(0xA5) self.send_data(0xA5)
epdconfig.delay_ms(2000) epdconfig.delay_ms(2000)