1+ import digitalio
2+ import busio
3+ import board
4+ from adafruit_epd .epd import Adafruit_EPD
5+ from adafruit_epd .il0373 import Adafruit_IL0373
6+
7+ # create the spi device and pins we will need
8+ spi = busio .SPI (board .SCK , MOSI = board .MOSI , MISO = board .MISO )
9+ ecs = digitalio .DigitalInOut (board .D10 )
10+ dc = digitalio .DigitalInOut (board .D9 )
11+ srcs = digitalio .DigitalInOut (board .D8 )
12+ rst = digitalio .DigitalInOut (board .D7 )
13+ busy = digitalio .DigitalInOut (board .D6 )
14+
15+ # give them all to our driver
16+ display = Adafruit_IL0373 (152 , 152 , rst , dc , busy , srcs , ecs , spi )
17+
18+ FILENAME = "blinka.bmp"
19+
20+ # clear the buffer
21+ display .clear_buffer ()
22+
23+ def read_le (s ):
24+ # as of this writting, int.from_bytes does not have LE support, DIY!
25+ result = 0
26+ shift = 0
27+ for byte in bytearray (s ):
28+ result += byte << shift
29+ shift += 8
30+ return result
31+
32+ class BMPError (Exception ):
33+ pass
34+
35+
36+ try :
37+ with open ("/" + FILENAME , "rb" ) as f :
38+ print ("File opened" )
39+ if f .read (2 ) != b'BM' : # check signature
40+ raise BMPError ("Not BitMap file" )
41+
42+ bmpFileSize = read_le (f .read (4 ))
43+ f .read (4 ) # Read & ignore creator bytes
44+
45+ bmpImageoffset = read_le (f .read (4 )) # Start of image data
46+ headerSize = read_le (f .read (4 ))
47+ bmpWidth = read_le (f .read (4 ))
48+ bmpHeight = read_le (f .read (4 ))
49+ flip = True
50+
51+ print ("Size: %d\n Image offset: %d\n Header size: %d" %
52+ (bmpFileSize , bmpImageoffset , headerSize ))
53+ print ("Width: %d\n Height: %d" % (bmpWidth , bmpHeight ))
54+
55+ if read_le (f .read (2 )) != 1 :
56+ raise BMPError ("Not singleplane" )
57+ bmpDepth = read_le (f .read (2 )) # bits per pixel
58+ print ("Bit depth: %d" % (bmpDepth ))
59+ if bmpDepth != 24 :
60+ raise BMPError ("Not 24-bit" )
61+ if read_le (f .read (2 )) != 0 :
62+ raise BMPError ("Compressed file" )
63+
64+ print ("Image OK! Drawing..." )
65+
66+ rowSize = (bmpWidth * 3 + 3 ) & ~ 3 # 32-bit line boundary
67+
68+ for row in range (bmpHeight ): # For each scanline...
69+ if flip : # Bitmap is stored bottom-to-top order (normal BMP)
70+ pos = bmpImageoffset + (bmpHeight - 1 - row ) * rowSize
71+ else : # Bitmap is stored top-to-bottom
72+ pos = bmpImageoffset + row * rowSize
73+
74+ # print ("seek to %d" % pos)
75+ f .seek (pos )
76+ for col in range (bmpWidth ):
77+ b , g , r = bytearray (f .read (3 )) # BMP files store RGB in BGR
78+ if r < 0x80 and g < 0x80 and b < 0x80 :
79+ display .draw_pixel (row , col , Adafruit_EPD .BLACK )
80+ elif r >= 0x80 and g >= 0x80 and b >= 0x80 :
81+ display .draw_pixel (row , col , Adafruit_EPD .WHITE )
82+ elif r >= 0x80 :
83+ display .draw_pixel (row , col , Adafruit_EPD .RED )
84+
85+ except OSError as e :
86+ if e .args [0 ] == 28 :
87+ raise OSError ("OS Error 28 0.25" )
88+ else :
89+ raise OSError ("OS Error 0.5" )
90+ except BMPError as e :
91+ print ("Failed to parse BMP: " + e .args [0 ])
92+
93+
94+ display .display ()
0 commit comments