IS-Matrix-Forge 1.0.0.dev27__tar.gz → 1.0.0.dev30__tar.gz

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