Readd complex connection logic
This commit is contained in:
parent
0c270ee199
commit
0c914a3dfe
1 changed files with 29 additions and 9 deletions
|
@ -1,27 +1,47 @@
|
||||||
import { Middleware, Action } from "@reduxjs/toolkit";
|
import { Middleware, Action } from "@reduxjs/toolkit";
|
||||||
import { RootState } from "../store/types.d";
|
import { RootState } from "../store/types.d";
|
||||||
import {
|
import {
|
||||||
connect, disconnect, setSerialPort, setMessage, sendMessage,
|
connect, disconnect, setSerialPort, setMessage, sendMessage, connectionStart, connectionFailure, connectionSuccess, connectionEnd,
|
||||||
} from "../slices/serialConnectionSlice";
|
} from "../slices/serialConnectionSlice";
|
||||||
import PortController from "../../serial/PortController";
|
import PortController from "../../serial/PortController";
|
||||||
import store from "../store";
|
|
||||||
|
|
||||||
let serialPort: PortController|null = null;
|
let serialPort: PortController|null = null;
|
||||||
const errorCalbackHandler = () => {};
|
|
||||||
const closeCalbackHandler = () => {};
|
|
||||||
const serialDataListener = (msg: string) => { store.dispatch(setMessage(msg)); };
|
|
||||||
|
|
||||||
const serialConnection: Middleware<{}, RootState> = () => (next) => (action: Action) => {
|
const serialConnection: Middleware<{}, RootState> = (state) => (next) => (action: Action) => {
|
||||||
|
const errorCalbackHandler = (error: Error | null | undefined) => {
|
||||||
|
if (error === null || error === undefined) {
|
||||||
|
state.dispatch(connectionSuccess());
|
||||||
|
} else {
|
||||||
|
state.dispatch(connectionFailure(error.message));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const closeCalbackHandler = (error: Error | null | undefined) => {
|
||||||
|
if (error !== null && error !== undefined) {
|
||||||
|
if (error.message === "Reading from COM port (ReadIOCompletion): Access denied") {
|
||||||
|
state.dispatch(connectionFailure(`Device ${state.getState().serialConnection.port} disconnected`));
|
||||||
|
state.dispatch(connectionEnd());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const serialDataListener = (msg: string) => {
|
||||||
|
if (msg !== state.getState().serialConnection.message) {
|
||||||
|
state.dispatch(setMessage(msg));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (connect.match(action)) {
|
if (connect.match(action)) {
|
||||||
|
state.dispatch(connectionStart());
|
||||||
|
if (state.getState().serialConnection.port === "") {
|
||||||
|
state.dispatch(connectionFailure("No Serial Port set"));
|
||||||
|
return next(action);
|
||||||
|
}
|
||||||
serialPort?.open(errorCalbackHandler, closeCalbackHandler);
|
serialPort?.open(errorCalbackHandler, closeCalbackHandler);
|
||||||
serialPort?.parser.on("data", serialDataListener);
|
serialPort?.parser.on("data", serialDataListener);
|
||||||
console.log("connect");
|
|
||||||
} else if (disconnect.match(action)) {
|
} else if (disconnect.match(action)) {
|
||||||
serialPort?.close();
|
serialPort?.close();
|
||||||
console.log("disconnect");
|
state.dispatch(connectionEnd());
|
||||||
} else if (setSerialPort.match(action)) {
|
} else if (setSerialPort.match(action)) {
|
||||||
serialPort = new PortController(action.payload);
|
serialPort = new PortController(action.payload);
|
||||||
console.log("setSerialPort");
|
|
||||||
} else if (sendMessage.match(action)) {
|
} else if (sendMessage.match(action)) {
|
||||||
serialPort?.write(action.payload);
|
serialPort?.write(action.payload);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue