瀏覽代碼

临时更改

rambo 4 月之前
父節點
當前提交
50755ccce3
共有 4 個文件被更改,包括 157 次插入91 次删除
  1. 28 2
      python/mcu/DeviceControl.py
  2. 1 0
      python/mcu/LineControl.py
  3. 1 1
      python/mcu/capture/smart_shooter_class.py
  4. 127 88
      python/sockets/socket_server.py

+ 28 - 2
python/mcu/DeviceControl.py

@@ -180,10 +180,16 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.to_init_device_origin_point(device_name="mcu",is_force=is_force)
         print("MCU 开始循环~")
         while 1:
-            await asyncio.sleep(0.01)
+            await asyncio.sleep(1)
             if not self.serial_ins or not self.connect_state:
                 break
             try:
+                # self.sendSocketMessage(
+                # 0,
+                #     msg="mcu循环监听中",
+                #     data={},
+                #     device_status=2,
+                # )
                 # print("mcu   send_cmd")
                 self.send_cmd()
                 # time.sleep(0.01)
@@ -901,7 +907,20 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
     async def add_port_by_linkage(self, port_name):
         # port_value :串口基础信息
         # todo 根据prot_value 信息自动进行连接
-        print("add", port_name)
+        print("add port_name", port_name)
+        print("self.port_name",self.port_name)
+        if self.port_name == port_name:
+            self.sendSocketMessage(
+                0,
+                msg="串口:{} 无法识别,调试".format(port_name).format(port_name),
+                data=message_data,
+                device_status=2,
+            )
+            self.connect_state = True
+            self.is_running = True
+            print("MCU 已连接")
+            self.port_name = port_name
+            return True
         # 对没有连接的设备进行尝试连接
         message_data = {
             "_type": "show_info",
@@ -1157,6 +1176,8 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.init_state = False
             self.is_init_while = False
             print("关闭MCU")
+        self.line_control.port_name = ""
+        self.line_control.close_connect()
 
     @property
     def mcu_move_state(self):
@@ -1666,6 +1687,9 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
         device_ctrl.sendSocketMessage(code=0, msg="MCU连接成功", data=message)
         return
     if device_ctrl.is_init_while:
+        device_ctrl.sendSocketMessage(
+            code=0, msg="MCU<<<---连接成功--->>>,is_init_while", data=message
+        )
         return
     device_ctrl.is_init_while = True
     """实时检测串口是否连接"""
@@ -1702,4 +1726,6 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
         #         code=1, msg="串口未连接,请检查", device_status=-1
         #     )
     device_ctrl.is_init_while = False
+    device_ctrl.p_list = []
+    device_ctrl.temp_ports_dict = {}
     print("MCU断开连接,已释放")

+ 1 - 0
python/mcu/LineControl.py

@@ -19,6 +19,7 @@ class LineControl(BaseClass):
         self.connect_state = False
         self.is_running = False
         self.msg_type = "blue_tooth"
+        self.port_name = None
         self.goods_art_no = None
         # 0 闲置;1进行中;2已完成;
         self.photo_take_state = 0

+ 1 - 1
python/mcu/capture/smart_shooter_class.py

@@ -379,6 +379,7 @@ class SmartShooter(metaclass=SingletonType):
             return False, msg_send
 
     def connect_listen(self):
+        time.sleep(5)
         print("smart shooter connect_listen", self.connect_status, self.listen_init)
         if self.connect_status == True or self.listen_init == True:
             return True
@@ -387,7 +388,6 @@ class SmartShooter(metaclass=SingletonType):
         print("构建监听", self.connect_status)
         while True:
             self.listen_init = True
-            time.sleep(0.01)
             if self.callback_listen == None:
                 continue
             # camera_states, camera_msg = await self.GetCameraInfo(is_send=False)

+ 127 - 88
python/sockets/socket_server.py

@@ -3,7 +3,7 @@ import asyncio
 from models import *
 from .connect_manager import ConnectionManager
 from .message_handler import *
-from mcu.DeviceControl import DeviceControl,checkMcuConnection
+from mcu.DeviceControl import DeviceControl, checkMcuConnection
 from mcu.BlueToothMode import BlueToothMode
 from mcu.capture.smart_shooter_class import SmartShooter
 import time
@@ -17,6 +17,8 @@ device_ctrl = DeviceControl(websocket_manager=conn_manager)
 blue_tooth = BlueToothMode(websocket_manager=conn_manager)
 smart_shooter = SmartShooter(websocket_manager=conn_manager)
 from utils.common import message_queue
+
+
 async def updateDataRecord(PhotoFilename, id):
     await asyncio.sleep(0.01)
     create_time = datetime.datetime.fromtimestamp(os.path.getctime(PhotoFilename))
@@ -39,104 +41,141 @@ async def websocket_endpoint(websocket: WebSocket):
     await conn_manager.connect(websocket)
     active_connections.add(websocket)
     smart_shooter.websocket = websocket
+
+    # 启动 smart_shooter.connect_listen 服务
+    tasks = set()
     try:
-        # await socket_manager.connect()
-        async def handler_messages():
-            while True:
-                try:
-                    byteDats = await websocket.receive()
-                    socket_type = byteDats.get("type")
-                    if socket_type == "websocket.disconnect":
-                        smart_shooter.stop_listen = True
-                        device_ctrl.close_connect()
-                        device_ctrl.mcu_exit = True
-                        device_ctrl.p_list = []
-                        device_ctrl.temp_ports_dict = {}
-                        device_ctrl.clearMyInstance()
-                        diviceList = blue_tooth.devices
-                        if len(diviceList) == 0:
-                            blue_tooth.bluetooth_exit = True
-                            blue_tooth.clearMyInstance()
-                            break
-                        diviceAddress = list(diviceList.keys())[0]
-                        if diviceAddress != "":
-                            print(diviceList.get(diviceAddress))
-                            diviceName = diviceList[diviceAddress]["name"]
-                            blue_tooth.disconnect_device(diviceAddress, diviceName)
-                        blue_tooth.bluetooth_exit = True
-                        blue_tooth.clearMyInstance()
-                        print("所有设备已断开连接")
-                        break
-                    print("byteDats", byteDats)
-                    await handlerSend(
-                        conn_manager, json.dumps(byteDats), websocket, smart_shooter
-                    )
-                except Exception as e:
-                    print(e)
-                    break
-        # async def checkConnMcu():
-        #     await checkMcuConnection(device_ctrl)
-        # async def connectBlueTooth():
-        #     await blue_tooth.main_func()
-        async def send_message():
-            while True:
-                try:
-                    message = await message_queue.get()
-                    await websocket.send_json(message)
-                except Exception as e:
-                    print(e)
-                    break
-        async def MsgCallback(msg):
-            msg_id = msg.get("msg_id")
-            match msg_id:
-                case "PhotoUpdated":
-                    PhotoFilename = msg.get("PhotoFilename")
-                    PhotoLocation = msg.get("PhotoLocation")
-                    PhotoOrigin = msg.get("PhotoOrigin")
-                    if (PhotoFilename != "" and PhotoFilename != None) and (
-                        PhotoLocation == "Local Disk"
-                    ):
-                        # temp_photo_name = PhotoFilename
-                        # 更新拍照记录
-                        print("PhotoFilename", PhotoFilename, PhotoOrigin)
-                        if PhotoOrigin != "" and PhotoOrigin != "external":
-                            goods_art_no, id = PhotoOrigin.split(",")
-                            await updateDataRecord(PhotoFilename, id)
-                        data = conn_manager.jsonMessage(
-                            code=0,
-                            msg=f"照片获取成功",
-                            data={"photo_file_name": PhotoFilename},
-                            msg_type="smart_shooter_photo_take",
-                        )
-                        await conn_manager.send_personal_message(data, websocket)
-                case "LiveviewUpdated":
-                    CameraLiveviewImage = msg.get("CameraLiveviewImage", None)
-                    # base64_to_image(CameraLiveviewImage, "liveview.jpg")
-                    # print("收到直播画面:CameraLiveviewImage")
-                    data = conn_manager.jsonMessage(
-                        code=1,
-                        msg=f"预览数据发送",
-                        data={"smart_shooter_preview": CameraLiveviewImage},
-                        msg_type="smart_shooter_enable_preview",
-                    )
-                    await conn_manager.send_personal_message(data, websocket)
-        smart_shooter.callback_listen = MsgCallback
-        loop = asyncio.get_event_loop()
-        loop.run_in_executor(None, smart_shooter.connect_listen)  # 后台线程启动监听
-        await asyncio.gather(handler_messages(), send_message())
+        # 创建任务来启动 connect_listen
+        listen_task = asyncio.get_event_loop().run_in_executor(
+            None, smart_shooter.connect_listen
+        )
+
+        # 创建任务来并发处理不同类型的消息
+        handler_task = asyncio.create_task(handler_messages(websocket))
+        send_task = asyncio.create_task(send_message(websocket))
+
+        # 等待所有任务完成
+        await asyncio.gather(listen_task, handler_task, send_task)
+
     except WebSocketDisconnect:
-        # socket_manager.close()
         print("Client disconnected")
     finally:
+        # 确保任务被正确取消
+        if listen_task and not listen_task.done():
+            listen_task.cancel()
         active_connections.discard(websocket)
-        # if websocket:
-        #     await websocket.close()
+
+
+async def start_smart_shooter_listen():
+    """启动 smart_shooter 监听服务"""
+    loop = asyncio.get_event_loop()
+    # 在执行器中运行 connect_listen 方法
+    try:
+        await loop.run_in_executor(None, smart_shooter.connect_listen())
+    except Exception as e:
+        print(f"Smart shooter listen error: {e}")
+
+
+async def handler_messages(websocket):
+    while True:
+        try:
+            byteDats = await websocket.receive()
+            socket_type = byteDats.get("type")
+            if socket_type == "websocket.disconnect":
+                smart_shooter.stop_listen = True
+                smart_shooter.is_init_while = False
+                device_ctrl.close_connect()
+                device_ctrl.mcu_exit = True
+                device_ctrl.p_list = []
+                device_ctrl.temp_ports_dict = {}
+                device_ctrl.clearMyInstance()
+                diviceList = blue_tooth.devices
+                if len(diviceList) == 0:
+                    blue_tooth.bluetooth_exit = True
+                    blue_tooth.clearMyInstance()
+                    break
+                diviceAddress = list(diviceList.keys())[0]
+                if diviceAddress != "":
+                    print(diviceList.get(diviceAddress))
+                    diviceName = diviceList[diviceAddress]["name"]
+                    blue_tooth.disconnect_device(diviceAddress, diviceName)
+                blue_tooth.bluetooth_exit = True
+                blue_tooth.clearMyInstance()
+                print("所有设备已断开连接")
+                break
+            print("byteDats", byteDats)
+            # 使用create_task来避免阻塞消息处理循环
+            asyncio.create_task(
+                handlerSend(
+                    conn_manager, json.dumps(byteDats), websocket, smart_shooter
+                )
+            )
+        except Exception as e:
+            print(e)
+            break
+
+
+async def send_message(websocket):
+    while True:
+        try:
+            # 使用wait()而不是直接get()来避免阻塞
+            message = await asyncio.wait_for(message_queue.get(), timeout=1.0)
+            await websocket.send_json(message)
+        except asyncio.TimeoutError:
+            # 超时继续循环,避免永久阻塞
+            continue
+        except Exception as e:
+            print("socket报错",e)
+            break
+
+
+async def MsgCallback(msg):
+    msg_id = msg.get("msg_id")
+    match msg_id:
+        case "PhotoUpdated":
+            PhotoFilename = msg.get("PhotoFilename")
+            PhotoLocation = msg.get("PhotoLocation")
+            PhotoOrigin = msg.get("PhotoOrigin")
+            if (PhotoFilename != "" and PhotoFilename != None) and (
+                PhotoLocation == "Local Disk"
+            ):
+                # temp_photo_name = PhotoFilename
+                # 更新拍照记录
+                print("PhotoFilename", PhotoFilename, PhotoOrigin)
+                if PhotoOrigin != "" and PhotoOrigin != "external":
+                    goods_art_no, id = PhotoOrigin.split(",")
+                    # 创建任务来处理数据库更新,避免阻塞回调
+                    asyncio.create_task(updateDataRecord(PhotoFilename, id))
+                data = conn_manager.jsonMessage(
+                    code=0,
+                    msg=f"照片获取成功",
+                    data={"photo_file_name": PhotoFilename},
+                    msg_type="smart_shooter_photo_take",
+                )
+                await conn_manager.send_personal_message(data, smart_shooter.websocket)
+        case "LiveviewUpdated":
+            CameraLiveviewImage = msg.get("CameraLiveviewImage", None)
+            # base64_to_image(CameraLiveviewImage, "liveview.jpg")
+            # print("收到直播画面:CameraLiveviewImage")
+            data = conn_manager.jsonMessage(
+                code=1,
+                msg=f"预览数据发送",
+                data={"smart_shooter_preview": CameraLiveviewImage},
+                msg_type="smart_shooter_enable_preview",
+            )
+            await conn_manager.send_personal_message(data, smart_shooter.websocket)
+
+
+# 初始化回调函数
+smart_shooter.callback_listen = MsgCallback
 
 # @app.on_event("startup")
 # async def startup_event():
 #     loop = asyncio.get_event_loop()
 #     loop.run_in_executor(None, await smart_shooter.connect_listen)
 #     print("监听服务已启动")
+
+
 @app.on_event("shutdown")
 async def shutdown_event():
     print("Shutting down...")