* fix: Use plugin.modes instead of manifest.json for available modes - Display controller now checks plugin_instance.modes first before falling back to manifest - This allows plugins to dynamically provide modes based on enabled leagues - Fixes issue where disabled leagues (WNBA, NCAAW) appeared in available modes - Plugins can now control their available modes at runtime based on config * fix: Handle permission errors when removing plugin directories - Added _safe_remove_directory() method to handle permission errors gracefully - Fixes permissions on __pycache__ directories before removal - Updates uninstall_plugin() and install methods to use safe removal - Resolves [Errno 13] Permission denied errors during plugin install/uninstall * debug(display): Change FPS check logging from debug to info level - Change FPS check log from DEBUG to INFO to help diagnose scrolling FPS issues - Add active_mode to log message for clarity - Helps identify if plugins are being detected for high-FPS mode * debug(display): Add logging for display_interval in both FPS loops - Log display_interval when entering high-FPS and normal loops - Shows expected FPS for high-FPS mode - Helps diagnose why news ticker shows 50 FPS despite high-FPS detection * feat: Update soccer-scoreboard submodule with scroll display support - Submodule now includes full feature parity with football-scoreboard - Granular display modes for 8 leagues (24 total modes) - Scroll display mode with game_renderer.py and scroll_display.py - League registry system with enabled state filtering - Modernized config_schema.json with per-league scroll settings - League-aware logo caching to prevent collisions - Pillow 8.x compatibility for image resampling Submodule branch: feature/football-feature-parity Commit: e22a16d * style(web): Update plugin button colors and reorganize documentation - Change update button color to yellow-600 in installed plugins section to match plugin config page - Change refresh plugins button color to blue-600 to match restart display button - Move DEVELOPMENT.md and MIGRATION_GUIDE.md from root to docs/ directory - Remove IMPACT_EXPLANATION.md and MERGE_CONFLICT_RESOLUTION_PLAN.md --------- Co-authored-by: Chuck <chuck@example.com>
5.0 KiB
Development Guide
This guide provides information for developers and contributors working on the LEDMatrix project.
Git Submodules
rpi-rgb-led-matrix-master Submodule
The rpi-rgb-led-matrix-master submodule is a foundational dependency located at the repository root (not in plugins/). This submodule provides the core hardware abstraction layer for controlling RGB LED matrices via the Raspberry Pi GPIO pins.
Architectural Rationale
Why at the root?
- Core Dependency: Unlike plugins in the
plugins/directory,rpi-rgb-led-matrix-masteris a foundational library required by the core LEDMatrix system, not an optional plugin - System-Level Integration: The
rgbmatrixPython module (built from this submodule) is imported bysrc/display_manager.py, which is part of the core display system - Build Requirements: The submodule must be compiled to create the
rgbmatrixPython bindings before the system can run - Separation of Concerns: Keeping core dependencies at the root level separates them from user-installable plugins, maintaining a clear architectural distinction
Why not in plugins/?
- Plugins are optional, user-installable modules that depend on the core system
rpi-rgb-led-matrix-masteris a required build dependency, not an optional plugin- The core system cannot function without this dependency
Initializing the Submodule
When cloning the repository, you must initialize the submodule:
First-time clone (recommended):
git clone --recurse-submodules https://github.com/ChuckBuilds/LEDMatrix.git
cd LEDMatrix
If you already cloned without submodules:
git submodule update --init --recursive
To initialize only the rpi-rgb-led-matrix-master submodule:
git submodule update --init --recursive rpi-rgb-led-matrix-master
Building the Submodule
After initializing the submodule, you need to build the Python bindings:
cd rpi-rgb-led-matrix-master
make build-python
cd bindings/python
python3 -m pip install --break-system-packages .
Note: The first_time_install.sh script automates this process during installation.
Troubleshooting
Submodule appears empty:
If the rpi-rgb-led-matrix-master directory exists but is empty or lacks a Makefile:
# Remove the empty directory
rm -rf rpi-rgb-led-matrix-master
# Re-initialize the submodule
git submodule update --init --recursive rpi-rgb-led-matrix-master
Build fails: Ensure you have the required build dependencies installed:
sudo apt install -y build-essential python3-dev cython3 scons
Import error for rgbmatrix module:
- Verify the submodule is initialized:
ls rpi-rgb-led-matrix-master/Makefile - Ensure the Python bindings are built and installed (see "Building the Submodule" above)
- Check that the module is installed:
python3 -c "from rgbmatrix import RGBMatrix; print('OK')"
Submodule out of sync: If the submodule commit doesn't match what the main repository expects:
git submodule update --remote rpi-rgb-led-matrix-master
CI/CD Configuration
When setting up CI/CD pipelines, ensure submodules are initialized before building:
GitHub Actions Example:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: recursive
- name: Build rpi-rgb-led-matrix
run: |
cd rpi-rgb-led-matrix-master
make build-python
cd bindings/python
pip install .
GitLab CI Example:
variables:
GIT_SUBMODULE_STRATEGY: recursive
build:
script:
- cd rpi-rgb-led-matrix-master
- make build-python
- cd bindings/python
- pip install .
Jenkins Example:
stage('Checkout') {
checkout([
$class: 'GitSCM',
branches: [[name: '*/main']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'SubmoduleOption',
disableSubmodules: false,
parentCredentials: true,
recursiveSubmodules: true,
reference: '',
trackingSubmodules: false]],
userRemoteConfigs: [[url: 'https://github.com/ChuckBuilds/LEDMatrix.git']]
])
}
General CI/CD Checklist:
- ✓ Use
--recurse-submodulesflag when cloning (or equivalent in your CI system) - ✓ Initialize submodules before any build steps
- ✓ Build the Python bindings if your tests require the
rgbmatrixmodule - ✓ Note: Emulator mode (using
RGBMatrixEmulator) doesn't require the submodule to be built
Plugin Submodules
Plugin submodules are located in the plugins/ directory and are managed similarly:
Initialize all plugin submodules:
git submodule update --init --recursive plugins/
Initialize a specific plugin:
git submodule update --init --recursive plugins/hockey-scoreboard
For more information about plugins, see the Plugin Development Guide and Plugin Architecture Specification.