Browse Source

fix : 曝光上图后,没有显示进度条
Fixes #6

sw 1 week ago
parent
commit
978acebda0

+ 39 - 0
src/API/exam/generatorAPI.ts

@@ -17,4 +17,43 @@ const openGenerator = async (): Promise<OpenDeviceResponse> => {
   return response.data;
 };
 
+interface DeviceActionMessage {
+  deviceUri: string;
+  reqName: string;
+  reqParam: string;
+  reqTransaction: string;
+  reqClientID: string;
+}
+
+const pathOfGenerator = 'DIOS/DEVICE/Generator';
+/**
+ * 状态设置 。 用于demo环境。
+ * @param {string} status - The sync status to set (e.g., '1', '2', '3')
+ * - 若设置值为3,后续会触发"3上去"的状态通知;
+ * - 若设置值为4,会通过MQTT推送以下关键信息:
+ */
+const setGeneratorToSyncStatus = async (status: string) => {
+  const message: DeviceActionMessage = {
+    deviceUri: pathOfGenerator,
+    reqName: 'SetGeneratortoSyncStatus',
+    reqParam: `{"P0":"${status}"}`,
+    reqTransaction: '',
+    reqClientID: '',
+  };
+
+  try {
+    console.log(
+      `[setGeneratorToSyncStatus] Setting generator sync status to: ${status}`
+    );
+    await axiosInstance.post('/auth/device/action', message);
+  } catch (error) {
+    console.error(
+      '[setGeneratorToSyncStatus] Failed to set generator sync status:',
+      error
+    );
+  }
+};
+
+export { setGeneratorToSyncStatus };
+
 export { openGenerator };

+ 20 - 7
src/domain/exam/prepare.ts

@@ -1,23 +1,36 @@
-import { startListening } from '../../domain/mqttService';
+import { startListening, stopListening } from '../../domain/mqttService';
 import { openGenerator } from '../../API/exam/generatorAPI';
 import { openDetector } from '../../API/exam/detectorAPI';
+import {
+  startListening as startListeningForDeviceOfGenerator,
+  stopListening as stopListeningForDeviceOfGenerator,
+} from '../../domain/mqttServiceForDevice';
 
 const prepare = async () => {
   try {
-    console.log('Preparing for inspection...');
+    console.log('[prepare] Preparing for inspection...');
     // Start listening for MQTT messages
     startListening();
-    console.log('Started listening to MQTT messages.');
+    startListeningForDeviceOfGenerator();
+    console.log('[prepare] Started listening to MQTT messages.');
     // Open the generator device
     await openGenerator();
-    console.log('Generator device opened.');
+    console.log('[prepare] Generator device opened.');
     // Open the detector device
     await openDetector();
-    console.log('Detector device opened.');
-    console.log('Preparation for inspection completed.');
+    console.log('[prepare] Detector device opened.');
+    console.log('[prepare] Preparation for inspection completed.');
   } catch (error) {
-    console.error('Failed to prepare for inspection:', error);
+    console.error('[prepare] Failed to prepare for inspection:', error);
   }
 };
 
+const unprepare = () => {
+  console.log('[unprepare] Unpreparing for inspection...');
+  // Stop listening to MQTT messages
+  stopListening();
+  stopListeningForDeviceOfGenerator();
+  console.log('[unprepare] Stopped listening to MQTT messages.');
+};
+export { unprepare };
 export default prepare;

+ 84 - 0
src/domain/mqttServiceForDevice.ts

@@ -0,0 +1,84 @@
+import mqtt from 'mqtt';
+import { MQTT_BROKER_URL } from '../API/config';
+import emitter from '../utils/eventEmitter';
+
+interface MqttMessage {
+  IDX: string;
+  TYPE: string;
+  CMD: string;
+  KEY: string;
+  CONTEXT: string;
+  Ver: string;
+  Transaction: string;
+  HANDLE: {
+    ROUTE: string;
+    FLAGS: string;
+    LANG: string;
+    HANDLEID: string;
+    OWNERID: {
+      EBUSID: string;
+      MACHINEID: string;
+      PROCID: string;
+      ADDR: string;
+    };
+    DEVID: {
+      EBUSID: string;
+      MACHINEID: string;
+      PROCID: string;
+      ADDR: string;
+    };
+  };
+  TOPIC: string;
+  PUBLISH: string;
+}
+
+const MQTT_TOPIC = 'CCOS/DEVICE/Generator/Notify/GENERATORSYNCSTATE';
+
+const options = {
+  clean: true,
+  connectTimeout: 4000,
+  username: 'mqttx1112',
+  password: '',
+};
+
+let mqttClient;
+
+const handleMqttMessage = (message: MqttMessage) => {
+  console.log(`[mqttServiceForDevice] 收到message.CONTEXT ${message.CONTEXT}`);
+  if (message.CONTEXT === '3') {
+    emitter.emit('ACQUISITION_STARTED');
+  }
+};
+
+const startListening = () => {
+  mqttClient = mqtt.connect(MQTT_BROKER_URL, options);
+  mqttClient.on('connect', () => {
+    console.log('[mqttServiceForDevice] Connected to MQTT broker');
+    mqttClient.subscribe(MQTT_TOPIC, (err) => {
+      if (err) {
+        console.error(
+          '[mqttServiceForDevice] Failed to subscribe to topic',
+          err
+        );
+      }
+    });
+  });
+
+  mqttClient.on('error', (error) => {
+    console.log('[mqttServiceForDevice] Connection failed:', error);
+  });
+
+  mqttClient.on('message', (topic, message) => {
+    if (topic === MQTT_TOPIC) {
+      const parsedMessage: MqttMessage = JSON.parse(message.toString());
+      handleMqttMessage(parsedMessage);
+    }
+  });
+};
+
+const stopListening = () => {
+  mqttClient.end();
+  console.log('[mqttServiceForDevice] Stopped listening to MQTT broker');
+};
+
+export { startListening, stopListening };

