Merge pull request #146 from MediumFidelity/epd5in65f_performance_python
Improve performance of the EPD 5.65 inch color E Ink when using Python
This commit is contained in:
commit
8537d942cd
1 changed files with 60 additions and 86 deletions
|
|
@ -32,6 +32,10 @@
|
||||||
import logging
|
import logging
|
||||||
from . import epdconfig
|
from . import epdconfig
|
||||||
|
|
||||||
|
import PIL
|
||||||
|
from PIL import Image
|
||||||
|
import io
|
||||||
|
|
||||||
# Display resolution
|
# Display resolution
|
||||||
EPD_WIDTH = 600
|
EPD_WIDTH = 600
|
||||||
EPD_HEIGHT = 448
|
EPD_HEIGHT = 448
|
||||||
|
|
@ -74,6 +78,12 @@ class EPD:
|
||||||
epdconfig.spi_writebyte([data])
|
epdconfig.spi_writebyte([data])
|
||||||
epdconfig.digital_write(self.cs_pin, 1)
|
epdconfig.digital_write(self.cs_pin, 1)
|
||||||
|
|
||||||
|
def send_data_bulk(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 ReadBusyHigh(self):
|
def ReadBusyHigh(self):
|
||||||
logging.debug("e-Paper busy")
|
logging.debug("e-Paper busy")
|
||||||
while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
|
while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
|
||||||
|
|
@ -130,59 +140,31 @@ class EPD:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def getbuffer(self, image):
|
def getbuffer(self, image):
|
||||||
buf = [0x00] * int(self.width * self.height / 2)
|
# Create a pallette with the 7 colors supported by the panel
|
||||||
image_monocolor = image.convert('RGB')#Picture mode conversion
|
pal_image = Image.new("P", (1,1))
|
||||||
imwidth, imheight = image_monocolor.size
|
pal_image.putpalette( (0,0,0, 255,255,255, 0,255,0, 0,0,255, 255,0,0, 255,255,0, 255,128,0) + (0,0,0)*249)
|
||||||
pixels = image_monocolor.load()
|
|
||||||
logging.debug('imwidth = %d imheight = %d ',imwidth, imheight)
|
# Check if we need to rotate the image
|
||||||
|
imwidth, imheight = image.size
|
||||||
if(imwidth == self.width and imheight == self.height):
|
if(imwidth == self.width and imheight == self.height):
|
||||||
for y in range(imheight):
|
image_temp = image
|
||||||
for x in range(imwidth):
|
|
||||||
# Set the bits for the column of pixels at the current position.
|
|
||||||
Add = int((x + y * self.width) / 2)
|
|
||||||
Color = 0;
|
|
||||||
if (pixels[x, y][0] == 0 and pixels[x, y][1] == 0 and pixels[x, y][2] == 0):
|
|
||||||
Color = 0
|
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 255 and pixels[x, y][2] == 255):
|
|
||||||
Color = 1
|
|
||||||
elif (pixels[x, y][0] == 0 and pixels[x, y][1] == 255 and pixels[x, y][2] == 0):
|
|
||||||
Color = 2
|
|
||||||
elif (pixels[x, y][0] == 0 and pixels[x, y][1] == 0 and pixels[x, y][2] == 255):
|
|
||||||
Color = 3
|
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 0 and pixels[x, y][2] == 0):
|
|
||||||
Color = 4
|
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 255 and pixels[x, y][2] == 0):
|
|
||||||
Color = 5
|
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 128 and pixels[x, y][2] == 0):
|
|
||||||
Color = 6
|
|
||||||
|
|
||||||
data_t = buf[Add]&(~(0xF0 >> ((x % 2)*4)))
|
|
||||||
buf[Add] = data_t | ((Color << 4) >> ((x % 2)*4));
|
|
||||||
|
|
||||||
elif(imwidth == self.height and imheight == self.width):
|
elif(imwidth == self.height and imheight == self.width):
|
||||||
for y in range(imheight):
|
image_temp = image.rotate(90, expand=True)
|
||||||
for x in range(imwidth):
|
else:
|
||||||
newx = y
|
logging.warning("Invalid image dimensions: %d x %d, expected %d x %d" % (imwidth, imheight, self.width, self.height))
|
||||||
newy = self.height - x - 1
|
|
||||||
Add = int((newx + newy*self.width) / 2)
|
# Convert the soruce image to the 7 colors, dithering if needed
|
||||||
Color = 0;
|
image_7color = image_temp.convert("RGB").quantize(palette=pal_image)
|
||||||
if (pixels[x, y][0] == 0 and pixels[x, y][1] == 0 and pixels[x, y][2] == 0):
|
buf_7color = bytearray(image_7color.tobytes('raw'))
|
||||||
Color = 0
|
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 255 and pixels[x, y][2] == 255):
|
# PIL does not support 4 bit color, so pack the 4 bits of color
|
||||||
Color = 1
|
# into a single byte to transfer to the panel
|
||||||
elif (pixels[x, y][0] == 0 and pixels[x, y][1] == 255 and pixels[x, y][2] == 0):
|
buf = [0x00] * int(self.width * self.height / 2)
|
||||||
Color = 2
|
idx = 0
|
||||||
elif (pixels[x, y][0] == 0 and pixels[x, y][1] == 0 and pixels[x, y][2] == 255):
|
for i in range(0, len(buf_7color), 2):
|
||||||
Color = 3
|
buf[idx] = (buf_7color[i] << 4) + buf_7color[i+1]
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 0 and pixels[x, y][2] == 0):
|
idx += 1
|
||||||
Color = 4
|
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 255 and pixels[x, y][2] == 0):
|
|
||||||
Color = 5
|
|
||||||
elif (pixels[x, y][0] == 255 and pixels[x, y][1] == 128 and pixels[x, y][2] == 0):
|
|
||||||
Color = 6
|
|
||||||
|
|
||||||
data_t = buf[Add]&(~(0xF0 >> ((newx % 2)*4)))
|
|
||||||
buf[Add] = data_t | ((Color << 4) >> ((newx % 2)*4));
|
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
def display(self,image):
|
def display(self,image):
|
||||||
|
|
@ -192,9 +174,8 @@ class EPD:
|
||||||
self.send_data(0x01)
|
self.send_data(0x01)
|
||||||
self.send_data(0xC0)
|
self.send_data(0xC0)
|
||||||
self.send_command(0x10)
|
self.send_command(0x10)
|
||||||
for i in range(0, int(EPD_HEIGHT)):
|
|
||||||
for j in range(0, int(EPD_WIDTH/2)):
|
self.send_data_bulk(image)
|
||||||
self.send_data((image[j+(int(EPD_WIDTH/2)*i)]))
|
|
||||||
self.send_command(0x04) #0x04
|
self.send_command(0x04) #0x04
|
||||||
self.ReadBusyHigh()
|
self.ReadBusyHigh()
|
||||||
self.send_command(0x12) #0x12
|
self.send_command(0x12) #0x12
|
||||||
|
|
@ -210,17 +191,11 @@ class EPD:
|
||||||
self.send_data(0x01)
|
self.send_data(0x01)
|
||||||
self.send_data(0xC0)
|
self.send_data(0xC0)
|
||||||
self.send_command(0x10)
|
self.send_command(0x10)
|
||||||
for i in range(0, int(EPD_HEIGHT)):
|
|
||||||
for j in range(0, int(EPD_WIDTH/2)):
|
# Set all pixels to white
|
||||||
self.send_data(0x11)
|
buf = [0x11] * int(self.width * self.height / 2)
|
||||||
#BLACK 0x00 /// 0000
|
self.send_data_bulk(buf)
|
||||||
#WHITE 0x11 /// 0001
|
|
||||||
#GREEN 0x22 /// 0010
|
|
||||||
#BLUE 0x33 /// 0011
|
|
||||||
#RED 0x44 /// 0100
|
|
||||||
#YELLOW 0x55 /// 0101
|
|
||||||
#ORANGE 0x66 /// 0110
|
|
||||||
#CLEAN 0x77 /// 0111 unavailable Afterimage
|
|
||||||
self.send_command(0x04) #0x04
|
self.send_command(0x04) #0x04
|
||||||
self.ReadBusyHigh()
|
self.ReadBusyHigh()
|
||||||
self.send_command(0x12) #0x12
|
self.send_command(0x12) #0x12
|
||||||
|
|
@ -237,4 +212,3 @@ class EPD:
|
||||||
|
|
||||||
epdconfig.delay_ms(2000)
|
epdconfig.delay_ms(2000)
|
||||||
epdconfig.module_exit()
|
epdconfig.module_exit()
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue