123 lines
3.6 KiB
Markdown
123 lines
3.6 KiB
Markdown
# PRRPC — Pico Real Rich Presence
|
||
|
||
> Physical status monitor for Linux environments. Displays contextual active application information on a secondary LCD screen powered by RP2040.
|
||
|
||
**Live:** [prrpc.jrodriiguezg.link](https://prrpc.jrodriiguezg.link)
|
||
**GitHub:** [jrodriiguezg/PRRPC](https://github.com/jrodriiguezg/PRRPC)
|
||
|
||
---
|
||
|
||
## Overview
|
||
|
||
PRRPC is an open-source hardware/software project that bridges your Linux desktop with a physical secondary display. A Python service running on the host PC detects the currently active application via GNOME's accessibility API and sends that information over USB serial to an RP2040 microcontroller, which renders a graphical icon on a 1.69" IPS LCD screen.
|
||
|
||
It operates in two distinct modes:
|
||
|
||
| Version | Mode | Description |
|
||
|---|---|---|
|
||
| V1 | Auto Monitoring | Automatic active-app detection and display |
|
||
| V2 | MacroDeck | Interactive mode with browser-based emoji control |
|
||
|
||
## Architecture
|
||
|
||
```
|
||
Host PC (Linux / GNOME / Wayland)
|
||
│
|
||
│ pyatspi focus events
|
||
▼
|
||
Python Service (monitor_pc.py)
|
||
│
|
||
│ Serial (USB-C)
|
||
▼
|
||
RP2040-Zero (MicroPython)
|
||
│
|
||
│ SPI
|
||
▼
|
||
1.69" IPS LCD (ST7789, 240×280)
|
||
```
|
||
|
||
**Key property:** The serial communication model means **zero CPU polling** on the host — events are pushed only when the active window changes.
|
||
|
||
## Features
|
||
|
||
### V1 — Auto Monitoring
|
||
|
||
- GNOME window focus detection via `pyatspi`
|
||
- Event-driven serial communication (no polling, near-zero CPU impact)
|
||
- Real-time application switching reflected on the LCD
|
||
- Session time tracking per application
|
||
|
||
### V2 — MacroDeck
|
||
|
||
- Flask web server on `localhost:5000`
|
||
- Browser-accessible emoji selector UI
|
||
- Manual display override from any device on the LAN
|
||
- Multi-threaded architecture
|
||
- Optimized 100×100px RGB565 image assets
|
||
|
||
## Hardware Specifications
|
||
|
||
| Component | Specification |
|
||
|---|---|
|
||
| Microcontroller | RP2040-Zero (or compatible Raspberry Pi Pico) |
|
||
| Firmware | MicroPython |
|
||
| Display | 1.69" IPS LCD, ST7789 controller, 240×280px |
|
||
| Interface | SPI (display) + USB-C (data + power) |
|
||
| Host OS | Linux with GNOME desktop (Wayland/X11) |
|
||
| Host Language | Python + pyatspi |
|
||
|
||
## Software Requirements
|
||
|
||
- **Host:** Python 3, `pyatspi`, `pyserial`
|
||
- **V2 additionally:** `flask`
|
||
- **Microcontroller:** MicroPython with `st7789` display driver
|
||
|
||
## App Mapping (V1)
|
||
|
||
```python
|
||
# Example: Adding a new app in monitor_pc.py
|
||
APPS_MAPPING = {
|
||
"Code": "VSCODE",
|
||
"Firefox": "FIREFOX",
|
||
# Map window focus keyword to an internal ID
|
||
"Obsidian": "NOTAS"
|
||
}
|
||
```
|
||
|
||
## Web Control API (V2)
|
||
|
||
```python
|
||
# V2: Web control API snippet
|
||
@app.route('/set_emoji/<emoji_id>')
|
||
def set_emoji(emoji_id):
|
||
# Sends manual Emoji command via serial
|
||
send_to_serial(emoji_id.upper())
|
||
return {"status": "success"}
|
||
```
|
||
|
||
## Gallery
|
||
|
||
The device has been tested and demonstrated with the following applications on Fedora Linux:
|
||
- **VS Code** — Development environment detection
|
||
- **Firefox** — Web browsing session tracking
|
||
- **Terminal** — System shell activity
|
||
- **YouTube Music** — Media playback tracking
|
||
|
||
## Tested On
|
||
|
||
- **OS:** Fedora Linux (GNOME, Wayland)
|
||
- **Hardware:** RP2040-Zero + 1.69" ST7789 LCD
|
||
|
||
## Support
|
||
|
||
☕ [Support on Ko-fi](https://ko-fi.com/jrodriiguezg)
|
||
|
||
## Author
|
||
|
||
**Juan Raul Rodriguez Gil** — Built with passion for Linux & Hardware
|
||
[jrodriiguezg.link](https://jrodriiguezg.link) | [GitHub](https://github.com/jrodriiguezg) | [Instagram](https://www.instagram.com/jrodriiguezg.link/?hl=es)
|
||
|
||
---
|
||
|
||
© 2026 Juan Raul Rodriguez Gil
|