diff --git a/inkycal/display/drivers/epd_7_in_5_v2_colour.py b/inkycal/display/drivers/epd_7_in_5_v2_colour.py index e1b1d7b..f2d0a89 100644 --- a/inkycal/display/drivers/epd_7_in_5_v2_colour.py +++ b/inkycal/display/drivers/epd_7_in_5_v2_colour.py @@ -1,40 +1,43 @@ -""" -* | File : epd7in5bc.py -* | Author : Waveshare team -* | Function : Electronic paper driver -* | Info : -*---------------- -* | This version: V4.0 -* | Date : 2019-06-20 -# | Info : python demo ------------------------------------------------------------------------------ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documnetation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furished to do so, subject to the following conditions: +# ***************************************************************************** +# * | File : epd7in5b_V2.py +# * | Author : Waveshare team +# * | Function : Electronic paper driver +# * | Info : +# *---------------- +# * | This version: V4.2 +# * | Date : 2022-01-08 +# # | Info : python demo +# ----------------------------------------------------------------------------- +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -""" import logging -from inkycal.display.drivers import epdconfig +from . import epdconfig # Display resolution EPD_WIDTH = 800 EPD_HEIGHT = 480 +logger = logging.getLogger(__name__) + class EPD: def __init__(self): @@ -66,17 +69,24 @@ class EPD: epdconfig.spi_writebyte([data]) epdconfig.digital_write(self.cs_pin, 1) + def send_data2(self, data): # faster + 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): - logging.debug("e-Paper busy") + logger.debug("e-Paper busy") self.send_command(0x71) busy = epdconfig.digital_read(self.busy_pin) while (busy == 0): self.send_command(0x71) busy = epdconfig.digital_read(self.busy_pin) epdconfig.delay_ms(200) + logger.debug("e-Paper busy release") def init(self): - if (epdconfig.module_init() != 0): + if epdconfig.module_init() != 0: return -1 self.reset() @@ -92,7 +102,7 @@ class EPD: self.ReadBusy() self.send_command(0X00) # PANNEL SETTING - self.send_data(0x0F) # KW-3f KWR-2F BWROTP 0f BWOTP 1f + self.send_data(0x0F) # KW-3f KWR-2F BWROTP-0f BWOTP-1f self.send_command(0x61) # tres self.send_data(0x03) # source 800 @@ -110,53 +120,56 @@ class EPD: self.send_command(0X60) # TCON SETTING self.send_data(0x22) + self.send_command(0x65) + self.send_data(0x00) + self.send_data(0x00) + self.send_data(0x00) + self.send_data(0x00) + return 0 def getbuffer(self, image): - # logging.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() - logging.debug('imwidth = %d imheight = %d ', imwidth, imheight) - if (imwidth == self.width and imheight == self.height): - logging.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): - logging.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)) + img = image + imwidth, imheight = img.size + if imwidth == self.width and imheight == self.height: + img = img.convert('1') + elif imwidth == self.height and imheight == self.width: + # image has correct dimensions, but needs to be rotated + img = img.rotate(90, expand=True).convert('1') + else: + logger.warning("Wrong image dimensions: must be " + str(self.width) + "x" + str(self.height)) + # return a blank buffer + return [0x00] * (int(self.width / 8) * self.height) + + buf = bytearray(img.tobytes('raw')) + # The bytes need to be inverted, because in the PIL world 0=black and 1=white, but + # in the e-paper world 0=white and 1=black. + for i in range(len(buf)): + buf[i] ^= 0xFF return buf def display(self, imageblack, imagered): self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(imageblack[i]) + # The black bytes need to be inverted back from what getbuffer did + for i in range(len(imageblack)): + imageblack[i] ^= 0xFF + self.send_data2(imageblack) self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(~imagered[i]) + self.send_data2(imagered) self.send_command(0x12) epdconfig.delay_ms(100) self.ReadBusy() def Clear(self): + buf = [0x00] * (int(self.width / 8) * self.height) + buf2 = [0xff] * (int(self.width / 8) * self.height) self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xff) + self.send_data2(buf2) self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0x00) + self.send_data2(buf) self.send_command(0x12) epdconfig.delay_ms(100) @@ -169,5 +182,5 @@ class EPD: self.send_command(0x07) # DEEP_SLEEP self.send_data(0XA5) + epdconfig.delay_ms(2000) epdconfig.module_exit() -### END OF FILE ###