35 lines
No EOL
1.2 KiB
Python
35 lines
No EOL
1.2 KiB
Python
import asyncio
|
|
from LCD import LCD
|
|
|
|
alloc_lock = asyncio.Lock()
|
|
|
|
class display:
|
|
def __init__(self, width=20, height=4, i2c_addr=0x27):
|
|
self.width = width
|
|
self.height = height
|
|
self.device = LCD(2, i2c_addr, True)
|
|
self.contents = [" " * width] * self.height
|
|
self.custom_char_allocations = [False] * 8
|
|
|
|
async def redraw(self, row = None):
|
|
if row == None:
|
|
for row, line in enumerate(self.contents):
|
|
await self.device.async_message(line, row + 1)
|
|
else:
|
|
await self.device.async_message(self.contents[row - 1], row)
|
|
|
|
async def alloc_cchar(self):
|
|
async with alloc_lock:
|
|
new_alloc = self.custom_char_allocations.index(False)
|
|
self.custom_char_allocations[new_alloc] = True
|
|
return new_alloc
|
|
|
|
async def free_cchar(self, cchar):
|
|
self.custom_char_allocations[cchar] = False
|
|
|
|
async def read(self, row):
|
|
return self.contents[row]
|
|
|
|
async def write(self, row, data, offset = 0):
|
|
self.contents[row - 1] = f'{self.contents[row - 1][:offset]}{data}{self.contents[row - 1][offset+len(data):]}'
|
|
await self.redraw(row) |