IS-Matrix-Forge 1.0.0.dev4__tar.gz → 1.0.0.dev5__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.dev4 → is_matrix_forge-1.0.0.dev5}/PKG-INFO +48 -52
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/README.md +42 -52
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/designer_gui/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/designer_gui/main_window/__init__.py +11 -3
- is_matrix_forge-1.0.0.dev4/is_matrix_forge/designer_gui/main_window/layout.py → is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/__init__.py +2 -6
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid/column.py +17 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid/grid.py +15 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/streamlit_app.py +93 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/ledmatrix.py +0 -16
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/Scripts/__init__.py +4 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/Scripts/identify_matrices.py +228 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/__init__.py +58 -0
- {is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/helpers/core → is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/commands}/__init__.py +3 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/__init__.py +2 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/controller.py +66 -19
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/animation.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/effects/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/font/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/breather.py +12 -28
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/presets/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/helpers/__init__.py +8 -27
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/media.py +1 -2
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/res.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/text/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/text/scroller.py +22 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/hardware.py +271 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/__init__.py +3 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/helpers/core/__init__.py +17 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/tools/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/utils/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/layout/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/main/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/monitor.py +3 -3
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/notify/__init__.py +0 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/scripts/__init__.py +1 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/scripts/preset_installer.py +184 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/__init__.py +1 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/__init__.py +18 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/answer.py +12 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/message.py +13 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/request.py +8 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/exchange.py +47 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/pyproject.toml +17 -17
- is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/Scripts/__init__.py +0 -4
- is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/__init__.py +0 -7
- is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/commands/__init__.py +0 -84
- is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/display/patterns/utils.py +0 -2
- is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/hardware.py +0 -134
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/LICENSE.md +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/plugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/unplugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/char_map.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/font_map.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/decorators/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/dirs.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/helpers/github_api.py +0 -0
- {is_matrix_forge-1.0.0.dev4/is_matrix_forge/monitor/gui → is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid}/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/debug.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/presets.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/b1display.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/c1minimal.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/font.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/battery_monitor.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/install_presets/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/install_presets/arguments.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/install_presets/main.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/commands/map.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/constants.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/helpers/threading.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/multiton.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/threaded.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/font/font.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/font/map_builder.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/base.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/keep_awake.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/plugged.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/text_scroller.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/fade.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/scroller/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/scroller/base.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/scroller/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/presets/manifest.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/helpers/columns.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/patterns/built_in/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/base.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/misc.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/fonts.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/core/lazy_mod_load.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/device.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/status_handler.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/stream/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/stream/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/led_matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/status.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/tools/identify.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/log_engine.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/events.py +0 -0
- {is_matrix_forge-1.0.0.dev4/is_matrix_forge/monitor/gui/windows → is_matrix_forge-1.0.0.dev5/is_matrix_forge/monitor/gui}/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/collection.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/event.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/layout/base.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/metaclasses/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4/is_matrix_forge/notify → is_matrix_forge-1.0.0.dev5/is_matrix_forge/monitor/gui/windows}/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/base.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/main/layout.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/notify/sounds/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/notify/sounds/base.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/progress.py +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/blank.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/manifest.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/shock_face.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/test1.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/test2.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/test3.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/test4.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/test5.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/test6.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/test7.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/x_animation II.json +0 -0
- {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/presets/x_animation.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: IS-Matrix-Forge
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev5
|
|
4
4
|
Summary:
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: led,matrix,framework,hardware
|
|
@@ -15,31 +15,42 @@ Provides-Extra: clipboard-support
|
|
|
15
15
|
Requires-Dist: chime (>=0.7.0,<0.8.0)
|
|
16
16
|
Requires-Dist: clipboard (>=0.0.4,<0.0.5) ; extra == "clipboard-support"
|
|
17
17
|
Requires-Dist: easy-exit-calls (>=1.0.0.dev1,<2.0.0)
|
|
18
|
+
Requires-Dist: imapclient (==3.0.1)
|
|
18
19
|
Requires-Dist: inspy-logger (>=3.2.3,<4.0.0)
|
|
19
20
|
Requires-Dist: inspyre-toolbox (>=1.6.0.dev23)
|
|
20
21
|
Requires-Dist: opencv-python (>=4.11.0.86,<5.0.0.0)
|
|
21
22
|
Requires-Dist: pillow (>=11.2.1,<12.0.0)
|
|
22
23
|
Requires-Dist: pyserial (>=3.5,<4.0)
|
|
24
|
+
Requires-Dist: pysimplegui-4-foss (==4.60.4.1)
|
|
25
|
+
Requires-Dist: pysimpleguiweb (==0.39.0)
|
|
26
|
+
Project-URL: Homepage, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
|
|
27
|
+
Project-URL: Repository, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
|
|
23
28
|
Description-Content-Type: text/markdown
|
|
24
29
|
|
|
25
30
|
[](https://pypi.org/project/IS-Matrix-Forge)
|
|
26
31
|

|
|
27
32
|
|
|
28
33
|
|
|
29
|
-
#
|
|
34
|
+
# IS Matrix Forge
|
|
30
35
|
|
|
31
|
-
|
|
36
|
+
**IS Matrix Forge** is a Python framework for creating applications that drive
|
|
37
|
+
9×34 LED matrix displays. It provides high level helpers for talking to the
|
|
38
|
+
hardware, tools for building animations, and utilities such as progress bars and
|
|
39
|
+
a battery monitor.
|
|
32
40
|
|
|
33
|
-
## Project
|
|
41
|
+
## Project Overview
|
|
34
42
|
|
|
35
|
-
|
|
43
|
+
Matrix Forge grew out of the LED Matrix Battery Monitor project. The goal is to
|
|
44
|
+
make it easy to create rich LED matrix experiences from Python. In addition to
|
|
45
|
+
monitoring the battery, you can design custom frames, display scrolling text,
|
|
46
|
+
run animations, and integrate the LED matrix with your own applications.
|
|
36
47
|
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
48
|
+
Highlighted features include:
|
|
49
|
+
- Device discovery and control via `pyserial`
|
|
50
|
+
- Drawing grids and patterns with the `Grid` class
|
|
51
|
+
- Built-in and custom animations
|
|
52
|
+
- Progress bars that render on the matrix
|
|
53
|
+
- A battery monitor example using these building blocks
|
|
43
54
|
|
|
44
55
|
## Hardware Requirements
|
|
45
56
|
|
|
@@ -71,8 +82,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
71
82
|
|
|
72
83
|
1. Clone the repository:
|
|
73
84
|
```
|
|
74
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
75
|
-
cd
|
|
85
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
86
|
+
cd IS-Matrix-Forge
|
|
76
87
|
```
|
|
77
88
|
|
|
78
89
|
2. Install dependencies using Poetry:
|
|
@@ -89,8 +100,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
89
100
|
|
|
90
101
|
1. Clone the repository:
|
|
91
102
|
```
|
|
92
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
93
|
-
cd
|
|
103
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
104
|
+
cd IS-Matrix-Forge
|
|
94
105
|
```
|
|
95
106
|
|
|
96
107
|
2. Install the package:
|
|
@@ -100,60 +111,43 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
100
111
|
|
|
101
112
|
## Usage Examples
|
|
102
113
|
|
|
103
|
-
###
|
|
104
|
-
|
|
105
|
-
To start monitoring your battery with default settings:
|
|
114
|
+
### Identify Connected Devices
|
|
106
115
|
|
|
107
116
|
```python
|
|
108
|
-
from is_matrix_forge.monitor import run_power_monitor
|
|
109
117
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
110
118
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
# Start monitoring with default settings
|
|
115
|
-
run_power_monitor(device)
|
|
119
|
+
for dev in DEVICES:
|
|
120
|
+
print(dev)
|
|
116
121
|
```
|
|
117
122
|
|
|
118
|
-
###
|
|
119
|
-
|
|
120
|
-
To customize the monitoring behavior:
|
|
123
|
+
### Display Text on the Matrix
|
|
121
124
|
|
|
122
125
|
```python
|
|
123
|
-
from is_matrix_forge.
|
|
126
|
+
from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
|
|
124
127
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
125
|
-
from pathlib import Path
|
|
126
|
-
|
|
127
|
-
# Get the first available LED matrix device
|
|
128
|
-
device = DEVICES[0]
|
|
129
128
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
|
|
133
|
-
|
|
134
|
-
# Start monitoring with custom settings
|
|
135
|
-
run_power_monitor(
|
|
136
|
-
device,
|
|
137
|
-
battery_check_interval=10, # Check every 10 seconds
|
|
138
|
-
plugged_alert=plugged_sound,
|
|
139
|
-
unplugged_alert=unplugged_sound
|
|
140
|
-
)
|
|
129
|
+
ctrl = LEDMatrixController(DEVICES[0])
|
|
130
|
+
ctrl.scroll_text("Hello World!", loop=False)
|
|
141
131
|
```
|
|
142
132
|
|
|
143
|
-
###
|
|
133
|
+
### Progress Bars
|
|
144
134
|
|
|
145
|
-
|
|
135
|
+
```python
|
|
136
|
+
import time
|
|
137
|
+
from is_matrix_forge.progress import tqdm
|
|
138
|
+
|
|
139
|
+
for _ in tqdm(range(100)):
|
|
140
|
+
time.sleep(0.05)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Battery Monitor Example
|
|
146
144
|
|
|
147
145
|
```python
|
|
148
|
-
from is_matrix_forge.monitor import
|
|
146
|
+
from is_matrix_forge.monitor import run_power_monitor
|
|
149
147
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
150
148
|
|
|
151
|
-
# Get the first available LED matrix device
|
|
152
149
|
device = DEVICES[0]
|
|
153
|
-
|
|
154
|
-
# Start monitoring in a background thread
|
|
155
|
-
monitor = run_power_monitor_threaded(device)
|
|
156
|
-
# ``monitor`` is a :class:`threading.Thread` instance
|
|
150
|
+
run_power_monitor(device)
|
|
157
151
|
```
|
|
158
152
|
|
|
159
153
|
## Troubleshooting
|
|
@@ -185,8 +179,10 @@ monitor = run_power_monitor_threaded(device)
|
|
|
185
179
|
|
|
186
180
|
## Contributing
|
|
187
181
|
|
|
188
|
-
Contributions
|
|
182
|
+
Contributions are welcome! If you have ideas or improvements for Matrix Forge,
|
|
183
|
+
feel free to open an issue or submit a pull request.
|
|
189
184
|
|
|
190
185
|
## License
|
|
191
186
|
|
|
192
187
|
This project is licensed under the MIT License - see the LICENSE.md file for details.
|
|
188
|
+
|
|
@@ -2,20 +2,26 @@
|
|
|
2
2
|

|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# IS Matrix Forge
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**IS Matrix Forge** is a Python framework for creating applications that drive
|
|
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 and
|
|
10
|
+
a battery monitor.
|
|
8
11
|
|
|
9
|
-
## Project
|
|
12
|
+
## Project Overview
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
Matrix Forge grew out of the LED Matrix Battery Monitor project. The goal is to
|
|
15
|
+
make it easy to create rich LED matrix experiences from Python. In addition to
|
|
16
|
+
monitoring the battery, you can design custom frames, display scrolling text,
|
|
17
|
+
run animations, and integrate the LED matrix with your own applications.
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
+
Highlighted features include:
|
|
20
|
+
- Device discovery and control via `pyserial`
|
|
21
|
+
- Drawing grids and patterns with the `Grid` class
|
|
22
|
+
- Built-in and custom animations
|
|
23
|
+
- Progress bars that render on the matrix
|
|
24
|
+
- A battery monitor example using these building blocks
|
|
19
25
|
|
|
20
26
|
## Hardware Requirements
|
|
21
27
|
|
|
@@ -47,8 +53,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
47
53
|
|
|
48
54
|
1. Clone the repository:
|
|
49
55
|
```
|
|
50
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
51
|
-
cd
|
|
56
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
57
|
+
cd IS-Matrix-Forge
|
|
52
58
|
```
|
|
53
59
|
|
|
54
60
|
2. Install dependencies using Poetry:
|
|
@@ -65,8 +71,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
65
71
|
|
|
66
72
|
1. Clone the repository:
|
|
67
73
|
```
|
|
68
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
69
|
-
cd
|
|
74
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
75
|
+
cd IS-Matrix-Forge
|
|
70
76
|
```
|
|
71
77
|
|
|
72
78
|
2. Install the package:
|
|
@@ -76,60 +82,43 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
76
82
|
|
|
77
83
|
## Usage Examples
|
|
78
84
|
|
|
79
|
-
###
|
|
80
|
-
|
|
81
|
-
To start monitoring your battery with default settings:
|
|
85
|
+
### Identify Connected Devices
|
|
82
86
|
|
|
83
87
|
```python
|
|
84
|
-
from is_matrix_forge.monitor import run_power_monitor
|
|
85
88
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
# Start monitoring with default settings
|
|
91
|
-
run_power_monitor(device)
|
|
90
|
+
for dev in DEVICES:
|
|
91
|
+
print(dev)
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
-
###
|
|
95
|
-
|
|
96
|
-
To customize the monitoring behavior:
|
|
94
|
+
### Display Text on the Matrix
|
|
97
95
|
|
|
98
96
|
```python
|
|
99
|
-
from is_matrix_forge.
|
|
97
|
+
from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
|
|
100
98
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
101
|
-
from pathlib import Path
|
|
102
|
-
|
|
103
|
-
# Get the first available LED matrix device
|
|
104
|
-
device = DEVICES[0]
|
|
105
99
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
|
|
109
|
-
|
|
110
|
-
# Start monitoring with custom settings
|
|
111
|
-
run_power_monitor(
|
|
112
|
-
device,
|
|
113
|
-
battery_check_interval=10, # Check every 10 seconds
|
|
114
|
-
plugged_alert=plugged_sound,
|
|
115
|
-
unplugged_alert=unplugged_sound
|
|
116
|
-
)
|
|
100
|
+
ctrl = LEDMatrixController(DEVICES[0])
|
|
101
|
+
ctrl.scroll_text("Hello World!", loop=False)
|
|
117
102
|
```
|
|
118
103
|
|
|
119
|
-
###
|
|
104
|
+
### Progress Bars
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
import time
|
|
108
|
+
from is_matrix_forge.progress import tqdm
|
|
109
|
+
|
|
110
|
+
for _ in tqdm(range(100)):
|
|
111
|
+
time.sleep(0.05)
|
|
112
|
+
```
|
|
120
113
|
|
|
121
|
-
|
|
114
|
+
### Battery Monitor Example
|
|
122
115
|
|
|
123
116
|
```python
|
|
124
|
-
from is_matrix_forge.monitor import
|
|
117
|
+
from is_matrix_forge.monitor import run_power_monitor
|
|
125
118
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
126
119
|
|
|
127
|
-
# Get the first available LED matrix device
|
|
128
120
|
device = DEVICES[0]
|
|
129
|
-
|
|
130
|
-
# Start monitoring in a background thread
|
|
131
|
-
monitor = run_power_monitor_threaded(device)
|
|
132
|
-
# ``monitor`` is a :class:`threading.Thread` instance
|
|
121
|
+
run_power_monitor(device)
|
|
133
122
|
```
|
|
134
123
|
|
|
135
124
|
## Troubleshooting
|
|
@@ -161,8 +150,9 @@ monitor = run_power_monitor_threaded(device)
|
|
|
161
150
|
|
|
162
151
|
## Contributing
|
|
163
152
|
|
|
164
|
-
Contributions
|
|
153
|
+
Contributions are welcome! If you have ideas or improvements for Matrix Forge,
|
|
154
|
+
feel free to open an issue or submit a pull request.
|
|
165
155
|
|
|
166
156
|
## License
|
|
167
157
|
|
|
168
|
-
This project is licensed under the MIT License - see the LICENSE.md file for details.
|
|
158
|
+
This project is licensed under the MIT License - see the LICENSE.md file for details.
|
|
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
|
|
|
3
3
|
Date: 2025-04-15 09:15:25
|
|
4
4
|
LastEditors: Taylor B. tayjaybabee@gmail.com
|
|
5
5
|
LastEditTime: 2025-04-15 09:24:40
|
|
6
|
-
FilePath: is_matrix_forge/
|
|
6
|
+
FilePath: is_matrix_forge/grid.py
|
|
7
7
|
Description: 这是默认设置,可以在设置》工具》File Description中进行配置
|
|
8
8
|
"""
|
{is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/__init__.py
RENAMED
|
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
|
|
|
3
3
|
Date: 2025-04-15 09:15:37
|
|
4
4
|
LastEditors: Taylor B. tayjaybabee@gmail.com
|
|
5
5
|
LastEditTime: 2025-04-15 09:24:40
|
|
6
|
-
FilePath: is_matrix_forge/assets/
|
|
6
|
+
FilePath: is_matrix_forge/assets/grid.py
|
|
7
7
|
Description: 这是默认设置,可以在设置》工具》File Description中进行配置
|
|
8
8
|
"""
|
{is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/designer_gui/__init__.py
RENAMED
|
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
|
|
|
3
3
|
Date: 2025-04-30 16:01:10
|
|
4
4
|
LastEditors: Taylor B. tayjaybabee@gmail.com
|
|
5
5
|
LastEditTime: 2025-04-30 16:01:49
|
|
6
|
-
FilePath: is_matrix_forge/designer_gui/
|
|
6
|
+
FilePath: is_matrix_forge/designer_gui/grid.py
|
|
7
7
|
Description: 这是默认设置,可以在设置》工具》File Description中进行配置
|
|
8
8
|
"""
|
|
@@ -4,12 +4,15 @@ import PySimpleGUI as sg
|
|
|
4
4
|
import copy
|
|
5
5
|
import os
|
|
6
6
|
|
|
7
|
-
from
|
|
7
|
+
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
8
8
|
from is_matrix_forge.led_matrix.display.animations.frame.base import Frame
|
|
9
9
|
from is_matrix_forge.led_matrix.display.grid.helpers import is_valid_grid
|
|
10
10
|
from is_matrix_forge.led_matrix.display.animations.frame.helpers import is_valid_frames
|
|
11
|
-
from .layout import PixelGridLayout
|
|
12
|
-
from is_matrix_forge.led_matrix import render_matrix
|
|
11
|
+
from is_matrix_forge.designer_gui.main_window.layout import PixelGridLayout
|
|
12
|
+
from is_matrix_forge.led_matrix.display.helpers import render_matrix
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
sg.theme('DarkTeal2')
|
|
13
16
|
|
|
14
17
|
|
|
15
18
|
def _normalize(key: Any) -> str:
|
|
@@ -139,6 +142,7 @@ class PixelGrid:
|
|
|
139
142
|
def _toggle_pixel(self, key: Tuple[int, int]) -> None:
|
|
140
143
|
col, row = key
|
|
141
144
|
new = 1 - self.grid[col][row]
|
|
145
|
+
print(f'Pixel {col},{row} toggled from {self.grid[col][row]} to {new}')
|
|
142
146
|
self.grid = [[new if (c==col and r==row) else self.grid[c][r]
|
|
143
147
|
for r in range(self.height)]
|
|
144
148
|
for c in range(self.width)]
|
|
@@ -250,3 +254,7 @@ class PixelGrid:
|
|
|
250
254
|
|
|
251
255
|
def _validate(self, grid: Any) -> bool:
|
|
252
256
|
return is_valid_grid(grid, self.width, self.height)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
if __name__ == '__main__':
|
|
260
|
+
PixelGrid().run()
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import PySimpleGUI as sg
|
|
2
2
|
from typing import List, Tuple, Any
|
|
3
|
+
from is_matrix_forge.designer_gui.main_window.layout.button_grid.column import build_grid_frame
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
class PixelGridLayout:
|
|
@@ -93,12 +94,7 @@ class PixelGridLayout:
|
|
|
93
94
|
self.__button_list = value
|
|
94
95
|
|
|
95
96
|
def build(self) -> List[List[Any]]:
|
|
96
|
-
|
|
97
|
-
[sg.Button(' ', size=self.button_size, key=(col, row), pad=self.pad)
|
|
98
|
-
for col in range(self.width)]
|
|
99
|
-
for row in range(self.height)
|
|
100
|
-
]
|
|
101
|
-
grid_column = sg.Column(grid)
|
|
97
|
+
grid_column = build_grid_frame(self.width, self.height, button_size=self.button_size, pad=self.pad)
|
|
102
98
|
|
|
103
99
|
controls = [[sg.Button(btn)] for btn in self.button_list]
|
|
104
100
|
control_column = sg.Column(controls, vertical_alignment='top')
|
is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid/column.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import PySimpleGUI as sg
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def build_grid_frame(num_cols=9, num_rows=34, button_size=(2,1), pad=(1,1)):
|
|
5
|
+
"""Return a layout of 9 vertical columns (of 34 buttons each), side by side."""
|
|
6
|
+
return [
|
|
7
|
+
[
|
|
8
|
+
sg.Column(
|
|
9
|
+
[
|
|
10
|
+
[sg.Button(' ', key=(col, row), size=button_size, pad=pad)]
|
|
11
|
+
for row in range(num_rows)
|
|
12
|
+
],
|
|
13
|
+
pad=(0,0)
|
|
14
|
+
)
|
|
15
|
+
for col in range(num_cols)
|
|
16
|
+
]
|
|
17
|
+
]
|
is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid/grid.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import PySimpleGUI as sg
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def build_button_grid(num_cols, num_rows, button_size=(1, 1), pad=(1, 1)):
|
|
5
|
+
"""
|
|
6
|
+
Returns a list of `num_cols` lists, each containing `num_rows` buttons.
|
|
7
|
+
So: 9 columns of 34 rows each.
|
|
8
|
+
"""
|
|
9
|
+
return [
|
|
10
|
+
[sg.Button(' ', key=(col, row), size=button_size, pad=pad)]
|
|
11
|
+
for row in range(num_rows)
|
|
12
|
+
],
|
|
13
|
+
for col in range(num_cols)
|
|
14
|
+
]
|
|
15
|
+
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import streamlit as st
|
|
2
|
+
import json
|
|
3
|
+
import copy
|
|
4
|
+
|
|
5
|
+
class Frame:
|
|
6
|
+
def __init__(self, grid, duration=1.0):
|
|
7
|
+
self.grid = grid
|
|
8
|
+
self.duration = duration
|
|
9
|
+
|
|
10
|
+
class PixelGridWeb:
|
|
11
|
+
def __init__(self, width=9, height=34):
|
|
12
|
+
self.width = width
|
|
13
|
+
self.height = height
|
|
14
|
+
if "frames" not in st.session_state:
|
|
15
|
+
st.session_state.frames = [Frame(self._new_grid())]
|
|
16
|
+
if "current_frame" not in st.session_state:
|
|
17
|
+
st.session_state.current_frame = 0
|
|
18
|
+
|
|
19
|
+
def _new_grid(self):
|
|
20
|
+
return [[0 for _ in range(self.height)] for _ in range(self.width)]
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def frames(self):
|
|
24
|
+
return st.session_state.frames
|
|
25
|
+
|
|
26
|
+
@frames.setter
|
|
27
|
+
def frames(self, value):
|
|
28
|
+
st.session_state.frames = value
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def current_frame(self):
|
|
32
|
+
return st.session_state.current_frame
|
|
33
|
+
|
|
34
|
+
@current_frame.setter
|
|
35
|
+
def current_frame(self, value):
|
|
36
|
+
st.session_state.current_frame = value
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def grid(self):
|
|
40
|
+
return self.frames[self.current_frame].grid
|
|
41
|
+
|
|
42
|
+
def draw(self):
|
|
43
|
+
st.title("PixelGrid Animator")
|
|
44
|
+
st.write(f"Frame {self.current_frame+1}/{len(self.frames)}")
|
|
45
|
+
# Render grid
|
|
46
|
+
grid = self.grid
|
|
47
|
+
for row in range(self.height):
|
|
48
|
+
cols = st.columns(self.width)
|
|
49
|
+
for col in range(self.width):
|
|
50
|
+
key = f"pix_{col}_{row}_{self.current_frame}"
|
|
51
|
+
is_on = grid[col][row]
|
|
52
|
+
label = "🟩" if is_on else "⬛"
|
|
53
|
+
if cols[col].button(label, key=key, use_container_width=True):
|
|
54
|
+
grid[col][row] ^= 1 # Toggle
|
|
55
|
+
|
|
56
|
+
# Frame controls
|
|
57
|
+
c1, c2, c3, c4 = st.columns(4)
|
|
58
|
+
if c1.button("Prev", disabled=self.current_frame == 0):
|
|
59
|
+
self.current_frame -= 1
|
|
60
|
+
if c2.button("Next", disabled=self.current_frame == len(self.frames)-1):
|
|
61
|
+
self.current_frame += 1
|
|
62
|
+
if c3.button("Add Frame"):
|
|
63
|
+
self.frames.append(Frame(copy.deepcopy(self.grid)))
|
|
64
|
+
self.current_frame = len(self.frames) - 1
|
|
65
|
+
if c4.button("Delete Frame", disabled=len(self.frames) == 1):
|
|
66
|
+
self.frames.pop(self.current_frame)
|
|
67
|
+
self.current_frame = max(0, self.current_frame-1)
|
|
68
|
+
# Export/import
|
|
69
|
+
st.markdown("---")
|
|
70
|
+
exp1, exp2, exp3 = st.columns(3)
|
|
71
|
+
if exp1.button("Export JSON"):
|
|
72
|
+
st.download_button(
|
|
73
|
+
"Download JSON",
|
|
74
|
+
data=json.dumps([f.grid for f in self.frames]),
|
|
75
|
+
file_name="frames.json",
|
|
76
|
+
mime="application/json"
|
|
77
|
+
)
|
|
78
|
+
uploaded = exp2.file_uploader("Load JSON", type="json")
|
|
79
|
+
if uploaded:
|
|
80
|
+
data = json.load(uploaded)
|
|
81
|
+
if isinstance(data, list) and all(isinstance(frame, list) for frame in data):
|
|
82
|
+
self.frames = [Frame(copy.deepcopy(g)) for g in data]
|
|
83
|
+
self.current_frame = 0
|
|
84
|
+
# Placeholder for "Send to Matrix"
|
|
85
|
+
if exp3.button("Send to Matrix"):
|
|
86
|
+
st.info("This would send to your matrix (not implemented here)!")
|
|
87
|
+
|
|
88
|
+
def main():
|
|
89
|
+
pg = PixelGridWeb()
|
|
90
|
+
pg.draw()
|
|
91
|
+
|
|
92
|
+
if __name__ == "__main__":
|
|
93
|
+
main()
|
{is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/__init__.py
RENAMED
|
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
|
|
|
3
3
|
Date: 2025-05-05 15:02:58
|
|
4
4
|
LastEditors: Taylor B. tayjaybabee@gmail.com
|
|
5
5
|
LastEditTime: 2025-05-05 15:24:08
|
|
6
|
-
FilePath: is_matrix_forge/dev_tools/
|
|
6
|
+
FilePath: is_matrix_forge/dev_tools/grid.py
|
|
7
7
|
Description: 这是默认设置,可以在设置》工具》File Description中进行配置
|
|
8
8
|
"""
|
{is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/ledmatrix.py
RENAMED
|
@@ -40,22 +40,6 @@ PWM_FREQUENCIES = [
|
|
|
40
40
|
]
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def get_pwm_freq(dev):
|
|
44
|
-
"""Adjust the brightness scaling of the entire screen."""
|
|
45
|
-
res = send_command(dev, CommandVals.PwmFreq, with_response=True)
|
|
46
|
-
freq = int(res[0])
|
|
47
|
-
if freq == 0:
|
|
48
|
-
return 29000
|
|
49
|
-
elif freq == 1:
|
|
50
|
-
return 3600
|
|
51
|
-
elif freq == 2:
|
|
52
|
-
return 1800
|
|
53
|
-
elif freq == 3:
|
|
54
|
-
return 900
|
|
55
|
-
else:
|
|
56
|
-
return None
|
|
57
|
-
|
|
58
|
-
|
|
59
43
|
def percentage(dev, p):
|
|
60
44
|
"""Fill a percentage of the screen. Bottom to top"""
|
|
61
45
|
send_command(dev, CommandVals.Pattern, [PatternVals.Percentage, p])
|