added drivers for 12.48" display
This commit is contained in:
		
							
								
								
									
										405
									
								
								inkycal/display/drivers/epd_12_in_48.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										405
									
								
								inkycal/display/drivers/epd_12_in_48.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,405 @@ | |||||||
|  | # /***************************************************************************** | ||||||
|  | # * | File        :	  epd12in48.py | ||||||
|  | # * | Author      :   Waveshare electrices | ||||||
|  | # * | Function    :   Hardware underlying interface | ||||||
|  | # * | Info        : | ||||||
|  | # *---------------- | ||||||
|  | # * |	This version:   V1.0 | ||||||
|  | # * | Date        :   2019-11-01 | ||||||
|  | # * | Info        :    | ||||||
|  | # ******************************************************************************/ | ||||||
|  | # 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: | ||||||
|  | # | ||||||
|  | # 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 time | ||||||
|  | from inkycal.display.drivers import epdconfig_12_in_48 as epdconfig | ||||||
|  |  | ||||||
|  | EPD_WIDTH       = 1304 | ||||||
|  | EPD_HEIGHT      = 984 | ||||||
|  |  | ||||||
|  | class EPD(object): | ||||||
|  |     def __init__(self): | ||||||
|  |         self.width = EPD_WIDTH | ||||||
|  |         self.height = EPD_HEIGHT | ||||||
|  |          | ||||||
|  |         self.EPD_M1_CS_PIN  = epdconfig.EPD_M1_CS_PIN | ||||||
|  |         self.EPD_S1_CS_PIN  = epdconfig.EPD_S1_CS_PIN | ||||||
|  |         self.EPD_M2_CS_PIN  = epdconfig.EPD_M2_CS_PIN | ||||||
|  |         self.EPD_S2_CS_PIN  = epdconfig.EPD_S2_CS_PIN | ||||||
|  |  | ||||||
|  |         self.EPD_M1S1_DC_PIN  = epdconfig.EPD_M1S1_DC_PIN | ||||||
|  |         self.EPD_M2S2_DC_PIN  = epdconfig.EPD_M2S2_DC_PIN | ||||||
|  |  | ||||||
|  |         self.EPD_M1S1_RST_PIN = epdconfig.EPD_M1S1_RST_PIN | ||||||
|  |         self.EPD_M2S2_RST_PIN = epdconfig.EPD_M2S2_RST_PIN | ||||||
|  |  | ||||||
|  |         self.EPD_M1_BUSY_PIN  = epdconfig.EPD_M1_BUSY_PIN | ||||||
|  |         self.EPD_S1_BUSY_PIN  = epdconfig.EPD_S1_BUSY_PIN | ||||||
|  |         self.EPD_M2_BUSY_PIN  = epdconfig.EPD_M2_BUSY_PIN | ||||||
|  |         self.EPD_S2_BUSY_PIN  = epdconfig.EPD_S2_BUSY_PIN | ||||||
|  |  | ||||||
|  |     def init(self): | ||||||
|  |         print("EPD init...") | ||||||
|  |         epdconfig.module_init() | ||||||
|  |          | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1)  | ||||||
|  |         self.Reset()  | ||||||
|  |  | ||||||
|  |         #panel setting | ||||||
|  |         self.M1_SendCommand(0x00)  | ||||||
|  |         self.M1_SendData(0x1f) 	#KW-3f   KWR-2F	BWROTP 0f	BWOTP 1f | ||||||
|  |         self.S1_SendCommand(0x00)  | ||||||
|  |         self.S1_SendData(0x1f)  | ||||||
|  |         self.M2_SendCommand(0x00)  | ||||||
|  |         self.M2_SendData(0x13)  | ||||||
|  |         self.S2_SendCommand(0x00)  | ||||||
|  |         self.S2_SendData(0x13)  | ||||||
|  |  | ||||||
|  |         # booster soft start | ||||||
|  |         self.M1_SendCommand(0x06)  | ||||||
|  |         self.M1_SendData(0x17) 	#A | ||||||
|  |         self.M1_SendData(0x17) 	#B | ||||||
|  |         self.M1_SendData(0x39) 	#C | ||||||
|  |         self.M1_SendData(0x17)  | ||||||
|  |         self.M2_SendCommand(0x06)  | ||||||
|  |         self.M2_SendData(0x17)  | ||||||
|  |         self.M2_SendData(0x17)  | ||||||
|  |         self.M2_SendData(0x39)  | ||||||
|  |         self.M2_SendData(0x17)  | ||||||
|  |  | ||||||
|  |         #resolution setting | ||||||
|  |         self.M1_SendCommand(0x61)  | ||||||
|  |         self.M1_SendData(0x02)  | ||||||
|  |         self.M1_SendData(0x88) 	#source 648 | ||||||
|  |         self.M1_SendData(0x01) 	#gate 492 | ||||||
|  |         self.M1_SendData(0xEC)  | ||||||
|  |         self.S1_SendCommand(0x61)  | ||||||
|  |         self.S1_SendData(0x02)  | ||||||
|  |         self.S1_SendData(0x90) 	#source 656 | ||||||
|  |         self.S1_SendData(0x01) 	#gate 492 | ||||||
|  |         self.S1_SendData(0xEC)  | ||||||
|  |         self.M2_SendCommand(0x61)  | ||||||
|  |         self.M2_SendData(0x02)  | ||||||
|  |         self.M2_SendData(0x90) 	#source 656 | ||||||
|  |         self.M2_SendData(0x01) 	#gate 492 | ||||||
|  |         self.M2_SendData(0xEC)  | ||||||
|  |         self.S2_SendCommand(0x61)  | ||||||
|  |         self.S2_SendData(0x02)  | ||||||
|  |         self.S2_SendData(0x88) 	#source 648 | ||||||
|  |         self.S2_SendData(0x01) 	#gate 492 | ||||||
|  |         self.S2_SendData(0xEC)  | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x15) 	#DUSPI | ||||||
|  |         self.M1S1M2S2_SendData(0x20)  | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x50) 	#Vcom and data interval setting | ||||||
|  |         self.M1S1M2S2_SendData(0x21)  #Border KW | ||||||
|  |         self.M1S1M2S2_SendData(0x07)  | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x60) #TCON | ||||||
|  |         self.M1S1M2S2_SendData(0x22)  | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0xE3)  | ||||||
|  |         self.M1S1M2S2_SendData(0x00)  | ||||||
|  |  | ||||||
|  |         #temperature | ||||||
|  |         temp =  self.M1_ReadTemperature()  | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0xe0) #Cascade setting | ||||||
|  |         self.M1S1M2S2_SendData(0x03)  | ||||||
|  |         self.M1S1M2S2_SendCommand(0xe5) #Force temperature | ||||||
|  |         self.M1S1M2S2_SendData(temp) | ||||||
|  |          | ||||||
|  |     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() | ||||||
|  |          | ||||||
|  |         if(imwidth == self.width and imheight == self.height):             | ||||||
|  |             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):             | ||||||
|  |             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 display(self, buf): | ||||||
|  |         start = time.clock()        | ||||||
|  |  | ||||||
|  |         #M1 part 648*492     | ||||||
|  |         self.M1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                     self.M1_SendData(buf[y*163 + x]) | ||||||
|  |  | ||||||
|  |         #S1 part 656*492 | ||||||
|  |         self.S1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.S1_SendData(buf[y*163 + x]) | ||||||
|  |  | ||||||
|  |         #M2 part 656*492 | ||||||
|  |         self.M2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.M2_SendData(buf[y*163 + x]) | ||||||
|  |  | ||||||
|  |         #S2 part 648*492 | ||||||
|  |         self.S2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.S2_SendData(buf[y*163 + x]) | ||||||
|  |                  | ||||||
|  |         end = time.clock() | ||||||
|  |         print("use time:%f"%(end - start)) | ||||||
|  |         self.TurnOnDisplay() | ||||||
|  |  | ||||||
|  |     def clear(self): | ||||||
|  |         """Clear contents of image buffer""" | ||||||
|  |         start = time.clock() | ||||||
|  |         self.M1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.M1_SendData(0xff) | ||||||
|  |  | ||||||
|  |         self.S1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.S1_SendData(0xff) | ||||||
|  |      | ||||||
|  |         self.M2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.M2_SendData(0xff) | ||||||
|  |  | ||||||
|  |         self.S2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.S2_SendData(0xff) | ||||||
|  |         end = time.clock() | ||||||
|  |         print("use time:%f"%(end - start)) | ||||||
|  |         self.TurnOnDisplay() | ||||||
|  |          | ||||||
|  |     """   M1S1M2S2 Write register address and data     """ | ||||||
|  |     def M1S1M2S2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |          | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |      | ||||||
|  |     def M1S1M2S2_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     """   M1M2 Write register address and data     """ | ||||||
|  |     def M1M2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |          | ||||||
|  |     def M1S1M2S2_Senddata(self, val):  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1)    | ||||||
|  |            | ||||||
|  |     """   S2 Write register address and data     """ | ||||||
|  |     def S2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def S2_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |          | ||||||
|  |     """   M2 Write register address and data     """ | ||||||
|  |     def M2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     def M2_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     """   S1 Write register address and data     """ | ||||||
|  |     def S1_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     def S1_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |          | ||||||
|  |     """   M1 Write register address and data     """ | ||||||
|  |     def M1_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     def M1_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     def Reset(self): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_RST_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_RST_PIN, 1)  | ||||||
|  |         time.sleep(0.2)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_RST_PIN, 0)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_RST_PIN, 0)  | ||||||
|  |         time.sleep(0.01)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_RST_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_RST_PIN, 1)  | ||||||
|  |         time.sleep(0.2)  | ||||||
|  |      | ||||||
|  |     def sleep(self): | ||||||
|  |         self.M1S1M2S2_SendCommand(0X02)   	 | ||||||
|  |         time.sleep(0.3)  | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0X07)   	 | ||||||
|  |         self.M1S1M2S2_SendData(0xA5)  | ||||||
|  |         time.sleep(0.3)  | ||||||
|  |         print("module_exit") | ||||||
|  |         epdconfig.module_exit() | ||||||
|  |          | ||||||
|  |          | ||||||
|  |     def TurnOnDisplay(self): | ||||||
|  |         self.M1M2_SendCommand(0x04)   | ||||||
|  |         time.sleep(0.3)  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x12)  | ||||||
|  |         self.M1_ReadBusy() | ||||||
|  |         self.S1_ReadBusy() | ||||||
|  |         self.M2_ReadBusy() | ||||||
|  |         self.S2_ReadBusy() | ||||||
|  |      | ||||||
|  |     #Busy | ||||||
|  |     def M1_ReadBusy(self): | ||||||
|  |         self.M1_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_M1_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         print("M1_ReadBusy") | ||||||
|  |         while(busy): | ||||||
|  |             self.M1_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_M1_BUSY_PIN)  | ||||||
|  |             busy = not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2) | ||||||
|  |          | ||||||
|  |     def M2_ReadBusy(self): | ||||||
|  |         self.M2_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_M2_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         print("M2_ReadBusy") | ||||||
|  |         while(busy): | ||||||
|  |             self.M2_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_M2_BUSY_PIN)  | ||||||
|  |             busy =not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2)    | ||||||
|  |          | ||||||
|  |     def S1_ReadBusy(self): | ||||||
|  |         self.S1_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_S1_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         print("s1_ReadBusy") | ||||||
|  |         while(busy): | ||||||
|  |             self.S1_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_S1_BUSY_PIN)  | ||||||
|  |             busy = not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2)    | ||||||
|  |          | ||||||
|  |     def S2_ReadBusy(self): | ||||||
|  |         self.S2_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_S2_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         print("S2_ReadBusy") | ||||||
|  |         while(busy): | ||||||
|  |             self.S2_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_S2_BUSY_PIN)  | ||||||
|  |             busy = not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2)             | ||||||
|  |          | ||||||
|  |     def M1_ReadTemperature(self): | ||||||
|  |         self.M1_SendCommand(0x40)  | ||||||
|  |         self.M1_ReadBusy()  | ||||||
|  |         time.sleep(0.3) | ||||||
|  |  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0)  | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1)  | ||||||
|  |          | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1)  | ||||||
|  |         time.sleep(0.01)  | ||||||
|  |          | ||||||
|  |         # temp = epdconfig.spi_readbyte(0x00) | ||||||
|  |         temp = 25 | ||||||
|  |         print("Read Temperature Reg:%d"%temp) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1)  | ||||||
|  |         # temp =0x29 | ||||||
|  |         return temp  | ||||||
							
								
								
									
										517
									
								
								inkycal/display/drivers/epd_12_in_48_colour.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										517
									
								
								inkycal/display/drivers/epd_12_in_48_colour.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,517 @@ | |||||||
