mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-11 13:23:00 +00:00
Update display_manager.py
timing adjustments to fight artifacts
This commit is contained in:
@@ -36,24 +36,25 @@ class DisplayManager:
|
|||||||
options.parallel = hardware_config.get('parallel', 1)
|
options.parallel = hardware_config.get('parallel', 1)
|
||||||
options.hardware_mapping = hardware_config.get('hardware_mapping', 'adafruit-hat-pwm')
|
options.hardware_mapping = hardware_config.get('hardware_mapping', 'adafruit-hat-pwm')
|
||||||
|
|
||||||
# Optimize display settings for maximum visibility
|
# Optimize display settings for chained panels
|
||||||
options.brightness = 100
|
options.brightness = 100
|
||||||
options.pwm_bits = 11
|
options.pwm_bits = 11
|
||||||
options.pwm_lsb_nanoseconds = 130
|
options.pwm_lsb_nanoseconds = 200 # Increased for better stability
|
||||||
options.led_rgb_sequence = 'RGB'
|
options.led_rgb_sequence = 'RGB'
|
||||||
options.pixel_mapper_config = ''
|
options.pixel_mapper_config = ''
|
||||||
options.row_address_type = 0
|
options.row_address_type = 0
|
||||||
options.multiplexing = 0
|
options.multiplexing = 0
|
||||||
options.disable_hardware_pulsing = True
|
options.disable_hardware_pulsing = False # Enable hardware pulsing for better sync
|
||||||
options.show_refresh_rate = False
|
options.show_refresh_rate = False
|
||||||
options.limit_refresh_rate_hz = 120
|
options.limit_refresh_rate_hz = 60 # Reduced refresh rate for stability
|
||||||
options.gpio_slowdown = 1
|
options.gpio_slowdown = 2 # Increased slowdown for better stability
|
||||||
|
|
||||||
# Initialize the matrix
|
# Initialize the matrix
|
||||||
self.matrix = RGBMatrix(options=options)
|
self.matrix = RGBMatrix(options=options)
|
||||||
|
|
||||||
# Create double buffer for smooth updates
|
# Create double buffer for smooth updates
|
||||||
self.offscreen_canvas = self.matrix.CreateFrameCanvas()
|
self.offscreen_canvas = self.matrix.CreateFrameCanvas()
|
||||||
|
self.current_canvas = self.matrix.CreateFrameCanvas()
|
||||||
|
|
||||||
# Create image with full chain width
|
# Create image with full chain width
|
||||||
self.image = Image.new('RGB', (self.matrix.width, self.matrix.height))
|
self.image = Image.new('RGB', (self.matrix.width, self.matrix.height))
|
||||||
@@ -88,19 +89,37 @@ class DisplayManager:
|
|||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
def update_display(self):
|
def update_display(self):
|
||||||
"""Update the display using double buffering."""
|
"""Update the display using double buffering with proper sync."""
|
||||||
|
try:
|
||||||
# Copy the current image to the offscreen canvas
|
# Copy the current image to the offscreen canvas
|
||||||
self.offscreen_canvas.SetImage(self.image)
|
self.offscreen_canvas.SetImage(self.image)
|
||||||
# Swap the canvases
|
|
||||||
self.offscreen_canvas = self.matrix.SwapOnVSync(self.offscreen_canvas)
|
# Wait for the next vsync before swapping
|
||||||
|
self.matrix.SwapOnVSync(self.offscreen_canvas)
|
||||||
|
|
||||||
|
# Swap our canvas references
|
||||||
|
self.offscreen_canvas, self.current_canvas = self.current_canvas, self.offscreen_canvas
|
||||||
|
|
||||||
|
# Small delay to ensure stable refresh
|
||||||
|
time.sleep(0.001)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error updating display: {e}")
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
"""Clear the display completely."""
|
"""Clear the display completely."""
|
||||||
# Create a new image and drawing context
|
try:
|
||||||
|
# Create a new black image
|
||||||
self.image = Image.new('RGB', (self.matrix.width, self.matrix.height))
|
self.image = Image.new('RGB', (self.matrix.width, self.matrix.height))
|
||||||
self.draw = ImageDraw.Draw(self.image)
|
self.draw = ImageDraw.Draw(self.image)
|
||||||
|
|
||||||
|
# Clear both canvases
|
||||||
|
self.offscreen_canvas.Clear()
|
||||||
|
self.current_canvas.Clear()
|
||||||
|
|
||||||
# Update the display to show the clear
|
# Update the display to show the clear
|
||||||
self.update_display()
|
self.update_display()
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error clearing display: {e}")
|
||||||
|
|
||||||
def _load_fonts(self):
|
def _load_fonts(self):
|
||||||
"""Load fonts for different text sizes."""
|
"""Load fonts for different text sizes."""
|
||||||
|
|||||||
Reference in New Issue
Block a user