Update epdconfig.py

Fixed code formatting
This commit is contained in:
kmanc 2022-10-29 09:36:52 -07:00 committed by GitHub
parent 833d3a86be
commit 61a1525bd3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,13 +1,13 @@
# /***************************************************************************** # *****************************************************************************
# * | File : epdconfig.py # * | File : epd4in2.py
# * | Author : Waveshare team # * | Author : Waveshare team
# * | Function : Hardware underlying interface # * | Function : Electronic paper driver
# * | Info : # * | Info :
# *---------------- # *----------------
# * | This version: V1.1 # * | This version: V4.2
# * | Date : 2022-08-10 # * | Date : 2022-10-29
# * | Info : # # | Info : python demo
# ****************************************************************************** # -----------------------------------------------------------------------------
# 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,200 +27,652 @@
# THE SOFTWARE. # THE SOFTWARE.
# #
import os
import logging import logging
import sys import epdconfig
import time from PIL import Image
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 RaspberryPi: class EPD:
# Pin definition
RST_PIN = 17
DC_PIN = 25
CS_PIN = 8
BUSY_PIN = 24
def __init__(self): def __init__(self):
import spidev self.reset_pin = epdconfig.RST_PIN
import RPi.GPIO self.dc_pin = epdconfig.DC_PIN
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
self.GPIO = RPi.GPIO lut_vcom0 = [
self.SPI = spidev.SpiDev() 0x00, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01,
def digital_write(self, pin, value): 0x00, 0x08, 0x08, 0x00, 0x00, 0x02,
self.GPIO.output(pin, value) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
def digital_read(self, pin): 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
return self.GPIO.input(pin) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
def delay_ms(self, delaytime): ]
time.sleep(delaytime / 1000.0) lut_ww = [
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
def spi_writebyte(self, data): 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
self.SPI.writebytes(data) 0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
def spi_writebyte2(self, data): 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
self.SPI.writebytes2(data) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
def module_init(self): ]
self.GPIO.setmode(self.GPIO.BCM) lut_bw = [
self.GPIO.setwarnings(False) 0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) 0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
# SPI device, bus = 0, device = 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
self.SPI.open(0, 0) ]
self.SPI.max_speed_hz = 4000000 lut_wb = [
self.SPI.mode = 0b00 0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
return 0 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
def module_exit(self): 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
logger.debug("spi end") 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
self.SPI.close() 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
logger.debug("close 5V, Module enters 0 power consumption ...") ]
self.GPIO.output(self.RST_PIN, 0) lut_bb = [
self.GPIO.output(self.DC_PIN, 0) 0x20, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN]) 0x10, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
class JetsonNano: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
# Pin definition 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
RST_PIN = 17 ]
DC_PIN = 25 # ******************************partial screen update LUT*********************************/
CS_PIN = 8 EPD_4IN2_Partial_lut_vcom1 = [
BUSY_PIN = 24 0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
def __init__(self): 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
import ctypes 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
find_dirs = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
os.path.dirname(os.path.realpath(__file__)), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
'/usr/local/lib', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
'/usr/lib', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
] ]
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')
import Jetson.GPIO EPD_4IN2_Partial_lut_ww1 = [
self.GPIO = Jetson.GPIO 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,
]
def digital_write(self, pin, value): EPD_4IN2_Partial_lut_bw1 = [
self.GPIO.output(pin, value) 0x20, 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,
]
def digital_read(self, pin): EPD_4IN2_Partial_lut_wb1 = [
return self.GPIO.input(self.BUSY_PIN) 0x10, 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,
]
def delay_ms(self, delaytime): EPD_4IN2_Partial_lut_bb1 = [
time.sleep(delaytime / 1000.0) 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,
]
def spi_writebyte(self, data): # ******************************gray*********************************/
self.SPI.SYSFS_software_spi_transfer(data[0]) # 0~3 gray
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,
]
def spi_writebyte2(self, data): # Hardware reset
for i in range(len(data)): def reset(self):
self.SPI.SYSFS_software_spi_transfer(data[i]) 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)
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 module_init(self): def send_command(self, command):
self.GPIO.setmode(self.GPIO.BCM) epdconfig.digital_write(self.dc_pin, 0)
self.GPIO.setwarnings(False) epdconfig.digital_write(self.cs_pin, 0)
self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) epdconfig.spi_writebyte([command])
self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) epdconfig.digital_write(self.cs_pin, 1)
self.GPIO.setup(self.CS_PIN, self.GPIO.OUT)
self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) def send_data(self, data):
self.SPI.SYSFS_software_spi_begin() 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 module_exit(self): def init_Partial(self):
logger.debug("spi end") if epdconfig.module_init() != 0:
self.SPI.SYSFS_software_spi_end() return -1
# EPD hardware init start
self.reset()
logger.debug("close 5V, Module enters 0 power consumption ...") self.send_command(0x01) # POWER SETTING
self.GPIO.output(self.RST_PIN, 0) self.send_data(0x03) # VDS_EN, VDG_EN
self.GPIO.output(self.DC_PIN, 0) self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0]
self.send_data(0x2b) # VDH
self.send_data(0x2b) # VDL
self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN]) self.send_command(0x06) # boost soft start
self.send_data(0x17)
self.send_data(0x17)
self.send_data(0x17)
class SunriseX3: self.send_command(0x04) # POWER_ON
# Pin definition self.ReadBusy()
RST_PIN = 17
DC_PIN = 25
CS_PIN = 8
BUSY_PIN = 24
Flag = 0
def __init__(self): self.send_command(0x00) # panel setting
import spidev self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f
import Hobot.GPIO
self.GPIO = Hobot.GPIO self.send_command(0x30) # PLL setting
self.SPI = spidev.SpiDev() self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
def digital_write(self, pin, value): self.send_command(0x61) # resolution setting
self.GPIO.output(pin, value) self.send_data(0x01)
self.send_data(0x90) # 128
self.send_data(0x01)
self.send_data(0x2c)
def digital_read(self, pin): self.send_command(0x82) # vcom_DC setting
return self.GPIO.input(pin) self.send_data(0x12)
def delay_ms(self, delaytime): self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
time.sleep(delaytime / 1000.0) self.send_data(
0x07) # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
def spi_writebyte(self, data): self.Partial_SetLut()
self.SPI.writebytes(data) # EPD hardware init end
def spi_writebyte2(self, data):
# for i in range(len(data)):
# self.SPI.writebytes([data[i]])
self.SPI.xfer3(data)
def module_init(self):
if self.Flag == 0 :
self.Flag = 1
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)
# SPI device, bus = 0, device = 0
self.SPI.open(2, 0)
self.SPI.max_speed_hz = 4000000
self.SPI.mode = 0b00
return 0 return 0
def Init_4Gray(self):
if epdconfig.module_init() != 0:
return -1
# EPD hardware init start
self.reset()
self.send_command(0x01) # POWER SETTING
self.send_data(0x03)
self.send_data(0x00) # VGH=20V,VGL=-20V
self.send_data(0x2b) # VDH=15V
self.send_data(0x2b) # VDL=-15V
self.send_data(0x13)
self.send_command(0x06) # booster soft start
self.send_data(0x17) # A
self.send_data(0x17) # B
self.send_data(0x17) # C
self.send_command(0x04)
self.ReadBusy()
self.send_command(0x00) # panel setting
self.send_data(0x3f) # KW-3f KWR-2F BWROTP 0f BWOTP 1f
self.send_command(0x30) # PLL setting
self.send_data(0x3c) # 100hz
self.send_command(0x61) # resolution setting
self.send_data(0x01) # 400
self.send_data(0x90)
self.send_data(0x01) # 300
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)
def getbuffer(self, image):
# logger.debug("bufsiz = ",int(self.width/8) * self.height)
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):
# logger.debug("bufsiz = ",int(self.width/8) * self.height)
buf = [0xFF] * (int(self.width / 4) * self.height)
image_monocolor = image.convert('L')
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:
logger.debug("Horizontal")
for x in range(imwidth):
for y in range(imheight):
newx = y
newy = x
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((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
def display(self, image):
if self.width % 8 == 0:
linewidth = int(self.width / 8)
else: else:
return 0 linewidth = int(self.width / 8) + 1
def module_exit(self): self.send_command(0x92)
logger.debug("spi end") self.set_lut()
self.SPI.close() self.send_command(0x10)
self.send_data2([0xFF] * int(self.width * linewidth))
logger.debug("close 5V, Module enters 0 power consumption ...") self.send_command(0x13)
self.Flag = 0 self.send_data2(image)
self.GPIO.output(self.RST_PIN, 0)
self.GPIO.output(self.DC_PIN, 0)
self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN]) self.send_command(0x12)
self.ReadBusy()
if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image):
implementation = RaspberryPi() # EPD_WIDTH = 400
elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'): # EPD_HEIGHT = 300
implementation = SunriseX3()
if EPD_WIDTH % 8 != 0:
Width = int(EPD_WIDTH / 8) + 1
else: else:
implementation = JetsonNano() Width = int(EPD_WIDTH / 8)
Height = EPD_HEIGHT
for func in [x for x in dir(implementation) if not x.startswith('_')]: if X_start % 8 != 0:
setattr(sys.modules[__name__], func, getattr(implementation, func)) X_start = int(X_start / 8) + 1
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 ###