|  | # /***************************************************************************** | ||||||
|  | # * | File        :	  epd12in48.py | ||||||
|  | # * | Author      :   Waveshare electrices | ||||||
|  | # * | Function    :   Hardware underlying interface | ||||||
|  | # * | Info        : | ||||||
|  | # *---------------- | ||||||
|  | # * |	This version:   V1.0 | ||||||
|  | # * | Date        :   2019-11-01 | ||||||
|  | # * | Info        :    | ||||||
|  | # ******************************************************************************/ | ||||||
|  | # 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: | ||||||
|  | # | ||||||
|  | # 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 time | ||||||
|  | from inkycal.display.drivers import epdconfig_12_in_48 as epdconfig | ||||||
|  |  | ||||||
|  | EPD_WIDTH       = 1304 | ||||||
|  | EPD_HEIGHT      = 984 | ||||||
|  |  | ||||||
|  | class EPD(object): | ||||||
|  |     def __init__(self): | ||||||
|  |         self.width = EPD_WIDTH | ||||||
|  |         self.height = EPD_HEIGHT | ||||||
|  |          | ||||||
|  |         self.EPD_M1_CS_PIN  = epdconfig.EPD_M1_CS_PIN | ||||||
|  |         self.EPD_S1_CS_PIN  = epdconfig.EPD_S1_CS_PIN | ||||||
|  |         self.EPD_M2_CS_PIN  = epdconfig.EPD_M2_CS_PIN | ||||||
|  |         self.EPD_S2_CS_PIN  = epdconfig.EPD_S2_CS_PIN | ||||||
|  |  | ||||||
|  |         self.EPD_M1S1_DC_PIN  = epdconfig.EPD_M1S1_DC_PIN | ||||||
|  |         self.EPD_M2S2_DC_PIN  = epdconfig.EPD_M2S2_DC_PIN | ||||||
|  |  | ||||||
|  |         self.EPD_M1S1_RST_PIN = epdconfig.EPD_M1S1_RST_PIN | ||||||
|  |         self.EPD_M2S2_RST_PIN = epdconfig.EPD_M2S2_RST_PIN | ||||||
|  |  | ||||||
|  |         self.EPD_M1_BUSY_PIN  = epdconfig.EPD_M1_BUSY_PIN | ||||||
|  |         self.EPD_S1_BUSY_PIN  = epdconfig.EPD_S1_BUSY_PIN | ||||||
|  |         self.EPD_M2_BUSY_PIN  = epdconfig.EPD_M2_BUSY_PIN | ||||||
|  |         self.EPD_S2_BUSY_PIN  = epdconfig.EPD_S2_BUSY_PIN | ||||||
|  |  | ||||||
|  |     def init(self): | ||||||
|  |         print("EPD init...") | ||||||
|  |         epdconfig.module_init() | ||||||
|  |          | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1)  | ||||||
|  |         self.Reset()  | ||||||
|  |  | ||||||
|  |         #panel setting | ||||||
|  |         self.M1_SendCommand(0x00)  | ||||||
|  |         self.M1_SendData(0x2f) 	#KW-3f   KWR-2F	BWROTP 0f	BWOTP 1f | ||||||
|  |         self.S1_SendCommand(0x00)  | ||||||
|  |         self.S1_SendData(0x2f)  | ||||||
|  |         self.M2_SendCommand(0x00)  | ||||||
|  |         self.M2_SendData(0x23)  | ||||||
|  |         self.S2_SendCommand(0x00)  | ||||||
|  |         self.S2_SendData(0x23)  | ||||||
|  |  | ||||||
|  |         # POWER SETTING | ||||||
|  |         self.M1_SendCommand(0x01) | ||||||
|  |         self.M1_SendData(0x07) | ||||||
|  |         self.M1_SendData(0x17)	# VGH=20V,VGL=-20V | ||||||
|  |         self.M1_SendData(0x3F)   # VDH=15V | ||||||
|  |         self.M1_SendData(0x3F)   # VDL=-15V | ||||||
|  |         self.M1_SendData(0x0d) | ||||||
|  |         self.M2_SendCommand(0x01) | ||||||
|  |         self.M2_SendData(0x07) | ||||||
|  |         self.M2_SendData(0x17)	# VGH=20V,VGL=-20V | ||||||
|  |         self.M2_SendData(0x3F)	# VDH=15V | ||||||
|  |         self.M2_SendData(0x3F)  # VDL=-15V | ||||||
|  |         self.M2_SendData(0x0d) | ||||||
|  |          | ||||||
|  |         # booster soft start | ||||||
|  |         self.M1_SendCommand(0x06) | ||||||
|  |         self.M1_SendData(0x17)	#A | ||||||
|  |         self.M1_SendData(0x17)	#B | ||||||
|  |         self.M1_SendData(0x39)	#C | ||||||
|  |         self.M1_SendData(0x17) | ||||||
|  |         self.M2_SendCommand(0x06) | ||||||
|  |         self.M2_SendData(0x17) | ||||||
|  |         self.M2_SendData(0x17) | ||||||
|  |         self.M2_SendData(0x39) | ||||||
|  |         self.M2_SendData(0x17) | ||||||
|  |  | ||||||
|  |         #resolution setting | ||||||
|  |         self.M1_SendCommand(0x61) | ||||||
|  |         self.M1_SendData(0x02) | ||||||
|  |         self.M1_SendData(0x88)	#source 648 | ||||||
|  |         self.M1_SendData(0x01)	#gate 492 | ||||||
|  |         self.M1_SendData(0xEC) | ||||||
|  |         self.S1_SendCommand(0x61) | ||||||
|  |         self.S1_SendData(0x02) | ||||||
|  |         self.S1_SendData(0x90)	#source 656 | ||||||
|  |         self.S1_SendData(0x01)	#gate 492 | ||||||
|  |         self.S1_SendData(0xEC) | ||||||
|  |         self.M2_SendCommand(0x61) | ||||||
|  |         self.M2_SendData(0x02) | ||||||
|  |         self.M2_SendData(0x90)	#source 656 | ||||||
|  |         self.M2_SendData(0x01)	#gate 492 | ||||||
|  |         self.M2_SendData(0xEC) | ||||||
|  |         self.S2_SendCommand(0x61) | ||||||
|  |         self.S2_SendData(0x02) | ||||||
|  |         self.S2_SendData(0x88)	#source 648 | ||||||
|  |         self.S2_SendData(0x01)	#gate 492 | ||||||
|  |         self.S2_SendData(0xEC) | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x15)	#DUSPI | ||||||
|  |         self.M1S1M2S2_SendData(0x20) | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x30)	# PLL | ||||||
|  |         self.M1S1M2S2_SendData(0x08) | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x50)	#Vcom and data interval setting | ||||||
|  |         self.M1S1M2S2_SendData(0x31) | ||||||
|  |         self.M1S1M2S2_SendData(0x07) | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x60)#TCON | ||||||
|  |         self.M1S1M2S2_SendData(0x22) | ||||||
|  |  | ||||||
|  |         self.M1_SendCommand(0xE0)			#POWER SETTING | ||||||
|  |         self.M1_SendData(0x01) | ||||||
|  |         self.M2_SendCommand(0xE0)			#POWER SETTING | ||||||
|  |         self.M2_SendData(0x01) | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0xE3) | ||||||
|  |         self.M1S1M2S2_SendData(0x00) | ||||||
|  |  | ||||||
|  |         self.M1_SendCommand(0x82) | ||||||
|  |         self.M1_SendData(0x1c) | ||||||
|  |         self.M2_SendCommand(0x82) | ||||||
|  |         self.M2_SendData(0x1c) | ||||||
|  |  | ||||||
|  |         self.SetLut() | ||||||
|  |          | ||||||
|  |     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() | ||||||
|  |          | ||||||
|  |         if(imwidth == self.width and imheight == self.height):             | ||||||
|  |             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):             | ||||||
|  |             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 display(self, blackbuf, redbuf): | ||||||
|  |         start = time.clock() | ||||||
|  |                      | ||||||
|  |         #S2 part 648*492 | ||||||
|  |         self.S2_SendCommand(0x10) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.S2_SendData(blackbuf[y*163 + x]) | ||||||
|  |         self.S2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.S2_SendData(~redbuf[y*163 + x]) | ||||||
|  |                  | ||||||
|  |         #M2 part 656*492 | ||||||
|  |         self.M2_SendCommand(0x10) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.M2_SendData(blackbuf[y*163 + x]) | ||||||
|  |         self.M2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.M2_SendData(~redbuf[y*163 + x]) | ||||||
|  |  | ||||||
|  |         #M1 part 648*492     | ||||||
|  |         self.M1_SendCommand(0x10) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.M1_SendData(blackbuf[y*163 + x]) | ||||||
|  |         self.M1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.M1_SendData(~redbuf[y*163 + x]) | ||||||
|  |          | ||||||
|  |         #S1 part 656*492 | ||||||
|  |         self.S1_SendCommand(0x10) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.S1_SendData(blackbuf[y*163 + x]) | ||||||
|  |         self.S1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.S1_SendData(~redbuf[y*163 + x]) | ||||||
|  |                  | ||||||
|  |         end = time.clock() | ||||||
|  |         print("use time: %f"%(end - start)) | ||||||
|  |         self.TurnOnDisplay() | ||||||
|  |  | ||||||
|  |     def clear(self): | ||||||
|  |         """Clear contents of image buffer""" | ||||||
|  |         start = time.clock() | ||||||
|  |          | ||||||
|  |         self.S2_SendCommand(0x10) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.S2_SendData(0xff)         | ||||||
|  |         self.S2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.S2_SendData(0x00) | ||||||
|  |                  | ||||||
|  |         self.M2_SendCommand(0x10) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.M2_SendData(0xff) | ||||||
|  |         self.M2_SendCommand(0x13) | ||||||
|  |         for y in  range(0, 492): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.M2_SendData(0x00)        | ||||||
|  |                      | ||||||
|  |         self.M1_SendCommand(0x10) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.M1_SendData(0xff) | ||||||
|  |         self.M1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(0, 81): | ||||||
|  |                 self.M1_SendData(0x00) | ||||||
|  |                  | ||||||
|  |         self.S1_SendCommand(0x10) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.S1_SendData(0xff) | ||||||
|  |         self.S1_SendCommand(0x13) | ||||||
|  |         for y in  range(492, 984): | ||||||
|  |             for x in  range(81, 163): | ||||||
|  |                 self.S1_SendData(0x00) | ||||||
|  |                  | ||||||
|  |         end = time.clock() | ||||||
|  |         print (end) | ||||||
|  |         print (start) | ||||||
|  |         print("use time: %f" %(end - start)) | ||||||
|  |          | ||||||
|  |         self.TurnOnDisplay() | ||||||
|  |          | ||||||
|  |     def Reset(self): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_RST_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_RST_PIN, 1)  | ||||||
|  |         time.sleep(0.2)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_RST_PIN, 0)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_RST_PIN, 0)  | ||||||
|  |         time.sleep(0.01)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_RST_PIN, 1)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_RST_PIN, 1)  | ||||||
|  |         time.sleep(0.2)  | ||||||
|  |      | ||||||
|  |     def sleep(self): | ||||||
|  |         self.M1S1M2S2_SendCommand(0X02)   	 | ||||||
|  |         time.sleep(0.3)  | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0X07)   	 | ||||||
|  |         self.M1S1M2S2_SendData(0xA5)  | ||||||
|  |         time.sleep(0.3)  | ||||||
|  |         print("module_exit") | ||||||
|  |         epdconfig.module_exit() | ||||||
|  |  | ||||||
|  |     def TurnOnDisplay(self): | ||||||
|  |         self.M1M2_SendCommand(0x04)   | ||||||
|  |         time.sleep(0.3)  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x12)  | ||||||
|  |         self.M1_ReadBusy() | ||||||
|  |         self.S1_ReadBusy() | ||||||
|  |         self.M2_ReadBusy() | ||||||
|  |         self.S2_ReadBusy()    | ||||||
|  |          | ||||||
|  |     """   M1S1M2S2 Write register address and data     """ | ||||||
|  |     def M1S1M2S2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |          | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |      | ||||||
|  |     def M1S1M2S2_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     """   M1M2 Write register address and data     """ | ||||||
|  |     def M1M2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |          | ||||||
|  |     def M1M2_Sendata(self, val):  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1)    | ||||||
|  |            | ||||||
|  |     """   S2 Write register address and data     """ | ||||||
|  |     def S2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |     def S2_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val) | ||||||
|  |         epdconfig.digital_write(self.EPD_S2_CS_PIN, 1) | ||||||
|  |          | ||||||
|  |     """   M2 Write register address and data     """ | ||||||
|  |     def M2_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |     def M2_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M2S2_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val)  | ||||||
|  |         epdconfig.digital_write(self.EPD_M2_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     """   S1 Write register address and data     """ | ||||||
|  |     def S1_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |     def S1_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val) | ||||||
|  |         epdconfig.digital_write(self.EPD_S1_CS_PIN, 1) | ||||||
|  |          | ||||||
|  |     """   M1 Write register address and data     """ | ||||||
|  |     def M1_SendCommand(self, cmd): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 0) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(cmd) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |     def M1_SendData(self, val): | ||||||
|  |         epdconfig.digital_write(self.EPD_M1S1_DC_PIN, 1) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 0) | ||||||
|  |         epdconfig.spi_writebyte(val) | ||||||
|  |         epdconfig.digital_write(self.EPD_M1_CS_PIN, 1) | ||||||
|  |  | ||||||
|  |     #Busy | ||||||
|  |     def M1_ReadBusy(self): | ||||||
|  |         self.M1_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_M1_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         while(busy): | ||||||
|  |             self.M1_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_M1_BUSY_PIN)  | ||||||
|  |             busy = not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2) | ||||||
|  |     def M2_ReadBusy(self): | ||||||
|  |         self.M2_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_M2_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         self.M2_SendCommand(0x71)  | ||||||
|  |         while(busy): | ||||||
|  |             self.M2_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_M2_BUSY_PIN)  | ||||||
|  |             busy =not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2) | ||||||
|  |     def S1_ReadBusy(self): | ||||||
|  |         self.S1_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_S1_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         while(busy): | ||||||
|  |             self.S1_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_S1_BUSY_PIN)  | ||||||
|  |             busy = not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2)         | ||||||
|  |     def S2_ReadBusy(self): | ||||||
|  |         self.S2_SendCommand(0x71)  | ||||||
|  |         busy = epdconfig.digital_read(self.EPD_S2_BUSY_PIN)  | ||||||
|  |         busy = not(busy & 0x01)  | ||||||
|  |         while(busy): | ||||||
|  |             self.S2_SendCommand(0x71)  | ||||||
|  |             busy = epdconfig.digital_read(self.EPD_S2_BUSY_PIN)  | ||||||
|  |             busy = not(busy & 0x01)  | ||||||
|  |         time.sleep(0.2)             | ||||||
|  |  | ||||||
|  |     lut_vcom1 = [ | ||||||
|  |         0x00,	0x10,	0x10,	0x01,	0x08,	0x01, | ||||||
|  |         0x00,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x00,	0x08,	0x01,	0x08,	0x01,	0x06, | ||||||
|  |         0x00,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x06, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x01, | ||||||
|  |         0x00,	0x04,	0x05,	0x08,	0x08,	0x01, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |     ] | ||||||
|  |     lut_ww1 = [ | ||||||
|  |         0x91,	0x10,	0x10,	0x01,	0x08,	0x01, | ||||||
|  |         0x04,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x84,	0x08,	0x01,	0x08,	0x01,	0x06, | ||||||
|  |         0x80,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x06, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x01, | ||||||
|  |         0x08,	0x04,	0x05,	0x08,	0x08,	0x01, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |     ] | ||||||
|  |     lut_bw1 = [ | ||||||
|  |         0xA8,	0x10,	0x10,	0x01,	0x08,	0x01, | ||||||
|  |         0x84,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x84,	0x08,	0x01,	0x08,	0x01,	0x06, | ||||||
|  |         0x86,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x8C,	0x05,	0x01,	0x1E,	0x0F,	0x06, | ||||||
|  |         0x8C,	0x05,	0x01,	0x1E,	0x0F,	0x01, | ||||||
|  |         0xF0,	0x04,	0x05,	0x08,	0x08,	0x01, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |     ] | ||||||
|  |     lut_wb1 = [ | ||||||
|  |         0x91,	0x10,	0x10,	0x01,	0x08,	0x01, | ||||||
|  |         0x04,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x84,	0x08,	0x01,	0x08,	0x01,	0x06, | ||||||
|  |         0x80,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x06, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x01, | ||||||
|  |         0x08,	0x04,	0x05,	0x08,	0x08,	0x01, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |     ] | ||||||
|  |     lut_bb1 = [ | ||||||
|  |         0x92,	0x10,	0x10,	0x01,	0x08,	0x01, | ||||||
|  |         0x80,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x84,	0x08,	0x01,	0x08,	0x01,	0x06, | ||||||
|  |         0x04,	0x06,	0x01,	0x06,	0x01,	0x05, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x06, | ||||||
|  |         0x00,	0x05,	0x01,	0x1E,	0x0F,	0x01, | ||||||
|  |         0x01,	0x04,	0x05,	0x08,	0x08,	0x01, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |         0x00,	0x00,	0x00,	0x00,	0x00,	0x00, | ||||||
|  |     ] | ||||||
|  |      | ||||||
|  |     def SetLut(self): | ||||||
|  |         self.M1S1M2S2_SendCommand(0x20) #vcom | ||||||
|  |         for count in range(0, 60): | ||||||
|  |             self.M1S1M2S2_SendData(self.lut_vcom1[count]) | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x21) #red not use | ||||||
|  |         for count in range(0, 60): | ||||||
|  |             self.M1S1M2S2_SendData(self.lut_ww1[count]) | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x22) #bw r | ||||||
|  |         for count in range(0, 60): | ||||||
|  |             self.M1S1M2S2_SendData(self.lut_bw1[count])   # bw=r | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x23) #wb w | ||||||
|  |         for count in range(0, 60): | ||||||
|  |             self.M1S1M2S2_SendData(self.lut_wb1[count])   # wb=w | ||||||
|  |  | ||||||
|  |         self.M1S1M2S2_SendCommand(0x24) #bb b | ||||||
|  |         for count in range(0, 60): | ||||||
|  |             self.M1S1M2S2_SendData(self.lut_bb1[count])   # bb=b | ||||||
|  |              | ||||||
|  |         self.M1S1M2S2_SendCommand(0x25) #bb b | ||||||
|  |         for count in range(0, 60): | ||||||
|  |             self.M1S1M2S2_SendData(self.lut_ww1[count])   # bb=b | ||||||
							
								
								
									
										148
									
								
								inkycal/display/drivers/epdconfig_12_in_48.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								inkycal/display/drivers/epdconfig_12_in_48.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | |||||||