+ 6 - 1
src/states/BusinessFlowSlice.ts

@@ -4,10 +4,12 @@ import store from './store';
 
 export interface BusinessFlowState {
   currentKey: string;
+  lastKey?: string; // Optional
 }
 
 const initialState: BusinessFlowState = {
   currentKey: 'register',
+  lastKey: '',
 };
 
 const BusinessFlowSlice = createSlice({
@@ -15,7 +17,10 @@ const BusinessFlowSlice = createSlice({
   initialState,
   reducers: {
     setBusinessFlow: (state, action: PayloadAction<string>) => {
-      state.currentKey = action.payload;
+      const lastKey = state.currentKey; // Save the last key before changing
+      //state={lastKey:lastKey,currentKey:action.payload}; // Update state with new key and last key
+
+      return { lastKey: lastKey, currentKey: action.payload };
     },
   },
 });

+ 18 - 1
src/states/businessFlowMiddlewareLogic.ts

@@ -1,5 +1,5 @@
 import { Action, Middleware } from '@reduxjs/toolkit';
-import prepare from '../domain/exam/prepare';
+import prepare, { unprepare } from '../domain/exam/prepare';
 import { BusinessFlowState, setBusinessFlow } from './BusinessFlowSlice';
 
 const businessFlowMiddlewareLogic: Middleware =
@@ -18,6 +18,23 @@ const businessFlowMiddlewareLogic: Middleware =
     if (currentKey === 'exam') {
       prepare();
     }
+    if (currentKey !== 'exam' && state.lastKey === 'exam') {
+      if (currentKey === 'view') {
+        //从检查进入图像处理,有可能是曝光导致的,怎么知道呢?看发生器状态
+        if (store.getState().generatorMonitor.acquisitionState === 1) {
+          //发生器正在采集
+          console.log(
+            `[businessFlowMiddleware] Exiting exam flow, but generator is still acquiring.`
+          );
+          return result; // 发生器正在采集,不能退出
+        }
+      }
+      // 说明从检查退出 , 执行清理
+      console.log(
+        `[businessFlowMiddleware] Exiting exam flow, last key was: ${state.lastKey}`
+      );
+      unprepare();
+    }
 
     return result;
   };

+ 36 - 0
src/states/exam/generatorMonitorSlice.ts

@@ -0,0 +1,36 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit';
+import emitter from '../../utils/eventEmitter';
+import store from '../store';
+
+interface GeneratorMonitorState {
+  acquisitionState: number;
+}
+
+const initialState: GeneratorMonitorState = {
+  acquisitionState: 0, // 0: idle, 1: started, 2: success, 3: failure
+};
+
+const generatorMonitorSlice = createSlice({
+  name: 'generatorMonitor',
+  initialState,
+  reducers: {
+    setAcquisitionState: (state, action: PayloadAction<number>) => {
+      state.acquisitionState = action.payload;
+    },
+  },
+});
+
+emitter.on('ACQUISITION_STARTED', () => {
+  store.dispatch(setAcquisitionState(1)); // Start acquisition
+});
+
+emitter.on('ACQUISITION_SUCCESS', () => {
+  store.dispatch(setAcquisitionState(2)); // Acquisition success
+});
+
+emitter.on('ACQUISITION_FAILURE', () => {
+  store.dispatch(setAcquisitionState(3)); // Acquisition failure
+});
+
+export const { setAcquisitionState } = generatorMonitorSlice.actions;
+export default generatorMonitorSlice.reducer;