Files
LEDMatrix/docs/DEVELOPMENT.md
Chuck 2a7a318cf7 docs: refresh and correct stale documentation across repo
Walked the README and docs/ tree against current code and fixed several
real bugs and many stale references. Highlights:

User-facing
- README.md: web interface install instructions referenced
  install_web_service.sh at the repo root, but it actually lives at
  scripts/install/install_web_service.sh.
- docs/GETTING_STARTED.md: every web UI port reference said 5050, but
  the real server in web_interface/start.py:123 binds 5000. Same bug
  was duplicated in docs/TROUBLESHOOTING.md (17 occurrences). Fixed
  both.
- docs/GETTING_STARTED.md: rewrote tab-by-tab instructions. The doc
  referenced "Plugin Store", "Plugin Management", "Sports Configuration",
  "Durations", and "Font Management" tabs - none of which exist. Real
  tabs (verified in web_interface/templates/v3/base.html) are: Overview,
  General, WiFi, Schedule, Display, Config Editor, Fonts, Logs, Cache,
  Operation History, Plugin Manager (+ per-plugin tabs).
- docs/GETTING_STARTED.md: removed references to a "Test Display"
  button (doesn't exist) and "Show Now" / "Stop" plugin buttons. Real
  controls are "Run On-Demand" / "Stop On-Demand" inside each plugin's
  tab (partials/plugin_config.html:792).
- docs/TROUBLESHOOTING.md: removed dead reference to
  troubleshoot_weather.sh (doesn't exist anywhere in the repo); weather
  is now a plugin in ledmatrix-plugins.

Developer-facing
- docs/PLUGIN_API_REFERENCE.md: documented draw_image() doesn't exist
  on DisplayManager. Real plugins paste onto display_manager.image
  directly (verified in src/base_classes/{baseball,basketball,football,
  hockey}.py). Replaced with the canonical pattern.
- docs/PLUGIN_API_REFERENCE.md: documented cache_manager.delete() doesn't
  exist. Real method is clear_cache(key=None). Updated the section.
- docs/PLUGIN_API_REFERENCE.md: added 10 missing BasePlugin methods that
  the doc never mentioned: dynamic-duration hooks, live-priority hooks,
  and the full Vegas-mode interface.
- docs/PLUGIN_DEVELOPMENT_GUIDE.md: same draw_image fix.
- docs/DEVELOPMENT.md: corrected the "Plugin Submodules" section. Plugins
  are NOT git submodules - .gitmodules only contains
  rpi-rgb-led-matrix-master. Plugins are installed at runtime into the
  plugins directory configured by plugin_system.plugins_directory
  (default plugin-repos/). Both internal links in this doc were also
  broken (missing relative path adjustment).
- docs/HOW_TO_RUN_TESTS.md: removed pytest-timeout from install line
  (not in requirements.txt) and corrected the test/integration/ path
  (real integration tests are at test/web_interface/integration/).
  Replaced the fictional file structure diagram with the real one.
- docs/EMULATOR_SETUP_GUIDE.md: clone URL was a placeholder; default
  pixel_size was documented as 16 but emulator_config.json ships with 5.

Index
- docs/README.md: rewrote. Old index claimed "16-17 files after
  consolidation" but docs/ actually has 38 .md files. Four were missing
  from the index entirely (CONFIG_DEBUGGING, DEV_PREVIEW,
  PLUGIN_ERROR_HANDLING, STARLARK_APPS_GUIDE). Trimmed the navel-gazing
  consolidation/statistics sections.

Out of scope but worth flagging:
- src/plugin_system/resource_monitor.py:343 and src/common/api_helper.py:287
  call cache_manager.delete(key) but no such method exists on
  CacheManager. Both call sites would AttributeError at runtime if hit.
  Not fixed in this docs PR - either add a delete() shim or convert
  callers to clear_cache().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 20:45:19 -04:00

5.6 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-master is a foundational library required by the core LEDMatrix system, not an optional plugin
  • System-Level Integration: The rgbmatrix Python module (built from this submodule) is imported by src/display_manager.py, which is part of the core display system
  • Build Requirements: The submodule must be compiled to create the rgbmatrix Python 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-master is 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-submodules flag when cloning (or equivalent in your CI system)
  • ✓ Initialize submodules before any build steps
  • ✓ Build the Python bindings if your tests require the rgbmatrix module
  • ✓ Note: Emulator mode (using RGBMatrixEmulator) doesn't require the submodule to be built

Plugins

Plugins are not git submodules of this repository. The plugins directory (configured by plugin_system.plugins_directory in config/config.json, default plugin-repos/) is populated at install time by the plugin loader as users install plugins from the Plugin Store or from a GitHub URL via the web interface. Plugin source lives in a separate repository: ChuckBuilds/ledmatrix-plugins.

To work on a plugin locally without going through the Plugin Store, clone that repo and symlink (or copy) the plugin directory into your configured plugins directory — by default plugin-repos/<plugin-id>/. The plugin loader will pick it up on the next display restart. The directory name must match the plugin's id in manifest.json.

For more information, see: