IS-Matrix-Forge 1.0.0.dev27__tar.gz → 1.0.0.dev30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/LICENSE.md +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/PKG-INFO +75 -40
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/README.md +108 -76
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/__init__.py +19 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/font_map/base.py +2 -2
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/common/dirs.py +27 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/helpers/github_api.py +1 -1
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/common/preset_config.py +332 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/designer_gui/main_window/streamlit_app.py +304 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/dev_tools/debug.py +4 -4
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/dev_tools/presets.py +1 -1
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/inputmodule/__init__.py +24 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/inputmodule/b1display.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/inputmodule/c1minimal.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/inputmodule/ledmatrix.py +9 -144
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/install_presets/arguments.py +2 -2
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/install_presets/main.py +92 -5
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/__init__.py +752 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/__init__.py +213 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/__init__.py +49 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/bootloader.py +22 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/controller_info.py +28 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/display_text.py +12 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/identify_matrices.py +5 -2
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/install_presets.py +50 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/scroll_text.py +65 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/scroll_until.py +45 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/set_presets_dir.py +25 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/show_presets_dir.py +15 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/ticket_info.py +46 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/Scripts/led_matrix/support.py +450 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/__init__.py +49 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/commands/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/commands/map.py +1 -1
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/console.py +76 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/constants.py +11 -3
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/base.py +33 -2
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/animation.py +41 -5
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/breather.py +20 -20
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/controller/components/brightness/helpers/percent.py +104 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/manager.py +249 -126
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/drawing.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/example_template.py +45 -45
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/controller/components/game.py +298 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/controller/components/history/__init__.py +1 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/controller/components/history/event.py +24 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/controller/components/history/manager.py +206 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/controller.py +83 -71
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/controller/errors.py +68 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/controller/helpers/__init__.py +127 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/helpers/threading.py +9 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/threaded.py +2 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/animation.py +248 -176
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/audio_visualizer.py +6 -3
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/effects/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/font/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/text_scroller.py +7 -6
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/effects/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/effects/breather.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/effects/scroller/helpers.py +11 -25
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/base.py +54 -25
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/display/grid/composite/__init__.py +15 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/display/grid/composite/base.py +120 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/display/grid/composite/helpers.py +41 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/display/grid/composite/utils.py +297 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/presets/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/presets/manifest.py +5 -3
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/helpers/columns.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/patterns/built_in/__init__.py +6 -5
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/__init__.py +12 -4
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/res.py +13 -8
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/text/scroller.py +1 -1
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/hardware.py +2 -2
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/helpers/location.py +125 -0
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/led_matrix/utils/__init__.py +118 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/log_engine.py +7 -7
- is_matrix_forge-1.0.0.dev30/is_matrix_forge/version.py +48 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/pyproject.toml +4 -5
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/Untitled.ipynb +0 -109
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/__init__.py +0 -1
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/common/dirs.py +0 -20
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/designer_gui/main_window/streamlit_app.py +0 -93
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/inputmodule/__init__.py +0 -164
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/Scripts/battery_monitor.py +0 -156
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/Scripts/led_matrix/__init__.py +0 -210
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/__init__.py +0 -108
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/__init__.py +0 -17
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/Scripts/led_matrix/arguments/commands/scroll_text.py +0 -35
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/__init__.py +0 -96
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/controller/components/brightness/helpers/percent.py +0 -25
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/controller/helpers/__init__.py +0 -67
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/display/animations.zip +0 -0
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/display/grid/composite/__init__.py +0 -13
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/is_matrix_forge.led_matrix.display.zip +0 -0
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/led_matrix/utils/__init__.py +0 -41
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/__init__.py +0 -68
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/errors.py +0 -35
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/events.py +0 -78
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/errors.py +0 -35
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/event/__init__.py +0 -8
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/event/collection.py +0 -153
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/event/errors.py +0 -58
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/event/event.py +0 -226
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/layout/__init__.py +0 -8
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/layout/base.py +0 -147
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/metaclasses/__init__.py +0 -20
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/windows/base.py +0 -325
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/windows/main/__init__.py +0 -77
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/windows/main/layout.py +0 -21
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/helpers.py +0 -55
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/monitor.py +0 -432
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/notify/__init__.py +0 -0
- is_matrix_forge-1.0.0.dev27/is_matrix_forge/scripts/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/audio/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/audio/files/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/audio/files/plugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/audio/files/unplugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/char_map.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/digit_map.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/font_map/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/font_map/builders.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/font_map/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/font_map/models/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/font_map/models/glyph.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/decorators/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/decorators/freeze_setter.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/helpers/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/logging/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/common/logging/log_exceptions.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/designer_gui/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/designer_gui/main_window/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/designer_gui/main_window/layout/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/designer_gui/main_window/layout/button_grid/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/designer_gui/main_window/layout/button_grid/column.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/designer_gui/main_window/layout/button_grid/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/designer_gui/main_window/layout/menu_bar.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/dev_tools/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/inputmodule/font.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/inputmodule/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/identify_matrices.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/install_presets/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/led_matrix/guards.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/Scripts/pixel_grid.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/helpers/breather_killer.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/helpers/easing.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/helpers/fade_planner.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/helpers/fade_spec.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/helpers/levels.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/brightness/helpers/safe_ops.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/identify.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/components/keep_alive.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/legacy.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/controller/multiton.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/font/font.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/font/map_builder.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/frame/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/frame/base.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/frame/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/keep_awake.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/plugged.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/text/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/animations/text/glyph_normalizer.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/assets/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/assets/fonts.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/effects/fade.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/effects/scroller/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/effects/scroller/base.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/composite/background.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/composite/composite.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/composite/foreground.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/grid/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/media.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/scene/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/scene/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/scene/scene.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/text/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/display/text/text.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/errors/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/errors/base.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/errors/composite_grid.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/errors/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/errors/matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/errors/misc.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/helpers/device/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/helpers/device/bootloader/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/helpers/device/bootloader/constants.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/helpers/device/bootloader/unix.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/helpers/device/bootloader/win.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/helpers/status_handler.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/status.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/tools/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/led_matrix/tools/identify.py +0 -0
- {is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui → is_matrix_forge-1.0.0.dev30/is_matrix_forge/notify}/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/notify/sounds/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/notify/sounds/base.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/progress.py +0 -0
- {is_matrix_forge-1.0.0.dev27/is_matrix_forge/monitor/gui/windows → is_matrix_forge-1.0.0.dev30/is_matrix_forge/scripts}/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/scripts/led-matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/scripts/preset_installer.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/serial_com/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/serial_com/base/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/serial_com/base/answer.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/serial_com/base/message.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/serial_com/base/request.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/serial_com/exchange.py +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/blank.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/manifest.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/shock_face.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/test1.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/test2.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/test3.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/test4.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/test5.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/test6.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/test7.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/x_animation II.json +0 -0
- {is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/presets/x_animation.json +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Copyright (c) 2025 Inspyre-Softworks
|
|
2
2
|
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
-
of this software (
|
|
4
|
+
of this software (IS-Matrix-Forge) and associated documentation files (the "Software"), to deal
|
|
5
5
|
in the Software without restriction, including without limitation the rights
|
|
6
6
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
7
|
copies of the Software, and to permit persons to whom the Software is
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: IS-Matrix-Forge
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev30
|
|
4
4
|
Summary:
|
|
5
5
|
License: MIT
|
|
6
|
+
License-File: LICENSE.md
|
|
6
7
|
Keywords: led,matrix,framework,hardware
|
|
7
8
|
Author: Taylor B.
|
|
8
9
|
Author-email: t.blackstone@inspyre.tech
|
|
@@ -11,6 +12,7 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
11
12
|
Classifier: Programming Language :: Python :: 3
|
|
12
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
14
16
|
Provides-Extra: clipboard-support
|
|
15
17
|
Requires-Dist: aliaser (>=1.0.0.dev4,<2.0.0)
|
|
16
18
|
Requires-Dist: chime (>=0.7.0,<0.8.0)
|
|
@@ -22,12 +24,13 @@ Requires-Dist: inspyre-toolbox (>=1.6.0.dev23)
|
|
|
22
24
|
Requires-Dist: ipywidgets (==8.1.7)
|
|
23
25
|
Requires-Dist: notebook (>=7.4.4,<8.0.0)
|
|
24
26
|
Requires-Dist: opencv-python (>=4.11.0.86,<5.0.0.0)
|
|
25
|
-
Requires-Dist: pillow (>=
|
|
26
|
-
Requires-Dist:
|
|
27
|
+
Requires-Dist: pillow (>=12.0.0,<13.0.0)
|
|
28
|
+
Requires-Dist: platformdirs (>=4.5.0,<5.0.0)
|
|
27
29
|
Requires-Dist: pyserial (>=3.5,<4.0)
|
|
28
30
|
Requires-Dist: pysimplegui-4-foss (==4.60.4.1)
|
|
29
31
|
Requires-Dist: pysimpleguiweb (==0.39.0)
|
|
30
32
|
Requires-Dist: requests (>=2.32.4,<3.0.0)
|
|
33
|
+
Requires-Dist: rich (>=13.9.4,<15)
|
|
31
34
|
Requires-Dist: wmi (>=1.5.1,<2.0.0) ; sys_platform == "win32"
|
|
32
35
|
Project-URL: Homepage, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
|
|
33
36
|
Project-URL: Repository, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
|
|
@@ -41,22 +44,32 @@ Description-Content-Type: text/markdown
|
|
|
41
44
|
|
|
42
45
|
**IS Matrix Forge** is a Python framework for creating applications that drive
|
|
43
46
|
9×34 LED matrix displays. It provides high level helpers for talking to the
|
|
44
|
-
hardware, tools for building animations, and utilities such as progress bars
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
-
|
|
47
|
+
hardware, tools for building animations, and utilities such as progress bars.
|
|
48
|
+
|
|
49
|
+
## Features
|
|
50
|
+
|
|
51
|
+
- **Hardware control** — device discovery and control over serial via
|
|
52
|
+
`pyserial`, with support for multiple connected matrices
|
|
53
|
+
- **Mixin-based controller** — `LEDMatrixController` composes device access,
|
|
54
|
+
keep-alive pings, brightness and "breather" management, device
|
|
55
|
+
identification, and command history with restore support; optional
|
|
56
|
+
`thread_safe=True` mode guards device operations behind an `RLock`
|
|
57
|
+
- **Display engine** — draw grids and patterns with the `Grid` class, build
|
|
58
|
+
frame-based `Animation`s (rewind, fast-forward, seek), and scroll text
|
|
59
|
+
horizontally or vertically with `TextScroller` and bitmap font maps
|
|
60
|
+
- **Firmware games** — launch Snake, Pong, Tetris, and Game of Life
|
|
61
|
+
(with classic start patterns like glider, blinker, and toad) on the matrix
|
|
62
|
+
- **Audio tools** — notification sounds via
|
|
63
|
+
`is_matrix_forge.notify.sounds` and an
|
|
64
|
+
optional `AudioVisualizer` in
|
|
65
|
+
`is_matrix_forge.led_matrix.display.animations.audio_visualizer` for live
|
|
66
|
+
input and audio files
|
|
67
|
+
- **Designer tools** — a PySimpleGUI desktop designer, a JSON preset system
|
|
68
|
+
with verified installs, and an optional Streamlit web-based pixel-grid
|
|
69
|
+
animation editor
|
|
70
|
+
- **Progress bars** — a `tqdm`-style helper that renders progress on the matrix
|
|
71
|
+
- **CLI** — `led-matrix` console entry point with a threaded
|
|
72
|
+
`identify-matrices` subcommand that identifies connected devices concurrently
|
|
60
73
|
|
|
61
74
|
## Hardware Requirements
|
|
62
75
|
|
|
@@ -77,10 +90,23 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
77
90
|
- inspyre-toolbox (>=1.6.0) - Utility functions
|
|
78
91
|
- pillow (>=11.2.1,<12.0.0) - Image processing
|
|
79
92
|
- opencv-python (>=4.11.0.86,<5.0.0.0) - Image processing
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
93
|
+
|
|
94
|
+
### Optional Tool Dependencies
|
|
95
|
+
|
|
96
|
+
The Streamlit editor and audio visualizer are included in the source tree but
|
|
97
|
+
their third-party dependencies are not installed by `poetry install` or
|
|
98
|
+
`pip install .`. Install only the dependencies for the tools you intend to use:
|
|
99
|
+
|
|
100
|
+
```shell
|
|
101
|
+
# Streamlit pixel-grid editor
|
|
102
|
+
pip install streamlit
|
|
103
|
+
|
|
104
|
+
# Audio visualizer (live input and audio-file playback)
|
|
105
|
+
pip install sounddevice soundfile
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
When using Poetry, run these commands after `poetry shell` so the packages are
|
|
109
|
+
installed in the project's virtual environment.
|
|
84
110
|
|
|
85
111
|
## Installation Instructions
|
|
86
112
|
|
|
@@ -136,6 +162,31 @@ ctrl = LEDMatrixController(DEVICES[0])
|
|
|
136
162
|
ctrl.scroll_text("Hello World!", loop=False)
|
|
137
163
|
```
|
|
138
164
|
|
|
165
|
+
### Navigate an Animation
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
from is_matrix_forge.led_matrix.display.animations.animation import Animation
|
|
169
|
+
from is_matrix_forge.led_matrix.display.animations.frame.base import Frame
|
|
170
|
+
|
|
171
|
+
animation = Animation(
|
|
172
|
+
frame_data=[
|
|
173
|
+
Frame(grid=[[1]], duration=0.1, width=1, height=1),
|
|
174
|
+
Frame(grid=[[0]], duration=0.1, width=1, height=1),
|
|
175
|
+
Frame(grid=[[1]], duration=0.1, width=1, height=1),
|
|
176
|
+
]
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
animation.fast_forward() # jump all the way to the last frame
|
|
180
|
+
animation.rewind() # jump all the way back to the first frame
|
|
181
|
+
animation.fast_forward(2) # move ahead two frames from the current cursor
|
|
182
|
+
animation.rewind(1) # move back one frame from the current cursor
|
|
183
|
+
animation.seek(0) # jump to an absolute frame index
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
`Animation.rewind()` and `Animation.fast_forward()` use relative step counts.
|
|
187
|
+
Passing `0` or omitting the argument jumps to the beginning/end respectively.
|
|
188
|
+
Use `Animation.seek(index)` when you want to jump to an absolute frame index.
|
|
189
|
+
|
|
139
190
|
## Controller Architecture
|
|
140
191
|
|
|
141
192
|
- Composition is implemented via multiple mixins that all use cooperative
|
|
@@ -166,16 +217,6 @@ for _ in tqdm(range(100)):
|
|
|
166
217
|
time.sleep(0.05)
|
|
167
218
|
```
|
|
168
219
|
|
|
169
|
-
### Battery Monitor Example
|
|
170
|
-
|
|
171
|
-
```python
|
|
172
|
-
from is_matrix_forge.monitor import run_power_monitor
|
|
173
|
-
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
174
|
-
|
|
175
|
-
device = DEVICES[0]
|
|
176
|
-
run_power_monitor(device)
|
|
177
|
-
```
|
|
178
|
-
|
|
179
220
|
## Troubleshooting
|
|
180
221
|
|
|
181
222
|
### LED Matrix Not Detected
|
|
@@ -191,12 +232,6 @@ run_power_monitor(device)
|
|
|
191
232
|
2. Check that the WAV files for notifications exist in the expected locations.
|
|
192
233
|
3. Verify that the chime library is properly installed.
|
|
193
234
|
|
|
194
|
-
### Battery Status Not Updating
|
|
195
|
-
|
|
196
|
-
1. Make sure psutil is properly installed.
|
|
197
|
-
2. Check that your system supports battery status monitoring through psutil.
|
|
198
|
-
3. Try increasing the battery_check_interval to reduce CPU usage.
|
|
199
|
-
|
|
200
235
|
### Animation Issues
|
|
201
236
|
|
|
202
237
|
1. Verify that the LED matrix is functioning correctly.
|
|
@@ -6,22 +6,32 @@
|
|
|
6
6
|
|
|
7
7
|
**IS Matrix Forge** is a Python framework for creating applications that drive
|
|
8
8
|
9×34 LED matrix displays. It provides high level helpers for talking to the
|
|
9
|
-
hardware, tools for building animations, and utilities such as progress bars
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
-
|
|
9
|
+
hardware, tools for building animations, and utilities such as progress bars.
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Hardware control** — device discovery and control over serial via
|
|
14
|
+
`pyserial`, with support for multiple connected matrices
|
|
15
|
+
- **Mixin-based controller** — `LEDMatrixController` composes device access,
|
|
16
|
+
keep-alive pings, brightness and "breather" management, device
|
|
17
|
+
identification, and command history with restore support; optional
|
|
18
|
+
`thread_safe=True` mode guards device operations behind an `RLock`
|
|
19
|
+
- **Display engine** — draw grids and patterns with the `Grid` class, build
|
|
20
|
+
frame-based `Animation`s (rewind, fast-forward, seek), and scroll text
|
|
21
|
+
horizontally or vertically with `TextScroller` and bitmap font maps
|
|
22
|
+
- **Firmware games** — launch Snake, Pong, Tetris, and Game of Life
|
|
23
|
+
(with classic start patterns like glider, blinker, and toad) on the matrix
|
|
24
|
+
- **Audio tools** — notification sounds via
|
|
25
|
+
`is_matrix_forge.notify.sounds` and an
|
|
26
|
+
optional `AudioVisualizer` in
|
|
27
|
+
`is_matrix_forge.led_matrix.display.animations.audio_visualizer` for live
|
|
28
|
+
input and audio files
|
|
29
|
+
- **Designer tools** — a PySimpleGUI desktop designer, a JSON preset system
|
|
30
|
+
with verified installs, and an optional Streamlit web-based pixel-grid
|
|
31
|
+
animation editor
|
|
32
|
+
- **Progress bars** — a `tqdm`-style helper that renders progress on the matrix
|
|
33
|
+
- **CLI** — `led-matrix` console entry point with a threaded
|
|
34
|
+
`identify-matrices` subcommand that identifies connected devices concurrently
|
|
25
35
|
|
|
26
36
|
## Hardware Requirements
|
|
27
37
|
|
|
@@ -42,10 +52,23 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
42
52
|
- inspyre-toolbox (>=1.6.0) - Utility functions
|
|
43
53
|
- pillow (>=11.2.1,<12.0.0) - Image processing
|
|
44
54
|
- opencv-python (>=4.11.0.86,<5.0.0.0) - Image processing
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
55
|
+
|
|
56
|
+
### Optional Tool Dependencies
|
|
57
|
+
|
|
58
|
+
The Streamlit editor and audio visualizer are included in the source tree but
|
|
59
|
+
their third-party dependencies are not installed by `poetry install` or
|
|
60
|
+
`pip install .`. Install only the dependencies for the tools you intend to use:
|
|
61
|
+
|
|
62
|
+
```shell
|
|
63
|
+
# Streamlit pixel-grid editor
|
|
64
|
+
pip install streamlit
|
|
65
|
+
|
|
66
|
+
# Audio visualizer (live input and audio-file playback)
|
|
67
|
+
pip install sounddevice soundfile
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
When using Poetry, run these commands after `poetry shell` so the packages are
|
|
71
|
+
installed in the project's virtual environment.
|
|
49
72
|
|
|
50
73
|
## Installation Instructions
|
|
51
74
|
|
|
@@ -80,7 +103,7 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
80
103
|
pip install .
|
|
81
104
|
```
|
|
82
105
|
|
|
83
|
-
## Usage Examples
|
|
106
|
+
## Usage Examples
|
|
84
107
|
|
|
85
108
|
### Identify Connected Devices
|
|
86
109
|
|
|
@@ -98,28 +121,53 @@ from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
|
|
|
98
121
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
99
122
|
|
|
100
123
|
ctrl = LEDMatrixController(DEVICES[0])
|
|
101
|
-
ctrl.scroll_text("Hello World!", loop=False)
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
ctrl.scroll_text("Hello World!", loop=False)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Navigate an Animation
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
from is_matrix_forge.led_matrix.display.animations.animation import Animation
|
|
131
|
+
from is_matrix_forge.led_matrix.display.animations.frame.base import Frame
|
|
132
|
+
|
|
133
|
+
animation = Animation(
|
|
134
|
+
frame_data=[
|
|
135
|
+
Frame(grid=[[1]], duration=0.1, width=1, height=1),
|
|
136
|
+
Frame(grid=[[0]], duration=0.1, width=1, height=1),
|
|
137
|
+
Frame(grid=[[1]], duration=0.1, width=1, height=1),
|
|
138
|
+
]
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
animation.fast_forward() # jump all the way to the last frame
|
|
142
|
+
animation.rewind() # jump all the way back to the first frame
|
|
143
|
+
animation.fast_forward(2) # move ahead two frames from the current cursor
|
|
144
|
+
animation.rewind(1) # move back one frame from the current cursor
|
|
145
|
+
animation.seek(0) # jump to an absolute frame index
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
`Animation.rewind()` and `Animation.fast_forward()` use relative step counts.
|
|
149
|
+
Passing `0` or omitting the argument jumps to the beginning/end respectively.
|
|
150
|
+
Use `Animation.seek(index)` when you want to jump to an absolute frame index.
|
|
151
|
+
|
|
152
|
+
## Controller Architecture
|
|
153
|
+
|
|
154
|
+
- Composition is implemented via multiple mixins that all use cooperative
|
|
155
|
+
initialization with `super()`.
|
|
156
|
+
- MRO ordering ensures safe access patterns during `__init__`:
|
|
157
|
+
- `DeviceBase` initializes early so mixins can use `self.device`.
|
|
158
|
+
- `BrightnessManager` precedes `BreatherManager` because the breather inspects
|
|
159
|
+
brightness at init time.
|
|
160
|
+
- `BreatherManager` precedes `IdentifyManager` because `IdentifyManager` may
|
|
161
|
+
call `@synchronized` methods in `__init__` that rely on a breather pause context.
|
|
162
|
+
- `Loggable` is placed last so the cooperative chain can pass `logger=` safely.
|
|
163
|
+
- Thread safety: pass `thread_safe=True` to enable an internal `RLock` used by
|
|
164
|
+
the `@synchronized` decorator for device operations.
|
|
165
|
+
- Logging: integrates with InspyLogger when available and falls back to a simple
|
|
166
|
+
logger; the controller passes `parent_log_device` through the cooperative chain
|
|
167
|
+
and the fallback stub supports it.
|
|
168
|
+
|
|
169
|
+
MRO diagram (left → right, init order)
|
|
170
|
+
`DeviceBase → KeepAliveManager → AnimationManager → DrawingManager → BrightnessManager → BreatherManager → IdentifyManager → Loggable`
|
|
123
171
|
|
|
124
172
|
### Progress Bars
|
|
125
173
|
|
|
@@ -131,16 +179,6 @@ for _ in tqdm(range(100)):
|
|
|
131
179
|
time.sleep(0.05)
|
|
132
180
|
```
|
|
133
181
|
|
|
134
|
-
### Battery Monitor Example
|
|
135
|
-
|
|
136
|
-
```python
|
|
137
|
-
from is_matrix_forge.monitor import run_power_monitor
|
|
138
|
-
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
139
|
-
|
|
140
|
-
device = DEVICES[0]
|
|
141
|
-
run_power_monitor(device)
|
|
142
|
-
```
|
|
143
|
-
|
|
144
182
|
## Troubleshooting
|
|
145
183
|
|
|
146
184
|
### LED Matrix Not Detected
|
|
@@ -156,35 +194,29 @@ run_power_monitor(device)
|
|
|
156
194
|
2. Check that the WAV files for notifications exist in the expected locations.
|
|
157
195
|
3. Verify that the chime library is properly installed.
|
|
158
196
|
|
|
159
|
-
### Battery Status Not Updating
|
|
160
|
-
|
|
161
|
-
1. Make sure psutil is properly installed.
|
|
162
|
-
2. Check that your system supports battery status monitoring through psutil.
|
|
163
|
-
3. Try increasing the battery_check_interval to reduce CPU usage.
|
|
164
|
-
|
|
165
197
|
### Animation Issues
|
|
166
198
|
|
|
167
199
|
1. Verify that the LED matrix is functioning correctly.
|
|
168
200
|
2. Check that the matrix dimensions match the expected 9x34 size.
|
|
169
201
|
3. Try clearing the matrix and restarting the application.
|
|
170
202
|
|
|
171
|
-
## Contributing
|
|
172
|
-
|
|
173
|
-
Contributions are welcome! If you have ideas or improvements for Matrix Forge,
|
|
174
|
-
feel free to open an issue or submit a pull request.
|
|
175
|
-
|
|
176
|
-
- See docs/contributing-mixins.md for guidance on authoring new controller mixins
|
|
177
|
-
using cooperative initialization and the `@synchronized` decorator.
|
|
178
|
-
A minimal reference mixin is available at
|
|
179
|
-
`is_matrix_forge/led_matrix/controller/components/example_template.py`.
|
|
180
|
-
|
|
181
|
-
Quick checklist for a new controller mixin
|
|
182
|
-
- Create `is_matrix_forge/led_matrix/controller/components/<name>.py` with `ClassNameManager`.
|
|
183
|
-
- In `__init__(...)`, accept keyword-only args and call `super().__init__(**kwargs)`.
|
|
184
|
-
- Avoid IO-heavy work in `__init__`; use `@synchronized` for device methods.
|
|
185
|
-
- If calling synchronized methods in `__init__`, ensure MRO places you after `BreatherManager`.
|
|
186
|
-
- If adding to the main controller, place after `DeviceBase` and before `IdentifyManager`; consider dependencies.
|
|
187
|
-
- Provide docstrings, type hints, and a small usage example or test.
|
|
203
|
+
## Contributing
|
|
204
|
+
|
|
205
|
+
Contributions are welcome! If you have ideas or improvements for Matrix Forge,
|
|
206
|
+
feel free to open an issue or submit a pull request.
|
|
207
|
+
|
|
208
|
+
- See docs/contributing-mixins.md for guidance on authoring new controller mixins
|
|
209
|
+
using cooperative initialization and the `@synchronized` decorator.
|
|
210
|
+
A minimal reference mixin is available at
|
|
211
|
+
`is_matrix_forge/led_matrix/controller/components/example_template.py`.
|
|
212
|
+
|
|
213
|
+
Quick checklist for a new controller mixin
|
|
214
|
+
- Create `is_matrix_forge/led_matrix/controller/components/<name>.py` with `ClassNameManager`.
|
|
215
|
+
- In `__init__(...)`, accept keyword-only args and call `super().__init__(**kwargs)`.
|
|
216
|
+
- Avoid IO-heavy work in `__init__`; use `@synchronized` for device methods.
|
|
217
|
+
- If calling synchronized methods in `__init__`, ensure MRO places you after `BreatherManager`.
|
|
218
|
+
- If adding to the main controller, place after `DeviceBase` and before `IdentifyManager`; consider dependencies.
|
|
219
|
+
- Provide docstrings, type hints, and a small usage example or test.
|
|
188
220
|
|
|
189
221
|
## License
|
|
190
222
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Top-level package for IS Matrix Forge.
|
|
2
|
+
|
|
3
|
+
Keep package imports lightweight so submodules can be imported in isolation
|
|
4
|
+
without eagerly initializing the full controller stack.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
__all__ = ["get_controllers"]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __getattr__(name: str):
|
|
13
|
+
if name == "get_controllers":
|
|
14
|
+
from is_matrix_forge.led_matrix.controller import get_controllers
|
|
15
|
+
|
|
16
|
+
globals()["get_controllers"] = get_controllers
|
|
17
|
+
return get_controllers
|
|
18
|
+
|
|
19
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
{is_matrix_forge-1.0.0.dev27 → is_matrix_forge-1.0.0.dev30}/is_matrix_forge/assets/font_map/base.py
RENAMED
|
@@ -20,8 +20,8 @@ from dataclasses import dataclass
|
|
|
20
20
|
from typing import Any, Dict, Iterable, Optional, Tuple, Callable
|
|
21
21
|
|
|
22
22
|
from inspyre_toolbox.syntactic_sweets.classes import validate_type
|
|
23
|
-
from .models.glyph import Glyph
|
|
24
|
-
from .helpers import load_builtin_char_map, get_ignore_case, has_key_ignore_case
|
|
23
|
+
from is_matrix_forge.assets.font_map.models.glyph import Glyph
|
|
24
|
+
from is_matrix_forge.assets.font_map.helpers import load_builtin_char_map, get_ignore_case, has_key_ignore_case
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
@dataclass(init=False, slots=True)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Directory configuration for the IS-Matrix-Forge application.
|
|
3
|
+
|
|
4
|
+
This module provides platform-specific directory paths for storing application
|
|
5
|
+
data, configuration files, and other resources using the platformdirs library.
|
|
6
|
+
|
|
7
|
+
``PRESETS_DIR`` is derived from :class:`~is_matrix_forge.common.preset_config.PresetConfig`
|
|
8
|
+
so that any user-configured preset location is always honoured.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from platformdirs import PlatformDirs
|
|
12
|
+
|
|
13
|
+
from is_matrix_forge.common.preset_config import get_preset_config
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
APP_DIRS = PlatformDirs('IS-Matrix-Forge', appauthor='Inspyre Softworks')
|
|
17
|
+
APP_DIR = APP_DIRS.user_data_path
|
|
18
|
+
|
|
19
|
+
# Read the user-configured preset directory; falls back to APP_DIR/presets.
|
|
20
|
+
PRESETS_DIR = get_preset_config().presets_dir
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
'APP_DIRS',
|
|
25
|
+
'APP_DIR',
|
|
26
|
+
'PRESETS_DIR',
|
|
27
|
+
]
|