|  | # /***************************************************************************** | ||||||
|  | # * | File        :	  epdconfig.py | ||||||
|  | # * | Author      :   Waveshare electrices | ||||||
|  | # * | Function    :   Hardware underlying interface | ||||||
|  | # * | Info        : | ||||||
|  | # *---------------- | ||||||
|  | # * |	This version:   V1.0 | ||||||
|  | # * | Date        :   2019-11-01 | ||||||
|  | # * | Info        :    | ||||||
|  | # ******************************************************************************/ | ||||||
|  | # 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: | ||||||
|  | # | ||||||
|  | # 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 RPi.GPIO as GPIO | ||||||
|  | import time | ||||||
|  | import os | ||||||
|  | import logging | ||||||
|  | import sys | ||||||
|  |  | ||||||
|  | from ctypes import * | ||||||
|  |  | ||||||
|  | EPD_SCK_PIN   =11 | ||||||
|  | EPD_MOSI_PIN  =10 | ||||||
|  |  | ||||||
|  | EPD_M1_CS_PIN  =8 | ||||||
|  | EPD_S1_CS_PIN  =7 | ||||||
|  | EPD_M2_CS_PIN  =17 | ||||||
|  | EPD_S2_CS_PIN  =18 | ||||||
|  |  | ||||||
|  | EPD_M1S1_DC_PIN  =13 | ||||||
|  | EPD_M2S2_DC_PIN  =22 | ||||||
|  |  | ||||||
|  | EPD_M1S1_RST_PIN =6 | ||||||
|  | EPD_M2S2_RST_PIN =23 | ||||||
|  |  | ||||||
|  | EPD_M1_BUSY_PIN  =5 | ||||||
|  | EPD_S1_BUSY_PIN  =19 | ||||||
|  | EPD_M2_BUSY_PIN  =27 | ||||||
|  | EPD_S2_BUSY_PIN  =24 | ||||||
|  |  | ||||||
|  | find_dirs = [ | ||||||
|  |     os.path.dirname(os.path.realpath(__file__)), | ||||||
|  |     '/usr/local/lib', | ||||||
|  |     '/usr/lib', | ||||||
|  | ] | ||||||
|  | spi = None | ||||||
|  | for find_dir in find_dirs: | ||||||
|  |     so_filename = os.path.join(find_dir, 'epd_12_in_48_lib.so') | ||||||
|  |     if os.path.exists(so_filename): | ||||||
|  |         spi = CDLL(so_filename) | ||||||
|  |         break | ||||||
|  | if spi is None: | ||||||
|  |     RuntimeError('Cannot find epd_12_in_48_lib.so') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def digital_write(pin, value): | ||||||
|  |     GPIO.output(pin, value) | ||||||
|  |  | ||||||
|  | def digital_read(pin): | ||||||
|  |     return GPIO.input(pin) | ||||||
|  |  | ||||||
|  | def spi_writebyte(value):  | ||||||
|  |     spi.DEV_SPI_WriteByte(value) | ||||||
|  |   | ||||||
|  | def delay_ms(delaytime): | ||||||
|  |     time.sleep(delaytime / 1000.0) | ||||||
|  |          | ||||||
|  | def module_init(): | ||||||
|  |     GPIO.setmode(GPIO.BCM) | ||||||
|  |     GPIO.setwarnings(False) | ||||||
|  |     GPIO.setup(EPD_SCK_PIN, GPIO.OUT)     | ||||||
|  |     GPIO.setup(EPD_MOSI_PIN, GPIO.OUT) | ||||||
|  |      | ||||||
|  |     logging.debug("python call wiringPi Lib") | ||||||
|  |      | ||||||
|  |     GPIO.setup(EPD_M2S2_RST_PIN, GPIO.OUT)     | ||||||
|  |     GPIO.setup(EPD_M1S1_RST_PIN, GPIO.OUT) | ||||||
|  |     GPIO.setup(EPD_M2S2_DC_PIN, GPIO.OUT) | ||||||
|  |     GPIO.setup(EPD_M1S1_DC_PIN, GPIO.OUT) | ||||||
|  |     GPIO.setup(EPD_S1_CS_PIN, GPIO.OUT) | ||||||
|  |     GPIO.setup(EPD_S2_CS_PIN, GPIO.OUT) | ||||||
|  |     GPIO.setup(EPD_M1_CS_PIN, GPIO.OUT) | ||||||
|  |     GPIO.setup(EPD_M2_CS_PIN, GPIO.OUT) | ||||||
|  |  | ||||||
|  |     GPIO.setup(EPD_S1_BUSY_PIN, GPIO.IN) | ||||||
|  |     GPIO.setup(EPD_S2_BUSY_PIN, GPIO.IN) | ||||||
|  |     GPIO.setup(EPD_M1_BUSY_PIN, GPIO.IN) | ||||||
|  |     GPIO.setup(EPD_M2_BUSY_PIN, GPIO.IN) | ||||||
|  |      | ||||||
|  |     digital_write(EPD_M1_CS_PIN, 1) | ||||||
|  |     digital_write(EPD_S1_CS_PIN, 1) | ||||||
|  |     digital_write(EPD_M2_CS_PIN, 1) | ||||||
|  |     digital_write(EPD_S2_CS_PIN, 1) | ||||||
|  |      | ||||||
|  |     digital_write(EPD_M2S2_RST_PIN, 0) | ||||||
|  |     digital_write(EPD_M1S1_RST_PIN, 0) | ||||||
|  |     digital_write(EPD_M2S2_DC_PIN, 1) | ||||||
|  |     digital_write(EPD_M1S1_DC_PIN, 1) | ||||||
|  |  | ||||||
|  |     spi.DEV_ModuleInit() | ||||||
|  |  | ||||||
|  | def module_exit(): | ||||||
|  |     digital_write(EPD_M2S2_RST_PIN, 0) | ||||||
|  |     digital_write(EPD_M1S1_RST_PIN, 0) | ||||||
|  |     digital_write(EPD_M2S2_DC_PIN, 0) | ||||||
|  |     digital_write(EPD_M1S1_DC_PIN, 0) | ||||||
|  |     digital_write(EPD_S1_CS_PIN, 1) | ||||||
|  |     digital_write(EPD_S2_CS_PIN, 1) | ||||||
|  |     digital_write(EPD_M1_CS_PIN, 1) | ||||||
|  |     digital_write(EPD_M2_CS_PIN, 1) | ||||||
|  |  | ||||||
|  | def spi_readbyte(Reg): | ||||||
|  |     GPIO.setup(EPD_MOSI_PIN, GPIO.IN) | ||||||
|  |     j=0 | ||||||
|  |     # time.sleep(0.01) | ||||||
|  |     for i in range(0, 8): | ||||||
|  |         GPIO.output(EPD_SCK_PIN, GPIO.LOW)  | ||||||
|  |         # time.sleep(0.01)  | ||||||
|  |         j = j << 1  | ||||||
|  |         if(GPIO.input(EPD_MOSI_PIN) == GPIO.HIGH): | ||||||
|  |             j |= 0x01 | ||||||
|  |         else: | ||||||
|  |             j &= 0xfe  | ||||||
|  |         # time.sleep(0.01) | ||||||
|  |         GPIO.output(EPD_SCK_PIN, GPIO.HIGH)  | ||||||
|  |         # time.sleep(0.01)   | ||||||
|  |     GPIO.setup(EPD_MOSI_PIN, GPIO.OUT) | ||||||
|  |     return j  | ||||||
|  |      | ||||||
|  | def delay_ms(delaytime): | ||||||
|  |     time.sleep(delaytime / 1000.0) | ||||||
|  |  | ||||||
|  |    | ||||||
		Reference in New Issue
	
	Block a user