rambo 6 месяцев назад
Родитель
Сommit
af8f7b109f

+ 15 - 17
python/mcu/DeviceControl.py

@@ -340,8 +340,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             print("send_data_queue  append  :{}".format(data))
             self.send_data_queue.append(data)
         self.lock.release()
-    def send_all_cmd(self):
+    async def send_all_cmd(self):
         while True:
+            await asyncio.sleep(0.01)
             if self.send_data_queue:
                 self.sendSocketMessage(msg="正在发送命令", device_status=1)
                 data = self.send_data_queue.pop(0)
@@ -1272,8 +1273,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.sendSocketMessage(code=1, msg="mcu 非停止状态", device_status=1)
         return True
 
-    def controlDevice(self, device_name, value):
+    async def controlDevice(self, device_name, value):
         '''控制设备移动等'''
+        await asyncio.sleep(0.01)
         if not self.is_running:
             self.sendSocketMessage(
                 code=1, msg="mcu设备未连接,请先连接设备", device_status=0
@@ -1338,19 +1340,15 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     device_name="laser_position", value=0 if int(value) <= 0 else 1
                 )
             case "take_picture":
-                loop = asyncio.get_event_loop()
-                if value>0:
-                    # 指定自动对焦
-                    loop.create_task(
-                        self.smart_shooter.CameraAutofocus(),
-                        name="CameraAutofocus",
-                    )
+                # loop = asyncio.get_event_loop()
+                # if value>0:
+                #     # 指定自动对焦
+                #     loop.create_task(
+                #         self.smart_shooter.CameraAutofocus(),
+                #         name="CameraAutofocus",
+                #     )
                 # 拍照
-                print("smart shooter 拍照")
-                loop.create_task(
-                    self.smart_shooter.CameraShooter(msg_type="run_mcu"),
-                    name="CameraShooter",
-                )
+                await self.smart_shooter.CameraShooter(msg_type="run_mcu")
             case "to_deal_device":
                 self.to_deal_device(device_name, value=value, _type=0, times=1)
             case _:
@@ -1429,7 +1427,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     ),
                 },
             )
-            self.controlDevice("laser_position", 0)
+            await self.controlDevice("laser_position", 0)
             self.msg_type = "mcu"
             self.is_runn_action = True
             for index, action in enumerate(config_list):
@@ -1460,7 +1458,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     print("action异常终止")
                     break
                 self.msg_type = "photo_take"
-                if not program_item.run(total_len):
+                if not await program_item.run(total_len):
                     self.sendSocketMessage(
                         code=1,
                         msg="{} 执行失败~".format(program_item.action_name),
@@ -1490,7 +1488,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 device_status=2,
             )
             self.msg_type = "mcu"
-            self.controlDevice("laser_position", 1)
+            await self.controlDevice("laser_position", 1)
 
     async def run_mcu_config_single(self, config_info, goods_art_no,msg_type="run_mcu_single_finish",image_index=-1,smart_shooter=None,action_id=-1):
         '''独立拍照  仅作测试用'''

+ 16 - 18
python/mcu/ProgramItem.py

@@ -142,7 +142,7 @@ class ProgramItem(BaseClass):
         #     self.ui_retry.setEnabled(True)
         #     self.ui_action_name.setToolTip(self.error_info_text)
 
-    def check_mcu_move_is_stop(self, re_check=False):
+    async def check_mcu_move_is_stop(self, re_check=False):
         self.error_info_text = ""
         # 发送基础数据信息
         # self.mcu.to_get_mcu_base_info()
@@ -150,6 +150,7 @@ class ProgramItem(BaseClass):
         last_num_1 = self.mcu.last_mcu_info_data["num"]
         self.mcu.cleanAllReceiveData()
         while 1:
+            await asyncio.sleep(0.01)
             if self.mcu.action_state != 1:
                 # 外部终止,停止运行
                 return False
@@ -167,7 +168,7 @@ class ProgramItem(BaseClass):
                 return True
             else:
                 self.mcu.to_get_mcu_base_info()
-                self.mcu.send_all_cmd()
+                await self.mcu.send_all_cmd()
                 time.sleep(0.5)
                 self.mcu.get_basic_info_mcu()
                 # return True
@@ -175,7 +176,7 @@ class ProgramItem(BaseClass):
             time.sleep(0.1)
             # self.mcu.to_get_mcu_base_info()
 
-    def run(self, total_len=5, *args):
+    async def run(self, total_len=5, *args):
         if total_len == 1:
             self.mode_type = "其他配置"
             self.set_other()
