Fix keyword argument decoding issue on MicroPython and finalize raw image endpoint and clock sync changes

This commit is contained in:
Adolfo Reyna
2026-06-19 13:30:26 -04:00
parent c944d8c48f
commit c8853cc5df
7 changed files with 711 additions and 24 deletions
+92
View File
@@ -2,6 +2,7 @@ import time
from machine import Pin, SPI
import framebuf
import micropython
import struct
class RLCD:
def __init__(self, spi, cs, dc, rst, width=400, height=300):
@@ -82,6 +83,97 @@ class RLCD:
except OSError:
print(f"Error: Could not open {filename}")
def draw_bmp(self, filename, x=0, y=0):
"""Draw a 24-bit or 32-bit uncompressed color BMP image converted to 1-bit monochrome at (x, y) coordinates."""
try:
with open(filename, 'rb') as f:
header = f.read(54)
if len(header) < 54 or header[0:2] != b'BM':
print("Err: Not a valid BMP file")
return False
pixel_offset = struct.unpack('<I', header[10:14])[0]
width, height = struct.unpack('<ii', header[18:26])
planes, bpp = struct.unpack('<HH', header[26:30])
compression = struct.unpack('<I', header[30:34])[0]
if bpp not in (24, 32):
print("Err: Only 24-bit and 32-bit BMP formats supported")
return False
if compression != 0:
print("Err: Only uncompressed BMP supported")
return False
f.seek(pixel_offset)
bottom_up = True
if height < 0:
height = -height
bottom_up = False
row_bytes = (width * bpp) // 8
row_padded = ((width * bpp + 31) // 32) * 4
read_buf = bytearray(row_padded)
for row_idx in range(height):
n = f.readinto(read_buf)
if n < row_padded:
break
screen_y = y + (height - 1 - row_idx) if bottom_up else y + row_idx
if screen_y < 0 or screen_y >= self.height:
continue
for px in range(width):
screen_x = x + px
if screen_x < 0 or screen_x >= self.width:
continue
if bpp == 24:
b = read_buf[px * 3]
g = read_buf[px * 3 + 1]
r = read_buf[px * 3 + 2]
else: # 32-bit
b = read_buf[px * 4]
g = read_buf[px * 4 + 1]
r = read_buf[px * 4 + 2]
# Convert to monochrome (0 = White, 1 = Black)
lum = (r * 299 + g * 587 + b * 114) // 1000
c = 1 if lum < 128 else 0
self.canvas.pixel(screen_x, screen_y, c)
self.show()
return True
except Exception as e:
print("Error drawing BMP on RLCD:", e)
return False
def draw_rgb565(self, x, y, w, h, data):
"""Draw raw RGB565 pixel data converted to 1-bit monochrome on the RLCD."""
for cy in range(h):
screen_y = y + cy
if screen_y < 0 or screen_y >= self.height:
continue
for cx in range(w):
screen_x = x + cx
if screen_x < 0 or screen_x >= self.width:
continue
idx = (cy * w + cx) * 2
h_byte = data[idx]
l_byte = data[idx + 1]
# Extract RGB from RGB565
r = (h_byte & 0xF8)
g = ((h_byte & 0x07) << 5) | ((l_byte & 0xE0) >> 3)
b = (l_byte & 0x1F) << 3
# Convert to luminance (0 = White, 1 = Black in RLCD)
lum = (r * 299 + g * 587 + b * 114) // 1000
c = 1 if lum < 128 else 0
self.canvas.pixel(screen_x, screen_y, c)
self.show()
return True
# --- SCREENSHOT ---
def save_screenshot(self, filename):
print(f"Saving screenshot to {filename}...")