epd4in2.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  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. logger = logging.getLogger(__name__)
  41. class EPD:
  42. def __init__(self):
  43. self.reset_pin = epdconfig.RST_PIN
  44. self.dc_pin = epdconfig.DC_PIN
  45. self.busy_pin = epdconfig.BUSY_PIN
  46. self.cs_pin = epdconfig.CS_PIN
  47. self.width = EPD_WIDTH
  48. self.height = EPD_HEIGHT
  49. self.GRAY1 = GRAY1 #white
  50. self.GRAY2 = GRAY2
  51. self.GRAY3 = GRAY3 #gray
  52. self.GRAY4 = GRAY4 #Blackest
  53. self.DATA = [0x00] * 15000
  54. lut_vcom0 = [
  55. 0x00, 0x08, 0x08, 0x00, 0x00, 0x02,
  56. 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01,
  57. 0x00, 0x08, 0x08, 0x00, 0x00, 0x02,
  58. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  60. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  61. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  62. 0x00, 0x00,
  63. ]
  64. lut_ww = [
  65. 0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
  66. 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
  67. 0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
  68. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  70. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  71. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  72. ]
  73. lut_bw = [
  74. 0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
  75. 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
  76. 0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
  77. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  78. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  79. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  80. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  81. ]
  82. lut_wb = [
  83. 0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
  84. 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
  85. 0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
  86. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  89. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  90. ]
  91. lut_bb = [
  92. 0x20, 0x08, 0x08, 0x00, 0x00, 0x02,
  93. 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
  94. 0x10, 0x08, 0x08, 0x00, 0x00, 0x02,
  95. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  96. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  97. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  98. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  99. ]
  100. #******************************partial screen update LUT*********************************/
  101. EPD_4IN2_Partial_lut_vcom1 =[
  102. 0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
  103. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  104. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  105. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  106. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  107. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  108. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  109. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  110. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  111. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  112. ]
  113. EPD_4IN2_Partial_lut_ww1 =[
  114. 0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
  115. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  116. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  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. ]
  122. EPD_4IN2_Partial_lut_bw1 =[
  123. 0x20, 0x01, 0x20, 0x01, 0x00, 0x01,
  124. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  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. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  132. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  133. ]
  134. EPD_4IN2_Partial_lut_wb1 =[
  135. 0x10, 0x01, 0x20, 0x01, 0x00, 0x01,
  136. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  137. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  138. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  139. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  140. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  141. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  142. ]
  143. EPD_4IN2_Partial_lut_bb1 =[
  144. 0x00, 0x01,0x20, 0x01, 0x00, 0x01,
  145. 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
  146. 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
  147. 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
  148. 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
  149. 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
  150. 0x00, 0x00,0x00, 0x00, 0x00, 0x00,
  151. ]
  152. #******************************gray*********************************/
  153. #0~3 gray
  154. EPD_4IN2_4Gray_lut_vcom =[
  155. 0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  156. 0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  157. 0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
  158. 0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
  159. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  160. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  161. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
  162. ]
  163. #R21
  164. EPD_4IN2_4Gray_lut_ww =[
  165. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  166. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  167. 0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  168. 0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
  169. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  170. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  171. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  172. ]
  173. #R22H r
  174. EPD_4IN2_4Gray_lut_bw =[
  175. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  176. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  177. 0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  178. 0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
  179. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  180. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  181. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  182. ]
  183. #R23H w
  184. EPD_4IN2_4Gray_lut_wb =[
  185. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  186. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  187. 0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  188. 0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
  189. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  190. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  191. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  192. ]
  193. #R24H b
  194. EPD_4IN2_4Gray_lut_bb =[
  195. 0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  196. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  197. 0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  198. 0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
  199. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  200. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  201. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  202. ]
  203. # Hardware reset
  204. def reset(self):
  205. epdconfig.digital_write(self.reset_pin, 1)
  206. epdconfig.delay_ms(10)
  207. epdconfig.digital_write(self.reset_pin, 0)
  208. epdconfig.delay_ms(10)
  209. epdconfig.digital_write(self.reset_pin, 1)
  210. epdconfig.delay_ms(10)
  211. epdconfig.digital_write(self.reset_pin, 0)
  212. epdconfig.delay_ms(10)
  213. epdconfig.digital_write(self.reset_pin, 1)
  214. epdconfig.delay_ms(10)
  215. epdconfig.digital_write(self.reset_pin, 0)
  216. epdconfig.delay_ms(10)
  217. epdconfig.digital_write(self.reset_pin, 1)
  218. epdconfig.delay_ms(10)
  219. def send_command(self, command):
  220. epdconfig.digital_write(self.dc_pin, 0)
  221. epdconfig.digital_write(self.cs_pin, 0)
  222. epdconfig.spi_writebyte([command])
  223. epdconfig.digital_write(self.cs_pin, 1)
  224. def send_data(self, data):
  225. epdconfig.digital_write(self.dc_pin, 1)
  226. epdconfig.digital_write(self.cs_pin, 0)
  227. epdconfig.spi_writebyte([data])
  228. epdconfig.digital_write(self.cs_pin, 1)
  229. def ReadBusy(self):
  230. self.send_command(0x71)
  231. while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
  232. self.send_command(0x71)
  233. epdconfig.delay_ms(100)
  234. def set_lut(self):
  235. self.send_command(0x20) # vcom
  236. for count in range(0, 36):
  237. self.send_data(self.lut_vcom0[count])
  238. self.send_command(0x21) # ww --
  239. for count in range(0, 36):
  240. self.send_data(self.lut_ww[count])
  241. self.send_command(0x22) # bw r
  242. for count in range(0, 36):
  243. self.send_data(self.lut_bw[count])
  244. self.send_command(0x23) # wb w
  245. for count in range(0, 36):
  246. self.send_data(self.lut_bb[count])
  247. self.send_command(0x24) # bb b
  248. for count in range(0, 36):
  249. self.send_data(self.lut_wb[count])
  250. def Partial_SetLut(self):
  251. self.send_command(0x20);
  252. for count in range(0, 44):
  253. self.send_data(self.EPD_4IN2_Partial_lut_vcom1[count])
  254. self.send_command(0x21);
  255. for count in range(0, 42):
  256. self.send_data(self.EPD_4IN2_Partial_lut_ww1[count])
  257. self.send_command(0x22);
  258. for count in range(0, 42):
  259. self.send_data(self.EPD_4IN2_Partial_lut_bw1[count])
  260. self.send_command(0x23);
  261. for count in range(0, 42):
  262. self.send_data(self.EPD_4IN2_Partial_lut_wb1[count])
  263. self.send_command(0x24);
  264. for count in range(0, 42):
  265. self.send_data(self.EPD_4IN2_Partial_lut_bb1[count])
  266. def Gray_SetLut(self):
  267. self.send_command(0x20) #vcom
  268. for count in range(0, 42):
  269. self.send_data(self.EPD_4IN2_4Gray_lut_vcom[count])
  270. self.send_command(0x21) #red not use
  271. for count in range(0, 42):
  272. self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
  273. self.send_command(0x22) #bw r
  274. for count in range(0, 42):
  275. self.send_data(self.EPD_4IN2_4Gray_lut_bw[count])
  276. self.send_command(0x23) #wb w
  277. for count in range(0, 42):
  278. self.send_data(self.EPD_4IN2_4Gray_lut_wb[count])
  279. self.send_command(0x24) #bb b
  280. for count in range(0, 42):
  281. self.send_data(self.EPD_4IN2_4Gray_lut_bb[count])
  282. self.send_command(0x25) #vcom
  283. for count in range(0, 42):
  284. self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
  285. def init(self):
  286. if (epdconfig.module_init() != 0):
  287. return -1
  288. # EPD hardware init start
  289. self.reset()
  290. self.send_command(0x01) # POWER SETTING
  291. self.send_data(0x03) # VDS_EN, VDG_EN
  292. self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0]
  293. self.send_data(0x2b) # VDH
  294. self.send_data(0x2b) # VDL
  295. self.send_command(0x06) # boost soft start
  296. self.send_data(0x17)
  297. self.send_data(0x17)
  298. self.send_data(0x17)
  299. self.send_command(0x04) # POWER_ON
  300. self.ReadBusy()
  301. self.send_command(0x00) # panel setting
  302. self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f
  303. self.send_command(0x30) # PLL setting
  304. self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
  305. self.send_command(0x61) # resolution setting
  306. self.send_data(0x01)
  307. self.send_data(0x90) # 128
  308. self.send_data(0x01)
  309. self.send_data(0x2c)
  310. self.send_command(0x82) # vcom_DC setting
  311. self.send_data(0x12)
  312. self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
  313. self.send_data(0x97) # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
  314. self.set_lut()
  315. # EPD hardware init end
  316. return 0
  317. def init_Partial(self):
  318. if (epdconfig.module_init() != 0):
  319. return -1
  320. # EPD hardware init start
  321. self.reset()
  322. self.send_command(0x01) # POWER SETTING
  323. self.send_data(0x03) # VDS_EN, VDG_EN
  324. self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0]
  325. self.send_data(0x2b) # VDH
  326. self.send_data(0x2b) # VDL
  327. self.send_command(0x06) # boost soft start
  328. self.send_data(0x17)
  329. self.send_data(0x17)
  330. self.send_data(0x17)
  331. self.send_command(0x04) # POWER_ON
  332. self.ReadBusy()
  333. self.send_command(0x00) # panel setting
  334. self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f
  335. self.send_command(0x30) # PLL setting
  336. self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
  337. self.send_command(0x61) # resolution setting
  338. self.send_data(0x01)
  339. self.send_data(0x90) # 128
  340. self.send_data(0x01)
  341. self.send_data(0x2c)
  342. self.send_command(0x82) # vcom_DC setting
  343. self.send_data(0x12)
  344. self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
  345. self.send_data(0x07) # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
  346. self.Partial_SetLut();
  347. # EPD hardware init end
  348. return 0
  349. def Init_4Gray(self):
  350. if (epdconfig.module_init() != 0):
  351. return -1
  352. # EPD hardware init start
  353. self.reset()
  354. self.send_command(0x01) #POWER SETTING
  355. self.send_data (0x03)
  356. self.send_data (0x00) #VGH=20V,VGL=-20V
  357. self.send_data (0x2b) #VDH=15V
  358. self.send_data (0x2b) #VDL=-15V
  359. self.send_data (0x13)
  360. self.send_command(0x06) #booster soft start
  361. self.send_data (0x17) #A
  362. self.send_data (0x17) #B
  363. self.send_data (0x17) #C
  364. self.send_command(0x04)
  365. self.ReadBusy()
  366. self.send_command(0x00) #panel setting
  367. self.send_data(0x3f) #KW-3f KWR-2F BWROTP 0f BWOTP 1f
  368. self.send_command(0x30) #PLL setting
  369. self.send_data (0x3c) #100hz
  370. self.send_command(0x61) #resolution setting
  371. self.send_data (0x01) #400
  372. self.send_data (0x90)
  373. self.send_data (0x01) #300
  374. self.send_data (0x2c)
  375. self.send_command(0x82) #vcom_DC setting
  376. self.send_data (0x12)
  377. self.send_command(0X50) #VCOM AND DATA INTERVAL SETTING
  378. self.send_data(0x97)
  379. def getbuffer(self, image):
  380. # logger.debug("bufsiz = ",int(self.width/8) * self.height)
  381. buf = [0xFF] * (int(self.width/8) * self.height)
  382. image_monocolor = image.convert('1')
  383. imwidth, imheight = image_monocolor.size
  384. pixels = image_monocolor.load()
  385. # logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
  386. if(imwidth == self.width and imheight == self.height):
  387. logger.debug("Horizontal")
  388. for y in range(imheight):
  389. for x in range(imwidth):
  390. # Set the bits for the column of pixels at the current position.
  391. if pixels[x, y] == 0:
  392. buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8))
  393. elif(imwidth == self.height and imheight == self.width):
  394. logger.debug("Vertical")
  395. for y in range(imheight):
  396. for x in range(imwidth):
  397. newx = y
  398. newy = self.height - x - 1
  399. if pixels[x, y] == 0:
  400. buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8))
  401. return buf
  402. def getbuffer_4Gray(self, image):
  403. # logger.debug("bufsiz = ",int(self.width/8) * self.height)
  404. buf = [0xFF] * (int(self.width / 4) * self.height)
  405. image_monocolor = image.convert('L')
  406. imwidth, imheight = image_monocolor.size
  407. pixels = image_monocolor.load()
  408. i=0
  409. # logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
  410. if(imwidth == self.width and imheight == self.height):
  411. logger.debug("Vertical")
  412. for y in range(imheight):
  413. for x in range(imwidth):
  414. # Set the bits for the column of pixels at the current position.
  415. if(pixels[x, y] == 0xC0):
  416. pixels[x, y] = 0x80
  417. elif (pixels[x, y] == 0x80):
  418. pixels[x, y] = 0x40
  419. i= i+1
  420. if(i%4 == 0):
  421. 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)
  422. elif(imwidth == self.height and imheight == self.width):
  423. logger.debug("Horizontal")
  424. for x in range(imwidth):
  425. for y in range(imheight):
  426. newx = y
  427. newy = x
  428. if(pixels[x, y] == 0xC0):
  429. pixels[x, y] = 0x80
  430. elif (pixels[x, y] == 0x80):
  431. pixels[x, y] = 0x40
  432. i= i+1
  433. if(i%4 == 0):
  434. 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)
  435. return buf
  436. def display(self, image):
  437. self.send_command(0x92);
  438. self.set_lut();
  439. self.send_command(0x10)
  440. for i in range(0, int(self.width * self.height / 8)):
  441. self.send_data(0xFF)
  442. self.send_command(0x13)
  443. for i in range(0, int(self.width * self.height / 8)):
  444. self.send_data(image[i])
  445. self.send_command(0x12)
  446. self.ReadBusy()
  447. def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image):
  448. # EPD_WIDTH = 400
  449. # EPD_HEIGHT = 300
  450. if(EPD_WIDTH % 8 != 0):
  451. Width = int(EPD_WIDTH / 8) + 1;
  452. else:
  453. Width = int(EPD_WIDTH / 8);
  454. Height = EPD_HEIGHT;
  455. if(X_start % 8 != 0):
  456. X_start = int(X_start/8)*8+8
  457. if(X_end % 8 != 0):
  458. X_end = int(X_end/8)*8+8
  459. self.send_command(0x91); #This command makes the display enter partial mode
  460. self.send_command(0x90); #resolution setting
  461. self.send_data (int(X_start/256));
  462. self.send_data (int(X_start%256)); #x-start
  463. self.send_data (int(X_end /256));
  464. self.send_data (int(X_end %256)-1); #x-end
  465. self.send_data (int(Y_start/256));
  466. self.send_data (int(Y_start%256)); #y-start
  467. self.send_data (int(Y_end/256));
  468. self.send_data (int(Y_end%256)-1); #y-end
  469. self.send_data (0x28);
  470. self.send_command(0x10); #writes Old data to SRAM for programming
  471. for j in range(0, int(Y_end - Y_start)):
  472. for i in range(0, int(X_end/8) - int(X_start/8)):
  473. self.send_data(self.DATA[(Y_start + j)*Width + int(X_start/8) + i]);
  474. self.send_command(0x13); #writes New data to SRAM.
  475. for j in range(0, int(Y_end - Y_start)):
  476. for i in range(0, int(X_end/8) - int(X_start/8)):
  477. self.send_data(~Image[(Y_start + j)*Width + int(X_start/8) + i]);
  478. self.DATA[(Y_start + j)*Width + int(X_start/8) + i] = ~Image[(Y_start + j)*Width + int(X_start/8) + i]
  479. self.send_command(0x12); #DISPLAY REFRESH
  480. epdconfig.delay_ms(200) #The delay here is necessary, 200uS at least!!!
  481. self.ReadBusy()
  482. def display_4Gray(self, image):
  483. self.send_command(0x92);
  484. self.set_lut();
  485. self.send_command(0x10)
  486. for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): # EPD_WIDTH * EPD_HEIGHT / 4
  487. temp3=0
  488. for j in range(0, 2):
  489. temp1 = image[i*2+j]
  490. for k in range(0, 2):
  491. temp2 = temp1&0xC0
  492. if(temp2 == 0xC0):
  493. temp3 |= 0x01#white
  494. elif(temp2 == 0x00):
  495. temp3 |= 0x00 #black
  496. elif(temp2 == 0x80):
  497. temp3 |= 0x01 #gray1
  498. else: #0x40
  499. temp3 |= 0x00 #gray2
  500. temp3 <<= 1
  501. temp1 <<= 2
  502. temp2 = temp1&0xC0
  503. if(temp2 == 0xC0): #white
  504. temp3 |= 0x01
  505. elif(temp2 == 0x00): #black
  506. temp3 |= 0x00
  507. elif(temp2 == 0x80):
  508. temp3 |= 0x01 #gray1
  509. else : #0x40
  510. temp3 |= 0x00 #gray2
  511. if(j!=1 or k!=1):
  512. temp3 <<= 1
  513. temp1 <<= 2
  514. self.send_data(temp3)
  515. self.send_command(0x13)
  516. for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): #5808*4 46464
  517. temp3=0
  518. for j in range(0, 2):
  519. temp1 = image[i*2+j]
  520. for k in range(0, 2):
  521. temp2 = temp1&0xC0
  522. if(temp2 == 0xC0):
  523. temp3 |= 0x01#white
  524. elif(temp2 == 0x00):
  525. temp3 |= 0x00 #black
  526. elif(temp2 == 0x80):
  527. temp3 |= 0x00 #gray1
  528. else: #0x40
  529. temp3 |= 0x01 #gray2
  530. temp3 <<= 1
  531. temp1 <<= 2
  532. temp2 = temp1&0xC0
  533. if(temp2 == 0xC0): #white
  534. temp3 |= 0x01
  535. elif(temp2 == 0x00): #black
  536. temp3 |= 0x00
  537. elif(temp2 == 0x80):
  538. temp3 |= 0x00 #gray1
  539. else: #0x40
  540. temp3 |= 0x01 #gray2
  541. if(j!=1 or k!=1):
  542. temp3 <<= 1
  543. temp1 <<= 2
  544. self.send_data(temp3)
  545. self.Gray_SetLut()
  546. self.send_command(0x12)
  547. epdconfig.delay_ms(200)
  548. self.ReadBusy()
  549. # pass
  550. def Clear(self):
  551. self.send_command(0x10)
  552. for i in range(0, int(self.width * self.height / 8)):
  553. self.send_data(0xFF)
  554. self.send_command(0x13)
  555. for i in range(0, int(self.width * self.height / 8)):
  556. self.send_data(0xFF)
  557. self.send_command(0x12)
  558. self.ReadBusy()
  559. def sleep(self):
  560. self.send_command(0x02) # POWER_OFF
  561. self.ReadBusy()
  562. self.send_command(0x07) # DEEP_SLEEP
  563. self.send_data(0XA5)
  564. epdconfig.delay_ms(2000)
  565. epdconfig.module_exit()
  566. ### END OF FILE ###