Update epdconfig.py

This commit is contained in:
kmanc 2022-10-29 13:26:57 -07:00 committed by GitHub
commit 0d59a1227e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,13 +1,13 @@
# ***************************************************************************** # /*****************************************************************************
# * | File : epd4in2.py # * | File : epdconfig.py
# * | Author : Waveshare team # * | Author : Waveshare team
# * | Function : Electronic paper driver # * | Function : Hardware underlying interface
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V4.2 # * | This version: V1.2
# * | Date : 2022-10-29 # * | Date : 2022-10-29
# # | Info : python demo # * | Info :
# ----------------------------------------------------------------------------- # ******************************************************************************
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal # of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights # in the Software without restriction, including without limitation the rights
@ -27,652 +27,200 @@
# THE SOFTWARE. # THE SOFTWARE.
# #
import os
import logging import logging
import epdconfig import sys
from PIL import Image import time
import RPi.GPIO as GPIO
# Display resolution
EPD_WIDTH = 400
EPD_HEIGHT = 300
GRAY1 = 0xff # white
GRAY2 = 0xC0
GRAY3 = 0x80 # gray
GRAY4 = 0x00 # Blackest
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class EPD: class RaspberryPi:
# Pin definition
RST_PIN = 17
DC_PIN = 25
CS_PIN = 8
BUSY_PIN = 24
def __init__(self): def __init__(self):
self.reset_pin = epdconfig.RST_PIN import spidev
self.dc_pin = epdconfig.DC_PIN import RPi.GPIO
self.busy_pin = epdconfig.BUSY_PIN
self.cs_pin = epdconfig.CS_PIN
self.width = EPD_WIDTH
self.height = EPD_HEIGHT
self.GRAY1 = GRAY1 # white
self.GRAY2 = GRAY2
self.GRAY3 = GRAY3 # gray
self.GRAY4 = GRAY4 # Blackest
self.DATA = [0x00] * 15000
lut_vcom0 = [ self.GPIO = RPi.GPIO
0x00, 0x08, 0x08, 0x00, 0x00, 0x02, self.SPI = spidev.SpiDev()
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0x00, 0x08, 0x08, 0x00, 0x00, 0x02,
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,
]
lut_ww = [
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
lut_bw = [
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
lut_wb = [
0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
lut_bb = [
0x20, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0x10, 0x08, 0x08, 0x00, 0x00, 0x02,
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 screen update LUT*********************************/
EPD_4IN2_Partial_lut_vcom1 = [
0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
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,
]
EPD_4IN2_Partial_lut_ww1 = [ def digital_write(self, pin, value):
0x00, 0x01, 0x20, 0x01, 0x00, 0x01, self.GPIO.output(pin, value)
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,
]
EPD_4IN2_Partial_lut_bw1 = [ def digital_read(self, pin):
0x20, 0x01, 0x20, 0x01, 0x00, 0x01, return self.GPIO.input(pin)
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,
]
EPD_4IN2_Partial_lut_wb1 = [ def delay_ms(self, delaytime):
0x10, 0x01, 0x20, 0x01, 0x00, 0x01, time.sleep(delaytime / 1000.0)
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,
]
EPD_4IN2_Partial_lut_bb1 = [ def spi_writebyte(self, data):
0x00, 0x01, 0x20, 0x01, 0x00, 0x01, self.SPI.writebytes(data)
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,
]
# ******************************gray*********************************/ def spi_writebyte2(self, data):
# 0~3 gray self.SPI.writebytes2(data)
EPD_4IN2_4Gray_lut_vcom = [
0x00, 0x0A, 0x00, 0x00, 0x00, 0x01,
0x60, 0x14, 0x14, 0x00, 0x00, 0x01,
0x00, 0x14, 0x00, 0x00, 0x00, 0x01,
0x00, 0x13, 0x0A, 0x01, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
]
# R21
EPD_4IN2_4Gray_lut_ww = [
0x40, 0x0A, 0x00, 0x00, 0x00, 0x01,
0x90, 0x14, 0x14, 0x00, 0x00, 0x01,
0x10, 0x14, 0x0A, 0x00, 0x00, 0x01,
0xA0, 0x13, 0x01, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
# R22H r
EPD_4IN2_4Gray_lut_bw = [
0x40, 0x0A, 0x00, 0x00, 0x00, 0x01,
0x90, 0x14, 0x14, 0x00, 0x00, 0x01,
0x00, 0x14, 0x0A, 0x00, 0x00, 0x01,
0x99, 0x0C, 0x01, 0x03, 0x04, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
# R23H w
EPD_4IN2_4Gray_lut_wb = [
0x40, 0x0A, 0x00, 0x00, 0x00, 0x01,
0x90, 0x14, 0x14, 0x00, 0x00, 0x01,
0x00, 0x14, 0x0A, 0x00, 0x00, 0x01,
0x99, 0x0B, 0x04, 0x04, 0x01, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
# R24H b
EPD_4IN2_4Gray_lut_bb = [
0x80, 0x0A, 0x00, 0x00, 0x00, 0x01,
0x90, 0x14, 0x14, 0x00, 0x00, 0x01,
0x20, 0x14, 0x0A, 0x00, 0x00, 0x01,
0x50, 0x13, 0x01, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
# Hardware reset def module_init(self):
def reset(self): self.GPIO.setmode(self.GPIO.BCM)
epdconfig.digital_write(self.reset_pin, 1) self.GPIO.setwarnings(False)
epdconfig.delay_ms(10) self.GPIO.setup(self.RST_PIN, self.GPIO.OUT)
epdconfig.digital_write(self.reset_pin, 0) self.GPIO.setup(self.DC_PIN, self.GPIO.OUT)
epdconfig.delay_ms(10) self.GPIO.setup(self.CS_PIN, self.GPIO.OUT)
epdconfig.digital_write(self.reset_pin, 1) self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN)
epdconfig.delay_ms(10)
epdconfig.digital_write(self.reset_pin, 0)
epdconfig.delay_ms(10)
epdconfig.digital_write(self.reset_pin, 1)
epdconfig.delay_ms(10)
epdconfig.digital_write(self.reset_pin, 0)
epdconfig.delay_ms(10)
epdconfig.digital_write(self.reset_pin, 1)
epdconfig.delay_ms(10)
def send_command(self, command): # SPI device, bus = 0, device = 0
epdconfig.digital_write(self.dc_pin, 0) self.SPI.open(0, 0)
epdconfig.digital_write(self.cs_pin, 0) self.SPI.max_speed_hz = 4000000
epdconfig.spi_writebyte([command]) self.SPI.mode = 0b00
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.digital_write(self.cs_pin, 1)
# send a lot of data
def send_data2(self, data):
epdconfig.digital_write(self.dc_pin, 1)
epdconfig.digital_write(self.cs_pin, 0)
epdconfig.spi_writebyte2(data)
epdconfig.digital_write(self.cs_pin, 1)
def ReadBusy(self):
self.send_command(0x71)
while epdconfig.digital_read(self.busy_pin) == 0: # 0: idle, 1: busy
self.send_command(0x71)
epdconfig.delay_ms(100)
def set_lut(self):
self.send_command(0x20) # vcom
self.send_data2(self.lut_vcom0)
self.send_command(0x21) # ww --
self.send_data2(self.lut_ww)
self.send_command(0x22) # bw r
self.send_data2(self.lut_bw)
self.send_command(0x23) # wb w
self.send_data2(self.lut_bb)
self.send_command(0x24) # bb b
self.send_data2(self.lut_wb)
def Partial_SetLut(self):
self.send_command(0x20)
self.send_data2(self.EPD_4IN2_Partial_lut_vcom1)
self.send_command(0x21)
self.send_data2(self.EPD_4IN2_Partial_lut_ww1)
self.send_command(0x22)
self.send_data2(self.EPD_4IN2_Partial_lut_bw1)
self.send_command(0x23)
self.send_data2(self.EPD_4IN2_Partial_lut_wb1)
self.send_command(0x24)
self.send_data2(self.EPD_4IN2_Partial_lut_bb1)
def Gray_SetLut(self):
self.send_command(0x20) # vcom
self.send_data2(self.EPD_4IN2_4Gray_lut_vcom)
self.send_command(0x21) # red not use
self.send_data2(self.EPD_4IN2_4Gray_lut_ww)
self.send_command(0x22) # bw r
self.send_data2(self.EPD_4IN2_4Gray_lut_bw)
self.send_command(0x23) # wb w
self.send_data2(self.EPD_4IN2_4Gray_lut_wb)
self.send_command(0x24) # bb b
self.send_data2(self.EPD_4IN2_4Gray_lut_bb)
self.send_command(0x25) # vcom
self.send_data2(self.EPD_4IN2_4Gray_lut_ww)
def init(self):
if epdconfig.module_init() != 0:
return -1
# EPD hardware init start
self.reset()
self.send_command(0x01) # POWER SETTING
self.send_data(0x03) # VDS_EN, VDG_EN
self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0]
self.send_data(0x2b) # VDH
self.send_data(0x2b) # VDL
self.send_command(0x06) # boost soft start
self.send_data(0x17)
self.send_data(0x17)
self.send_data(0x17)
self.send_command(0x04) # POWER_ON
self.ReadBusy()
self.send_command(0x00) # panel setting
self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f
self.send_command(0x30) # PLL setting
self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
self.send_command(0x61) # resolution setting
self.send_data(0x01)
self.send_data(0x90) # 128
self.send_data(0x01)
self.send_data(0x2c)
self.send_command(0x82) # vcom_DC setting
self.send_data(0x12)
self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
self.send_data(
0x97) # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
self.set_lut()
# EPD hardware init end
return 0 return 0
def init_Partial(self): def module_exit(self):
if epdconfig.module_init() != 0: logger.debug("spi end")
return -1 self.SPI.close()
# EPD hardware init start
self.reset()
self.send_command(0x01) # POWER SETTING logger.debug("close 5V, Module enters 0 power consumption ...")
self.send_data(0x03) # VDS_EN, VDG_EN self.GPIO.output(self.RST_PIN, 0)
self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0] self.GPIO.output(self.DC_PIN, 0)
self.send_data(0x2b) # VDH
self.send_data(0x2b) # VDL
self.send_command(0x06) # boost soft start self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN])
self.send_data(0x17)
self.send_data(0x17)
self.send_data(0x17)
self.send_command(0x04) # POWER_ON
self.ReadBusy()
self.send_command(0x00) # panel setting class JetsonNano:
self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f # Pin definition
RST_PIN = 17
DC_PIN = 25
CS_PIN = 8
BUSY_PIN = 24
self.send_command(0x30) # PLL setting def __init__(self):
self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ import ctypes
find_dirs = [
os.path.dirname(os.path.realpath(__file__)),
'/usr/local/lib',
'/usr/lib',
]
self.SPI = None
for find_dir in find_dirs:
so_filename = os.path.join(find_dir, 'sysfs_software_spi.so')
if os.path.exists(so_filename):
self.SPI = ctypes.cdll.LoadLibrary(so_filename)
break
if self.SPI is None:
raise RuntimeError('Cannot find sysfs_software_spi.so')
self.send_command(0x61) # resolution setting import Jetson.GPIO
self.send_data(0x01) self.GPIO = Jetson.GPIO
self.send_data(0x90) # 128
self.send_data(0x01)
self.send_data(0x2c)
self.send_command(0x82) # vcom_DC setting def digital_write(self, pin, value):
self.send_data(0x12) self.GPIO.output(pin, value)
self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING def digital_read(self, pin):
self.send_data( return self.GPIO.input(self.BUSY_PIN)
0x07) # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
self.Partial_SetLut() def delay_ms(self, delaytime):
# EPD hardware init end time.sleep(delaytime / 1000.0)
def spi_writebyte(self, data):
self.SPI.SYSFS_software_spi_transfer(data[0])
def spi_writebyte2(self, data):
for i in range(len(data)):
self.SPI.SYSFS_software_spi_transfer(data[i])
def module_init(self):
self.GPIO.setmode(self.GPIO.BCM)
self.GPIO.setwarnings(False)
self.GPIO.setup(self.RST_PIN, self.GPIO.OUT)
self.GPIO.setup(self.DC_PIN, self.GPIO.OUT)
self.GPIO.setup(self.CS_PIN, self.GPIO.OUT)
self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN)
self.SPI.SYSFS_software_spi_begin()
return 0 return 0
def Init_4Gray(self): def module_exit(self):
if epdconfig.module_init() != 0: logger.debug("spi end")
return -1 self.SPI.SYSFS_software_spi_end()
# EPD hardware init start
self.reset()
self.send_command(0x01) # POWER SETTING logger.debug("close 5V, Module enters 0 power consumption ...")
self.send_data(0x03) self.GPIO.output(self.RST_PIN, 0)
self.send_data(0x00) # VGH=20V,VGL=-20V self.GPIO.output(self.DC_PIN, 0)
self.send_data(0x2b) # VDH=15V
self.send_data(0x2b) # VDL=-15V
self.send_data(0x13)
self.send_command(0x06) # booster soft start self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN])
self.send_data(0x17) # A
self.send_data(0x17) # B
self.send_data(0x17) # C
self.send_command(0x04) class SunriseX3:
self.ReadBusy() # Pin definition
RST_PIN = 17
DC_PIN = 25
CS_PIN = 8
BUSY_PIN = 24
Flag = 0
self.send_command(0x00) # panel setting def __init__(self):
self.send_data(0x3f) # KW-3f KWR-2F BWROTP 0f BWOTP 1f import spidev
import Hobot.GPIO
self.send_command(0x30) # PLL setting self.GPIO = Hobot.GPIO
self.send_data(0x3c) # 100hz self.SPI = spidev.SpiDev()
self.send_command(0x61) # resolution setting def digital_write(self, pin, value):
self.send_data(0x01) # 400 self.GPIO.output(pin, value)
self.send_data(0x90)
self.send_data(0x01) # 300
self.send_data(0x2c)
self.send_command(0x82) # vcom_DC setting def digital_read(self, pin):
self.send_data(0x12) return self.GPIO.input(pin)
self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING def delay_ms(self, delaytime):
self.send_data(0x97) time.sleep(delaytime / 1000.0)
def getbuffer(self, image): def spi_writebyte(self, data):
# logger.debug("bufsiz = ",int(self.width/8) * self.height) self.SPI.writebytes(data)
buf = [0xFF] * (int(self.width / 8) * self.height)
image_monocolor = image.convert('1')
imwidth, imheight = image_monocolor.size
pixels = image_monocolor.load()
# logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
if imwidth == self.width and imheight == self.height:
logger.debug("Horizontal")
for y in range(imheight):
for x in range(imwidth):
# Set the bits for the column of pixels at the current position.
if pixels[x, y] == 0:
buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8))
elif imwidth == self.height and imheight == self.width:
logger.debug("Vertical")
for y in range(imheight):
for x in range(imwidth):
newx = y
newy = self.height - x - 1
if pixels[x, y] == 0:
buf[int((newx + newy * self.width) / 8)] &= ~(0x80 >> (y % 8))
return buf
def getbuffer_4Gray(self, image): def spi_writebyte2(self, data):
# logger.debug("bufsiz = ",int(self.width/8) * self.height) # for i in range(len(data)):
buf = [0xFF] * (int(self.width / 4) * self.height) # self.SPI.writebytes([data[i]])
image_monocolor = image.convert('L') self.SPI.xfer3(data)
imwidth, imheight = image_monocolor.size
pixels = image_monocolor.load()
i = 0
# logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
if imwidth == self.width and imheight == self.height:
logger.debug("Vertical")
for y in range(imheight):
for x in range(imwidth):
# Set the bits for the column of pixels at the current position.
if pixels[x, y] == 0xC0:
pixels[x, y] = 0x80
elif pixels[x, y] == 0x80:
pixels[x, y] = 0x40
i = i + 1
if i % 4 == 0:
buf[int((x + (y * self.width)) / 4)] = (
(pixels[x - 3, y] & 0xc0) | (pixels[x - 2, y] & 0xc0) >> 2 | (
pixels[x - 1, y] & 0xc0) >> 4 | (pixels[x, y] & 0xc0) >> 6)
elif imwidth == self.height and imheight == self.width: def module_init(self):
logger.debug("Horizontal") if self.Flag == 0 :
for x in range(imwidth): self.Flag = 1
for y in range(imheight): self.GPIO.setmode(self.GPIO.BCM)
newx = y self.GPIO.setwarnings(False)
newy = x self.GPIO.setup(self.RST_PIN, self.GPIO.OUT)
if pixels[x, y] == 0xC0: self.GPIO.setup(self.DC_PIN, self.GPIO.OUT)
pixels[x, y] = 0x80 self.GPIO.setup(self.CS_PIN, self.GPIO.OUT)
elif pixels[x, y] == 0x80: self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN)
pixels[x, y] = 0x40
i = i + 1
if i % 4 == 0:
buf[int((newx + (newy * self.width)) / 4)] = (
(pixels[x, y - 3] & 0xc0) | (pixels[x, y - 2] & 0xc0) >> 2 | (
pixels[x, y - 1] & 0xc0) >> 4 | (pixels[x, y] & 0xc0) >> 6)
return buf # SPI device, bus = 0, device = 0
self.SPI.open(2, 0)
def display(self, image): self.SPI.max_speed_hz = 4000000
if self.width % 8 == 0: self.SPI.mode = 0b00
linewidth = int(self.width / 8) return 0
else : else :
linewidth = int(self.width / 8) + 1 return 0
self.send_command(0x92) def module_exit(self):
self.set_lut() logger.debug("spi end")
self.send_command(0x10) self.SPI.close()
self.send_data2([0xFF] * int(self.width * linewidth))
self.send_command(0x13) logger.debug("close 5V, Module enters 0 power consumption ...")
self.send_data2(image) self.Flag = 0
self.GPIO.output(self.RST_PIN, 0)
self.GPIO.output(self.DC_PIN, 0)
self.send_command(0x12) self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN])
self.ReadBusy()
def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image): if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'):
# EPD_WIDTH = 400 implementation = RaspberryPi()
# EPD_HEIGHT = 300 elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'):
implementation = SunriseX3()
if EPD_WIDTH % 8 != 0:
Width = int(EPD_WIDTH / 8) + 1
else: else:
Width = int(EPD_WIDTH / 8) implementation = JetsonNano()
Height = EPD_HEIGHT
if X_start % 8 != 0: for func in [x for x in dir(implementation) if not x.startswith('_')]:
X_start = int(X_start / 8) + 1 setattr(sys.modules[__name__], func, getattr(implementation, func))
else:
X_start = int(X_start / 8)
if X_end % 8 != 0:
X_end = int(X_end / 8) + 1
else:
X_end = int(X_end / 8)
buf = [0x00] * (Y_end - Y_start) * (X_end - X_start)
self.send_command(0x91) # This command makes the display enter partial mode
self.send_command(0x90) # resolution setting
self.send_data(int(X_start * 8 / 256))
self.send_data(int(X_start * 8 % 256)) # x-start
self.send_data(int(X_end * 8 / 256))
self.send_data(int(X_end * 8 % 256) - 1) # x-end
self.send_data(int(Y_start / 256))
self.send_data(int(Y_start % 256)) # y-start
self.send_data(int(Y_end / 256))
self.send_data(int(Y_end % 256) - 1) # y-end
self.send_data(0x28)
self.send_command(0x10) # writes Old data to SRAM for programming
for j in range(0, Y_end - Y_start):
for i in range(0, X_end - X_start):
buf[j * (X_end - X_start) + i] = self.DATA[(Y_start + j) * Width + X_start + i]
self.send_data2(buf)
self.send_command(0x13) # writes New data to SRAM.
for j in range(0, Y_end - Y_start):
for i in range(0, X_end - X_start):
buf[j * (X_end - X_start) + i] = ~Image[(Y_start + j) * Width + X_start + i]
self.DATA[(Y_start + j) * Width + X_start + i] = ~Image[(Y_start + j) * Width + X_start / 8 + i]
self.send_data2(buf)
self.send_command(0x12) # DISPLAY REFRESH
epdconfig.delay_ms(200) # The delay here is necessary, 200uS at least!!!
self.ReadBusy()
def display_4Gray(self, image):
self.send_command(0x92)
self.set_lut()
self.send_command(0x10)
if self.width % 8 == 0:
linewidth = int(self.width / 8)
else:
linewidth = int(self.width / 8) + 1
buf = [0x00] * self.height * linewidth
for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): # EPD_WIDTH * EPD_HEIGHT / 4
temp3 = 0
for j in range(0, 2):
temp1 = image[i * 2 + j]
for k in range(0, 2):
temp2 = temp1 & 0xC0
if temp2 == 0xC0:
temp3 |= 0x01 # white
elif temp2 == 0x00:
temp3 |= 0x00 # black
elif temp2 == 0x80:
temp3 |= 0x01 # gray1
else: # 0x40
temp3 |= 0x00 # gray2
temp3 <<= 1
temp1 <<= 2
temp2 = temp1 & 0xC0
if temp2 == 0xC0: # white
temp3 |= 0x01
elif temp2 == 0x00: # black
temp3 |= 0x00
elif temp2 == 0x80:
temp3 |= 0x01 # gray1
else: # 0x40
temp3 |= 0x00 # gray2
if j != 1 or k != 1:
temp3 <<= 1
temp1 <<= 2
buf[i] = temp3
self.send_data2(buf)
self.send_command(0x13)
for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): # 5808*4 46464
temp3 = 0
for j in range(0, 2):
temp1 = image[i * 2 + j]
for k in range(0, 2):
temp2 = temp1 & 0xC0
if temp2 == 0xC0:
temp3 |= 0x01 # white
elif temp2 == 0x00:
temp3 |= 0x00 # black
elif temp2 == 0x80:
temp3 |= 0x00 # gray1
else: # 0x40
temp3 |= 0x01 # gray2
temp3 <<= 1
temp1 <<= 2
temp2 = temp1 & 0xC0
if temp2 == 0xC0: # white
temp3 |= 0x01
elif temp2 == 0x00: # black
temp3 |= 0x00
elif temp2 == 0x80:
temp3 |= 0x00 # gray1
else: # 0x40
temp3 |= 0x01 # gray2
if j != 1 or k != 1:
temp3 <<= 1
temp1 <<= 2
buf[i] = temp3
self.send_data2(buf)
self.Gray_SetLut()
self.send_command(0x12)
epdconfig.delay_ms(200)
self.ReadBusy()
# pass
def Clear(self):
if self.width % 8 == 0:
linewidth = int(self.width / 8)
else:
linewidth = int(self.width / 8) + 1
self.send_command(0x10)
self.send_data2([0xff] * int(self.height * linewidth))
self.send_command(0x13)
self.send_data2([0xff] * int(self.height * linewidth))
self.send_command(0x12)
self.ReadBusy()
def sleep(self):
self.send_command(0x02) # POWER_OFF
self.ReadBusy()
self.send_command(0x07) # DEEP_SLEEP
self.send_data(0XA5)
epdconfig.delay_ms(2000)
epdconfig.module_exit()
### END OF FILE ### ### END OF FILE ###