import imgNote from "./noteSmall.png"; import imgWatch from "./watch.png"; import digitalFont from "./digital-font.ttf"; import { Plant } from "../Plant"; import { RaisedEvent } from "@/statecharts/runtime_types"; type DigitalWatchState = { light: boolean; h: number; m: number; s: number; alarm: boolean; } type DigitalWatchProps = DigitalWatchState & { callbacks: { onTopLeftPressed: () => void; onTopRightPressed: () => void; onBottomRightPressed: () => void; onBottomLeftPressed: () => void; onTopLeftReleased: () => void; onTopRightReleased: () => void; onBottomRightReleased: () => void; onBottomLeftReleased: () => void; }, } export function DigitalWatch({light, h, m, s, alarm, callbacks}: DigitalWatchProps) { const twoDigits = (n: number) => n < 0 ? " " : ("0"+n.toString()).slice(-2); const hhmmss = `${twoDigits(h)}:${twoDigits(m)}:${twoDigits(s)}`; return <> {light && } {hhmmss} callbacks.onTopLeftPressed()} onMouseUp={() => callbacks.onTopLeftReleased()} /> callbacks.onTopRightPressed()} onMouseUp={() => callbacks.onTopRightReleased()} /> callbacks.onBottomLeftPressed()} onMouseUp={() => callbacks.onBottomLeftReleased()} /> callbacks.onBottomRightPressed()} onMouseUp={() => callbacks.onBottomRightReleased()} /> {alarm && } ; } export const DigitalWatchPlant: Plant = { inputEvents: [ { kind: "event", event: "setH", paramName: 'h' }, { kind: "event", event: "setM", paramName: 'm' }, { kind: "event", event: "setS", paramName: 's' }, { kind: "event", event: "setLight", paramName: 'lightOn'}, { kind: "event", event: "setAlarm", paramName: 'alarmOn'}, ], outputEvents: [ { kind: "event", event: "topLeftPressed" }, { kind: "event", event: "topRightPressed" }, { kind: "event", event: "bottomRightPressed" }, { kind: "event", event: "bottomLeftPressed" }, { kind: "event", event: "topLeftReleased" }, { kind: "event", event: "topRightReleased" }, { kind: "event", event: "bottomRightReleased" }, { kind: "event", event: "bottomLeftReleased" }, ], initial: (raise: (event: RaisedEvent) => void) => ({ light: false, alarm: false, h: 12, m: 0, s: 0, callbacks: { onTopLeftPressed: () => raise({ name: "topLeftPressed" }), onTopRightPressed: () => raise({ name: "topRightPressed" }), onBottomRightPressed: () => raise({ name: "bottomRightPressed" }), onBottomLeftPressed: () => raise({ name: "bottomLeftPressed" }), onTopLeftReleased: () => raise({ name: "topLeftReleased" }), onTopRightReleased: () => raise({ name: "topRightReleased" }), onBottomRightReleased: () => raise({ name: "bottomRightReleased" }), onBottomLeftReleased: () => raise({ name: "bottomLeftReleased" }), }, }), reducer: (inputEvent: RaisedEvent, state: DigitalWatchProps) => { if (inputEvent.name === "setH") { return { ...state, h: inputEvent.param }; } if (inputEvent.name === "setM") { return { ...state, m: inputEvent.param }; } if (inputEvent.name === "setS") { return { ...state, s: inputEvent.param }; } if (inputEvent.name === "lightOn") { return { ...state, light: true }; } if (inputEvent.name === "lightOff") { return { ...state, light: false }; } if (inputEvent.name === "setAlarm") { return { ...state, alarm: true }; } if (inputEvent.name === "unsetAlarm") { return { ...state, alarm: false }; } return state; // unknown event - ignore it }, render: DigitalWatch, }