add warning and danger transitions as timer life cycle events (#1071)

* setup detection of TImerPhase changes

* add integration event for transition to warning

* add integration event for transition to danger

---------

Co-authored-by: Carlos Valente <34649812+cpvalente@users.noreply.github.com>
This commit is contained in:
2024-06-15 02:54:29 -05:00
committed by GitHub
parent 1044dfac01
commit 70e8fbf327
5 changed files with 39 additions and 1 deletions
@@ -14,4 +14,6 @@ export const cycles: CycleLabel[] = [
{ id: 5, label: 'Every second', value: 'onClock' },
{ id: 5, label: 'On Timer Update', value: 'onUpdate' },
{ id: 6, label: 'On Finish', value: 'onFinish' },
{ id: 7, label: 'On Warning', value: 'onWarning' },
{ id: 8, label: 'On Danger', value: 'onDanger' },
];
@@ -1,4 +1,13 @@
import { EndAction, LogOrigin, MaybeNumber, OntimeEvent, Playback, RuntimeStore, TimerLifeCycle } from 'ontime-types';
import {
EndAction,
LogOrigin,
MaybeNumber,
OntimeEvent,
Playback,
RuntimeStore,
TimerLifeCycle,
TimerPhase,
} from 'ontime-types';
import { millisToString, validatePlayback } from 'ontime-utils';
import { deepEqual } from 'fast-equals';
@@ -93,6 +102,25 @@ class RuntimeService {
const rundown = getPlayableEvents();
this.eventTimer.roll(rundown);
}
const timerPhaseChanged = RuntimeService.previousState.timer?.phase !== newState.timer.phase;
if (timerPhaseChanged) {
switch (newState.timer.phase) {
case TimerPhase.Warning:
process.nextTick(() => {
integrationService.dispatch(TimerLifeCycle.onWarning);
});
break;
case TimerPhase.Danger:
process.nextTick(() => {
integrationService.dispatch(TimerLifeCycle.onDanger);
});
break;
default:
break;
}
}
}
/** delay initialisation until we have a restore point */
@@ -645,6 +645,8 @@ describe('test import of v2 datamodel', () => {
onStop: [],
onUpdate: [],
onFinish: [],
onWarning: [],
onDanger: [],
},
},
http: {
@@ -33,6 +33,8 @@ describe('sanitiseOscSubscriptions()', () => {
{ id: '4', cycle: 'onStop', address: '/test', payload: 'test', enabled: false },
{ id: '5', cycle: 'onUpdate', address: '/test', payload: 'test', enabled: true },
{ id: '6', cycle: 'onFinish', address: '/test', payload: 'test', enabled: false },
{ id: '7', cycle: 'onWarning', address: '/test', payload: 'test', enabled: false },
{ id: '8', cycle: 'onDanger', address: '/test', payload: 'test', enabled: false },
];
const sanitationResult = sanitiseOscSubscriptions(oscSubscriptions);
expect(sanitationResult).toStrictEqual(oscSubscriptions);
@@ -69,6 +71,8 @@ describe('sanitiseHttpSubscriptions()', () => {
{ id: '4', cycle: 'onStop', message: 'http://test', enabled: false },
{ id: '5', cycle: 'onUpdate', message: 'http://test', enabled: true },
{ id: '6', cycle: 'onFinish', message: 'http://test', enabled: false },
{ id: '7', cycle: 'onWarning', message: 'http://test', enabled: false },
{ id: '8', cycle: 'onDanger', message: 'http://test', enabled: false },
];
const sanitationResult = sanitiseHttpSubscriptions(httpSubscription);
expect(sanitationResult).toStrictEqual(httpSubscription);
@@ -6,6 +6,8 @@ export enum TimerLifeCycle {
onClock = 'onClock',
onUpdate = 'onUpdate',
onFinish = 'onFinish',
onWarning = 'onWarning',
onDanger = 'onDanger',
}
export type TimerLifeCycleKey = keyof typeof TimerLifeCycle;