@@ -183,10 +184,10 @@ class ProgramItem(BaseClass):
         print("1{}  - is run".format(self.action_name))
         self.set_state(state_value=1)
         if settings.IS_TEST:
-            self.do_run()
+            await self.do_run()
         else:
             try:
-                self.do_run()
+                await self.do_run()
             except BaseException as e:
                 self.sendSocketMessage(
                     msg="p_item 错误:{}".format(e), device_status=-1
@@ -225,13 +226,14 @@ class ProgramItem(BaseClass):
                 time.sleep(0.1)
             self.mcu.send_all_cmd()
 
-    def do_run(self, *args):
+    async def do_run(self, *args):
+        await asyncio.sleep(0.01)
         # if not self.goods_art_no:  # and self.action_name != "初始化位置"
         #     return False
         start_time = time.time()
         # ============连接MCU 处理步进电机与舵机等
         if settings.IS_MCU:
-            if self.mode_type != "其他配置" and self.check_mcu_move_is_stop() is False:
+            if self.mode_type != "其他配置" and await self.check_mcu_move_is_stop() is False:
                 # MCU运动是否有停止检查,设定超时时间
                 return
             print(
@@ -272,11 +274,11 @@ class ProgramItem(BaseClass):
                 # time.sleep(0.1)
 
             # MCU运动是否有停止检查,设定超时时间
-            self.mcu.send_all_cmd()
+            await self.mcu.send_all_cmd()
             if self.mode_type != "其他配置":
                 time.sleep(1.2)
                 print("二次检查")
-                if self.check_mcu_move_is_stop(re_check=True) is False:
+                if await self.check_mcu_move_is_stop(re_check=True) is False:
                     print("MCU检测运动未停止,自动退出,   提前退出")
                     return
 
@@ -288,7 +290,6 @@ class ProgramItem(BaseClass):
             # 用于临时拍照计数
             is_af = True if self.af_times > 0 else False
             if self.smart_shooter != None:
-                loop = asyncio.get_event_loop()
                 # 拍照
                 print("smart shooter 拍照")
                 record_id = self.record_id
@@ -296,14 +297,11 @@ class ProgramItem(BaseClass):
                 if record_id == -1:
                     goods_art_no = ""
                 print("smart shooter CameraShooter")
-                loop.create_task(
-                    self.smart_shooter.CameraShooter(
-                        msg_type="run_mcu",
-                        goods_art_no=goods_art_no,
-                        id=record_id,
-                        is_af=is_af,
-                    ),
-                    name="CameraShooter",
+                await self.smart_shooter.CameraShooter(
+                    msg_type="run_mcu",
+                    goods_art_no=goods_art_no,
+                    id=record_id,
+                    is_af=is_af,
                 )
                 print("smart shooter CameraShooter end")
             else:

+ 59 - 42
python/mcu/capture/smart_shooter_class.py

@@ -41,7 +41,7 @@ class SmartShooter(metaclass=SingletonType):
         json_msg = json.loads(str_msg)
         return json_msg
 
-    def __create_req(self,time_out=5) -> tuple[zmq.Socket, zmq.Context]:
+    def __create_req(self, time_out=5) -> tuple[zmq.Socket, zmq.Context]:
         context = zmq.Context()
         req_socket = context.socket(zmq.REQ)
         # 设置发送超时为 5000 毫秒(5 秒)
@@ -84,15 +84,15 @@ class SmartShooter(metaclass=SingletonType):
                 msg_send = "相机未连接或软件未打开"
                 if is_send:
                     message = {
-                            "code": 1,
-                            "msg": msg_send,
-                            "data": msg_result,
-                            "msg_type": self.msg_type,
-                            "device_status": -1,
-                        }
+                        "code": 1,
+                        "msg": msg_send,
+                        "data": msg_result,
+                        "msg_type": self.msg_type,
+                        "device_status": -1,
+                    }
                     await self.websocket_manager.send_personal_message(
-                            message, self.websocket
-                        )
+                        message, self.websocket
+                    )
                 return False, msg_send
             cameraInfo = json_msg.get("CameraInfo")
             if cameraInfo == None or len(cameraInfo) == 0:
@@ -100,50 +100,50 @@ class SmartShooter(metaclass=SingletonType):
                 msg_send = "相机未连接"
                 if is_send:
                     message = {
-                            "code": 1,
-                            "msg": msg_send,
-                            "data": msg_result,
-                            "msg_type": self.msg_type,
-                            "device_status": -1,
-                        }
+                        "code": 1,
+                        "msg": msg_send,
+                        "data": msg_result,
+                        "msg_type": self.msg_type,
+                        "device_status": -1,
+                    }
                     await self.websocket_manager.send_personal_message(
-                            message, self.websocket
-                        )
+                        message, self.websocket
+                    )
                 return False, "相机未连接"
             # 链接的相机
             # connect_camera = cameraInfo
             CameraStatus = any(
-                    item.get("CameraStatus") in ["Ready", "Busy"] for item in cameraInfo
-                )
+                item.get("CameraStatus") in ["Ready", "Busy"] for item in cameraInfo
+            )
             # CameraStatus = connect_camera.get("CameraStatus")
             if not CameraStatus:
                 self.connect_status = False
                 msg_send = "相机未连接"
                 if is_send:
                     message = {
-                            "code": 1,
-                            "msg": msg_send,
-                            "data": msg_result,
-                            "msg_type": self.msg_type,
-                            "device_status": -1,
-                        }
+                        "code": 1,
+                        "msg": msg_send,
+                        "data": msg_result,
+                        "msg_type": self.msg_type,
+                        "device_status": -1,
+                    }
                     await self.websocket_manager.send_personal_message(
-                            message, self.websocket
-                        )
+                        message, self.websocket
+                    )
                 return False, msg_send
             self.connect_status = True
             msg_send = "相机已连接"
             if is_send:
                 message = {
-                        "code": 0,
-                        "msg": msg_send,
-                        "data": msg_result,
-                        "msg_type": self.msg_type,
-                        "device_status": 2,
-                    }
+                    "code": 0,
+                    "msg": msg_send,
+                    "data": msg_result,
+                    "msg_type": self.msg_type,
+                    "device_status": 2,
+                }
                 await self.websocket_manager.send_personal_message(
-                        message, self.websocket
-                    )
+                    message, self.websocket
+                )
             return True, "相机已连接"
         except zmq.Again:
             print("获取相机信息超时,继续监听...")
