Skip to content

T-Timers pause time#77

Draft
rjmunro wants to merge 15 commits intorjmunro/t-timers-expectedfrom
rjmunro/t-timers-pause-time
Draft

T-Timers pause time#77
rjmunro wants to merge 15 commits intorjmunro/t-timers-expectedfrom
rjmunro/t-timers-pause-time

Conversation

@rjmunro
Copy link
Collaborator

@rjmunro rjmunro commented Feb 19, 2026

About the Contributor

This pull request is posted by SuperflyTV on behalf of the BBC.

Type of Contribution

This is a Feature

Current Behavior

When a part starts "pushing" and progress through the timeline is paused, the T-Timer estimateState is set to paused on the server and the update is propogated to the clients through the database and meteors standard methods.

New Behavior

Information about when pushing will start and therefore a pause is needed, is included in the estimateState, so the client is able to pause itself, and no update needs to be sent. The pauseTime is a time of day, not a duration. The remaining duration is therefore zeroTime - pauseTime.

This also means a regular T-Timer can have a pause time if you know that you want to hold the clock at a certain point in the future. If you set zeroTime and pauseTime to the same value, the clock will stop at zero, so we could maybe remove the stopAtZero feature.

Testing

  • I have added one or more unit tests for this PR
  • I have updated the relevant unit tests
  • No unit test changes are needed for this PR

Affected areas

Time Frame

Other Information

Status

  • PR is ready to be reviewed.
  • The functionality has been tested by the author.
  • Relevant unit tests has been added / updated.
  • Relevant documentation (code comments, system documentation) has been added / updated.

So we can measure if we are over or under time
This will ensure a timeout is set for the next expected push start time.
…e management

Add three new methods to IPlaylistTTimer interface:
- clearEstimate() - Clear both manual estimates and anchor parts
- setEstimateAnchorPart(partId) - Set anchor part for automatic calculation
- setEstimateTime(time, paused?) - Manually set estimate as timestamp
- setEstimateDuration(duration, paused?) - Manually set estimate as duration

When anchor part is set, automatically queues RecalculateTTimerEstimates job.
Manual estimates clear anchor parts and vice versa.

Updated TTimersService to accept JobContext for job queueing capability.
Updated all blueprint context instantiations and tests.
…tions

Implements segment budget timing for T-Timer estimate calculations in
recalculateTTimerEstimates(). When a segment has a budgetDuration set,
the function now:

- Uses the segment budget instead of individual part durations
- Tracks budget consumption as parts are traversed
- Ignores budget timing if the anchor is within the budget segment
  (anchor part uses normal part duration timing)

This matches the front-end timing behavior in rundownTiming.ts and
ensures server-side estimates align with UI countdown calculations
for budget-controlled segments.
Add optional pauseTime field to TimerState type to indicate when a
timer should automatically pause (when current part ends and overrun begins).

Benefits:
- Client can handle running→paused transition locally without server update
- Reduces latency in state transitions
- Server still triggers recalculation on Take/part changes
- More declarative timing ("pause at this time" vs "set paused now")

Implementation:
- When not pushing: pauseTime = now + currentPartRemainingTime
- When already pushing: pauseTime = null
- Client should display timer as paused when now >= pauseTime
Document the client-side logic for rendering timer states with pauseTime support:
- paused === true: use frozen duration
- pauseTime && now >= pauseTime: use zeroTime - pauseTime (auto-pause)
- otherwise: use zeroTime - now (running normally)
Add calculateTimerDuration() function to calculate current timer duration
from TimerState, handling all three cases:
- Manually paused or already pushing
- Auto-pause at overrun (pauseTime)
- Running normally

Clients can import and use:
import { calculateTimerDuration } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
const duration = calculateTimerDuration(timer.state, getCurrentTime())
@rjmunro rjmunro force-pushed the rjmunro/t-timers-pause-time branch from 4bede23 to 6bd8b20 Compare February 20, 2026 10:55
@rjmunro rjmunro force-pushed the rjmunro/t-timers-expected branch from 6d7de5e to 1132ad0 Compare March 9, 2026 16:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant