Skip to content

Releases: b0x42/E-Paper-Emulator

v1.6.0

03 Mar 21:01
cf503c5

Choose a tag to compare

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, and epd6in2

v1.5.0

12 Feb 14:53
7d758c7

Choose a tag to compare

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_bytes is now initialized before the Flask server starts, and a threading.Lock protects shared state from concurrent access. Prevents AttributeError crashes on early browser requests.

  • Clear() ignoring color parameterClear() 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 Flask setInterval).

  • 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 install from pyproject.toml, fixing broken CI pipelines.

  • Flake8 lint errors — Cleaned up trailing whitespace, extra blank lines, long lines, and unused variables across the codebase.