Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 26
dynamic_duration
Dynamic Duration is a feature that calculates the exact time needed to display scrolling content (like news headlines or stock tickers) based on the content's length, scroll speed, and display characteristics, rather than using a fixed duration. This ensures optimal viewing time for users while maintaining smooth content flow.
The dynamic duration calculation considers several factors:
- Content Width: The total width of the text/image content to be displayed
- Display Width: The width of the LED matrix display
- Scroll Speed: How many pixels the content moves per frame
- Scroll Delay: Time between each frame update
- Buffer Time: Additional time added for smooth cycling (configurable percentage)
Total Scroll Distance = Display Width + Content Width
Frames Needed = Total Scroll Distance / Scroll Speed
Base Time = Frames Needed × Scroll Delay
Buffer Time = Base Time × Duration Buffer
Calculated Duration = Base Time + Buffer Time
The final duration is then capped between the configured minimum and maximum values.
Add the following settings to your config/config.json file:
{
"stocks": {
"dynamic_duration": true,
"min_duration": 30,
"max_duration": 300,
"duration_buffer": 0.1,
// ... other existing settings
}
}{
"stock_news": {
"dynamic_duration": true,
"min_duration": 30,
"max_duration": 300,
"duration_buffer": 0.1,
// ... other existing settings
}
}{
"odds_ticker": {
"dynamic_duration": true,
"min_duration": 30,
"max_duration": 300,
"duration_buffer": 0.1,
// ... other existing settings
}
}dynamic_duration(boolean): Enable/disable dynamic duration calculationmin_duration(seconds): Minimum display time regardless of content lengthmax_duration(seconds): Maximum display time to prevent excessive delaysduration_buffer(decimal): Additional time as a percentage of calculated time (e.g., 0.1 = 10% extra)
The StockManager class has been enhanced with dynamic duration capabilities:
# In __init__ methodself.dynamic_duration_enabled=self.stocks_config.get('dynamic_duration', True)
self.min_duration=self.stocks_config.get('min_duration', 30)
self.max_duration=self.stocks_config.get('max_duration', 300)
self.duration_buffer=self.stocks_config.get('duration_buffer', 0.1)
self.dynamic_duration=60# Default duration in secondsself.total_scroll_width=0# Track total width for calculationcalculate_dynamic_duration()
- Calculates the exact time needed to display all stock information
- Considers display width, content width, scroll speed, and delays
- Applies min/max duration limits
- Includes detailed debug logging
get_dynamic_duration()
- Returns the calculated dynamic duration for external use
- Used by the DisplayController to determine display timing
Similar enhancements have been applied to the StockNewsManager:
# In __init__ methodself.dynamic_duration_enabled=self.stock_news_config.get('dynamic_duration', True)
self.min_duration=self.stock_news_config.get('min_duration', 30)
self.max_duration=self.stock_news_config.get('max_duration', 300)
self.duration_buffer=self.stock_news_config.get('duration_buffer', 0.1)
self.dynamic_duration=60# Default duration in secondsself.total_scroll_width=0# Track total width for calculationcalculate_dynamic_duration()
- Calculates display time for news headlines
- Uses the same logic as StockManager but with stock news configuration
- Handles text width calculation from cached images
get_dynamic_duration()
- Returns the calculated duration for news display
The OddsTickerManager class has been enhanced with dynamic duration capabilities:
# In __init__ methodself.dynamic_duration_enabled=self.odds_ticker_config.get('dynamic_duration', True)
self.min_duration=self.odds_ticker_config.get('min_duration', 30)
self.max_duration=self.odds_ticker_config.get('max_duration', 300)
self.duration_buffer=self.odds_ticker_config.get('duration_buffer', 0.1)
self.dynamic_duration=60# Default duration in secondsself.total_scroll_width=0# Track total width for calculationcalculate_dynamic_duration()
- Calculates display time for odds ticker content
- Uses the same logic as other managers but with odds ticker configuration
- Handles width calculation from the composite ticker image
get_dynamic_duration()
- Returns the calculated duration for odds ticker display
The DisplayController has been updated to use dynamic durations:
# In get_current_duration() method# Handle dynamic duration for stocksifmode_key=='stocks'andself.stocks:
try:
dynamic_duration=self.stocks.get_dynamic_duration()
logger.info(f"Using dynamic duration for stocks: {dynamic_duration} seconds")
returndynamic_durationexceptExceptionase:
logger.error(f"Error getting dynamic duration for stocks: {e}")
returnself.display_durations.get(mode_key, 60)
# Handle dynamic duration for stock_newsifmode_key=='stock_news'andself.news:
try:
dynamic_duration=self.news.get_dynamic_duration()
logger.info(f"Using dynamic duration for stock_news: {dynamic_duration} seconds")
returndynamic_durationexceptExceptionase:
logger.error(f"Error getting dynamic duration for stock_news: {e}")
returnself.display_durations.get(mode_key, 60)
# Handle dynamic duration for odds_tickerifmode_key=='odds_ticker'andself.odds_ticker:
try:
dynamic_duration=self.odds_ticker.get_dynamic_duration()
logger.info(f"Using dynamic duration for odds_ticker: {dynamic_duration} seconds")
returndynamic_durationexceptExceptionase:
logger.error(f"Error getting dynamic duration for odds_ticker: {e}")
returnself.display_durations.get(mode_key, 60)
## Benefits1.**OptimalViewingTime**: Contentisdisplayedforexactlytherightamountoftime2.**SmoothTransitions**: Buffertimeensuressmoothcyclingbetweencontent3.**ConfigurableLimits**: Min/maxdurationspreventtooshortortoolongdisplays4.**ConsistentExperience**: Allscrollingcontentusesthesametiminglogic5.**DebugVisibility**: Detailedlogginghelpstroubleshoottimingissues## TestingTheimplementationincludescomprehensiveloggingtoverifycalculations:Stock dynamic duration calculation: Display width: 128px Text width: 450px Total scroll distance: 578px Frames needed: 578.0 Base time: 5.78s Buffer time: 0.58s (10%) Calculated duration: 6s Final duration: 30s (capped to minimum)
## Troubleshooting
### Duration Always at Minimum
If your calculated duration is always capped at the minimum value, check:
- Scroll speed settings (higher speed = shorter duration)
- Scroll delay settings (lower delay = shorter duration)
- Content width calculation
- Display width configuration
### Duration Too Long
If content displays for too long:
- Reduce the `duration_buffer` percentage
- Increase `scroll_speed` or decrease `scroll_delay`
- Lower the `max_duration` limit
### Dynamic Duration Not Working
If dynamic duration isn't being used:
- Verify `dynamic_duration: true` in configuration
- Check that the manager instances are properly initialized
- Review error logs for calculation failures
## Related Files
- `config/config.json` - Configuration settings
- `src/stock_manager.py` - Stock display with dynamic duration
- `src/stock_news_manager.py` - Stock news with dynamic duration
- `src/odds_ticker_manager.py` - Odds ticker with dynamic duration
- `src/display_controller.py` - Integration and duration management
- `src/news_manager.py` - Original implementation reference