Browse Source

mod:检测

panqiuyao 9 months ago
parent
commit
c06e39054b

+ 1 - 1
electron/api/camera.js

@@ -51,7 +51,7 @@ module.exports = {
 * 曝光补偿  ExposureCompensation
 * 对焦模式 focusmode
 *
-*
+*folder 文件夹
 曝光度:exposure
 压缩:compression
 测光点:metering

+ 27 - 24
electron/controller/socket.js

@@ -4,53 +4,52 @@ const { Controller } = require('ee-core');
 const Log = require('ee-core/log');
 const CoreWindow = require('ee-core/electron/window');
 const WebSocket = require('ws'); // 引入原生 ws 库
-
+let socket = null;
 class SocketController extends Controller {
   constructor(ctx) {
     super(ctx);
-    this.socket = null;
   }
 
   /**
    * Connect to WebSocket server
    */
   connect() {
-    this.socket = new WebSocket('ws://10.56.42.176:7074/ws');
+    socket = new WebSocket('ws://10.56.42.176:7074/ws');
 
+    const win = CoreWindow.getMainWindow()
     // 监听连接成功事件
-    this.socket.on('open', () => {
-      Log.info('Connected to WebSocket server');
-      this.sendPing(); // 连接成功后发送 ping
+    socket.on('open', () => {
+      console.log('socket open')
+   //   this.sendPing(); // 连接成功后发送 ping
+    //  win.webContents.send('controller.socket.connect', true);
+      return true;
     });
 
     // 监听消息事件
-    this.socket.on('message', (data) => {
+    socket.on('message', (data) => {
+      console.log('socket message')
       Log.info('Received:', data.toString());
+      win.webContents.send('controller.socket.message', data.toString());
     });
 
     // 监听连接关闭事件
-    this.socket.on('close', () => {
-      Log.info('Disconnected from WebSocket server');
+    socket.on('close', () => {
+      console.log('socket close')
+      Log.info('Disconnected from socket server');
     });
 
     // 监听错误事件
-    this.socket.on('error', (err) => {
-      Log.error('WebSocketError:', err);
+    socket.on('error', (err) => {
+      console.log('socket error')
+      Log.error('socketError:', err);
     });
 
-
-    setInterval(()=>{
-
-      const win = CoreWindow.getMainWindow();
-      win.webContents.send('controller.socket.message', '这是一个消息');
-    },2000)
   }
 
   /**
    * 发送 ping 消息
    */
   sendPing() {
-    Log.info('sendPing:');
     const message = JSON.stringify({ data: 'node', type: 'ping' });
     this.sendMessage(message);
   }
@@ -61,11 +60,13 @@ class SocketController extends Controller {
    */
   sendMessage(message) {
     // 检查连接状态
-    if (this.socket.readyState === WebSocket.OPEN) {
-      this.socket.send(message); // 使用 send() 发送
-      Log.info('Sent:', message);
+    console.log('sendMessage');
+    console.log(message);
+    console.log(typeof socket);
+    if (socket?.readyState === WebSocket.OPEN) {
+      socket.send(message); // 使用 send() 发送
     } else {
-      Log.error('WebSocket未连接或未就绪');
+      Log.error('socket未连接或未就绪');
     }
   }
 
@@ -73,8 +74,10 @@ class SocketController extends Controller {
    * 断开连接
    */
   disconnect() {
-    if (this.socket) {
-      this.socket.close(); // 使用 close() 方法
+    console.log('disconnect');
+    if (socket) {
+      socket.close(); // 使用 close() 方法
+      socket = null;
     }
   }
 }

+ 0 - 1
frontend/package.json

@@ -22,7 +22,6 @@
     "@types/node": "22.13.5",
     "@types/crypto-js": "4.1.1",
     "@vitejs/plugin-vue": "5.2.1",
-    "@types/crypto-js": "^4.1.1",
     "@vue/tsconfig": "0.7.0",
     "sass-embedded": "^1.85.1",
     "typescript": "5.7.2",

+ 98 - 41
frontend/src/components/check/index.vue

@@ -3,6 +3,7 @@
     v-model="visible"
     :title="title"
     :close-on-click-modal="false"
+    :show-close="false"
     width="500px"
     class="hardware-check-dialog"
   >
@@ -21,8 +22,8 @@
               <template v-else-if="checkSuccess">硬件检测完成</template>
               <template v-else>初始化检测硬件失败</template>
             </div>
-            <el-progress 
-              :percentage="progress" 
+            <el-progress
+              :percentage="progress"
               :colors="['#2FB0FF', '#B863FB']"
               :stroke-width="8"
               v-if="checkLoading"
@@ -30,7 +31,7 @@
             <div class="check-error-result" v-else-if="!checkSuccess">失败的原因,比如请检查硬件链接</div>
           </div>
         </el-timeline-item>
-        
+
         <!-- Step 2 -->
         <el-timeline-item
           :type="'primary'"
@@ -60,8 +61,19 @@
 </template>
 
 <script setup>
-import { ref, computed, watch, onBeforeUnmount, nextTick } from 'vue';
-
+import { ref, computed, watch, onBeforeUnmount, nextTick, watchEffect } from 'vue';
+import icpList from '@/utils/ipc'
+import client from "@/stores/modules/client";
+import useUserInfo from "@/stores/modules/user";
+import socket from "@/stores/modules/socket";
+import checkInfo from "@/stores/modules/check";
+
+/**
+ * 定义组件的 props。
+ * @param {Object} props
+ * @param {Boolean} props.modelValue - 控制对话框显示状态的双向绑定值,默认为 false。
+ * @param {String} props.title - 对话框标题,默认为 '检测硬件'。
+ */
 const props = defineProps({
   modelValue: {
     type: Boolean,
@@ -72,60 +84,105 @@ const props = defineProps({
     default: '检测硬件'
   }
 });
+
+
+const checkInfoStore = checkInfo()
+
+// 检测是否成功的状态
 const checkSuccess = ref(false);
-const checkLoading = ref(false)
+
+// 检测加载状态
+const checkLoading = ref(false);
+
+// 定义事件发射器,用于更新父组件的 modelValue 和触发 confirm 事件
 const emit = defineEmits(['update:modelValue', 'confirm']);
 
-const progress = ref(80);
+// 检测次数计数器
+const checkCount = ref(0);
+
+// 进度条的当前进度值
+const progress = checkInfoStore.getProgress
+
+// 定时器变量,用于控制进度条的递增
 let timer = null;
 
-const visible = computed({
-  get() {
-    return props.modelValue;
-  },
-  set(val) {
-    emit('update:modelValue', val);
-  }
-});
+// 控制组件可见性的状态
+const visible = ref(false);
 
+/**
+ * 开始进度条的递增逻辑。
+ * 该函数会重置进度条并启动定时器,逐步增加进度值直到达到 80。
+ */
 function startProgress() {
   progress.value = 0;
   checkLoading.value = true;
-  timer = setInterval(() => {
-    if (progress.value < 80) {
-      progress.value += 1;
-    } else {
-      checkSuccess.value = false;
-      clearInterval(timer);
-    }
-  }, 50);
 }
 
+/**
+ * 重新执行检测逻辑。
+ * 调用 startProgress 函数以重新开始进度条。
+ */
 function reCheck() {
-    startProgress();
+  startProgress()
+  listenerMessage()
 }
 
+// 初始化客户端状态管理
+const clientStore = client();
 
-function handleConfirm() {
-  emit('confirm');
-  visible.value = false;
-}
+// 初始化用户信息状态管理
+const useUserInfoStore = useUserInfo()
+
+// 初始化 WebSocket 状态管理
+const socketStore = socket()
+
+
+/**
+ * 监听用户信息和检测次数的变化,自动触发相关逻辑。
+ * 当用户信息存在且检测次数为 0 时,设置组件可见性为 true,
+ * 并尝试连接 WebSocket 和发送消息。
+ */
+watchEffect(async ()=>{
+  if( useUserInfoStore.userInfo.id && checkCount.value === 0){
+  //  console.log('aaa')
+    await socketStore.disconnectSocket()
+    console.log('watchEffect');
+    checkCount.value++;
+    await socketStore.connectSocket()
+    visible.value = true
+    startProgress()
+    listenerMessage()
 
-watch(visible, (val) => {
-  if (val) {
-    nextTick(() => {
-      startProgress();
-    });
-  } else {
-    clearInterval(timer);
   }
-});
+})
+
+
+async function listenerMessage(){
+
+/*  //发送设备连接检测请求
+  await socketStore.sendMessage({
+    type: 'connect_mcu',
+  })
+*/
+  //发送遥控器请求
+/*  await socketStore.sendMessage({
+    type: 'connect_bluetooth',
+  })*/
+  if(clientStore.isClient){
+    clientStore.ipc.removeAllListeners(icpList.socket.message);
+    clientStore.ipc.on(icpList.socket.message, async (event, result) => {
+      console.log(result);
+    })
+  }
+
+
+
+}
+
 
-onBeforeUnmount(() => {
-  clearInterval(timer);
-});
 </script>
 
+
 <style lang="scss" scoped>
 .hardware-check-container {
   padding: 20px 0;
@@ -145,7 +202,7 @@ color: #000000;
 }
 
 .progress-text {
-  text-align: right;    
+  text-align: right;
   margin-top: 5px;
   color: #606266;
 }
@@ -183,4 +240,4 @@ color: #000000;
     text-align: left;
     color: #FF4C00;
 }
-</style>
+</style>

+ 140 - 0
frontend/src/stores/modules/check.ts

@@ -0,0 +1,140 @@
+import { defineStore } from 'pinia';
+import { ref, reactive, computed } from 'vue';
+import socket from "./socket";
+import icpList from "../../utils/ipc";
+import client from "./client";
+
+const socketStore = socket()
+// 初始化客户端状态管理
+const clientStore = client();
+
+export const checkInfo = defineStore('checkInfo',()=>{
+
+    //status  -1连接失败  0未连接 1连接中  2链接成功  3端口占用
+    //拍照设备
+    const mcu = reactive({
+        status:0,
+        msg_type:"mcu",
+        msg:"未连接",
+    })
+
+    //遥控器
+    const blueTooth = reactive({
+        status:0,
+        msg_type:"blue_tooth",
+        msg:"未连接",
+    })
+
+    //camControl 打开digiCamControl 通过端口  5513 来判断是否链接上了
+    const camControl = reactive({
+        status:0,
+        msg_type:"cam_control",
+        msg:"未连接",
+    })
+
+    //相机
+    const camera = reactive({
+        status:0,
+        msg_type:"cam_control",
+        msg:"未连接",
+    })
+
+
+    const getProgress = computed(()=>{
+        let completed = 0;
+        let total = 4;
+        if(mcu.status === 2) completed++;
+        if(blueTooth.status === 2) completed++;
+        if(camControl.status === 2) completed++;
+        if(camera.status === 2) completed++;
+        return Number(completed/total)*100
+    })
+
+
+    const getErrorMsg = computed(()=>{
+        if(mcu.status === -1) return mcu.msg
+        if(blueTooth.status === -1) return blueTooth.msg
+        if(camControl.status === -1) return camControl.msg
+        if(camera.status === -1) return camera.msg
+    })
+
+
+
+    const checkAction = async (data: any) => {
+        await socketStore.disconnectSocket()
+        await socketStore.connectSocket()
+        await checkMCU()
+        await checkblueTooth()
+
+        await checkCamControl()
+        await checkCamera()
+    };
+
+
+    const checkMCU = async (data: any) => {
+        await socketStore.sendMessage({
+            type: 'connect_mcu',
+        })
+        if(clientStore.isClient){
+            clientStore.ipc.removeAllListeners(icpList.socket.check.mcu);
+            clientStore.ipc.on(icpList.socket.check.mcu, async (event, result) => {
+              if(result){
+                  mcu.status = result.status
+                  mcu.msg = result.msg
+              }
+            })
+        }
+    };
+    const checkblueTooth = async (data: any) => {
+        await socketStore.sendMessage({
+            type: 'blueTooth',
+        })
+        if(clientStore.isClient){
+            clientStore.ipc.removeAllListeners(icpList.socket.check.blueTooth);
+            clientStore.ipc.on(icpList.socket.check.blueTooth, async (event, result) => {
+                if(result){
+                    blueTooth.status = result.status
+                    blueTooth.msg = result.msg
+                }
+            })
+        }
+    };
+    const checkCamControl = async (data: any) => {
+
+        clientStore.ipc.removeAllListeners(icpList.socket.check.camControl);
+
+        clientStore.ipc.send(icpList.socket.check.camControl);
+
+        clientStore.ipc.on(icpList.socket.check.camControl, async (event, result) => {
+            if(result){
+                camControl.status = result.status
+                camControl.msg = result.msg
+            }
+
+        })
+    };
+    const checkCamera = async (data: any) => {
+        clientStore.ipc.removeAllListeners(icpList.socket.check.camera);
+
+        clientStore.ipc.send(icpList.socket.check.camera);
+
+        clientStore.ipc.on(icpList.socket.check.camera, async (event, result) => {
+            if(result){
+                camera.status = result.status
+                camera.msg = result.msg
+            }
+
+        })
+    };
+
+    return {
+        getProgress,
+        mcu,
+        blueTooth,
+        camControl,
+        camera
+    }
+})
+
+
+export default checkInfo;

+ 71 - 0
frontend/src/stores/modules/socket.ts

@@ -0,0 +1,71 @@
+
+import { defineStore } from 'pinia';
+import { ref, computed } from 'vue';
+import client from "@/stores/modules/client";
+import  icpList from '@/utils/ipc'
+
+
+const socket = defineStore('socket', ()=>{
+    const socket = ref(null);
+    const clientStore = client();
+
+    async function connectSocket(){
+        if(!clientStore.isClient) return;
+        new  Promise((resolve,reject)=>{
+            if(socket) resolve(socket)
+            clientStore.ipc.removeAllListeners(icpList.socket.connect);
+            clientStore.ipc.send(icpList.socket.connect);
+            clientStore.ipc.on(icpList.socket.connect, async (event, result) => {
+
+                console.log('on icpList.socket.connect');
+                console.log(result);
+                socket.value = result
+                resolve(result)
+            })
+
+        })
+    }
+
+
+
+    async function disconnectSocket(){
+        if(!clientStore.isClient) return;
+        new  Promise((resolve,reject)=>{
+            if(socket) resolve(socket)
+            clientStore.ipc.removeAllListeners(icpList.socket.disconnect);
+            clientStore.ipc.send(icpList.socket.disconnect);
+            clientStore.ipc.on(icpList.socket.connect, async (event, result) => {
+                socket.value = null
+                resolve(result)
+            })
+
+        })
+    }
+
+
+    async function sendMessage(data){
+        if(!clientStore.isClient) return;
+        new  Promise((resolve,reject)=>{
+            if(socket) resolve(socket)
+            clientStore.ipc.removeAllListeners(icpList.socket.sendMessage);
+            clientStore.ipc.send(icpList.socket.sendMessage,JSON.stringify(data));
+            clientStore.ipc.on(icpList.socket.sendMessage, async (event, result) => {
+                resolve(result)
+            })
+
+        })
+    }
+
+
+
+
+
+    return {
+        sendMessage,
+        connectSocket,
+        disconnectSocket,
+    }
+
+});
+
+export default socket;

+ 8 - 0
frontend/src/utils/ipc.ts

@@ -7,8 +7,16 @@ const icpList = {
     },
     socket:{
         connect: 'controller.socket.connect',
+        sendPing: 'controller.socket.sendPing',
         message: 'controller.socket.message',
+        sendMessage: 'controller.socket.sendMessage',
         disconnect: 'controller.socket.disconnect',
+        check:{
+            mcu: 'controller.socket.check.mcu',
+            blueTooth: 'controller.socket.check.blueTooth',
+            camControl: 'controller.socket.check.camControl',
+            camera: 'controller.socket.check.camera',
+        }
     }
 }
 

+ 31 - 16
frontend/src/views/Home/index.vue

@@ -16,6 +16,8 @@
     <el-button @click="hideVideo">关闭预览</el-button>
     <el-button @click="takePictures">拍照</el-button>
     <el-button @click="socketConnect">socket 连接</el-button>
+    <el-button @click="connect_mcu">发送设备连接检测请求</el-button>
+    <el-button @click="connect_bluetooth">发送遥控器请求</el-button>
     <el-button @click="socketDisconnect">socket 断开</el-button>
 
 
@@ -32,7 +34,7 @@
     </router-link>
 
     <el-button type="danger">Danger</el-button>
-    <hardware-check v-model="checkVisible" @confirm="onCheckComplete"></hardware-check>
+<!--    <hardware-check v-model="checkVisible" @confirm="onCheckComplete"></hardware-check>-->
     <Login v-model:dialogVisible="dialogVisible" @login-success="handleLoginSuccess"/>
     <el-button type="primary"  @click="loginIn">登录成功</el-button>
   </div>
@@ -59,6 +61,7 @@ const dialogVisible = ref(false);
 const checkVisible = ref(false)
 import client from "@/stores/modules/client";
 import  icpList from '@/utils/ipc'
+import socket from "@/stores/modules/socket";
 const clientStore = client();
 console.log(icpList);
 
@@ -109,7 +112,6 @@ let interval:any = null
 function showVideo(){
   if(clientStore.isClient){
 
-    console.log(clientStore.ipc)
     clientStore.ipc.removeAllListeners(icpList.camera.PreviewShow);
 
     clientStore.ipc.send(icpList.camera.PreviewShow);
@@ -180,25 +182,44 @@ function takePictures(){
   }
 }
 
+// 初始化 WebSocket 状态管理
+const socketStore = socket()
 
 function socketConnect(){
 
   if(clientStore.isClient){
+    socketStore.connectSocket()
 
-    clientStore.ipc.removeAllListeners(icpList.socket.connect);
+    clientStore.ipc.on(icpList.socket.message, async (event, result) => {
+      console.log(result)
+    })
+  }
 
-    clientStore.ipc.send(icpList.socket.connect);
+}
 
-    clientStore.ipc.on(icpList.socket.connect, async (event, result) => {
-      console.log(result);
-    })
 
-    clientStore.ipc.on(icpList.socket.message, async (event, result) => {
-      console.log(result);
+
+function connect_mcu(){
+
+  if(clientStore.isClient){
+
+     socketStore.sendMessage({
+      type: 'connect_mcu',
+       data:"connect_mcu"
     })
   }
 
+}
+
+function connect_bluetooth(){
 
+  if(clientStore.isClient){
+
+     socketStore.sendMessage({
+       type: 'connect_bluetooth',
+       data:"connect_bluetooth"
+    })
+  }
 
 }
 
@@ -208,13 +229,7 @@ function socketDisconnect(){
 
   if(clientStore.isClient){
 
-    clientStore.ipc.removeAllListeners(icpList.socket.disconnect);
-
-    clientStore.ipc.send(icpList.socket.disconnect);
-
-    clientStore.ipc.on(icpList.socket.disconnect, async (event, result) => {
-      console.log(result);
-    })
+    socketStore.disconnectSocket()
   }
 }
 </script>

+ 16 - 2
frontend/src/views/Photography/check.vue

@@ -36,13 +36,27 @@
       </div>
     </div>
   </div>
+
+
+  <hardware-check/>
 </template>
 <script setup lang="ts">
+import  { watchEffect } from  'vue'
 import client from "@/stores/modules/client";
 import icpList from '@/utils/ipc'
+import useUserInfo from "@/stores/modules/user";
 const clientStore = client();
-console.log(icpList);
+
+
+
+const useUserInfoStore = useUserInfo()
+import HardwareCheck from '@/components/check/index.vue'
+function onCheckComplete(){
+
+}
+
 import { ref } from 'vue'
+import socket from "../../stores/modules/socket";
 const url = ref('https://ossimg.valimart.net/uploads/vali_ai/20240312/171022217892595.png')
 const imageUrl = ref('')
 const previewKey = ref(0)
@@ -183,4 +197,4 @@ function takePictures() {
     }
   }
 }
-</style>
+</style>