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.
Files changed (135) hide show
  1. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/PKG-INFO +5 -1
  2. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/README.md +4 -0
  3. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/helpers/__init__.py +32 -0
  4. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/constants.py +1 -0
  5. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/controller.py +15 -4
  6. {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
  7. {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
  8. {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
  9. {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
  10. {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
  11. {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
  12. {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
  13. {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
  14. {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
  15. {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
  16. is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py +3 -0
  17. 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
  18. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/hardware.py +1 -39
  19. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/helpers/__init__.py +2 -1
  20. {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
  21. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/monitor.py +2 -1
  22. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/pyproject.toml +1 -1
  23. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/__init__.py +0 -59
  24. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/LICENSE.md +0 -0
  25. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/__init__.py +0 -0
  26. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/__init__.py +0 -0
  27. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/__init__.py +0 -0
  28. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/files/__init__.py +0 -0
  29. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/files/plugged.wav +0 -0
  30. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/audio/files/unplugged.wav +0 -0
  31. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/char_map.json +0 -0
  32. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/assets/font_map.py +0 -0
  33. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/__init__.py +0 -0
  34. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/decorators/__init__.py +0 -0
  35. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/dirs.py +0 -0
  36. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/common/helpers/github_api.py +0 -0
  37. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/designer_gui/__init__.py +0 -0
  38. {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
  39. {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
  40. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/__init__.py +0 -0
  41. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/debug.py +0 -0
  42. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/dev_tools/presets.py +0 -0
  43. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/__init__.py +0 -0
  44. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/b1display.py +0 -0
  45. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/c1minimal.py +0 -0
  46. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/font.py +0 -0
  47. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/helpers/__init__.py +0 -0
  48. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/inputmodule/ledmatrix.py +0 -0
  49. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/Scripts/__init__.py +0 -0
  50. {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
  51. {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
  52. {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
  53. {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
  54. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/__init__.py +0 -0
  55. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/commands/__init__.py +0 -0
  56. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/commands/map.py +0 -0
  57. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/__init__.py +0 -0
  58. {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
  59. {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
  60. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/multiton.py +0 -0
  61. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/controller/threaded.py +0 -0
  62. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/__init__.py +0 -0
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/display/media.py +0 -0
  82. /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
  83. {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
  84. {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
  85. {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
  86. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/__init__.py +0 -0
  87. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/base.py +0 -0
  88. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/grid.py +0 -0
  89. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/matrix.py +0 -0
  90. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/errors/misc.py +0 -0
  91. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/fonts.py +0 -0
  92. {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
  93. {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
  94. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/helpers/device.py +0 -0
  95. {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
  96. {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
  97. {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
  98. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/led_matrix.py +0 -0
  99. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/status.py +0 -0
  100. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/tools/__init__.py +0 -0
  101. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/tools/identify.py +0 -0
  102. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/led_matrix/utils/__init__.py +0 -0
  103. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/log_engine.py +0 -0
  104. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/__init__.py +0 -0
  105. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/errors.py +0 -0
  106. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/events.py +0 -0
  107. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/__init__.py +0 -0
  108. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/errors.py +0 -0
  109. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/__init__.py +0 -0
  110. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/collection.py +0 -0
  111. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/errors.py +0 -0
  112. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/event/event.py +0 -0
  113. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/layout/__init__.py +0 -0
  114. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/layout/base.py +0 -0
  115. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/metaclasses/__init__.py +0 -0
  116. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/windows/__init__.py +0 -0
  117. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/gui/windows/base.py +0 -0
  118. {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
  119. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/monitor/helpers.py +0 -0
  120. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/__init__.py +0 -0
  121. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/sounds/__init__.py +0 -0
  122. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/notify/sounds/base.py +0 -0
  123. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/is_matrix_forge/progress.py +0 -0
  124. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/blank.json +0 -0
  125. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/manifest.json +0 -0
  126. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/shock_face.json +0 -0
  127. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test1.json +0 -0
  128. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test2.json +0 -0
  129. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test3.json +0 -0
  130. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test4.json +0 -0
  131. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test5.json +0 -0
  132. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test6.json +0 -0
  133. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/test7.json +0 -0
  134. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev4}/presets/x_animation II.json +0 -0
  135. {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.dev2
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
+ [![PyPI version](https://img.shields.io/pypi/v/IS-Matrix-Forge)](https://pypi.org/project/IS-Matrix-Forge)
26
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/IS-Matrix-Forge)
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
+ [![PyPI version](https://img.shields.io/pypi/v/IS-Matrix-Forge)](https://pypi.org/project/IS-Matrix-Forge)
2
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/IS-Matrix-Forge)
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.
@@ -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.
@@ -11,6 +11,7 @@ This module defines various constants used throughout the application, including
11
11
  """
12
12
  from is_matrix_forge.common.dirs import PRESETS_DIR
13
13
 
14
+
14
15
  # Hardware identifiers
15
16
  FWK_MAGIC = [0x32, 0xAC]
16
17
  PID = 0x20
@@ -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.hardware import animate
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.hardware import percentage as _show_percentage_raw
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.hardware import brightness as _set_brightness_raw
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
@@ -1,7 +1,6 @@
1
1
  from time import sleep
2
2
 
3
-
4
- from is_matrix_forge.led_matrix.hardware import brightness
3
+ from is_matrix_forge.led_matrix.display.helpers import brightness
5
4
  from is_matrix_forge.led_matrix.display.text import show_string
6
5
 
7
6
 
@@ -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
- class Breather:
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._controller.brightness, self._max_brightness))
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._controller.brightness = current
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 = controller.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,7 +1,7 @@
1
1
  import difflib
2
2
  from typing import Any
3
3
 
4
- from .constants import PATTERN_MAP
4
+ from .stencils.res import PATTERN_MAP
5
5
 
6
6
 
7
7
  class BuiltInPatterns:
@@ -1,3 +1,3 @@
1
- from is_matrix_forge.led_matrix.hardware import PatternVals
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 .commands import PatternVals
2
- from is_matrix_forge.led_matrix.commands.map import CommandVals
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 .stencils import all_brightnesses, every_nth_row, every_nth_col, checkerboard
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())
@@ -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
- from is_matrix_forge.led_matrix.helpers.core.lazy_mod_load import LazyModuleLoader
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
- global DISCONNECTED_DEVS
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.hardware import brightness
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
@@ -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
- self.dev.brightness = percentage_to_value(5)
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,6 +1,6 @@
1
1
  [project]
2
2
  name = "IS-Matrix-Forge"
3
- version = "1.0.0-dev.2"
3
+ version = "1.0.0-dev.4"
4
4
  description = ""
5
5
  authors = [
6
6
  {name = "Taylor B.",email = "t.blackstone@inspyre.tech"}
@@ -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
-