Files
mcp_screen/voice_animations/error_alert.py
T
2026-06-21 21:19:51 -04:00

96 lines
3.3 KiB
Python

# Standalone MicroPython Voice Animation: Error Alert
# Exposes run(text="", frames=...) and runs automatically if executed directly.
import time
try:
import board_config
display = getattr(board_config, 'display_instance', None)
except Exception:
board_config = None
display = None
def draw_center_text(d, msg, y, w, scale=1, c=1):
char_w = 8 * scale
x = max(0, (w - len(msg) * char_w) // 2)
if hasattr(d, 'text_large') and scale > 1:
try:
d.text_large(msg, x, y, scale, c)
return
except Exception:
pass
d.text(msg, x, y, c)
def run(text="", frames=100):
if not display:
print("board_config.display_instance is not available. Skipping animation.")
return
width = getattr(display, 'width', 400)
height = getattr(display, 'height', 300)
cx, cy = width // 2, height // 2
label = text if text else "ERROR OCCURRED"
frame = 0
try:
while True:
if frames is not None and frames > 0 and frame >= frames:
break
display.clear(0)
# Blink animation state
# Flashes between standard warning symbol and high-contrast double border
blink_state = (frame // 4) % 2
# Base warning triangle dimensions
ty_top = cy - 40
ty_bottom = cy + 30
tx_left = cx - 45
tx_right = cx + 45
if blink_state == 0:
# Draw single bold warning triangle
display.line(cx, ty_top, tx_left, ty_bottom, 1)
display.line(cx, ty_top, tx_right, ty_bottom, 1)
display.line(tx_left, ty_bottom, tx_right, ty_bottom, 1)
else:
# Draw double thick warning triangle for "flashing" impact
display.line(cx, ty_top - 3, tx_left - 4, ty_bottom + 2, 1)
display.line(cx, ty_top - 3, tx_right + 4, ty_bottom + 2, 1)
display.line(tx_left - 4, ty_bottom + 2, tx_right + 4, ty_bottom + 2, 1)
display.line(cx, ty_top, tx_left, ty_bottom, 1)
display.line(cx, ty_top, tx_right, ty_bottom, 1)
display.line(tx_left, ty_bottom, tx_right, ty_bottom, 1)
# Draw Exclamation mark inside the triangle
# Exclamation bar
display.fill_rect(cx - 3, cy - 15, 6, 22, 1)
# Exclamation dot
display.fill_rect(cx - 3, cy + 13, 6, 6, 1)
# Draw warning stripes on the left and right edges of the screen
stripe_y = (frame * 3) % 20
for sy in range(-20, height + 20, 20):
# Left stripe
display.line(5, sy + stripe_y, 15, sy + stripe_y + 10, 1)
# Right stripe
display.line(width - 15, sy + stripe_y, width - 5, sy + stripe_y + 10, 1)
# Draw centered text label at the bottom
draw_center_text(display, label, height - 30, width, scale=1, c=1)
display.show()
frame += 1
try:
time.sleep_ms(60)
except AttributeError:
time.sleep(0.06)
except KeyboardInterrupt:
print("Animation interrupted by user.")
if __name__ in ('__main__', '__name__'):
run()