epd4in2.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. # *****************************************************************************
  2. # * | File : epd4in2.py
  3. # * | Author : Waveshare team
  4. # * | Function : Electronic paper driver
  5. # * | Info :
  6. # *----------------
  7. # * | This version: V4.0
  8. # * | Date : 2019-06-20
  9. # # | Info : python demo
  10. # -----------------------------------------------------------------------------
  11. # Permission is hereby granted, free of charge, to any person obtaining a copy
  12. # of this software and associated documnetation files (the "Software"), to deal
  13. # in the Software without restriction, including without limitation the rights
  14. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  15. # copies of the Software, and to permit persons to whom the Software is
  16. # furished to do so, subject to the following conditions:
  17. #
  18. # The above copyright notice and this permission notice shall be included in
  19. # all copies or substantial portions of the Software.
  20. #
  21. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  22. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  23. # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  24. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  25. # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  26. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  27. # THE SOFTWARE.
  28. #
  29. import logging
  30. from . import epdconfig
  31. from PIL import Image
  32. import RPi.GPIO as GPIO
  33. # Display resolution
  34. EPD_WIDTH = 400
  35. EPD_HEIGHT = 300
  36. GRAY1 = 0xff #white
  37. GRAY2 = 0xC0
  38. GRAY3 = 0x80 #gray
  39. GRAY4 = 0x00 #Blackest
  40. class EPD:
  41. def __init__(self):
  42. self.reset_pin = epdconfig.RST_PIN
  43. self.dc_pin = epdconfig.DC_PIN
  44. self.busy_pin = epdconfig.BUSY_PIN
  45. self.cs_pin = epdconfig.CS_PIN
  46. self.width = EPD_WIDTH
  47. self.height = EPD_HEIGHT
  48. self.GRAY1 = GRAY1 #white
  49. self.GRAY2 = GRAY2
  50. self.GRAY3 = GRAY3 #gray
  51. self.GRAY4 = GRAY4 #Blackest
  52. lut_vcom0 = [
  53. 0x00, 0x17, 0x00, 0x00, 0x00, 0x02,
  54. 0x00, 0x17, 0x17, 0x00, 0x00, 0x02,
  55. 0x00, 0x0A, 0x01, 0x00, 0x00, 0x01,
  56. 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  57. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  58. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  60. ]
  61. lut_ww = [
  62. 0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
  63. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  64. 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
  65. 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  66. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  67. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  68. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69. ]
  70. lut_bw = [
  71. 0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
  72. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  73. 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
  74. 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  75. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  76. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  77. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  78. ]
  79. lut_wb = [
  80. 0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
  81. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  82. 0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
  83. 0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  84. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  85. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87. ]
  88. lut_bb = [
  89. 0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
  90. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  91. 0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
  92. 0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  93. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  94. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  95. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  96. ]
  97. #******************************partial screen update LUT*********************************/
  98. EPD_4IN2_Partial_lut_vcom1 =[
  99. 0x00 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  100. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  101. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  102. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  103. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  104. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  105. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  106. 0x00 ,0x00, ]
  107. EPD_4IN2_Partial_lut_ww1 =[
  108. 0x00 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  109. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  110. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  111. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  112. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  113. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  114. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,]
  115. EPD_4IN2_Partial_lut_bw1 =[
  116. 0x80 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  117. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  118. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  119. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  120. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  121. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  122. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, ]
  123. EPD_4IN2_Partial_lut_wb1 =[
  124. 0x40 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  125. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  126. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  127. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  128. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  129. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  130. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, ]
  131. EPD_4IN2_Partial_lut_bb1 =[
  132. 0x00 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  133. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  134. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  135. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  136. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  137. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  138. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, ]
  139. #******************************gray*********************************/
  140. #0~3 gray
  141. EPD_4IN2_4Gray_lut_vcom =[
  142. 0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  143. 0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  144. 0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
  145. 0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
  146. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  147. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  148. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
  149. ]
  150. #R21
  151. EPD_4IN2_4Gray_lut_ww =[
  152. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  153. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  154. 0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  155. 0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
  156. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  157. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  158. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  159. ]
  160. #R22H r
  161. EPD_4IN2_4Gray_lut_bw =[
  162. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  163. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  164. 0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  165. 0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
  166. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  167. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  168. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  169. ]
  170. #R23H w
  171. EPD_4IN2_4Gray_lut_wb =[
  172. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  173. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  174. 0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  175. 0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
  176. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  177. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  178. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  179. ]
  180. #R24H b
  181. EPD_4IN2_4Gray_lut_bb =[
  182. 0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  183. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  184. 0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  185. 0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
  186. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  187. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  188. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  189. ]
  190. # Hardware reset
  191. def reset(self):
  192. epdconfig.digital_write(self.reset_pin, 1)
  193. epdconfig.delay_ms(20)
  194. epdconfig.digital_write(self.reset_pin, 0)
  195. epdconfig.delay_ms(5)
  196. epdconfig.digital_write(self.reset_pin, 1)
  197. epdconfig.delay_ms(20)
  198. epdconfig.digital_write(self.reset_pin, 0)
  199. epdconfig.delay_ms(5)
  200. epdconfig.digital_write(self.reset_pin, 1)
  201. epdconfig.delay_ms(20)
  202. epdconfig.digital_write(self.reset_pin, 0)
  203. epdconfig.delay_ms(5)
  204. epdconfig.digital_write(self.reset_pin, 1)
  205. epdconfig.delay_ms(20)
  206. def send_command(self, command):
  207. epdconfig.digital_write(self.dc_pin, 0)
  208. epdconfig.digital_write(self.cs_pin, 0)
  209. epdconfig.spi_writebyte([command])
  210. epdconfig.digital_write(self.cs_pin, 1)
  211. def send_data(self, data):
  212. epdconfig.digital_write(self.dc_pin, 1)
  213. epdconfig.digital_write(self.cs_pin, 0)
  214. epdconfig.spi_writebyte([data])
  215. epdconfig.digital_write(self.cs_pin, 1)
  216. def ReadBusy(self):
  217. self.send_command(0x71)
  218. while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
  219. self.send_command(0x71)
  220. epdconfig.delay_ms(100)
  221. def set_lut(self):
  222. self.send_command(0x20) # vcom
  223. for count in range(0, 44):
  224. self.send_data(self.lut_vcom0[count])
  225. self.send_command(0x21) # ww --
  226. for count in range(0, 42):
  227. self.send_data(self.lut_ww[count])
  228. self.send_command(0x22) # bw r
  229. for count in range(0, 42):
  230. self.send_data(self.lut_bw[count])
  231. self.send_command(0x23) # wb w
  232. for count in range(0, 42):
  233. self.send_data(self.lut_bb[count])
  234. self.send_command(0x24) # bb b
  235. for count in range(0, 42):
  236. self.send_data(self.lut_wb[count])
  237. def Partial_SetLut(self):
  238. self.send_command(0x20);
  239. for count in range(0, 44):
  240. self.send_data(self.EPD_4IN2_Partial_lut_vcom1[count])
  241. self.send_command(0x21);
  242. for count in range(0, 42):
  243. self.send_data(self.EPD_4IN2_Partial_lut_ww1[count])
  244. self.send_command(0x22);
  245. for count in range(0, 42):
  246. self.send_data(self.EPD_4IN2_Partial_lut_bw1[count])
  247. self.send_command(0x23);
  248. for count in range(0, 42):
  249. self.send_data(self.EPD_4IN2_Partial_lut_wb1[count])
  250. self.send_command(0x24);
  251. for count in range(0, 42):
  252. self.send_data(self.EPD_4IN2_Partial_lut_bb1[count])
  253. def Gray_SetLut(self):
  254. self.send_command(0x20) #vcom
  255. for count in range(0, 42):
  256. self.send_data(self.EPD_4IN2_4Gray_lut_vcom[count])
  257. self.send_command(0x21) #red not use
  258. for count in range(0, 42):
  259. self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
  260. self.send_command(0x22) #bw r
  261. for count in range(0, 42):
  262. self.send_data(self.EPD_4IN2_4Gray_lut_bw[count])
  263. self.send_command(0x23) #wb w
  264. for count in range(0, 42):
  265. self.send_data(self.EPD_4IN2_4Gray_lut_wb[count])
  266. self.send_command(0x24) #bb b
  267. for count in range(0, 42):
  268. self.send_data(self.EPD_4IN2_4Gray_lut_bb[count])
  269. self.send_command(0x25) #vcom
  270. for count in range(0, 42):
  271. self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
  272. def init(self):
  273. if (epdconfig.module_init() != 0):
  274. return -1
  275. # EPD hardware init start
  276. self.reset()
  277. self.send_command(0x01) # POWER SETTING
  278. self.send_data(0x03) # VDS_EN, VDG_EN
  279. self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0]
  280. self.send_data(0x2b) # VDH
  281. self.send_data(0x2b) # VDL
  282. self.send_command(0x06) # boost soft start
  283. self.send_data(0x17)
  284. self.send_data(0x17)
  285. self.send_data(0x17)
  286. self.send_command(0x04) # POWER_ON
  287. self.ReadBusy()
  288. self.send_command(0x00) # panel setting
  289. self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f
  290. self.send_data(0x0d)
  291. self.send_command(0x30) # PLL setting
  292. self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
  293. self.send_command(0x61) # resolution setting
  294. self.send_data(0x01)
  295. self.send_data(0x90) # 128
  296. self.send_data(0x01)
  297. self.send_data(0x2c)
  298. self.send_command(0x82) # vcom_DC setting
  299. self.send_data(0x28)
  300. self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
  301. self.send_data(0x97) # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
  302. self.set_lut()
  303. # EPD hardware init end
  304. return 0
  305. def Init_4Gray(self):
  306. if (epdconfig.module_init() != 0):
  307. return -1
  308. # EPD hardware init start
  309. self.reset()
  310. self.send_command(0x01) #POWER SETTING
  311. self.send_data (0x03)
  312. self.send_data (0x00) #VGH=20V,VGL=-20V
  313. self.send_data (0x2b) #VDH=15V
  314. self.send_data (0x2b) #VDL=-15V
  315. self.send_data (0x13)
  316. self.send_command(0x06) #booster soft start
  317. self.send_data (0x17) #A
  318. self.send_data (0x17) #B
  319. self.send_data (0x17) #C
  320. self.send_command(0x04)
  321. self.ReadBusy()
  322. self.send_command(0x00) #panel setting
  323. self.send_data(0x3f) #KW-3f KWR-2F BWROTP 0f BWOTP 1f
  324. self.send_command(0x30) #PLL setting
  325. self.send_data (0x3c) #100hz
  326. self.send_command(0x61) #resolution setting
  327. self.send_data (0x01) #400
  328. self.send_data (0x90)
  329. self.send_data (0x01) #300
  330. self.send_data (0x2c)
  331. self.send_command(0x82) #vcom_DC setting
  332. self.send_data (0x12)
  333. self.send_command(0X50) #VCOM AND DATA INTERVAL SETTING
  334. self.send_data(0x97)
  335. def getbuffer(self, image):
  336. # logging.debug("bufsiz = ",int(self.width/8) * self.height)
  337. buf = [0xFF] * (int(self.width/8) * self.height)
  338. image_monocolor = image.convert('1')
  339. imwidth, imheight = image_monocolor.size
  340. pixels = image_monocolor.load()
  341. # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight)
  342. if(imwidth == self.width and imheight == self.height):
  343. logging.debug("Horizontal")
  344. for y in range(imheight):
  345. for x in range(imwidth):
  346. # Set the bits for the column of pixels at the current position.
  347. if pixels[x, y] == 0:
  348. buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8))
  349. elif(imwidth == self.height and imheight == self.width):
  350. logging.debug("Vertical")
  351. for y in range(imheight):
  352. for x in range(imwidth):
  353. newx = y
  354. newy = self.height - x - 1
  355. if pixels[x, y] == 0:
  356. buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8))
  357. return buf
  358. def getbuffer_4Gray(self, image):
  359. # logging.debug("bufsiz = ",int(self.width/8) * self.height)
  360. buf = [0xFF] * (int(self.width / 4) * self.height)
  361. image_monocolor = image.convert('L')
  362. imwidth, imheight = image_monocolor.size
  363. pixels = image_monocolor.load()
  364. i=0
  365. # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight)
  366. if(imwidth == self.width and imheight == self.height):
  367. logging.debug("Vertical")
  368. for y in range(imheight):
  369. for x in range(imwidth):
  370. # Set the bits for the column of pixels at the current position.
  371. if(pixels[x, y] == 0xC0):
  372. pixels[x, y] = 0x80
  373. elif (pixels[x, y] == 0x80):
  374. pixels[x, y] = 0x40
  375. i= i+1
  376. if(i%4 == 0):
  377. 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)
  378. elif(imwidth == self.height and imheight == self.width):
  379. logging.debug("Horizontal")
  380. for x in range(imwidth):
  381. for y in range(imheight):
  382. newx = y
  383. newy = x
  384. if(pixels[x, y] == 0xC0):
  385. pixels[x, y] = 0x80
  386. elif (pixels[x, y] == 0x80):
  387. pixels[x, y] = 0x40
  388. i= i+1
  389. if(i%4 == 0):
  390. 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)
  391. return buf
  392. def display(self, image):
  393. self.send_command(0x92);
  394. self.set_lut();
  395. self.send_command(0x10)
  396. for i in range(0, int(self.width * self.height / 8)):
  397. self.send_data(0xFF)
  398. self.send_command(0x13)
  399. for i in range(0, int(self.width * self.height / 8)):
  400. self.send_data(image[i])
  401. self.send_command(0x12)
  402. self.ReadBusy()
  403. def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image):
  404. # EPD_WIDTH = 400
  405. # EPD_HEIGHT = 300
  406. if(EPD_WIDTH % 8 != 0):
  407. Width = int(EPD_WIDTH / 8) + 1;
  408. else:
  409. Width = int(EPD_WIDTH / 8);
  410. Height = EPD_HEIGHT;
  411. if(X_start % 8 != 0):
  412. X_start = int(X_start/8)*8+8
  413. if(X_end % 8 != 0):
  414. X_end = int(X_end/8)*8+8
  415. self.Partial_SetLut();
  416. self.send_command(0x91); #This command makes the display enter partial mode
  417. self.send_command(0x90); #resolution setting
  418. self.send_data (int(X_start/256));
  419. self.send_data (int(X_start%256)); #x-start
  420. self.send_data (int(X_end /256));
  421. self.send_data (int(X_end %256)-1); #x-end
  422. self.send_data (int(Y_start/256));
  423. self.send_data (int(Y_start%256)); #y-start
  424. self.send_data (int(Y_end/256));
  425. self.send_data (int(Y_end%256)-1); #y-end
  426. self.send_data (0x28);
  427. self.send_command(0x10); #writes Old data to SRAM for programming
  428. for j in range(0, int(Y_end - Y_start)):
  429. for i in range(0, int(X_end/8) - int(X_start/8)):
  430. self.send_data(Image[(Y_start + j)*Width + int(X_start/8) + i]);
  431. self.send_command(0x13); #writes New data to SRAM.
  432. for j in range(0, int(Y_end - Y_start)):
  433. for i in range(0, int(X_end/8) - int(X_start/8)):
  434. self.send_data(~Image[(Y_start + j)*Width + int(X_start/8) + i]);
  435. self.send_command(0x12); #DISPLAY REFRESH
  436. epdconfig.delay_ms(200) #The delay here is necessary, 200uS at least!!!
  437. self.ReadBusy()
  438. def display_4Gray(self, image):
  439. self.send_command(0x92);
  440. self.set_lut();
  441. self.send_command(0x10)
  442. for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): # EPD_WIDTH * EPD_HEIGHT / 4
  443. temp3=0
  444. for j in range(0, 2):
  445. temp1 = image[i*2+j]
  446. for k in range(0, 2):
  447. temp2 = temp1&0xC0
  448. if(temp2 == 0xC0):
  449. temp3 |= 0x01#white
  450. elif(temp2 == 0x00):
  451. temp3 |= 0x00 #black
  452. elif(temp2 == 0x80):
  453. temp3 |= 0x01 #gray1
  454. else: #0x40
  455. temp3 |= 0x00 #gray2
  456. temp3 <<= 1
  457. temp1 <<= 2
  458. temp2 = temp1&0xC0
  459. if(temp2 == 0xC0): #white
  460. temp3 |= 0x01
  461. elif(temp2 == 0x00): #black
  462. temp3 |= 0x00
  463. elif(temp2 == 0x80):
  464. temp3 |= 0x01 #gray1
  465. else : #0x40
  466. temp3 |= 0x00 #gray2
  467. if(j!=1 or k!=1):
  468. temp3 <<= 1
  469. temp1 <<= 2
  470. self.send_data(temp3)
  471. self.send_command(0x13)
  472. for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): #5808*4 46464
  473. temp3=0
  474. for j in range(0, 2):
  475. temp1 = image[i*2+j]
  476. for k in range(0, 2):
  477. temp2 = temp1&0xC0
  478. if(temp2 == 0xC0):
  479. temp3 |= 0x01#white
  480. elif(temp2 == 0x00):
  481. temp3 |= 0x00 #black
  482. elif(temp2 == 0x80):
  483. temp3 |= 0x00 #gray1
  484. else: #0x40
  485. temp3 |= 0x01 #gray2
  486. temp3 <<= 1
  487. temp1 <<= 2
  488. temp2 = temp1&0xC0
  489. if(temp2 == 0xC0): #white
  490. temp3 |= 0x01
  491. elif(temp2 == 0x00): #black
  492. temp3 |= 0x00
  493. elif(temp2 == 0x80):
  494. temp3 |= 0x00 #gray1
  495. else: #0x40
  496. temp3 |= 0x01 #gray2
  497. if(j!=1 or k!=1):
  498. temp3 <<= 1
  499. temp1 <<= 2
  500. self.send_data(temp3)
  501. self.Gray_SetLut()
  502. self.send_command(0x12)
  503. epdconfig.delay_ms(200)
  504. self.ReadBusy()
  505. # pass
  506. def Clear(self):
  507. self.send_command(0x10)
  508. for i in range(0, int(self.width * self.height / 8)):
  509. self.send_data(0xFF)
  510. self.send_command(0x13)
  511. for i in range(0, int(self.width * self.height / 8)):
  512. self.send_data(0xFF)
  513. self.send_command(0x12)
  514. self.ReadBusy()
  515. def sleep(self):
  516. self.send_command(0x02) # POWER_OFF
  517. self.ReadBusy()
  518. self.send_command(0x07) # DEEP_SLEEP
  519. self.send_data(0XA5)
  520. epdconfig.delay_ms(2000)
  521. epdconfig.module_exit()
  522. ### END OF FILE ###