IS-Matrix-Forge 1.0.0.dev2__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.dev2 → is_matrix_forge-1.0.0.dev5}/PKG-INFO +52 -52
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/README.md +46 -52
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/helpers/__init__.py +32 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/designer_gui/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/designer_gui/main_window/__init__.py +11 -3
- is_matrix_forge-1.0.0.dev2/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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → 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.dev2/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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/constants.py +1 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/__init__.py +2 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/controller.py +75 -17
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/__init__.py +0 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/animation.py +14 -2
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/errors.py +10 -0
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/base.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/breather.py +27 -11
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/helpers/__init__.py +7 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/helpers/columns.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/media.py +1 -2
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/patterns/built_in/__init__.py +1 -1
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +3 -0
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py +3 -0
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py → is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/res.py +39 -4
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/text/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/__init__.py +5 -1
- is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/helpers/core/__init__.py +17 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/tools/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/utils/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/layout/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/monitor.py +3 -2
- 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.dev2 → is_matrix_forge-1.0.0.dev5}/pyproject.toml +17 -17
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/Scripts/__init__.py +0 -4
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/__init__.py +0 -7
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/commands/__init__.py +0 -84
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/__init__.py +0 -59
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +0 -3
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/utils.py +0 -2
- is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/hardware.py +0 -172
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/LICENSE.md +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/plugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/unplugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/char_map.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/font_map.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/decorators/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/dirs.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/helpers/github_api.py +0 -0
- {is_matrix_forge-1.0.0.dev2/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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/debug.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/presets.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/b1display.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/c1minimal.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/font.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/battery_monitor.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → 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.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/commands/map.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/helpers/threading.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/multiton.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/threaded.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → 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.dev2 → 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.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/plugged.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/fade.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → 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.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → 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.dev2/is_matrix_forge/led_matrix/display/patterns/built_in/stencils.py → /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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/misc.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/fonts.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/device.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/status_handler.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/stream/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/stream/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/led_matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/status.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/tools/identify.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/log_engine.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/events.py +0 -0
- {is_matrix_forge-1.0.0.dev2/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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/collection.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/event.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/layout/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/metaclasses/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2/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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/main/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/main/layout.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/notify/sounds/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/notify/sounds/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/progress.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/blank.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/manifest.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/shock_face.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test1.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test2.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test3.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test4.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test5.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test6.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test7.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/x_animation II.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → 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,27 +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)
|
|
31
|
+

|
|
26
32
|
|
|
27
|
-
A Python application that displays your computer's battery status on an LED matrix display. The application monitors battery level and power state, providing visual feedback on an LED matrix and audio notifications when power is plugged or unplugged.
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
## Project Overview
|
|
42
|
+
|
|
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.
|
|
47
|
+
|
|
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
|
|
39
54
|
|
|
40
55
|
## Hardware Requirements
|
|
41
56
|
|
|
@@ -67,8 +82,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
67
82
|
|
|
68
83
|
1. Clone the repository:
|
|
69
84
|
```
|
|
70
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
71
|
-
cd
|
|
85
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
86
|
+
cd IS-Matrix-Forge
|
|
72
87
|
```
|
|
73
88
|
|
|
74
89
|
2. Install dependencies using Poetry:
|
|
@@ -85,8 +100,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
85
100
|
|
|
86
101
|
1. Clone the repository:
|
|
87
102
|
```
|
|
88
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
89
|
-
cd
|
|
103
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
104
|
+
cd IS-Matrix-Forge
|
|
90
105
|
```
|
|
91
106
|
|
|
92
107
|
2. Install the package:
|
|
@@ -96,60 +111,43 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
96
111
|
|
|
97
112
|
## Usage Examples
|
|
98
113
|
|
|
99
|
-
###
|
|
100
|
-
|
|
101
|
-
To start monitoring your battery with default settings:
|
|
114
|
+
### Identify Connected Devices
|
|
102
115
|
|
|
103
116
|
```python
|
|
104
|
-
from is_matrix_forge.monitor import run_power_monitor
|
|
105
117
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
106
118
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
# Start monitoring with default settings
|
|
111
|
-
run_power_monitor(device)
|
|
119
|
+
for dev in DEVICES:
|
|
120
|
+
print(dev)
|
|
112
121
|
```
|
|
113
122
|
|
|
114
|
-
###
|
|
115
|
-
|
|
116
|
-
To customize the monitoring behavior:
|
|
123
|
+
### Display Text on the Matrix
|
|
117
124
|
|
|
118
125
|
```python
|
|
119
|
-
from is_matrix_forge.
|
|
126
|
+
from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
|
|
120
127
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
121
|
-
from pathlib import Path
|
|
122
128
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
# Custom sound files
|
|
127
|
-
plugged_sound = Path("path/to/custom_plugged_sound.wav")
|
|
128
|
-
unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
|
|
129
|
-
|
|
130
|
-
# Start monitoring with custom settings
|
|
131
|
-
run_power_monitor(
|
|
132
|
-
device,
|
|
133
|
-
battery_check_interval=10, # Check every 10 seconds
|
|
134
|
-
plugged_alert=plugged_sound,
|
|
135
|
-
unplugged_alert=unplugged_sound
|
|
136
|
-
)
|
|
129
|
+
ctrl = LEDMatrixController(DEVICES[0])
|
|
130
|
+
ctrl.scroll_text("Hello World!", loop=False)
|
|
137
131
|
```
|
|
138
132
|
|
|
139
|
-
###
|
|
133
|
+
### Progress Bars
|
|
134
|
+
|
|
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
|
+
```
|
|
140
142
|
|
|
141
|
-
|
|
143
|
+
### Battery Monitor Example
|
|
142
144
|
|
|
143
145
|
```python
|
|
144
|
-
from is_matrix_forge.monitor import
|
|
146
|
+
from is_matrix_forge.monitor import run_power_monitor
|
|
145
147
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
146
148
|
|
|
147
|
-
# Get the first available LED matrix device
|
|
148
149
|
device = DEVICES[0]
|
|
149
|
-
|
|
150
|
-
# Start monitoring in a background thread
|
|
151
|
-
monitor = run_power_monitor_threaded(device)
|
|
152
|
-
# ``monitor`` is a :class:`threading.Thread` instance
|
|
150
|
+
run_power_monitor(device)
|
|
153
151
|
```
|
|
154
152
|
|
|
155
153
|
## Troubleshooting
|
|
@@ -181,8 +179,10 @@ monitor = run_power_monitor_threaded(device)
|
|
|
181
179
|
|
|
182
180
|
## Contributing
|
|
183
181
|
|
|
184
|
-
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.
|
|
185
184
|
|
|
186
185
|
## License
|
|
187
186
|
|
|
188
187
|
This project is licensed under the MIT License - see the LICENSE.md file for details.
|
|
188
|
+
|
|
@@ -1,17 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
[](https://pypi.org/project/IS-Matrix-Forge)
|
|
2
|
+

|
|
2
3
|
|
|
3
|
-
A Python application that displays your computer's battery status on an LED matrix display. The application monitors battery level and power state, providing visual feedback on an LED matrix and audio notifications when power is plugged or unplugged.
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
## Project Overview
|
|
13
|
+
|
|
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.
|
|
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
|
|
15
25
|
|
|
16
26
|
## Hardware Requirements
|
|
17
27
|
|
|
@@ -43,8 +53,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
43
53
|
|
|
44
54
|
1. Clone the repository:
|
|
45
55
|
```
|
|
46
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
47
|
-
cd
|
|
56
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
57
|
+
cd IS-Matrix-Forge
|
|
48
58
|
```
|
|
49
59
|
|
|
50
60
|
2. Install dependencies using Poetry:
|
|
@@ -61,8 +71,8 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
61
71
|
|
|
62
72
|
1. Clone the repository:
|
|
63
73
|
```
|
|
64
|
-
git clone https://github.com/Inspyre-Softworks/
|
|
65
|
-
cd
|
|
74
|
+
git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
|
|
75
|
+
cd IS-Matrix-Forge
|
|
66
76
|
```
|
|
67
77
|
|
|
68
78
|
2. Install the package:
|
|
@@ -72,60 +82,43 @@ This project requires Python 3.12 or newer and the following dependencies:
|
|
|
72
82
|
|
|
73
83
|
## Usage Examples
|
|
74
84
|
|
|
75
|
-
###
|
|
76
|
-
|
|
77
|
-
To start monitoring your battery with default settings:
|
|
85
|
+
### Identify Connected Devices
|
|
78
86
|
|
|
79
87
|
```python
|
|
80
|
-
from is_matrix_forge.monitor import run_power_monitor
|
|
81
88
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
82
89
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
# Start monitoring with default settings
|
|
87
|
-
run_power_monitor(device)
|
|
90
|
+
for dev in DEVICES:
|
|
91
|
+
print(dev)
|
|
88
92
|
```
|
|
89
93
|
|
|
90
|
-
###
|
|
91
|
-
|
|
92
|
-
To customize the monitoring behavior:
|
|
94
|
+
### Display Text on the Matrix
|
|
93
95
|
|
|
94
96
|
```python
|
|
95
|
-
from is_matrix_forge.
|
|
97
|
+
from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
|
|
96
98
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
97
|
-
from pathlib import Path
|
|
98
99
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
# Custom sound files
|
|
103
|
-
plugged_sound = Path("path/to/custom_plugged_sound.wav")
|
|
104
|
-
unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
|
|
105
|
-
|
|
106
|
-
# Start monitoring with custom settings
|
|
107
|
-
run_power_monitor(
|
|
108
|
-
device,
|
|
109
|
-
battery_check_interval=10, # Check every 10 seconds
|
|
110
|
-
plugged_alert=plugged_sound,
|
|
111
|
-
unplugged_alert=unplugged_sound
|
|
112
|
-
)
|
|
100
|
+
ctrl = LEDMatrixController(DEVICES[0])
|
|
101
|
+
ctrl.scroll_text("Hello World!", loop=False)
|
|
113
102
|
```
|
|
114
103
|
|
|
115
|
-
###
|
|
104
|
+
### Progress Bars
|
|
116
105
|
|
|
117
|
-
|
|
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
|
+
```
|
|
113
|
+
|
|
114
|
+
### Battery Monitor Example
|
|
118
115
|
|
|
119
116
|
```python
|
|
120
|
-
from is_matrix_forge.monitor import
|
|
117
|
+
from is_matrix_forge.monitor import run_power_monitor
|
|
121
118
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
122
119
|
|
|
123
|
-
# Get the first available LED matrix device
|
|
124
120
|
device = DEVICES[0]
|
|
125
|
-
|
|
126
|
-
# Start monitoring in a background thread
|
|
127
|
-
monitor = run_power_monitor_threaded(device)
|
|
128
|
-
# ``monitor`` is a :class:`threading.Thread` instance
|
|
121
|
+
run_power_monitor(device)
|
|
129
122
|
```
|
|
130
123
|
|
|
131
124
|
## Troubleshooting
|
|
@@ -157,8 +150,9 @@ monitor = run_power_monitor_threaded(device)
|
|
|
157
150
|
|
|
158
151
|
## Contributing
|
|
159
152
|
|
|
160
|
-
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.
|
|
161
155
|
|
|
162
156
|
## License
|
|
163
157
|
|
|
164
|
-
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.dev2 → 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.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/helpers/__init__.py
RENAMED
|
@@ -3,6 +3,10 @@ from pathlib import Path
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
import requests
|
|
5
5
|
from inspyre_toolbox.path_man import provision_path
|
|
6
|
+
from is_matrix_forge.log_engine import ROOT_LOGGER
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
MOD_LOGGER = ROOT_LOGGER.get_child(__name__)
|
|
6
10
|
|
|
7
11
|
|
|
8
12
|
def download_presets():
|
|
@@ -24,9 +28,13 @@ def calculate_checksum(file_path):
|
|
|
24
28
|
str:
|
|
25
29
|
The SHA-256 checksum of the file.
|
|
26
30
|
"""
|
|
31
|
+
log = MOD_LOGGER.get_child('calculate_checksum')
|
|
32
|
+
|
|
27
33
|
if not isinstance(file_path, Path):
|
|
28
34
|
file_path = provision_path(file_path)
|
|
29
35
|
|
|
36
|
+
log.debug(f'Calculating checksum for file: {file_path}')
|
|
37
|
+
|
|
30
38
|
sha256 = hashlib.sha256()
|
|
31
39
|
|
|
32
40
|
with open(file_path, 'rb') as f:
|
|
@@ -78,6 +86,30 @@ def percentage_to_value(percent, max_value=255):
|
|
|
78
86
|
return int(round(percent * max_value / 100))
|
|
79
87
|
|
|
80
88
|
|
|
89
|
+
def value_to_percentage(value, max_value=255):
|
|
90
|
+
"""
|
|
91
|
+
Convert a value to its percentage representation relative to `max_value`.
|
|
92
|
+
|
|
93
|
+
Parameters:
|
|
94
|
+
value (int or float):
|
|
95
|
+
The value to convert.
|
|
96
|
+
|
|
97
|
+
max_value (int, optional):
|
|
98
|
+
The maximum possible value. Defaults to 255.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
float:
|
|
102
|
+
The percentage value between 0 and 100.
|
|
103
|
+
"""
|
|
104
|
+
if not isinstance(value, (int, float)):
|
|
105
|
+
raise TypeError(f'value must be of type int or float, not {type(value)}')
|
|
106
|
+
|
|
107
|
+
if value < 0 or value > max_value:
|
|
108
|
+
raise ValueError(f'value must be between 0 and {max_value}, not {value}')
|
|
109
|
+
|
|
110
|
+
return (value / max_value) * 100
|
|
111
|
+
|
|
112
|
+
|
|
81
113
|
def verify_checksum(remote_checksum, local_file_path):
|
|
82
114
|
"""
|
|
83
115
|
Verify the checksum of a local file against a remote checksum.
|
{is_matrix_forge-1.0.0.dev2 → 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.dev2 → 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.dev2 → 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])
|