IS-Matrix-Forge 1.0.0.dev2__tar.gz → 1.0.0.dev4__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.dev4}/PKG-INFO +5 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/README.md +4 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/helpers/__init__.py +32 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/constants.py +1 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/controller.py +15 -4
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/animations/__init__.py +1 -2
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/animations/animation.py +13 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/animations/errors.py +10 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.dev4}/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.dev4}/is_matrix_forge/led_matrix/display/effects/breather.py +36 -4
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/helpers/__init__.py +26 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/helpers/columns.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/patterns/built_in/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +1 -1
- is_matrix_forge-1.0.0.dev4/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.dev4/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.dev4}/is_matrix_forge/led_matrix/hardware.py +1 -39
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/helpers/__init__.py +2 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/windows/main/__init__.py +1 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/monitor.py +2 -1
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/pyproject.toml +1 -1
- 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-1.0.0.dev4}/LICENSE.md +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/files/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/files/plugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/files/unplugged.wav +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/char_map.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/font_map.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/decorators/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/dirs.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/helpers/github_api.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/designer_gui/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/designer_gui/main_window/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/designer_gui/main_window/layout.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/debug.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/presets.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/b1display.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/c1minimal.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/font.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/ledmatrix.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/Scripts/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/Scripts/battery_monitor.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.dev4}/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.dev4}/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.dev4}/is_matrix_forge/led_matrix/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/commands/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/commands/map.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/helpers/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/helpers/threading.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/multiton.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/threaded.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/animations/effects/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/animations/font/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.dev4}/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.dev4}/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.dev4}/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.dev4}/is_matrix_forge/led_matrix/display/animations/plugged.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.dev4}/is_matrix_forge/led_matrix/display/effects/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/effects/fade.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.dev4}/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.dev4}/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.dev4}/is_matrix_forge/led_matrix/display/grid/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/grid/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/grid/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/grid/presets/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/grid/presets/manifest.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/media.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.dev4/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.dev4}/is_matrix_forge/led_matrix/display/patterns/utils.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/text/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/text/scroller.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/grid.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/misc.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/fonts.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/helpers/core/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.dev4}/is_matrix_forge/led_matrix/helpers/device.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/helpers/status_handler.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/helpers/stream/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/helpers/stream/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/led_matrix.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/status.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/tools/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/tools/identify.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/utils/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/log_engine.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/events.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/collection.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/errors.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/event.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/layout/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/layout/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/metaclasses/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/windows/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/windows/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/windows/main/layout.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/helpers.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/sounds/__init__.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/sounds/base.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/progress.py +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/blank.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/manifest.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/shock_face.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test1.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test2.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test3.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test4.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test5.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test6.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test7.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/x_animation II.json +0 -0
- {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.dev4
|
|
4
4
|
Summary:
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: led,matrix,framework,hardware
|
|
@@ -22,6 +22,10 @@ Requires-Dist: pillow (>=11.2.1,<12.0.0)
|
|
|
22
22
|
Requires-Dist: pyserial (>=3.5,<4.0)
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
|
|
25
|
+
[](https://pypi.org/project/IS-Matrix-Forge)
|
|
26
|
+

|
|
27
|
+
|
|
28
|
+
|
|
25
29
|
# LED Matrix Battery Monitor
|
|
26
30
|
|
|
27
31
|
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.
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
[](https://pypi.org/project/IS-Matrix-Forge)
|
|
2
|
+

|
|
3
|
+
|
|
4
|
+
|
|
1
5
|
# LED Matrix Battery Monitor
|
|
2
6
|
|
|
3
7
|
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.
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/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.
|
|
@@ -138,10 +138,11 @@ class LEDMatrixController(metaclass=MultitonMeta):
|
|
|
138
138
|
|
|
139
139
|
self.__set_up_thread_safety__(thread_safe)
|
|
140
140
|
|
|
141
|
+
self.__post_init__()
|
|
142
|
+
|
|
141
143
|
def __post_init__(self):
|
|
142
144
|
from is_matrix_forge.led_matrix.display.effects.breather import Breather
|
|
143
145
|
|
|
144
|
-
|
|
145
146
|
self.__breather = Breather(self)
|
|
146
147
|
|
|
147
148
|
if self.clear_on_init:
|
|
@@ -384,7 +385,7 @@ class LEDMatrixController(metaclass=MultitonMeta):
|
|
|
384
385
|
enable (bool, optional):
|
|
385
386
|
Whether to enable or disable animation. Defaults to True.
|
|
386
387
|
"""
|
|
387
|
-
from is_matrix_forge.led_matrix.
|
|
388
|
+
from is_matrix_forge.led_matrix.display.helpers import animate
|
|
388
389
|
|
|
389
390
|
# Call the low-level animate function to control animation on the device
|
|
390
391
|
# The animate function also sets the status to 'animate' when enabled
|
|
@@ -429,7 +430,7 @@ class LEDMatrixController(metaclass=MultitonMeta):
|
|
|
429
430
|
|
|
430
431
|
@synchronized
|
|
431
432
|
def draw_percentage(self, percentage: int, clear_first: bool = False):
|
|
432
|
-
from is_matrix_forge.led_matrix.
|
|
433
|
+
from is_matrix_forge.led_matrix.display.helpers import percentage as _show_percentage_raw
|
|
433
434
|
if not isinstance(percentage, int):
|
|
434
435
|
if isinstance(percentage, (float, str)):
|
|
435
436
|
percentage = coerce_to_int(percentage)
|
|
@@ -538,6 +539,16 @@ class LEDMatrixController(metaclass=MultitonMeta):
|
|
|
538
539
|
def is_animating(self):
|
|
539
540
|
return self.animating
|
|
540
541
|
|
|
542
|
+
def jump_to_bootloader(self):
|
|
543
|
+
"""
|
|
544
|
+
Jump to the bootloader on the device.
|
|
545
|
+
|
|
546
|
+
Returns:
|
|
547
|
+
None
|
|
548
|
+
"""
|
|
549
|
+
from is_matrix_forge.led_matrix.hardware import bootloader_jump
|
|
550
|
+
bootloader_jump(self.device)
|
|
551
|
+
|
|
541
552
|
@synchronized
|
|
542
553
|
def set_brightness(self, brightness: Union[int, float], __from_setter=False) -> None:
|
|
543
554
|
"""
|
|
@@ -551,7 +562,7 @@ class LEDMatrixController(metaclass=MultitonMeta):
|
|
|
551
562
|
InvalidBrightnessError:
|
|
552
563
|
If the brightness value is invalid.
|
|
553
564
|
"""
|
|
554
|
-
from is_matrix_forge.led_matrix.
|
|
565
|
+
from is_matrix_forge.led_matrix.display.helpers import brightness as _set_brightness_raw
|
|
555
566
|
from is_matrix_forge.led_matrix.errors import InvalidBrightnessError
|
|
556
567
|
from is_matrix_forge.common.helpers import \
|
|
557
568
|
percentage_to_value # Converts percentage values to raw hardware values
|
|
@@ -6,9 +6,10 @@ from pathlib import Path
|
|
|
6
6
|
|
|
7
7
|
from serial.tools.list_ports_common import ListPortInfo
|
|
8
8
|
|
|
9
|
-
from is_matrix_forge.led_matrix import LEDMatrixController
|
|
9
|
+
from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
|
|
10
10
|
from is_matrix_forge.led_matrix.display.animations.frame.base import Frame
|
|
11
11
|
from is_matrix_forge.led_matrix.helpers import get_json_from_file
|
|
12
|
+
from is_matrix_forge.led_matrix.display.animations.errors import AnimationFinishedError
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
class Animation:
|
|
@@ -159,6 +160,11 @@ class Animation:
|
|
|
159
160
|
|
|
160
161
|
self.__cursor = new_value
|
|
161
162
|
|
|
163
|
+
@property
|
|
164
|
+
def cursor_at_end(self) -> bool:
|
|
165
|
+
"""Get whether the cursor is at the end of the animation sequence."""
|
|
166
|
+
return self.__cursor == len(self.__frames) - 1
|
|
167
|
+
|
|
162
168
|
@property
|
|
163
169
|
def devices(self) -> List[Any]:
|
|
164
170
|
"""Get the list of devices used by the animation."""
|
|
@@ -341,6 +347,9 @@ class Animation:
|
|
|
341
347
|
ValueError:
|
|
342
348
|
If the animation has no frames.
|
|
343
349
|
"""
|
|
350
|
+
if self.cursor_at_end:
|
|
351
|
+
raise AnimationFinishedError('Try rewinding the animation first.')
|
|
352
|
+
|
|
344
353
|
self.__check_ready()
|
|
345
354
|
devices = self.__normalize_devices(devices)
|
|
346
355
|
|
|
@@ -387,6 +396,9 @@ class Animation:
|
|
|
387
396
|
if self.is_empty:
|
|
388
397
|
raise ValueError("Cannot play a frame from an animation with no frames.")
|
|
389
398
|
|
|
399
|
+
if self.cursor_at_end:
|
|
400
|
+
raise AnimationFinishedError('Try rewinding the animation first.')
|
|
401
|
+
|
|
390
402
|
if frame_index is not None:
|
|
391
403
|
if not (0 <= frame_index < len(self.__frames)):
|
|
392
404
|
raise IndexError(f"Frame index {frame_index} out of bounds (0-{len(self.__frames) - 1}).")
|
|
@@ -21,3 +21,13 @@ class MalformedGridError(GridDefinitionError):
|
|
|
21
21
|
|
|
22
22
|
super().__init__(message=self.default_message, **kwargs)
|
|
23
23
|
|
|
24
|
+
|
|
25
|
+
class AnimationFinishedError(CustomRootException, RuntimeError):
|
|
26
|
+
default_message = 'Animation has finished!'
|
|
27
|
+
|
|
28
|
+
def __init__(self, message: str = None, **kwargs) -> None:
|
|
29
|
+
if message is not None:
|
|
30
|
+
self.default_message = f"{self.default_message}\n\n Additional information from caller:\n {message}"
|
|
31
|
+
|
|
32
|
+
super().__init__(message=self.default_message, **kwargs)
|
|
33
|
+
|
|
@@ -3,7 +3,7 @@ from .base import Frame
|
|
|
3
3
|
from serial.tools.list_ports_common import ListPortInfo
|
|
4
4
|
from is_matrix_forge.led_matrix.display.grid.helpers import is_valid_grid
|
|
5
5
|
from is_matrix_forge.led_matrix.display.animations.errors import MalformedGridError
|
|
6
|
-
from is_matrix_forge.led_matrix import render_matrix
|
|
6
|
+
from is_matrix_forge.led_matrix.display.helpers import render_matrix
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
running = False
|
|
@@ -6,7 +6,7 @@ from time import sleep
|
|
|
6
6
|
from typing import List, Any, Union
|
|
7
7
|
from is_matrix_forge.led_matrix.display.grid.helpers import is_valid_grid
|
|
8
8
|
|
|
9
|
-
from is_matrix_forge.led_matrix import render_matrix
|
|
9
|
+
from is_matrix_forge.led_matrix.display.helpers import render_matrix
|
|
10
10
|
from is_matrix_forge.led_matrix.display.grid.grid import Grid
|
|
11
11
|
from is_matrix_forge.led_matrix.display.grid.helpers import generate_blank_grid
|
|
12
12
|
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import threading
|
|
2
2
|
import time
|
|
3
|
+
import is_matrix_forge.led_matrix.display.helpers
|
|
3
4
|
from is_matrix_forge.common.decorators import freeze_setter
|
|
5
|
+
from is_matrix_forge.log_engine import ROOT_LOGGER, Loggable
|
|
4
6
|
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
MOD_LOGGER = ROOT_LOGGER.get_child(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Breather(Loggable):
|
|
7
12
|
"""
|
|
8
13
|
Controls a “breathing” (fade in/out) effect on a controller’s brightness.
|
|
9
14
|
|
|
@@ -39,6 +44,7 @@ class Breather:
|
|
|
39
44
|
step: int = 5,
|
|
40
45
|
breathe_fps: float = 30.0
|
|
41
46
|
):
|
|
47
|
+
super().__init__(MOD_LOGGER)
|
|
42
48
|
self._controller = None
|
|
43
49
|
self._min_brightness = None
|
|
44
50
|
self._max_brightness = None
|
|
@@ -46,13 +52,21 @@ class Breather:
|
|
|
46
52
|
self._fps = None
|
|
47
53
|
|
|
48
54
|
self.controller = controller
|
|
55
|
+
log = self.class_logger
|
|
56
|
+
log.debug(f'Controller: {controller}')
|
|
49
57
|
|
|
50
58
|
self.__initial_brightness = self.controller.brightness
|
|
59
|
+
log.debug(f'Initial brightness: {self.__initial_brightness}')
|
|
51
60
|
|
|
52
61
|
self.min_brightness = min_brightness
|
|
53
62
|
self.max_brightness = max_brightness
|
|
63
|
+
log.debug(f'Min brightness: {self.min_brightness} | Max brightness: {self.max_brightness}')
|
|
64
|
+
|
|
54
65
|
self.step = step
|
|
66
|
+
log.debug(f'Step: {self.step}%')
|
|
67
|
+
|
|
55
68
|
self.fps = breathe_fps
|
|
69
|
+
log.debug(f'FPS: {self.fps}')
|
|
56
70
|
|
|
57
71
|
self._breathing = False
|
|
58
72
|
self._thread = None
|
|
@@ -66,9 +80,13 @@ class Breather:
|
|
|
66
80
|
if not isinstance(new, bool):
|
|
67
81
|
raise TypeError(f'"breathing" must be of type `bool`, not {type(new)}')
|
|
68
82
|
|
|
83
|
+
self.method_logger.debug(f'Received new value for "breathing": {new}')
|
|
84
|
+
|
|
69
85
|
if self.breathing and not new:
|
|
86
|
+
self.method_logger.debug('Stopping breathing')
|
|
70
87
|
self.stop()
|
|
71
88
|
elif not self.breathing and new:
|
|
89
|
+
self.method_logger.debug('Starting breathing')
|
|
72
90
|
self.start()
|
|
73
91
|
|
|
74
92
|
self._breathing = new
|
|
@@ -84,9 +102,12 @@ class Breather:
|
|
|
84
102
|
@controller.setter
|
|
85
103
|
@freeze_setter()
|
|
86
104
|
def controller(self, new):
|
|
87
|
-
from is_matrix_forge.led_matrix import LEDMatrixController
|
|
105
|
+
from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
|
|
88
106
|
if not isinstance(new, LEDMatrixController):
|
|
89
107
|
raise TypeError(f'controller must be LEDMatrixController, not {type(new)}')
|
|
108
|
+
|
|
109
|
+
self.method_logger.debug(f'New controller: {new}')
|
|
110
|
+
|
|
90
111
|
self._controller = new
|
|
91
112
|
|
|
92
113
|
@property
|
|
@@ -113,6 +134,9 @@ class Breather:
|
|
|
113
134
|
raise ValueError('"min_brightness" must be between 0 and 100')
|
|
114
135
|
if self._max_brightness is not None and new > self._max_brightness:
|
|
115
136
|
raise ValueError('"min_brightness" must be <= max_brightness')
|
|
137
|
+
|
|
138
|
+
self.method_logger.debug(f'New min brightness: {new}')
|
|
139
|
+
|
|
116
140
|
self._min_brightness = new
|
|
117
141
|
|
|
118
142
|
@property
|
|
@@ -130,6 +154,8 @@ class Breather:
|
|
|
130
154
|
raise ValueError('"max_brightness" must be between 0 and 100')
|
|
131
155
|
if self._min_brightness is not None and new < self._min_brightness:
|
|
132
156
|
raise ValueError('"max_brightness" must be >= min_brightness')
|
|
157
|
+
|
|
158
|
+
self.method_logger.debug(f'New max brightness: {new}')
|
|
133
159
|
self._max_brightness = new
|
|
134
160
|
|
|
135
161
|
@property
|
|
@@ -145,6 +171,9 @@ class Breather:
|
|
|
145
171
|
raise TypeError('"step" must be int')
|
|
146
172
|
if new <= 0 or new > 100:
|
|
147
173
|
raise ValueError('"step" must be > 0 and <= 100')
|
|
174
|
+
|
|
175
|
+
self.method_logger.debug(f'New step: {new}')
|
|
176
|
+
|
|
148
177
|
self._step = new
|
|
149
178
|
|
|
150
179
|
@property
|
|
@@ -160,13 +189,16 @@ class Breather:
|
|
|
160
189
|
raise TypeError('"fps" must be a number')
|
|
161
190
|
if new <= 0:
|
|
162
191
|
raise ValueError('"fps" must be > 0')
|
|
192
|
+
|
|
193
|
+
self.method_logger.debug(f'New FPS: {new}')
|
|
194
|
+
|
|
163
195
|
self._fps = float(new)
|
|
164
196
|
|
|
165
197
|
def _breath_loop(self):
|
|
166
198
|
interval = 1.0 / self._fps
|
|
167
199
|
# start at current brightness, clamped
|
|
168
200
|
current = max(self._min_brightness,
|
|
169
|
-
min(self.
|
|
201
|
+
min(self.controller.brightness, self._max_brightness))
|
|
170
202
|
going_up = True
|
|
171
203
|
|
|
172
204
|
while self._breathing:
|
|
@@ -181,7 +213,7 @@ class Breather:
|
|
|
181
213
|
current = self._min_brightness
|
|
182
214
|
going_up = True
|
|
183
215
|
|
|
184
|
-
self.
|
|
216
|
+
self.controller.brightness = current
|
|
185
217
|
time.sleep(interval)
|
|
186
218
|
|
|
187
219
|
def start(self):
|
|
@@ -26,7 +26,7 @@ def keep_image(
|
|
|
26
26
|
time_between_refreshes: seconds to sleep after one full breath cycle
|
|
27
27
|
(or between redraws if not breathing)
|
|
28
28
|
"""
|
|
29
|
-
base_brightness =
|
|
29
|
+
base_brightness = brightness
|
|
30
30
|
t = 0.0
|
|
31
31
|
period = 1.0 # one full sine cycle = 1 second
|
|
32
32
|
step = 1.0 / breathe_fps
|
|
@@ -108,3 +108,28 @@ def render_matrix(dev, matrix):
|
|
|
108
108
|
send_command(dev, CommandVals.Draw, vals)
|
|
109
109
|
|
|
110
110
|
|
|
111
|
+
def brightness(dev, b: int):
|
|
112
|
+
"""Adjust the brightness scaling of the entire screen."""
|
|
113
|
+
send_command(dev, CommandVals.Brightness, [b])
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def get_brightness(dev):
|
|
117
|
+
"""Adjust the brightness scaling of the entire screen."""
|
|
118
|
+
res = send_command(dev, CommandVals.Brightness, with_response=True)
|
|
119
|
+
return int(res[0])
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def animate(dev, b: bool):
|
|
123
|
+
"""Enable/disable animation"""
|
|
124
|
+
send_command(dev, CommandVals.Animate, [0x01 if b else 0x00])
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def get_animate(dev):
|
|
128
|
+
"""Check if animation is enabled"""
|
|
129
|
+
res = send_command(dev, CommandVals.Animate, with_response=True)
|
|
130
|
+
return bool(res[0])
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def percentage(dev, p):
|
|
134
|
+
"""Fill a percentage of the screen. Bottom to top"""
|
|
135
|
+
send_command(dev, CommandVals.Pattern, [PatternVals.Percentage, p])
|
|
@@ -17,6 +17,7 @@ Description:
|
|
|
17
17
|
"""
|
|
18
18
|
from is_matrix_forge.led_matrix.commands.map import CommandVals
|
|
19
19
|
from is_matrix_forge.led_matrix.constants import FWK_MAGIC
|
|
20
|
+
from is_matrix_forge.led_matrix.hardware import send_serial
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
def send_col(dev, s, x, vals):
|
|
@@ -28,6 +29,5 @@ def send_col(dev, s, x, vals):
|
|
|
28
29
|
def commit_cols(dev, s):
|
|
29
30
|
"""Commit the changes from sending individual cols with send_col(), displaying the matrix.
|
|
30
31
|
This makes sure that the matrix isn't partially updated."""
|
|
31
|
-
from ..hardware import FWK_MAGIC
|
|
32
32
|
command = FWK_MAGIC + [CommandVals.DrawGreyColBuffer, 0x00]
|
|
33
33
|
send_serial(dev, s, command)
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
from is_matrix_forge.led_matrix.
|
|
1
|
+
from is_matrix_forge.led_matrix.display.patterns.built_in.constants import PatternVals
|
|
2
2
|
from is_matrix_forge.led_matrix.commands.map import CommandVals
|
|
3
3
|
from is_matrix_forge.led_matrix.commands import send_command
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from
|
|
2
|
-
from is_matrix_forge.led_matrix.
|
|
1
|
+
from enum import IntEnum
|
|
2
|
+
from is_matrix_forge.led_matrix.display.patterns.built_in.stencils import checkerboard, every_nth_col, every_nth_row, all_brightnesses
|
|
3
3
|
from is_matrix_forge.led_matrix.commands import send_command
|
|
4
|
-
from .
|
|
4
|
+
from is_matrix_forge.led_matrix.commands.map import CommandVals
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
PATTERN_MAP = {
|
|
@@ -26,4 +26,39 @@ PATTERN_MAP = {
|
|
|
26
26
|
"Double Checkerboard": lambda dev: checkerboard(dev, 2),
|
|
27
27
|
"Triple Checkerboard": lambda dev: checkerboard(dev, 3),
|
|
28
28
|
"Quad Checkerboard": lambda dev: checkerboard(dev, 4),
|
|
29
|
-
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PatternVals(IntEnum):
|
|
33
|
+
Percentage = 0x00
|
|
34
|
+
Gradient = 0x01
|
|
35
|
+
DoubleGradient = 0x02
|
|
36
|
+
DisplayLotus = 0x03
|
|
37
|
+
ZigZag = 0x04
|
|
38
|
+
FullBrightness = 0x05
|
|
39
|
+
DisplayPanic = 0x06
|
|
40
|
+
DisplayLotus2 = 0x07
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def as_dict(cls) -> dict[str, int]:
|
|
44
|
+
"""
|
|
45
|
+
Returns a dictionary of {name: value} for all enum members.
|
|
46
|
+
|
|
47
|
+
Returns
|
|
48
|
+
-------
|
|
49
|
+
dict[str, int]
|
|
50
|
+
A dictionary mapping enum names to their integer values.
|
|
51
|
+
"""
|
|
52
|
+
return {member.name: member.value for member in cls}
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def names(cls) -> list[str]:
|
|
56
|
+
return list(cls.as_dict().keys())
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def values(cls) -> list[int]:
|
|
60
|
+
return list(cls.as_dict().values())
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def items(cls) -> list[tuple[str, int]]:
|
|
64
|
+
return list(cls.as_dict().items())
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/hardware.py
RENAMED
|
@@ -7,24 +7,13 @@ It includes functions for sending commands, controlling brightness, and other ba
|
|
|
7
7
|
|
|
8
8
|
from is_matrix_forge.led_matrix.commands import send_command
|
|
9
9
|
from is_matrix_forge.led_matrix.commands.map import CommandVals
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
from enum import IntEnum
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
# Import the necessary functions from the controller module
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class PatternVals(IntEnum):
|
|
18
|
-
Percentage = 0x00
|
|
19
|
-
Gradient = 0x01
|
|
20
|
-
DoubleGradient = 0x02
|
|
21
|
-
DisplayLotus = 0x03
|
|
22
|
-
ZigZag = 0x04
|
|
23
|
-
FullBrightness = 0x05
|
|
24
|
-
DisplayPanic = 0x06
|
|
25
|
-
DisplayLotus2 = 0x07
|
|
26
|
-
|
|
27
|
-
|
|
28
17
|
class Game(IntEnum):
|
|
29
18
|
Snake = 0x00
|
|
30
19
|
Pong = 0x01
|
|
@@ -81,17 +70,6 @@ def bootloader_jump(dev):
|
|
|
81
70
|
send_command(dev, CommandVals.BootloaderReset, [0x00])
|
|
82
71
|
|
|
83
72
|
|
|
84
|
-
def brightness(dev, b: int):
|
|
85
|
-
"""Adjust the brightness scaling of the entire screen."""
|
|
86
|
-
send_command(dev, CommandVals.Brightness, [b])
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def get_brightness(dev):
|
|
90
|
-
"""Adjust the brightness scaling of the entire screen."""
|
|
91
|
-
res = send_command(dev, CommandVals.Brightness, with_response=True)
|
|
92
|
-
return int(res[0])
|
|
93
|
-
|
|
94
|
-
|
|
95
73
|
def get_version(dev):
|
|
96
74
|
"""Get the device's firmware version"""
|
|
97
75
|
res = send_command(dev, CommandVals.Version, with_response=True)
|
|
@@ -117,17 +95,6 @@ def send_serial(dev, s, command):
|
|
|
117
95
|
# print("Error: ", ex)
|
|
118
96
|
|
|
119
97
|
|
|
120
|
-
def animate(dev, b: bool):
|
|
121
|
-
"""Enable/disable animation"""
|
|
122
|
-
send_command(dev, CommandVals.Animate, [0x01 if b else 0x00])
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def get_animate(dev):
|
|
126
|
-
"""Check if animation is enabled"""
|
|
127
|
-
res = send_command(dev, CommandVals.Animate, with_response=True)
|
|
128
|
-
return bool(res[0])
|
|
129
|
-
|
|
130
|
-
|
|
131
98
|
def get_pwm_freq(dev):
|
|
132
99
|
"""Adjust the brightness scaling of the entire screen."""
|
|
133
100
|
res = send_command(dev, CommandVals.PwmFreq, with_response=True)
|
|
@@ -156,11 +123,6 @@ def pwm_freq(dev, freq):
|
|
|
156
123
|
send_command(dev, CommandVals.PwmFreq, [3])
|
|
157
124
|
|
|
158
125
|
|
|
159
|
-
def percentage(dev, p):
|
|
160
|
-
"""Fill a percentage of the screen. Bottom to top"""
|
|
161
|
-
send_command(dev, CommandVals.Pattern, [PatternVals.Percentage, p])
|
|
162
|
-
|
|
163
|
-
|
|
164
126
|
def define_controllers(threaded=False):
|
|
165
127
|
from is_matrix_forge.led_matrix.controller.helpers import get_controllers
|
|
166
128
|
return get_controllers(threaded)
|
|
@@ -99,7 +99,7 @@ def disconnect_dev(dev: str) -> None:
|
|
|
99
99
|
This function adds the device to a global list of disconnected devices
|
|
100
100
|
to prevent further attempts to communicate with it.
|
|
101
101
|
"""
|
|
102
|
-
|
|
102
|
+
from is_matrix_forge.led_matrix.constants import DISCONNECTED_DEVS
|
|
103
103
|
if dev in DISCONNECTED_DEVS:
|
|
104
104
|
return
|
|
105
105
|
|
|
@@ -146,6 +146,7 @@ def identify_devices(devices: Optional[List[ListPortInfo]] = None) -> None:
|
|
|
146
146
|
|
|
147
147
|
controllers = [LEDMatrixController(dev, 100) for dev in devices]
|
|
148
148
|
|
|
149
|
+
|
|
149
150
|
def safe_identify(controller):
|
|
150
151
|
try:
|
|
151
152
|
controller.identify()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from .layout import Layout as MainWindowLayout
|
|
2
2
|
from ..base import WindowBase
|
|
3
|
-
from is_matrix_forge.led_matrix.
|
|
3
|
+
from is_matrix_forge.led_matrix.display.helpers import brightness
|
|
4
4
|
from is_matrix_forge.led_matrix.helpers.device import DEVICES
|
|
5
5
|
from is_matrix_forge.monitor.monitor import PowerMonitor
|
|
6
6
|
import time
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/monitor.py
RENAMED
|
@@ -9,6 +9,7 @@ from inspy_logger import Loggable
|
|
|
9
9
|
from inspyre_toolbox.syntactic_sweets.classes import validate_type
|
|
10
10
|
from serial.tools.list_ports_common import ListPortInfo
|
|
11
11
|
|
|
12
|
+
import is_matrix_forge.led_matrix.display.helpers
|
|
12
13
|
from is_matrix_forge.common.helpers import percentage_to_value
|
|
13
14
|
from is_matrix_forge.led_matrix import pattern, get_animate, animate, percentage, LEDMatrixController
|
|
14
15
|
from is_matrix_forge.led_matrix.display.animations import goodbye_animation
|
|
@@ -56,7 +57,7 @@ class PowerMonitor(Loggable):
|
|
|
56
57
|
if unplugged_alert:
|
|
57
58
|
self.unplugged_alert = unplugged_alert
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
is_matrix_forge.led_matrix.display.helpers.brightness = percentage_to_value(5)
|
|
60
61
|
self.__battery_check_interval = battery_check_interval or self.DEFAULT_CHECK_INTERVAL
|
|
61
62
|
|
|
62
63
|
@property
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Pattern display module for LED Matrix.
|
|
3
|
-
|
|
4
|
-
This module provides functions for displaying various patterns on the LED matrix.
|
|
5
|
-
It includes functions for displaying checkerboards, gradients, and other visual patterns.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import time
|
|
9
|
-
|
|
10
|
-
from .built_in.stencils import every_nth_row, every_nth_col
|
|
11
|
-
from ..helpers import render_matrix
|
|
12
|
-
from is_matrix_forge.led_matrix.display.patterns.built_in.stencils import every_nth_row, every_nth_col
|
|
13
|
-
from is_matrix_forge.led_matrix.display.helpers.columns import send_col
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def breathing(dev):
|
|
17
|
-
"""Animate breathing brightness.
|
|
18
|
-
Keeps currently displayed grid"""
|
|
19
|
-
set_status('breathing')
|
|
20
|
-
# Bright ranges appear similar, so we have to go through those faster
|
|
21
|
-
while get_status() == 'breathing':
|
|
22
|
-
# Go quickly from 250 to 50
|
|
23
|
-
for i in range(10):
|
|
24
|
-
time.sleep(0.03)
|
|
25
|
-
brightness(dev, 250 - i * 20)
|
|
26
|
-
|
|
27
|
-
# Go slowly from 50 to 0
|
|
28
|
-
for i in range(10):
|
|
29
|
-
time.sleep(0.06)
|
|
30
|
-
brightness(dev, 50 - i * 5)
|
|
31
|
-
|
|
32
|
-
# Go slowly from 0 to 50
|
|
33
|
-
for i in range(10):
|
|
34
|
-
time.sleep(0.06)
|
|
35
|
-
brightness(dev, i * 5)
|
|
36
|
-
|
|
37
|
-
# Go quickly from 50 to 250
|
|
38
|
-
for i in range(10):
|
|
39
|
-
time.sleep(0.03)
|
|
40
|
-
brightness(dev, 50 + i * 20)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def eq(dev, vals):
|
|
44
|
-
"""Display 9 values in equalizer diagram starting from the middle, going up and down"""
|
|
45
|
-
matrix = [[0 for _ in range(34)] for _ in range(9)]
|
|
46
|
-
|
|
47
|
-
for col, val in enumerate(vals[:9]):
|
|
48
|
-
row = int(34 / 2)
|
|
49
|
-
above = int(val / 2)
|
|
50
|
-
below = val - above
|
|
51
|
-
|
|
52
|
-
for i in range(above):
|
|
53
|
-
matrix[col][row + i] = 0xFF
|
|
54
|
-
for i in range(below):
|
|
55
|
-
matrix[col][row - 1 - i] = 0xFF
|
|
56
|
-
|
|
57
|
-
render_matrix(dev, matrix)
|
|
58
|
-
|
|
59
|
-
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/__init__.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/char_map.json
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/font_map.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/designer_gui/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/__init__.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/debug.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/presets.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/__init__.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/b1display.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/c1minimal.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/font.py
RENAMED
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/ledmatrix.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/commands/map.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/base.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/grid.py
RENAMED
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/misc.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/fonts.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/led_matrix.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/status.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/__init__.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/errors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/event.py
RENAMED
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/layout/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/helpers.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/__init__.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/sounds/__init__.py
RENAMED
|
File without changes
|
{is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/sounds/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|