25076dc1f3
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>
23 lines
474 B
Python
23 lines
474 B
Python
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: ...
|
|
|
|
|
|
class NullDisplay:
|
|
def show(self, image: Image.Image) -> None:
|
|
log.debug("NullDisplay.show: %dx%d", image.width, image.height)
|
|
|
|
|
|
class WaveshareDisplay:
|
|
def show(self, image: Image.Image) -> None:
|
|
raise NotImplementedError
|