|
|
@@ -43,6 +43,75 @@ class EPD:
|
|
|
self.width = EPD_WIDTH
|
|
|
self.height = EPD_HEIGHT
|
|
|
|
|
|
+ # waveform full refresh
|
|
|
+ WF_Full_1IN54 = [
|
|
|
+ 0x80, 0x48, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x80, 0x48, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x8, 0x1, 0x0, 0x8, 0x1, 0x0, 0x2,
|
|
|
+ 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0,
|
|
|
+ 0x22, 0x17, 0x41, 0x0, 0x32, 0x20
|
|
|
+ ]
|
|
|
+
|
|
|
+ # waveform partial refresh(fast)
|
|
|
+ WF_PARTIAL_1IN54_0 = [
|
|
|
+ 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0xF,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x1,0x1,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0,
|
|
|
+ 0x02,0x17,0x41,0xB0,0x32,0x28,
|
|
|
+ ]
|
|
|
+
|
|
|
+ # waveform partial refresh(quality)
|
|
|
+ WF_PARTIAL_1IN54_1 = [
|
|
|
+ 0x0,0x00,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0xA,0x0,0x0,0x0,0x0,0x0,0x1,
|
|
|
+ 0x1,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0,
|
|
|
+ 0x22,0x17,0x41,0x0,0x32,0x20,
|
|
|
+ ]
|
|
|
+
|
|
|
# Hardware reset
|
|
|
def reset(self):
|
|
|
epdconfig.digital_write(self.reset_pin, 1)
|
|
|
@@ -72,62 +141,123 @@ class EPD:
|
|
|
|
|
|
def TurnOnDisplay(self):
|
|
|
self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2
|
|
|
- self.send_data(0xF7)
|
|
|
+ self.send_data(0xc7)
|
|
|
self.send_command(0x20) # MASTER_ACTIVATION
|
|
|
self.ReadBusy()
|
|
|
|
|
|
def TurnOnDisplayPart(self):
|
|
|
self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2
|
|
|
- self.send_data(0xFF)
|
|
|
+ self.send_data(0xcF)
|
|
|
self.send_command(0x20) # MASTER_ACTIVATION
|
|
|
self.ReadBusy()
|
|
|
|
|
|
- def init(self):
|
|
|
- if (epdconfig.module_init() != 0):
|
|
|
- return -1
|
|
|
+ def lut(self, lut):
|
|
|
+ self.send_command(0x32) # WRITE_LUT_REGISTER
|
|
|
+ for i in range(0, len(lut)):
|
|
|
+ self.send_data(lut[i])
|
|
|
|
|
|
- # EPD hardware init start
|
|
|
- self.reset()
|
|
|
+ def set_lut(self, lut):
|
|
|
+ self.lut(lut)
|
|
|
|
|
|
- self.ReadBusy()
|
|
|
- self.send_command(0x12) # SWRESET
|
|
|
- self.ReadBusy()
|
|
|
+ self.send_command(0x3f)
|
|
|
+ self.send_data(lut[153])
|
|
|
|
|
|
- self.send_command(0x01) # DRIVER_OUTPUT_CONTROL
|
|
|
- self.send_data(0xC7) # (EPD_HEIGHT - 1) & 0xFF
|
|
|
- self.send_data(0x00) # ((EPD_HEIGHT - 1) >> 8) & 0xFF
|
|
|
- self.send_data(0x01) # GD = 0 SM = 0 TB = 0
|
|
|
+ self.send_command(0x03)
|
|
|
+ self.send_data(lut[154])
|
|
|
|
|
|
- self.send_command(0x11) # data entry mode
|
|
|
- self.send_data(0x01)
|
|
|
+ self.send_command(0x04)
|
|
|
+ self.send_data(lut[155])
|
|
|
+ self.send_data(lut[156])
|
|
|
+ self.send_data(lut[157])
|
|
|
|
|
|
- self.send_command(0x44) # set Ram-X address start/end position
|
|
|
- self.send_data(0x00)
|
|
|
- self.send_data(0x18) # 0x0C-->(18+1)*8=200
|
|
|
+ self.send_command(0x2c)
|
|
|
+ self.send_data(lut[158])
|
|
|
+
|
|
|
+ def SetWindows(self, Xstart, Ystart, Xend, Yend):
|
|
|
+ self.send_command(0x44); # SET_RAM_X_ADDRESS_START_END_POSITION
|
|
|
+ self.send_data((Xstart>>3) & 0xFF);
|
|
|
+ self.send_data((Xend>>3) & 0xFF);
|
|
|
|
|
|
- self.send_command(0x45) # set Ram-Y address start/end position
|
|
|
- self.send_data(0xC7) # 0xC7-->(199+1)=200
|
|
|
- self.send_data(0x00)
|
|
|
- self.send_data(0x00)
|
|
|
- self.send_data(0x00)
|
|
|
-
|
|
|
- self.send_command(0x3C) # BorderWavefrom
|
|
|
- self.send_data(0x01)
|
|
|
+ self.send_command(0x45); # SET_RAM_Y_ADDRESS_START_END_POSITION
|
|
|
+ self.send_data(Ystart & 0xFF);
|
|
|
+ self.send_data((Ystart >> 8) & 0xFF);
|
|
|
+ self.send_data(Yend & 0xFF);
|
|
|
+ self.send_data((Yend >> 8) & 0xFF);
|
|
|
+
|
|
|
|
|
|
- self.send_command(0x18)
|
|
|
- self.send_data(0x80)
|
|
|
+ def SetCursor(self, Xstart, Ystart):
|
|
|
+ self.send_command(0x4E); # SET_RAM_X_ADDRESS_COUNTER
|
|
|
+ self.send_data(Xstart & 0xFF);
|
|
|
|
|
|
- self.send_command(0x22) # #Load Temperature and waveform setting.
|
|
|
- self.send_data(0XB1)
|
|
|
- self.send_command(0x20)
|
|
|
+ self.send_command(0x4F); # SET_RAM_Y_ADDRESS_COUNTER
|
|
|
+ self.send_data(Ystart & 0xFF);
|
|
|
+ self.send_data((Ystart >> 8) & 0xFF);
|
|
|
|
|
|
- self.send_command(0x4E) # set RAM x address count to 0;
|
|
|
- self.send_data(0x00)
|
|
|
- self.send_command(0x4F) # set RAM y address count to 0X199;
|
|
|
- self.send_data(0xC7)
|
|
|
- self.send_data(0x00)
|
|
|
+ def init(self, isPartial):
|
|
|
+ if (epdconfig.module_init() != 0):
|
|
|
+ return -1
|
|
|
+
|
|
|
+ if(isPartial):
|
|
|
+ logging.debug("full refresh")
|
|
|
+ self.reset()
|
|
|
+ self.ReadBusy()
|
|
|
+
|
|
|
+ self.set_lut(self.WF_PARTIAL_1IN54_0)
|
|
|
+
|
|
|
+ self.send_command(0x37)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x40)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+
|
|
|
+ self.send_command(0x3c) # BorderWavefrom
|
|
|
+ self.send_data(0x80)
|
|
|
+
|
|
|
+ self.send_command(0x22)
|
|
|
+ self.send_data(0xc0)
|
|
|
+ self.send_command(0x20)
|
|
|
+ self.ReadBusy()
|
|
|
|
|
|
- self.ReadBusy()
|
|
|
+ else:
|
|
|
+ logging.debug("partial refresh")
|
|
|
+ # EPD hardware init start
|
|
|
+ self.reset()
|
|
|
+
|
|
|
+ self.ReadBusy()
|
|
|
+ self.send_command(0x12) # SWRESET (software reset)
|
|
|
+ self.ReadBusy()
|
|
|
+
|
|
|
+ self.send_command(0x01) # DRIVER_OUTPUT_CONTROL
|
|
|
+ self.send_data(0xC7) # (EPD_HEIGHT - 1) & 0xFF
|
|
|
+ self.send_data(0x00) # ((EPD_HEIGHT - 1) >> 8) & 0xFF
|
|
|
+ self.send_data(0x01) # GD = 0 SM = 0 TB = 0
|
|
|
+
|
|
|
+ self.send_command(0x11) # data entry mode
|
|
|
+ self.send_data(0x01)
|
|
|
+
|
|
|
+ self.SetWindows(0, self.height-1, self.width-1, 0) # Set Windows
|
|
|
+
|
|
|
+ self.send_command(0x3C) # BorderWavefrom
|
|
|
+ self.send_data(0x01)
|
|
|
+
|
|
|
+ self.send_command(0x18)
|
|
|
+ self.send_data(0x80)
|
|
|
+
|
|
|
+ self.send_command(0x22) # #Load Temperature and waveform setting.
|
|
|
+ self.send_data(0XB1)
|
|
|
+ self.send_command(0x20)
|
|
|
+
|
|
|
+ self.SetCursor(0, self.height-1) # Set Cursor
|
|
|
+
|
|
|
+ self.ReadBusy()
|
|
|
+
|
|
|
+ self.set_lut(self.WF_Full_1IN54) # Set lut
|
|
|
|
|
|
def Clear(self, color):
|
|
|
self.send_command(0x24)
|
|
|
@@ -188,14 +318,6 @@ class EPD:
|
|
|
def displayPart(self, image):
|
|
|
if (image == None):
|
|
|
return
|
|
|
-
|
|
|
- epdconfig.digital_write(self.reset_pin, 0)
|
|
|
- epdconfig.delay_ms(10)
|
|
|
- epdconfig.digital_write(self.reset_pin, 1)
|
|
|
- epdconfig.delay_ms(10)
|
|
|
-
|
|
|
- self.send_command(0x3c)
|
|
|
- self.send_data(0x80)
|
|
|
|
|
|
self.send_command(0x24)
|
|
|
for j in range(0, self.height):
|