feat(2-6): stateful Renderer, DisplayInterface, and pipeline smoke test

Implements story 2-6: Renderer class with per-aircraft trail history
(deque capped at TRAIL_MAX_DOTS=5), NullDisplay with DEBUG logging,
WaveshareDisplay stub, and end-to-end pipeline smoke test. All 96
tests pass; ruff check and format clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Matt Edholm
2026-04-22 23:33:36 -04:00
parent 5d307c33b0
commit 25076dc1f3
6 changed files with 161 additions and 30 deletions
+11 -1
View File
@@ -1,7 +1,12 @@
from __future__ import annotations
import logging
from typing import Protocol
from PIL import Image
log = logging.getLogger(__name__)
class DisplayInterface(Protocol):
def show(self, image: Image.Image) -> None: ...
@@ -9,4 +14,9 @@ class DisplayInterface(Protocol):
class NullDisplay:
def show(self, image: Image.Image) -> None:
pass
log.debug("NullDisplay.show: %dx%d", image.width, image.height)
class WaveshareDisplay:
def show(self, image: Image.Image) -> None:
raise NotImplementedError