From 0da2c793cd641ee2cd4df1d0b3c91d7ca3007a54 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Tue, 21 Oct 2025 14:51:14 +0200 Subject: [PATCH] begin implementing mechanism of declaring 'Plant' (e.g., digital watch, microwave oven) to simulate a plant interactively --- src/Plant/DigitalWatch/DigitalWatch.tsx | 41 +++++++++++++++++++++++++ src/Plant/Plant.ts | 11 +++++++ 2 files changed, 52 insertions(+) create mode 100644 src/Plant/Plant.ts diff --git a/src/Plant/DigitalWatch/DigitalWatch.tsx b/src/Plant/DigitalWatch/DigitalWatch.tsx index a7163e0..c26f7f5 100644 --- a/src/Plant/DigitalWatch/DigitalWatch.tsx +++ b/src/Plant/DigitalWatch/DigitalWatch.tsx @@ -4,6 +4,8 @@ import imgNote from "./noteSmall.png"; import imgWatch from "./watch.png"; import imgWatchLight from "./watch-light.png"; import digitalFont from "./digital-font.ttf"; +import { Plant } from "../Plant"; +import { RaisedEvent } from "@/statecharts/runtime_types"; type DigitalWatchProps = { light: boolean; @@ -66,3 +68,42 @@ export function DigitalWatch({light, h, m, s, alarm, callbacks}: DigitalWatchPro ; } + +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" }, + ], + 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 === "setLight") { + return { ...state, light: inputEvent.param }; + } + if (inputEvent.name === "setAlarm") { + return { ...state, alarm: inputEvent.param }; + } + return state; // unknown event - ignore it + }, + render: DigitalWatch, +} \ No newline at end of file diff --git a/src/Plant/Plant.ts b/src/Plant/Plant.ts new file mode 100644 index 0000000..636b33a --- /dev/null +++ b/src/Plant/Plant.ts @@ -0,0 +1,11 @@ +import { EventTrigger } from "@/statecharts/label_ast"; +import { RaisedEvent } from "@/statecharts/runtime_types"; +import { ReactElement } from "react"; + +export type Plant = { + inputEvents: EventTrigger[]; + outputEvents: EventTrigger[]; + + reducer: (inputEvent: RaisedEvent, state: StateType) => StateType; + render: (state: StateType) => ReactElement; +}