From ff3f4186369c1bf7ca2f8173c612aace4b9a3ef6 Mon Sep 17 00:00:00 2001 From: Ismail Ali Date: Sun, 22 Jun 2025 09:46:13 +0200 Subject: [PATCH] feat: digitalOutputs separate jsSimulatedProd mode --- .env.development | 2 +- .env.production | 2 +- CHANGELOG.md | 12 ++++++++++ .../SERVICE/digitalOutputsMockData.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- pages/api/cpl/getDigitalInputsHandler.ts | 4 ++-- pages/api/cpl/getDigitalOutputsHandler.ts | 22 +++++-------------- services/fetchDigitalOutputsService.ts | 20 ++++++++++++++++- 9 files changed, 44 insertions(+), 26 deletions(-) diff --git a/.env.development b/.env.development index ccaf46e..03e5e88 100644 --- a/.env.development +++ b/.env.development @@ -6,5 +6,5 @@ NEXT_PUBLIC_USE_MOCK_BACKEND_LOOP_START=false NEXT_PUBLIC_EXPORT_STATIC=false NEXT_PUBLIC_USE_CGI=false # App-Versionsnummer -NEXT_PUBLIC_APP_VERSION=1.6.442 +NEXT_PUBLIC_APP_VERSION=1.6.443 NEXT_PUBLIC_CPL_MODE=jsSimulatedProd # json (Entwicklungsumgebung) oder jsSimulatedProd (CPL ->CGI-Interface-Simulator) oder production (CPL-> CGI-Interface Platzhalter) \ No newline at end of file diff --git a/.env.production b/.env.production index 6e05ff3..0059bc1 100644 --- a/.env.production +++ b/.env.production @@ -5,5 +5,5 @@ NEXT_PUBLIC_CPL_API_PATH=/CPL NEXT_PUBLIC_EXPORT_STATIC=true NEXT_PUBLIC_USE_CGI=true # App-Versionsnummer -NEXT_PUBLIC_APP_VERSION=1.6.442 +NEXT_PUBLIC_APP_VERSION=1.6.443 NEXT_PUBLIC_CPL_MODE=production \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 9515e29..163027e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [1.6.443] – 2025-06-22 + +- feat: jsSimulatedProd-Modus für analoge & digitale Eingänge implementiert + +- neuen Modus `jsSimulatedProd` eingeführt für realitätsnahe Simulation auf Basis echter Produktionsdaten +- analoge Eingänge: analogInputsMockData.js eingebunden und dynamisch per Script geladen +- digitale Eingänge: digitalInputsMockData.js eingebunden mit window-Variablen (z. B. win_de_state, win_de_label etc.) +- fetchAnalogInputsService.ts und fetchDigitalInputsService.ts angepasst zur Modusprüfung und Script-Auswertung +- getAnalogInputsHandler.ts und getDigitalInputsHandler.ts geben im jsSimulatedProd-Modus JavaScript-Dateien aus +- .env.development setzt `NEXT_PUBLIC_CPL_MODE=jsSimulatedProd` + +--- ## [1.6.442] – 2025-06-22 - docs: add full architecture diagram and data flow for json, jsmock and production modes diff --git a/mocks/device-cgi-simulator/SERVICE/digitalOutputsMockData.js b/mocks/device-cgi-simulator/SERVICE/digitalOutputsMockData.js index cb4e2cf..1cd14d7 100644 --- a/mocks/device-cgi-simulator/SERVICE/digitalOutputsMockData.js +++ b/mocks/device-cgi-simulator/SERVICE/digitalOutputsMockData.js @@ -1,2 +1,2 @@ win_da_state = [1, 1, 1, 1]; -win_da_bezeichnung = ["Ausgang1", "Ausgang2", "Ausgang3", "Ausgang4"]; +win_da_bezeichnung = ["Ausgang2", "Ausgang2", "Ausgang3", "Ausgang4"]; diff --git a/package-lock.json b/package-lock.json index 9c38c3d..00212b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cpl-v4", - "version": "1.6.442", + "version": "1.6.443", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cpl-v4", - "version": "1.6.442", + "version": "1.6.443", "dependencies": { "@fontsource/roboto": "^5.1.0", "@iconify-icons/ri": "^1.2.10", diff --git a/package.json b/package.json index a3717a0..eb4c2ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cpl-v4", - "version": "1.6.442", + "version": "1.6.443", "private": true, "scripts": { "dev": "next dev", diff --git a/pages/api/cpl/getDigitalInputsHandler.ts b/pages/api/cpl/getDigitalInputsHandler.ts index 0a7f95a..5ae8d9f 100644 --- a/pages/api/cpl/getDigitalInputsHandler.ts +++ b/pages/api/cpl/getDigitalInputsHandler.ts @@ -21,12 +21,12 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) { } if (mode === "jsSimulatedProd") { - const analogInputsScript = fs.readFileSync( + const digitalInputsScript = fs.readFileSync( "mocks/device-cgi-simulator/SERVICE/digitalInputsMockData.js", "utf-8" ); res.setHeader("Content-Type", "application/javascript"); - res.status(200).send(analogInputsScript); + res.status(200).send(digitalInputsScript); return; } diff --git a/pages/api/cpl/getDigitalOutputsHandler.ts b/pages/api/cpl/getDigitalOutputsHandler.ts index 9c2e322..0d9f98d 100644 --- a/pages/api/cpl/getDigitalOutputsHandler.ts +++ b/pages/api/cpl/getDigitalOutputsHandler.ts @@ -3,6 +3,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import path from "path"; import fs from "fs/promises"; +import { readFileSync } from "fs"; export default async function handler( req: NextApiRequest, @@ -22,25 +23,12 @@ export default async function handler( } if (mode === "jsSimulatedProd") { - // Lese Datei und extrahiere window-Variablen aus .js-Datei - const filePath = path.join( - process.cwd(), + const digitalOutputsScript = readFileSync( "mocks/device-cgi-simulator/SERVICE/digitalOutputsMockData.js" ); - const fileContent = await fs.readFile(filePath, "utf-8"); - - const stateMatch = fileContent.match(/win_da_state\s*=\s*\[([^\]]*)\]/); - const labelMatch = fileContent.match( - /win_da_bezeichnung\s*=\s*\[([^\]]*)\]/ - ); - - const win_da_state = - stateMatch?.[1]?.split(",").map((x) => parseInt(x.trim())) || []; - const win_da_bezeichnung = - labelMatch?.[1]?.split(",").map((x) => x.trim().replace(/["']/g, "")) || - []; - - return res.status(200).json({ win_da_state, win_da_bezeichnung }); + res.setHeader("Content-Type", "application/javascript"); + res.status(200).send(digitalOutputsScript); + return; } return res.status(400).json({ error: "Unsupported mode" }); diff --git a/services/fetchDigitalOutputsService.ts b/services/fetchDigitalOutputsService.ts index 51c6c83..1ca7d10 100644 --- a/services/fetchDigitalOutputsService.ts +++ b/services/fetchDigitalOutputsService.ts @@ -33,7 +33,7 @@ export const fetchDigitalOutputsService = async () => { status: status === 1, })); } - } else if (mode === "json" || mode === "jsSimulatedProd") { + } else if (mode === "json") { const res = await fetch("/api/cpl/getDigitalOutputsHandler"); if (!res.ok) { @@ -57,6 +57,24 @@ export const fetchDigitalOutputsService = async () => { })); } } + } else if (mode === "jsSimulatedProd") { + console.log("🔄 Lade simulierte analoge Eingänge im Produktionsmodus..."); + const scriptUrl = "/api/cpl/getDigitalOutputsHandler"; // gibt JavaScript zurück + await new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.src = scriptUrl; + script.async = true; + script.onload = () => resolve(); + script.onerror = () => + reject("❌ Fehler beim Laden des simulierten Scripts"); + document.body.appendChild(script); + }); + const win = window as any; + return Array.from({ length: 4 }, (_, i) => ({ + id: i + 1, + label: win.win_da_bezeichnung[i] || `Ausgang ${i + 1}`, + status: win.win_da_state[i] === 1, + })); } else { console.warn(`⚠️ Unbekannter Modus: ${mode}`); return [];