@@ -161,7 +161,7 @@ class SmartShooter(metaclass=SingletonType):
                 )
             return False, msg_send
         except Exception as e:
-            print("拍照异常",e)
+            print("拍照异常", e)
             self.connect_status = False
             socket.close()
             context.term()
@@ -261,7 +261,7 @@ class SmartShooter(metaclass=SingletonType):
             context.term()
             return False, "相机未连接或软件未打开"
 
-    async def CameraShooter(self, msg_type="", goods_art_no="", id=0,is_af=False):
+    async def CameraShooter(self, msg_type="", goods_art_no="", id=0, is_af=False):
         # 对焦混用
         if is_af:
             await self.CameraAutofocus()
@@ -270,10 +270,10 @@ class SmartShooter(metaclass=SingletonType):
         """
         执行拍照
         """
-        # camera_states, _ = await self.GetCameraInfo(is_send=False)
-        # print("camera_states CameraShooter", camera_states)
-        # if not camera_states:
-        #     return False, "请先连接相机"
+        camera_states, _ = await self.GetCameraInfo(is_send=True)
+        print("camera_states CameraShooter", camera_states)
+        if not camera_states:
+            return False, "请先连接相机"
         try:
             socket, context = self.__create_req()
             req = {}
@@ -310,10 +310,27 @@ class SmartShooter(metaclass=SingletonType):
                 "msg_type": self.msg_type,
                 "device_status": 2,
             }
+            msg_send = "相机未连接或软件未打开"
+            message = {
+                "code": 1,
+                "msg": msg_send,
+                "data": None,
+                "msg_type": self.msg_type,
+                "device_status": -1,
+            }
             await self.websocket_manager.send_personal_message(message, self.websocket)
             return True, "拍照成功"
         except zmq.Again:
-            print("拍照超时,继续监听...")
+            msg_send = "相机未连接或软件未打开"
+            message = {
+                "code": 1,
+                "msg": msg_send,
+                "data": {goods_art_no: goods_art_no, "id": id},
+                "msg_type": self.msg_type,
+                "device_status": -1,
+            }
+            await self.websocket_manager.send_personal_message(message, self.websocket)
+            return True, "拍照失败"
         except:
             socket.close()
             context.term()

+ 1 - 1
python/sockets/message_handler.py

@@ -131,7 +131,7 @@ async def handlerSend(
             device_ctrl = DeviceControl(
                 websocket_manager=manager, smart_shooter=smart_shooter
             )
-            device_ctrl.controlDevice(device_name, value)
+            await device_ctrl.controlDevice(device_name, value)
         case "stop_action":
             device_ctrl = DeviceControl(
                 websocket_manager=manager, smart_shooter=smart_shooter