analoge eingänge
This commit is contained in:
97
redux/slices/analogInputsSlice.ts
Normal file
97
redux/slices/analogInputsSlice.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
// Redux Slice: redux/slices/analogInputsSlice.ts
|
||||
import { createSlice, PayloadAction, createAsyncThunk } from "@reduxjs/toolkit";
|
||||
|
||||
export interface AnalogInput {
|
||||
id: number | null;
|
||||
value: number | null;
|
||||
name: string;
|
||||
uW: boolean;
|
||||
uG: boolean;
|
||||
oW: boolean;
|
||||
oG: boolean;
|
||||
}
|
||||
|
||||
export interface AnalogInputsState {
|
||||
[key: string]: AnalogInput;
|
||||
}
|
||||
|
||||
// Standardwerte für Eingänge
|
||||
const defaultAnalogInput: AnalogInput = {
|
||||
id: null,
|
||||
value: null,
|
||||
name: "",
|
||||
uW: false,
|
||||
uG: false,
|
||||
oW: false,
|
||||
oG: false,
|
||||
};
|
||||
|
||||
// Initialer Zustand
|
||||
const initialState: AnalogInputsState = {
|
||||
win_analogInputs1: { ...defaultAnalogInput },
|
||||
win_analogInputs2: { ...defaultAnalogInput },
|
||||
win_analogInputs3: { ...defaultAnalogInput },
|
||||
win_analogInputs4: { ...defaultAnalogInput },
|
||||
win_analogInputs5: { ...defaultAnalogInput },
|
||||
win_analogInputs6: { ...defaultAnalogInput },
|
||||
win_analogInputs7: { ...defaultAnalogInput },
|
||||
win_analogInputs8: { ...defaultAnalogInput },
|
||||
};
|
||||
|
||||
// Dynamisch Mock-Daten aus `window` abrufen
|
||||
export const loadFromWindow = createAsyncThunk(
|
||||
"analogInputs/loadFromWindow",
|
||||
async (_, { dispatch }) => {
|
||||
const data: Partial<AnalogInputsState> = {};
|
||||
|
||||
for (let i = 1; i <= 8; i++) {
|
||||
const key = `win_analogInputs${i}`;
|
||||
const value = (window as any)[key];
|
||||
|
||||
if (Array.isArray(value) && value.length === 7) {
|
||||
data[key] = {
|
||||
id: value[0],
|
||||
value: value[1],
|
||||
name: value[2],
|
||||
uW: value[3] === 1,
|
||||
uG: value[4] === 1,
|
||||
oW: value[5] === 1,
|
||||
oG: value[6] === 1,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
dispatch(setAnalogInputs(data)); // ✅ Redux direkt aktualisieren
|
||||
return data;
|
||||
}
|
||||
);
|
||||
|
||||
// Redux Slice
|
||||
const analogInputsSlice = createSlice({
|
||||
name: "analogInputsSlice",
|
||||
initialState,
|
||||
reducers: {
|
||||
setAnalogInput(
|
||||
state,
|
||||
action: PayloadAction<{ key: string; value: AnalogInput }>
|
||||
) {
|
||||
state[action.payload.key] = action.payload.value;
|
||||
},
|
||||
setAnalogInputs(state, action: PayloadAction<Partial<AnalogInputsState>>) {
|
||||
Object.entries(action.payload).forEach(([key, value]) => {
|
||||
if (value) {
|
||||
state[key] = value;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
extraReducers: (builder) => {
|
||||
builder.addCase(loadFromWindow.fulfilled, (state, action) => {
|
||||
Object.assign(state, action.payload);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
export const { setAnalogInput, setAnalogInputs } = analogInputsSlice.actions;
|
||||
|
||||
export default analogInputsSlice.reducer;
|
||||
@@ -1,101 +0,0 @@
|
||||
// Redux Slice: redux/slices/analogeEingaengeSlice.ts
|
||||
import { createSlice, PayloadAction, createAsyncThunk } from "@reduxjs/toolkit";
|
||||
|
||||
export interface AnalogerEingang {
|
||||
id: number | null;
|
||||
value: number | null;
|
||||
name: string;
|
||||
uW: boolean;
|
||||
uG: boolean;
|
||||
oW: boolean;
|
||||
oG: boolean;
|
||||
}
|
||||
|
||||
export interface AnalogeEingaengeState {
|
||||
[key: string]: AnalogerEingang;
|
||||
}
|
||||
|
||||
// Standardwerte für Eingänge
|
||||
const defaultAnalogerEingang: AnalogerEingang = {
|
||||
id: null,
|
||||
value: null,
|
||||
name: "",
|
||||
uW: false,
|
||||
uG: false,
|
||||
oW: false,
|
||||
oG: false,
|
||||
};
|
||||
|
||||
// Initialer Zustand
|
||||
const initialState: AnalogeEingaengeState = {
|
||||
win_analogeEingaenge1: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge2: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge3: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge4: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge5: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge6: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge7: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge8: { ...defaultAnalogerEingang },
|
||||
};
|
||||
|
||||
// Dynamisch Mock-Daten aus `window` abrufen
|
||||
export const loadFromWindow = createAsyncThunk(
|
||||
"analogeEingaenge/loadFromWindow",
|
||||
async (_, { dispatch }) => {
|
||||
const data: Partial<AnalogeEingaengeState> = {};
|
||||
|
||||
for (let i = 1; i <= 8; i++) {
|
||||
const key = `win_analogeEingaenge${i}`;
|
||||
const value = (window as any)[key];
|
||||
|
||||
if (Array.isArray(value) && value.length === 7) {
|
||||
data[key] = {
|
||||
id: value[0],
|
||||
value: value[1],
|
||||
name: value[2],
|
||||
uW: value[3] === 1,
|
||||
uG: value[4] === 1,
|
||||
oW: value[5] === 1,
|
||||
oG: value[6] === 1,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
dispatch(setAnalogeEingaenge(data)); // ✅ Redux direkt aktualisieren
|
||||
return data;
|
||||
}
|
||||
);
|
||||
|
||||
// Redux Slice
|
||||
const analogeEingaengeSlice = createSlice({
|
||||
name: "analogeEingaengeSlice",
|
||||
initialState,
|
||||
reducers: {
|
||||
setAnalogerEingang(
|
||||
state,
|
||||
action: PayloadAction<{ key: string; value: AnalogerEingang }>
|
||||
) {
|
||||
state[action.payload.key] = action.payload.value;
|
||||
},
|
||||
setAnalogeEingaenge(
|
||||
state,
|
||||
action: PayloadAction<Partial<AnalogeEingaengeState>>
|
||||
) {
|
||||
Object.entries(action.payload).forEach(([key, value]) => {
|
||||
if (value) {
|
||||
state[key] = value;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
extraReducers: (builder) => {
|
||||
builder.addCase(loadFromWindow.fulfilled, (state, action) => {
|
||||
Object.assign(state, action.payload);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
export const { setAnalogerEingang, setAnalogeEingaenge } =
|
||||
analogeEingaengeSlice.actions;
|
||||
|
||||
export default analogeEingaengeSlice.reducer;
|
||||
@@ -11,7 +11,7 @@ import opcuaSettingsReducer from "./slices/opcuaSettingsSlice";
|
||||
import digitalOutputsReducer from "./slices/digitalOutputsSlice";
|
||||
import brushReducer from "./slices/brushSlice";
|
||||
import tdrChartReducer from "./slices/tdrChartSlice";
|
||||
import analogeEingaengeReducer from "./slices/analogeEingaengeSlice";
|
||||
import analogInputsReducer from "./slices/analogInputsSlice";
|
||||
import digitalInputsReducer from "./slices/digitalInputsSlice";
|
||||
import tdrReferenceChartReducer from "./slices/tdrReferenceChartSlice";
|
||||
import loopChartReducer from "./slices/loopChartSlice";
|
||||
@@ -36,7 +36,7 @@ const store = configureStore({
|
||||
systemSettingsSlice: systemSettingsReducer,
|
||||
opcuaSettingsSlice: opcuaSettingsReducer,
|
||||
digitalOutputsSlice: digitalOutputsReducer,
|
||||
analogeEingaengeSlice: analogeEingaengeReducer,
|
||||
analogeInputsSlice: analogInputsReducer,
|
||||
brushSlice: brushReducer,
|
||||
tdrChartSlice: tdrChartReducer,
|
||||
tdrReferenceChartSlice: tdrReferenceChartReducer,
|
||||
|
||||
22
redux/thunks/fetchAnalogInputsThunk.ts
Normal file
22
redux/thunks/fetchAnalogInputsThunk.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
// /redux/thunks/fetchAnalogInputsThunk.ts
|
||||
import { createAsyncThunk } from "@reduxjs/toolkit";
|
||||
import { fetchAnalogInputsService } from "@/services/fetchAnalogInputsService";
|
||||
import { setAnalogInputs } from "@/redux/slices/analogInputsSlice";
|
||||
|
||||
/**
|
||||
* Holt die analogen Eingänge von der API und speichert sie in Redux.
|
||||
*/
|
||||
export const fetchAnalogInputsThunk = createAsyncThunk(
|
||||
"analogeInputs/fetchAnalogInputs",
|
||||
async (_, { dispatch }) => {
|
||||
if (typeof window === "undefined") return; // Server-Side Execution blockieren
|
||||
try {
|
||||
const data = await fetchAnalogInputsService();
|
||||
if (data) {
|
||||
dispatch(setAnalogInputs(data)); // ✅ Redux mit API-Daten füllen
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("❌ Fehler beim Laden der analogen Eingänge:", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -1,22 +0,0 @@
|
||||
// /redux/thunks/fetchAnalogeEingaengeThunk.ts
|
||||
import { createAsyncThunk } from "@reduxjs/toolkit";
|
||||
import { fetchAnalogeEingaengeService } from "../../services/fetchAnalogeEingaengeService";
|
||||
import { setAnalogeEingaenge } from "../slices/analogeEingaengeSlice";
|
||||
|
||||
/**
|
||||
* Holt die analogen Eingänge von der API und speichert sie in Redux.
|
||||
*/
|
||||
export const fetchAnalogeEingaengeThunk = createAsyncThunk(
|
||||
"analogeEingaenge/fetchAnalogeEingaenge",
|
||||
async (_, { dispatch }) => {
|
||||
if (typeof window === "undefined") return; // Server-Side Execution blockieren
|
||||
try {
|
||||
const data = await fetchAnalogeEingaengeService();
|
||||
if (data) {
|
||||
dispatch(setAnalogeEingaenge(data)); // ✅ Redux mit API-Daten füllen
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("❌ Fehler beim Laden der analogen Eingänge:", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user