OTD draw cache change

This commit is contained in:
Chuck
2025-07-22 22:21:30 -05:00
parent 5c6776d120
commit b311256cc1

View File

@@ -39,6 +39,8 @@ class OfTheDayManager:
# State management # State management
self.force_clear = False self.force_clear = False
self.last_drawn_category_index = -1
self.last_drawn_day = None
# Load data files # Load data files
self.data_files = {} self.data_files = {}
@@ -286,65 +288,50 @@ class OfTheDayManager:
return lines[:max_lines] return lines[:max_lines]
def display(self, force_clear=False): def display(self, force_clear=False):
"""Display 'of the day' items on the LED matrix.""" """Display 'of the day' items on the LED matrix, only updating when content changes."""
if not self.enabled: if not self.enabled:
logger.warning("OfTheDayManager is disabled") return # Manager is disabled
return
if not self.current_items: if not self.current_items:
# Throttle warning to once every 10 seconds # Throttle warning to once every 10 seconds
current_time = time.time() current_time = time.time()
if not hasattr(self, 'last_warning_time') or current_time - self.last_warning_time > 10: if not hasattr(self, 'last_warning_time') or current_time - self.last_warning_time > 10:
logger.warning(f"OfTheDayManager has no current items. Available items: {list(self.current_items.keys())}") logger.warning(f"OfTheDayManager has no current items.")
self.last_warning_time = current_time self.last_warning_time = current_time
return return
# Check if a redraw is necessary
content_has_changed = self.current_category_index != self.last_drawn_category_index or self.current_day != self.last_drawn_day
if not content_has_changed and not force_clear:
return # Nothing to update, so we exit early
try: try:
if force_clear:
self.display_manager.clear()
self.force_clear = True
# Get current category and item # Get current category and item
category_names = list(self.current_items.keys()) category_names = list(self.current_items.keys())
if not category_names: if not category_names or self.current_category_index >= len(category_names):
return
if self.current_category_index >= len(category_names):
self.current_category_index = 0 self.current_category_index = 0
if not category_names: return
current_category = category_names[self.current_category_index] current_category = category_names[self.current_category_index]
current_item = self.current_items[current_category] current_item = self.current_items[current_category]
# Log the item being displayed, but only every 5 seconds # Log the new item being displayed (throttled)
current_time = time.time() current_time = time.time()
if current_time - self.last_display_log > 5: if current_time - self.last_display_log > 5:
title = current_item.get('title', 'No Title') logger.info(f"Displaying {current_category}: {current_item.get('title', 'No Title')}")
logger.info(f"Displaying {current_category}: {title}")
self.last_display_log = current_time self.last_display_log = current_time
# Clear the display once to remove any previous content (like the "Initializing" screen) # A redraw is needed, so first clear the canvas
if not hasattr(self, '_has_cleared_initial'): self.display_manager.clear()
logger.debug("Calling display_manager.clear() to remove initial screen")
self.display_manager.clear()
self._has_cleared_initial = True
logger.debug("display_manager.clear() completed")
elif force_clear:
logger.debug("Calling display_manager.clear() due to force_clear")
self.display_manager.clear()
logger.debug("display_manager.clear() completed")
# Draw the item # Draw the item
self.draw_item(current_category, current_item) self.draw_item(current_category, current_item)
# Update the display # Update the physical display
# Throttle debug logging to once every 5 seconds self.display_manager.update_display()
if not hasattr(self, '_last_update_debug_log') or current_time - self._last_update_debug_log > 5:
logger.debug("Calling display_manager.update_display()") # Cache the state of what was just drawn
self._last_update_debug_log = current_time self.last_drawn_category_index = self.current_category_index
try: self.last_drawn_day = self.current_day
self.display_manager.update_display()
logger.debug("display_manager.update_display() completed successfully")
except Exception as e:
logger.error(f"Error in display_manager.update_display(): {e}", exc_info=True)
except Exception as e: except Exception as e:
logger.error(f"Error displaying 'of the day' item: {e}", exc_info=True) logger.error(f"Error displaying 'of the day' item: {e}", exc_info=True)