mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-08-01 08:48:05 +00:00
Discoverability: re-export the adaptive layout/image API from src.common (the blessed-helpers package plugin authors already know) — canonical paths stay src.adaptive_layout / src.adaptive_images so nothing breaks. Document it in src/common/README.md and cross-link ADAPTIVE_LAYOUT.md from the developer docs authors actually read (quick reference, API reference, advanced dev, font manager, dev preview, plugin dev guide); ADAPTIVE_LAYOUT.md gains adaptive-images, composite-layouts and preserving-user-customization sections. Compat: PluginLoader now logs one advisory warning (never raises) when a plugin's manifest declares a min LEDMatrix version newer than the running core, checking the min_ledmatrix_version / requires.* / versions[] spellings found in the wild. Guarded against stale core version numbers. src/__init__.py __version__ bumped 1.0.0 -> 3.1.0 to match the latest release tag (v3.1.0) — it had never been updated and the compat check needs a truthful number. NOTE: verify this matches the intended release numbering before the next tag. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
220 lines
6.1 KiB
Markdown
220 lines
6.1 KiB
Markdown
# Developer Quick Reference
|
|
|
|
One-page quick reference for common LEDMatrix development tasks.
|
|
|
|
## REST API Endpoints
|
|
|
|
### Most Common Endpoints
|
|
|
|
```bash
|
|
# Get installed plugins
|
|
GET /api/v3/plugins/installed
|
|
|
|
# Get plugin configuration
|
|
GET /api/v3/plugins/config?plugin_id=<plugin_id>
|
|
|
|
# Save plugin configuration
|
|
POST /api/v3/plugins/config
|
|
{"plugin_id": "my-plugin", "config": {...}}
|
|
|
|
# Start on-demand display
|
|
POST /api/v3/display/on-demand/start
|
|
{"plugin_id": "my-plugin", "duration": 30}
|
|
|
|
# Get system status
|
|
GET /api/v3/system/status
|
|
|
|
# Execute system action
|
|
POST /api/v3/system/action
|
|
{"action": "start_display"}
|
|
```
|
|
|
|
**Base URL**: `http://your-pi-ip:5000/api/v3`
|
|
|
|
See [API_REFERENCE.md](API_REFERENCE.md) for complete documentation.
|
|
|
|
## Display Manager Quick Methods
|
|
|
|
```python
|
|
# Core operations
|
|
display_manager.clear() # Clear display
|
|
display_manager.update_display() # Update physical display
|
|
|
|
# Text rendering
|
|
display_manager.draw_text("Hello", x=10, y=16, color=(255, 255, 255))
|
|
display_manager.draw_text("Centered", centered=True) # Auto-center
|
|
|
|
# Utilities
|
|
width = display_manager.get_text_width("Text", font)
|
|
height = display_manager.get_font_height(font)
|
|
|
|
# Adaptive layout (recommended for multi-size support — text and images
|
|
# that scale to any panel; see docs/ADAPTIVE_LAYOUT.md)
|
|
rows = self.layout.bounds.inset(1).split_v(3, 1, gap=1)
|
|
self.draw_fit("12:34", rows[0]) # largest crisp font that fits
|
|
self.draw_image(logo, rows[1], mode="fill_height", crop_to_ink=True)
|
|
|
|
# Weather icons
|
|
display_manager.draw_weather_icon("rain", x=10, y=10, size=16)
|
|
|
|
# Scrolling state
|
|
display_manager.set_scrolling_state(True)
|
|
display_manager.defer_update(lambda: self.update_cache(), priority=0)
|
|
```
|
|
|
|
## Cache Manager Quick Methods
|
|
|
|
```python
|
|
# Basic caching
|
|
cached = cache_manager.get("key", max_age=3600)
|
|
cache_manager.set("key", data)
|
|
cache_manager.delete("key") # alias for clear_cache(key)
|
|
|
|
# Advanced caching
|
|
data = cache_manager.get_cached_data_with_strategy("key", data_type="weather")
|
|
data = cache_manager.get_background_cached_data("key", sport_key="nhl")
|
|
|
|
# Strategy
|
|
strategy = cache_manager.get_cache_strategy("weather")
|
|
interval = cache_manager.get_sport_live_interval("nhl")
|
|
```
|
|
|
|
## Plugin Manager Quick Methods
|
|
|
|
```python
|
|
# Get plugins
|
|
plugin = plugin_manager.get_plugin("plugin-id")
|
|
all_plugins = plugin_manager.get_all_plugins()
|
|
enabled = plugin_manager.get_enabled_plugins()
|
|
|
|
# Get info
|
|
info = plugin_manager.get_plugin_info("plugin-id")
|
|
modes = plugin_manager.get_plugin_display_modes("plugin-id")
|
|
```
|
|
|
|
## BasePlugin Quick Reference
|
|
|
|
```python
|
|
class MyPlugin(BasePlugin):
|
|
def update(self):
|
|
# Fetch data (called based on update_interval)
|
|
cache_key = f"{self.plugin_id}_data"
|
|
cached = self.cache_manager.get(cache_key, max_age=3600)
|
|
if cached:
|
|
self.data = cached
|
|
return
|
|
self.data = self._fetch_from_api()
|
|
self.cache_manager.set(cache_key, self.data)
|
|
|
|
def display(self, force_clear=False):
|
|
# Render display
|
|
if force_clear:
|
|
self.display_manager.clear()
|
|
self.display_manager.draw_text("Hello", x=10, y=16)
|
|
self.display_manager.update_display()
|
|
|
|
# Optional methods
|
|
def has_live_content(self) -> bool:
|
|
return len(self.live_items) > 0
|
|
|
|
def validate_config(self) -> bool:
|
|
return "api_key" in self.config
|
|
```
|
|
|
|
## Common Patterns
|
|
|
|
### Caching Pattern
|
|
```python
|
|
def update(self):
|
|
cache_key = f"{self.plugin_id}_data"
|
|
cached = self.cache_manager.get(cache_key, max_age=3600)
|
|
if cached:
|
|
self.data = cached
|
|
return
|
|
self.data = self._fetch_from_api()
|
|
self.cache_manager.set(cache_key, self.data)
|
|
```
|
|
|
|
### Error Handling Pattern
|
|
```python
|
|
def display(self, force_clear=False):
|
|
try:
|
|
if not self.data:
|
|
self._display_no_data()
|
|
return
|
|
self._render_content()
|
|
self.display_manager.update_display()
|
|
except Exception as e:
|
|
self.logger.error(f"Display error: {e}", exc_info=True)
|
|
self._display_error()
|
|
```
|
|
|
|
### Scrolling Pattern
|
|
```python
|
|
def display(self, force_clear=False):
|
|
self.display_manager.set_scrolling_state(True)
|
|
try:
|
|
# Scroll content...
|
|
for x in range(width, -text_width, -2):
|
|
self.display_manager.clear()
|
|
self.display_manager.draw_text(text, x=x, y=16)
|
|
self.display_manager.update_display()
|
|
time.sleep(0.05)
|
|
finally:
|
|
self.display_manager.set_scrolling_state(False)
|
|
```
|
|
|
|
## Plugin Development Checklist
|
|
|
|
- [ ] Plugin inherits from `BasePlugin`
|
|
- [ ] Implements `update()` and `display()` methods
|
|
- [ ] `manifest.json` with required fields
|
|
- [ ] `config_schema.json` for web UI (recommended)
|
|
- [ ] `README.md` with documentation
|
|
- [ ] Error handling implemented
|
|
- [ ] Uses caching appropriately
|
|
- [ ] Tested on Raspberry Pi hardware
|
|
- [ ] Follows versioning best practices
|
|
|
|
## Common Errors & Solutions
|
|
|
|
| Error | Solution |
|
|
|-------|----------|
|
|
| Plugin not discovered | Check `manifest.json` exists and `id` matches directory name |
|
|
| Import errors | Check `requirements.txt` and dependencies |
|
|
| Config validation fails | Verify `config_schema.json` syntax |
|
|
| Display not updating | Call `update_display()` after drawing |
|
|
| Cache not working | Check cache directory permissions |
|
|
|
|
## File Locations
|
|
|
|
```
|
|
LEDMatrix/
|
|
├── plugins/ # Installed plugins
|
|
├── config/
|
|
│ ├── config.json # Main configuration
|
|
│ └── config_secrets.json # API keys and secrets
|
|
├── docs/ # Documentation
|
|
│ ├── API_REFERENCE.md
|
|
│ ├── PLUGIN_API_REFERENCE.md
|
|
│ └── ...
|
|
└── src/
|
|
├── display_manager.py
|
|
├── cache_manager.py
|
|
└── plugin_system/
|
|
└── base_plugin.py
|
|
```
|
|
|
|
## Quick Links
|
|
|
|
- [Complete API Reference](API_REFERENCE.md)
|
|
- [Plugin API Reference](PLUGIN_API_REFERENCE.md)
|
|
- [Plugin Development Guide](PLUGIN_DEVELOPMENT_GUIDE.md)
|
|
- [Advanced Patterns](ADVANCED_PLUGIN_DEVELOPMENT.md)
|
|
- [Configuration Guide](PLUGIN_CONFIGURATION_GUIDE.md)
|
|
|
|
---
|
|
|
|
**Tip**: Bookmark this page for quick access to common methods and patterns!
|
|
|