diff --git a/apps/client/src/common/hooks/useSocket.ts b/apps/client/src/common/hooks/useSocket.ts index 1f8b91fca..d11431996 100644 --- a/apps/client/src/common/hooks/useSocket.ts +++ b/apps/client/src/common/hooks/useSocket.ts @@ -130,7 +130,6 @@ export const useTimerSpeed = createSelector((state: RuntimeStore) => ({ })); export const setTimerSpeed = { - calculateSpeed: () => socketSendJson('calculate-speed'), getSpeed: () => socketSendJson('get-speed'), setSpeed: (speed: number) => socketSendJson('set-speed', speed), }; diff --git a/apps/server/src/api-integration/integration.controller.ts b/apps/server/src/api-integration/integration.controller.ts index e44e4e5b5..74071353e 100644 --- a/apps/server/src/api-integration/integration.controller.ts +++ b/apps/server/src/api-integration/integration.controller.ts @@ -260,10 +260,6 @@ const actionHandlers: Record = { throw new Error('No matching method provided'); }, /* Speed */ - 'calculate-speed': () => { - const factor = runtimeService.calculateSpeed(); - return { payload: factor }; - }, 'get-speed': () => { const factor = runtimeService.getSpeed(); return { payload: factor }; diff --git a/apps/server/src/services/runtime-service/RuntimeService.ts b/apps/server/src/services/runtime-service/RuntimeService.ts index 8002ef273..33fad265a 100644 --- a/apps/server/src/services/runtime-service/RuntimeService.ts +++ b/apps/server/src/services/runtime-service/RuntimeService.ts @@ -667,14 +667,6 @@ class RuntimeService { } } - /** - * Utility calculates the speed factor necessary to finish on time - * @returns {number} speed factor needed to meet schedule - */ - public calculateSpeed(): number { - return runtimeState.calculateSpeed(); - } - /** * @returns {number} speed factor currently applied */ @@ -688,19 +680,28 @@ class RuntimeService { * @returns {number} applied speed factor */ public setSpeed(speed: number): number { - // TODO: validate state - // TODO: validate value - runtimeState.setSpeed(speed); - return runtimeState.getSpeed(); + if (speed < 0.5 || speed > 2.0) { + logger.warning(LogOrigin.Server, `Speed out of bounds: ${speed}`); + return; + } + + const currentState = runtimeState.getState(); + if (currentState.eventNow === null) { + logger.warning(LogOrigin.Server, 'No event running to set speed to'); + } + + const newSpeed = runtimeState.setSpeed(speed); + logger.info(LogOrigin.Server, `Speed set to ${newSpeed}`); + return newSpeed; } /** * Resets the speed of the current timer - * @returns {number} applied speed factor */ public resetSpeed(): number { - runtimeState.resetSpeed(); - return runtimeState.getSpeed(); + const speed = runtimeState.resetSpeed(); + logger.info(LogOrigin.Server, `Speed set to ${speed}`); + return speed; } } diff --git a/apps/server/src/stores/runtimeState.ts b/apps/server/src/stores/runtimeState.ts index d0ea80a22..7d0caca41 100644 --- a/apps/server/src/stores/runtimeState.ts +++ b/apps/server/src/stores/runtimeState.ts @@ -350,33 +350,26 @@ export function updateAll(rundown: OntimeRundown) { loadBlock(rundown); } -export function setSpeed(speed: number) { +export function setSpeed(speed: number): number { + const remainingMs = runtimeState.timer.current; + const adjustedRemainingTimeMs = remainingMs / speed; + const newFinishTimeMs = runtimeState.clock + adjustedRemainingTimeMs; + runtimeState.timer.speed = speed; + runtimeState.timer.expectedFinish = newFinishTimeMs; + + return runtimeState.timer.speed; } export function resetSpeed() { runtimeState.timer.speed = 1.0; + return runtimeState.timer.speed; } export function getSpeed() { return runtimeState.timer.speed; } -export function calculateSpeed() { - // TODO: what should this return if no timer is running? - if (runtimeState.eventNow !== null) { - const timeToDesiredFinish = runtimeState.eventNow.timeEnd - runtimeState.clock; - const timeToActualFinish = runtimeState.timer.expectedFinish - runtimeState.clock; - const factor = 1 / (timeToDesiredFinish / timeToActualFinish); - - // TODO: this can produce negative speeds (i.e. the desired finish time is in the past) - // TODO: should there be some clamping or rounding on this number? - return factor; - } - - return 1.0; -} - export function start(state: RuntimeState = runtimeState): boolean { if (state.eventNow === null) { return false;