Sfoglia il codice sorgente

消息阻塞问题

rambo 4 mesi fa
parent
commit
0faf4054c8

+ 26 - 5
python/mcu/BaseClass.py

@@ -3,6 +3,7 @@ from sockets import ConnectionManager
 from utils.common import message_queue
 from mcu.capture.smart_shooter_class import SmartShooter
 
+
 class BaseClass:
 
     def __init__(
@@ -11,10 +12,11 @@ class BaseClass:
         self.websocket_manager = websocket_manager
         self.smart_shooter = smart_shooter
         self.msg_type = ""
+        self.websocket = None
         # -1连接失败  0未连接 1连接中  2连接成功  3端口占用
         # self.device_status = 2
 
-    def sendSocketMessage(self, code=0, msg="", data=None,device_status=2):
+    def sendSocketMessage(self, code=0, msg="", data=None, device_status=2):
         data = {
             "code": code,
             "msg": msg,
@@ -23,9 +25,28 @@ class BaseClass:
             "msg_type": self.msg_type,
         }
         loop = asyncio.get_event_loop()
-        loop.create_task(message_queue.put(data))
-    def change_hex_to_int(self,_bytearray):
-        return ' '.join([hex(x) for x in _bytearray])
+        if self.websocket == None:
+            loop.create_task(message_queue.put(data))
+        else:
+            loop.create_task(
+                self.websocket_manager.send_personal_message(data, self.websocket)
+            )
+
+    async def asyncSendSocketMessage(self, code=0, msg="", data=None, device_status=2):
+        data = {
+            "code": code,
+            "msg": msg,
+            "status": device_status,
+            "data": data,
+            "msg_type": self.msg_type,
+        }
+        if self.websocket == None:
+            await asyncio.wait_for(message_queue.put(data), timeout=0.1)
+        else:
+            await self.websocket_manager.send_personal_message(data, self.websocket)
+
+    def change_hex_to_int(self, _bytearray):
+        return " ".join([hex(x) for x in _bytearray])
 
     def read_cmd(self, serial_handle, check=None):
         n = 0
@@ -82,7 +103,7 @@ class BaseClass:
                         else:
                             self.receive_data = self.receive_data[1:]
 
-    def write_cmd(self, serial_handle,data: list):
+    def write_cmd(self, serial_handle, data: list):
         if serial_handle:
             # data = [(0xff & par1), (0xff & (par1 >> 8))]
             # self.clearn_flush()

+ 0 - 1
python/mcu/BlueToothMode.py

@@ -30,7 +30,6 @@ class BlueToothMode(BaseClass, metaclass=SingletonType):
         self.remote_control_v2 = RemoteControlV2(self, websocket_manager)
         # 用于存储找到的目标设备的地址
         self.target_device_address = None
-
         self._lock = threading.Lock()
         self.connect_state = False
         self.receive_data = b""

+ 4 - 2
python/mcu/DeviceControl.py

@@ -1686,18 +1686,20 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 print("action异常终止")
                 logger.info("action异常终止")
                 return
-            self.msg_type = "photo_take"
+            self.msg_type = "run_mcu_single"
             program_item.smart_shooter = smart_shooter
             await program_item.run(3)
+            self.msg_type = "mcu"
+            print("发送 run_mcu_signle消息","{} 执行完成~".format(program_item.action_name))
             self.sendSocketMessage(
                 code=0,
                 msg="{} 执行完成~".format(program_item.action_name),
                 data={"goods_art_no": goods_art_no, "id": action_id},
                 device_status=2,
             )
-            self.msg_type = "mcu"
             self.action_state = 2
             self.msg_type = msg_type
+            print("发送 run_mcu_signle消息", "执行完成")
             self.sendSocketMessage(
                 code=0,
                 msg=f"执行完成",

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

@@ -502,7 +502,7 @@ class SmartShooter(metaclass=SingletonType):
                 future = asyncio.ensure_future(self.asyncMessageListen())
                 # 运行任务,但设置超时以避免无限等待
                 self.listen_loop.run_until_complete(
-                    asyncio.wait_for(future, timeout=0.1)
+                    asyncio.wait_for(future, timeout=0.5)
                 )
             except asyncio.TimeoutError:
                 # 超时是正常的,表示没有消息需要处理

+ 2 - 0
python/sockets/socket_server.py

@@ -41,6 +41,8 @@ async def websocket_endpoint(websocket: WebSocket):
     await conn_manager.connect(websocket)
     active_connections.add(websocket)
     smart_shooter.websocket = websocket
+    device_ctrl.websocket = websocket
+    blue_tooth.websocket = websocket
 
     # 启动 smart_shooter.connect_listen 服务
     listen_task = None