Slow down redraw rate

Slowing redraw to try and fix flicker
This commit is contained in:
Chuck
2025-04-07 21:25:58 -05:00
parent bae3475efe
commit a5f91040f6
3 changed files with 21 additions and 31 deletions

View File

@@ -21,6 +21,7 @@ class Clock:
self.clock_config = self.config.get('clock', {}) self.clock_config = self.config.get('clock', {})
# Use configured timezone if available, otherwise try to determine it # Use configured timezone if available, otherwise try to determine it
self.timezone = self._get_timezone() self.timezone = self._get_timezone()
self.last_time = None
def _get_timezone(self) -> pytz.timezone: def _get_timezone(self) -> pytz.timezone:
"""Get timezone based on location or config.""" """Get timezone based on location or config."""
@@ -69,16 +70,20 @@ class Clock:
def display_time(self) -> None: def display_time(self) -> None:
"""Display the current time.""" """Display the current time."""
current_time = self.get_current_time() current_time = self.get_current_time()
logger.debug("Displaying time: %s", current_time)
# Center the text on the display # Only update if the time has changed
text_width = self.display_manager.font.getlength(current_time) if current_time != self.last_time:
x = (self.display_manager.matrix.width - text_width) // 2 logger.debug("Time changed, updating display from %s to %s", self.last_time, current_time)
y = (self.display_manager.matrix.height - 24) // 2 self.last_time = current_time
logger.debug("Drawing time at position (%d, %d)", x, y) # Center the text on the display
self.display_manager.clear() text_width = self.display_manager.font.getlength(current_time)
self.display_manager.draw_text(current_time, x, y) x = (self.display_manager.matrix.width - text_width) // 2
y = (self.display_manager.matrix.height - 24) // 2
logger.debug("Drawing time at position (%d, %d)", x, y)
self.display_manager.clear()
self.display_manager.draw_text(current_time, x, y)
if __name__ == "__main__": if __name__ == "__main__":
clock = Clock() clock = Clock()

View File

@@ -26,7 +26,7 @@ class DisplayController:
try: try:
while True: while True:
current_time = time.time() current_time = time.time()
rotation_interval = self.config['display'].get('rotation_interval', 10) rotation_interval = self.config['display'].get('rotation_interval', 15)
# Switch display if interval has passed # Switch display if interval has passed
if current_time - self.last_switch > rotation_interval: if current_time - self.last_switch > rotation_interval:
@@ -44,8 +44,8 @@ class DisplayController:
logger.debug("Updating weather display") logger.debug("Updating weather display")
self.weather.display_weather() self.weather.display_weather()
# Small delay to prevent CPU overload # Sleep for 0.5 seconds since we only need to check for second changes
time.sleep(0.1) time.sleep(0.5)
except KeyboardInterrupt: except KeyboardInterrupt:
print("\nDisplay stopped by user") print("\nDisplay stopped by user")

View File

@@ -48,23 +48,8 @@ class WeatherManager:
temp = round(weather_data['main']['temp']) temp = round(weather_data['main']['temp'])
condition = weather_data['weather'][0]['main'] condition = weather_data['weather'][0]['main']
# Format the display string # Format the display string with both temp and condition
display_text = self.weather_config.get('display_format', '{temp}°F\n{condition}') display_text = f"{temp}°F\n{condition}"
display_text = display_text.format(temp=temp, condition=condition)
# Split text into lines
lines = display_text.split('\n')
# Calculate vertical spacing # Draw both lines at once using the multi-line support in draw_text
total_height = len(lines) * 24 # Assuming 24px font height self.display_manager.draw_text(display_text)
start_y = (self.display_manager.matrix.height - total_height) // 2
# Clear the display
self.display_manager.clear()
# Draw each line centered
for i, line in enumerate(lines):
text_width = self.display_manager.font.getlength(line)
x = (self.display_manager.matrix.width - text_width) // 2
y = start_y + (i * 24)
self.display_manager.draw_text(line, x, y)