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)