Releases: b0x42/E-Paper-Emulator
v1.6.0
What's New
16 New Display Models (21 → 37 total)
Added support for the following Waveshare e-paper displays:
| Model | Resolution | Notes |
|---|---|---|
epd1in02 |
128×80 | |
epd1in54b |
200×200 | red/black/white |
epd1in54c |
152×152 | yellow/black/white |
epd2in9b |
128×296 | red/black/white |
epd4in2b |
400×300 | red/black/white |
epd4in26 |
800×480 | |
epd5in79 |
792×272 | |
epd5in79b |
792×272 | red/black/white |
epd7in3f |
800×480 | 7-color ACeP |
epd7in5b |
800×480 | red/black/white |
epd7in5hd |
880×528 | HD variant |
epd7in8 |
1872×1404 | |
epd10in2g |
960×640 | ACEP color |
epd13in3 |
1600×1200 | |
epd13in3b |
960×680 | red/black/white |
epd13in3k |
960×680 |
Bug Fixes
- Fixed incorrect resolutions in README for
epd2in66,epd3in52, andepd6in2
v1.5.0
A drop-in pure-Python emulator for Waveshare e-paper displays, enabling development and testing without physical hardware.
Features
-
Flask web display mode — View your e-paper output in any browser with auto-refreshing frames. Enables remote development and headless environments (CI, SSH, containers) where a native GUI isn't available.
-
Tkinter GUI display mode — Native desktop window for real-time e-paper visualization. Gives instant visual feedback during local development without needing a browser.
-
21 pre-configured Waveshare display models — JSON-based configs for models from 1.54" to 12.48", including multi-color variants (B/C, D). Eliminates manual resolution/color lookup and lets you switch models with a single parameter.
-
batch()context manager — Groups multiple drawing operations into a single display update. Reduces unnecessary redraws and improves performance when composing complex layouts. -
Display border in Flask view (PR #2) — Adds a visible border around the e-paper image in the browser. Makes it easy to see the exact display boundaries, especially on white backgrounds.
-
Configurable Flask port — Set the web server port instead of being locked to the default. Avoids conflicts when running multiple emulator instances or alongside other local services.
-
In-memory frame serving — Flask serves display frames from a memory buffer instead of writing to disk. Eliminates disk I/O overhead and avoids file permission issues in restricted environments.
-
Lazy GUI imports — Tkinter, Flask, and webbrowser are imported only when needed. Allows the package to install and tests to run cleanly in headless environments without GUI dependencies.
-
Comprehensive test suite — Unit tests covering EPD initialization, drawing operations, config loading, Flask routes, and buffer output. Catches regressions early and documents expected behavior.
-
CI/CD workflows — Automated testing, linting, and release publishing via GitHub Actions. Ensures every PR is validated and releases are built consistently.
-
Python 3.14 compatibility — Updated dependencies (Pillow >= 10.0.0, Flask >= 3.0.0) and removed invalid tk pip package. Keeps the project working on the latest Python releases.
-
GitHub issue templates & contribution guidelines — Structured templates for bug reports, feature requests, and AI/LLM usage. Lowers the barrier for contributors and keeps issues actionable.
Fixes
-
Thread safety race condition in Flask mode (PR #3) —
image_bytesis now initialized before the Flask server starts, and athreading.Lockprotects shared state from concurrent access. PreventsAttributeErrorcrashes on early browser requests. -
Clear()ignoring color parameter —Clear()always filled with white regardless of the color argument. Now correctly uses the caller's specified color. -
Update interval timing mismatch — The interval was stored ambiguously, causing incorrect refresh rates. Now stored in seconds and converted to milliseconds at each call site (Tkinter
after()and FlasksetInterval). -
Flask daemon thread cleanup — The Flask server thread is now set as a daemon, so the process exits cleanly when the main thread finishes instead of hanging indefinitely.
-
Browser opens before server is ready — Deferred
webbrowser.open()until the Flask server is actually listening. Eliminates the connection-refused error on startup. -
CI installing from missing requirements.txt — Switched to
pip installfrompyproject.toml, fixing broken CI pipelines. -
Flake8 lint errors — Cleaned up trailing whitespace, extra blank lines, long lines, and unused variables across the codebase.