浏览代码

连接问题

rambo 4 月之前
父节点
当前提交
b6f112abc3
共有 1 个文件被更改,包括 118 次插入71 次删除
  1. 118 71
      python/mcu/DeviceControl.py

+ 118 - 71
python/mcu/DeviceControl.py

@@ -20,7 +20,10 @@ from .LineControl import LineControl
 import copy
 import logging
 from mcu.capture.smart_shooter_class import SmartShooter
+
 logger = logging.getLogger(__name__)
+
+
 # mcu命令
 class DeviceControl(BaseClass, metaclass=SingletonType):
     lock = threading.Lock()
@@ -28,7 +31,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
     def __init__(
         self, websocket_manager: ConnectionManager, smart_shooter: SmartShooter = None
     ):
-        super().__init__(websocket_manager=websocket_manager,smart_shooter=smart_shooter)
+        super().__init__(
+            websocket_manager=websocket_manager, smart_shooter=smart_shooter
+        )
         self.msg_type = "mcu"
         self.mcu_deviation_set = McuDeviationSet(self)
         self.mcu_other_set = OtherSet(self)
@@ -122,14 +127,16 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             100: self.print_mcu_error_data,  # 打印下位机的错误内容
         }
 
-    async def sendCommand(self,command):
+    async def sendCommand(self, command):
         await asyncio.sleep(0.01)
         loop = asyncio.get_event_loop()
         loop.create_task(self.debug_uart.set(command), name="sendCommand2")
+
     async def getMcuOtherInfo(self):
         await asyncio.sleep(0.01)
         self.get_other_info()
-    async def setMcuOtherInfo(self,data):
+
+    async def setMcuOtherInfo(self, data):
         await asyncio.sleep(0.01)
         for k, v in data.items():
             print("k:{},v:{}".format(k, v))
@@ -144,7 +151,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         )
         self.msg_type = "mcu"
 
-    def setOtherMaxMinValue(self,item, value):
+    def setOtherMaxMinValue(self, item, value):
         value = int(value)
         parameter_limits = {
             "is_auto_send_base_info": (0, 10000),
@@ -170,19 +177,19 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         value = max(min_value, min(max_value, value))
         return value
 
-    async def initDevice(self,is_force=False):
+    async def initDevice(self, is_force=False):
         if not self.is_running:
             self.sendSocketMessage(
                 code=1, msg="mcu设备未连接,请先连接设备", device_status=0
             )
             return False
-        if self.init_state ==True:
+        if self.init_state == True:
             print("已经初始化过,请勿重复初始化")
             logger.info("已经初始化过,请勿重复初始化")
             self.sendSocketMessage(msg="设备初始化完成", device_status=2)
             return False
         self.serial_ins.clearn_flush()
-        self.to_init_device_origin_point(device_name="mcu",is_force=is_force)
+        self.to_init_device_origin_point(device_name="mcu", is_force=is_force)
         print("MCU 开始循环~")
         logger.info("MCU 开始循环~")
         while 1:
@@ -213,15 +220,15 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         logger.info("MCU 循环退出~")
         print("串口未连接,请检查")
         logger.info("串口未连接,请检查")
+        self.sendSocketMessage(code=1, msg="MCU串口未连接,请检查", device_status=-1)
+        message = {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
         self.sendSocketMessage(
-            code=1, msg="MCU串口未连接,请检查", device_status=-1
+            code=1, msg="MCU 连接失败", data=message, device_status=-1
         )
-        message = {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
-        self.sendSocketMessage(code=1, msg="MCU 连接失败", data=message,device_status=-1)
         self.close_connect()
 
-    async def initControlLine(self,serial_handle):
-        '''实例化有线控制设备'''
+    async def initControlLine(self, serial_handle):
+        """实例化有线控制设备"""
         self.line_control.connect_state = True
         self.line_control.serial_ins = serial_handle
         await self.line_control.run()
@@ -362,7 +369,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.add_send_data_queue(data)
         # self.controlDevice(device_name, deviation)
 
-    async def set_deviation_cmd(self,value,action_name,type):
+    async def set_deviation_cmd(self, value, action_name, type):
         await asyncio.sleep(0.01)
         name_sets = [
             "相机电机",  # min 0 max 400,步长1
@@ -376,7 +383,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         ]
         if action_name not in name_sets:
             self.msg_type = f"{type}_deviation"
-            self.sendSocketMessage(msg="设置参数有误,请检查", device_status=0,code=1)
+            self.sendSocketMessage(msg="设置参数有误,请检查", device_status=0, code=1)
             self.msg_type = "mcu"
             return
         # 发送获取偏移量
@@ -385,8 +392,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         elif type == "set":
             self.mcu_deviation_set.set_deviation(action_name)
         self.msg_type = f"{type}_deviation"
-        self.sendSocketMessage(msg=f"{action_name} 设置成功", device_status=2,code=0)
+        self.sendSocketMessage(msg=f"{action_name} 设置成功", device_status=2, code=0)
         self.msg_type = "mcu"
+
     def get_other_info(self):
         # 发送获取偏移量
         data = [self.command["get_other_info"], 1]
@@ -398,9 +406,10 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.lock.acquire()
         if self.serial_ins:
             print("send_data_queue  append  :{}".format(data))
-            logger.info("send_data_queue  append  %s",data)
+            logger.info("send_data_queue  append  %s", data)
             self.send_data_queue.append(data)
         self.lock.release()
+
     async def send_all_cmd(self):
         await asyncio.sleep(0.001)
         while True:
@@ -411,6 +420,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 self.sendSocketMessage(msg="命令发送完成", device_status=2)
             else:
                 break
+
     def send_cmd(self):
         self.lock.acquire()
         if self.send_data_queue:
@@ -439,7 +449,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             logger.info("115  print_mcu_error_data:%s", data)
         except BaseException as e:
             print("117 error {}".format(e))
-            logger.info("117 error %s",e)
+            logger.info("117 error %s", e)
         return
 
     def get_from_mcu_move_respond_data(self, receive_data):
@@ -524,6 +534,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             receive_data = self.serial_ins.read_cmd(out_time=1)
             if not receive_data:
                 break
+
     def get_basic_info_mcu(self):
         receive_data = self.serial_ins.read_cmd(out_time=1)
         if receive_data is False:
@@ -675,11 +686,15 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         # 初始化偏移量信息
         camera_high_motor_deviation = get_deviation_data["camera_high_motor_deviation"]
         camera_steering_deviation = get_deviation_data["camera_steering_deviation"]
-        turntable_steering_deviation = get_deviation_data["turntable_steering_deviation"]
-        overturn_steering_middle=get_deviation_data["overturn_steering_middle"]
+        turntable_steering_deviation = get_deviation_data[
+            "turntable_steering_deviation"
+        ]
+        overturn_steering_middle = get_deviation_data["overturn_steering_middle"]
         overturn_steering_high = get_deviation_data["overturn_steering_high"]
         overturn_steering_up_speed = get_deviation_data["overturn_steering_up_speed"]
-        overturn_steering_down_speed = get_deviation_data["overturn_steering_down_speed"]
+        overturn_steering_down_speed = get_deviation_data[
+            "overturn_steering_down_speed"
+        ]
         self.mcu_deviation_set.last_value["相机电机"] = camera_high_motor_deviation
         self.mcu_deviation_set.last_value["相机舵机"] = camera_steering_deviation
         self.mcu_deviation_set.last_value["转盘舵机"] = turntable_steering_deviation
@@ -766,7 +781,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.last_mcu_other_info_data["num"] += 1
         for k, v in self.last_mcu_other_info_data["data"].items():
             print("k:{},v:{}".format(k, v))
-            logger.info("k:%s,v:%s",k, v)
+            logger.info("k:%s,v:%s", k, v)
         self.msg_type = "get_mcu_other_info"
         self.sendSocketMessage(
             code=0,
@@ -869,7 +884,15 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 },
             }
             # if self.state_camera_motor
-            if all(value == 2 for value in [self.state_camera_motor, self.state_camera_steering, self.state_turntable_steering, self.state_overturn_steering]):
+            if all(
+                value == 2
+                for value in [
+                    self.state_camera_motor,
+                    self.state_camera_steering,
+                    self.state_turntable_steering,
+                    self.state_overturn_steering,
+                ]
+            ):
                 self.init_state = True
                 self.sendSocketMessage(msg="设备初始化完成", device_status=2)
             self.sendSocketMessage(msg="获取mcu设备运行状态信息", data=message)
@@ -925,16 +948,26 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         }
         self.sendSocketMessage(1, "串口被移除", data)
 
+    def is_serial_available(self, port):
+        try:
+            ser = serial.Serial(port)
+            ser.close()
+            return True
+        except serial.serialException:
+            return False
+
     async def add_port_by_linkage(self, port_name):
         # port_value :串口基础信息
         # todo 根据prot_value 信息自动进行连接
         print("add port_name", port_name)
         logger.info("add port_name %s", port_name)
-        print("self.port_name",self.port_name)
+        print("self.port_name", self.port_name)
         logger.info("self.port_name %s", self.port_name)
-        if self.port_name == port_name:
-            return False
+        # if self.port_name == port_name:
+        #     return True
         # 对没有连接的设备进行尝试连接
+        # 如果存在串口被占用则进行断开
+        self.is_serial_available(port_name)
         message_data = {
             "_type": "show_info",
             "plugins_mode": "auto_select_com",
@@ -964,7 +997,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 device_status=-1,
             )
             print("串口:{} 被占用".format(port_name))
-            logger.info("串口:%s 被占用",port_name)
+            logger.info("串口:%s 被占用", port_name)
+            if self.serial_ins.serial_handle is not None:
+                self.serial_ins.serial_handle.close()
             return False
 
         await asyncio.sleep(2)
@@ -1012,14 +1047,14 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 device_id = receive_data[2]
 
         print("关闭串口:{}".format(port_name))
-        logger.info("关闭串口:%s",port_name)
+        logger.info("关闭串口:%s", port_name)
         serial_handle.close()
         loop = asyncio.get_event_loop()
         print("device_id============>>>", device_id)
         logger.info("device_id============>>>%s", device_id)
         if device_id > 0:
             if device_id == 1:
-                state,_=self.to_connect_com(port_name)
+                state, _ = self.to_connect_com(port_name)
                 if not state:
                     return False
                 message_data = {
@@ -1083,7 +1118,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             logger.info("串口无法识别")
             self.sendSocketMessage(
                 code=1,
-                msg="串口无法识别,请重新插拔拍照机USB", data=message_data, device_status=-1
+                msg="串口无法识别,请重新插拔拍照机USB",
+                data=message_data,
+                device_status=-1,
             )
             return False
             # 走其他途径处理
@@ -1092,8 +1129,10 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         # 正常跳过;记录为其他列表
         # 不正常进行尝试连接
         # 连接不上,记录为其他列表
+
     def clearMyInstance(self):
         SingletonType.clear_instance()
+
     def to_connect_com(self, port_name):
         # 关闭串口
         print("to_connect_com", port_name)
@@ -1114,7 +1153,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 )
                 self.serial_ins = None
                 self.connect_state = False
-                return False,None
+                return False, None
 
         except:
             message_data = {
@@ -1153,7 +1192,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 "409  receive_data--90:{}".format(self.change_hex_to_int(receive_data))
             )
             logger.info(
-                "409  receive_data--90:%s",str(self.change_hex_to_int(receive_data))
+                "409  receive_data--90:%s", str(self.change_hex_to_int(receive_data))
             )
         else:
             return False, None
@@ -1169,7 +1208,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 except:
                     mcu_has_been_set = 99  # 未知状态
                 print("MCU初始化信息{}".format(mcu_has_been_set))
-                logger.info("MCU初始化信息%s",str(mcu_has_been_set))
+                logger.info("MCU初始化信息%s", str(mcu_has_been_set))
                 message_data = {
                     "_type": "show_info",
                     "plugins_mode": "mcu",
@@ -1290,8 +1329,8 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         """
         此处输入单位为 毫米,以及度  需要先缩小,再放大
         """
-        print("移动",time.time())
-        logger.info("移动,%s",time.time())
+        print("移动", time.time())
+        logger.info("移动,%s", time.time())
         speed = settings.moveSpeed()
 
         cmd = 1
@@ -1299,8 +1338,8 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         # if device_id != 1:
         #     print("F非MCU设备,禁止处理")
         #     return
-        print("正在执行",device_name)
-        logger.info("正在执行 %s",device_name)
+        print("正在执行", device_name)
+        logger.info("正在执行 %s", device_name)
         match device_name:
             case "camera_high_motor":
                 # value 单位毫米
@@ -1367,8 +1406,8 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         _dir = True if value >= 0 else False
 
         value = int(abs(value * 10))  # 此处value赋值后,单位为mm以及0.1度
-        print("准备执行",device_name, value)
-        logger.info("准备执行,%s %s",device_name, value)
+        print("准备执行", device_name, value)
+        logger.info("准备执行,%s %s", device_name, value)
         data = [
             cmd,
             device_id,
@@ -1411,9 +1450,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         if self.state != 2:
             print("check_before_action 设备正在运行中~")
             logger.info("check_before_action 设备正在运行中~")
-            self.sendSocketMessage(
-                code=1, msg="设备正在运行中", device_status=1
-            )
+            self.sendSocketMessage(code=1, msg="设备正在运行中", device_status=1)
             return False
 
         if self.mcu_move_state != 2:
@@ -1424,7 +1461,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         return True
 
     async def controlDevice(self, device_name, value):
-        '''控制设备移动等'''
+        """控制设备移动等"""
         await asyncio.sleep(0.01)
         if not self.is_running:
             self.sendSocketMessage(
@@ -1432,9 +1469,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             )
             return False
         if not self.init_state:
-            self.sendSocketMessage(
-                code=1, msg="mcu设备未初始化", device_status=4
-            )
+            self.sendSocketMessage(code=1, msg="mcu设备未初始化", device_status=4)
             return False
         _is_debug = 1 if settings.IS_DEBUG == "true" else 0
         is_deviation = 0 if settings.IS_DEBUG == "true" else 1
@@ -1506,6 +1541,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 pass
             # case "photograph":
             #     self.photograph(goods_art_no=None)
+
     def checkDevice(self):
         print("检查设备是否运行中")
         logger.info("检查设备是否运行中")
@@ -1556,7 +1592,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     image_counts += 1
                     # 批量插入
                     image_deal_mode = 0 if action_info == "执行左脚程序" else 1
-                    state,record_id = await insert_photo_records(
+                    state, record_id = await insert_photo_records(
                         image_deal_mode=image_deal_mode,
                         goods_art_no=goods_art_no,
                         image_index=idx,
@@ -1644,7 +1680,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     #  最后一个初始化处理
                     pass
                 # self.action_state = 2
-            if self.is_stop_action==True:
+            if self.is_stop_action == True:
                 self.msg_type = "run_mcu_stop"
                 self.sendSocketMessage(
                     code=0,
@@ -1663,8 +1699,16 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.msg_type = "mcu"
             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):
-        '''独立拍照  仅作测试用'''
+    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,
+    ):
+        """独立拍照  仅作测试用"""
         await asyncio.sleep(0.01)
         if self.checkDevice() == False:
             return
@@ -1674,14 +1718,14 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.action_state = 1
             self.msg_type = "mcu"
             program_item = ProgramItem(
-                    websocket_manager=self.websocket_manager,
-                    action_data=config_info,
-                    mcu=self,
-                    goods_art_no=goods_art_no,
-                    image_index=image_index,
-                    smart_shooter=smart_shooter,
-                    record_id=action_id,
-                )
+                websocket_manager=self.websocket_manager,
+                action_data=config_info,
+                mcu=self,
+                goods_art_no=goods_art_no,
+                image_index=image_index,
+                smart_shooter=smart_shooter,
+                record_id=action_id,
+            )
             if self.action_state != 1:
                 # 异常终止
                 print("action异常终止")
@@ -1700,10 +1744,10 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             self.action_state = 2
             self.msg_type = msg_type
             self.sendSocketMessage(
-                    code=0,
-                    msg=f"执行完成",
-                    device_status=2,
-                )
+                code=0,
+                msg=f"执行完成",
+                device_status=2,
+            )
             self.msg_type = "mcu"
         else:
             self.sendSocketMessage(
@@ -1712,8 +1756,10 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
 
     async def only_take_photo(self, goods_art_no, image_index, record_id):
         await asyncio.sleep(0.1)
-        print("only_take_photo=====>",goods_art_no, image_index, record_id)
-        logger.info("only_take_photo=====> %s %s %s",goods_art_no, image_index, record_id)
+        print("only_take_photo=====>", goods_art_no, image_index, record_id)
+        logger.info(
+            "only_take_photo=====> %s %s %s", goods_art_no, image_index, record_id
+        )
         if goods_art_no == "":
             print("only_take_photo 数据查询异常")
             logger.info("only_take_photo 数据查询异常")
@@ -1743,12 +1789,13 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
         device_ctrl.device_status = 2
         device_ctrl.sendSocketMessage(code=0, msg="MCU连接成功", data=message)
         return
-    # if device_ctrl.is_init_while == True:
-    #     device_ctrl.sendSocketMessage(
-    #         code=0, msg="MCU<<<---连接成功--->>>,is_init_while", data={}
-    #     )
-    #     return
-    # device_ctrl.is_init_while = True
+    if device_ctrl.is_init_while == True:
+        logger.info("mcu 初始化循环已创建,请勿重复创建")
+        device_ctrl.sendSocketMessage(
+            code=0, msg="mcu 初始化循环已创建,请勿重复创建", data={}
+        )
+        return
+    device_ctrl.is_init_while = True
     """实时检测串口是否连接"""
     while True:
         await asyncio.sleep(1)
@@ -1757,7 +1804,7 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
         ports_dict = device_ctrl.scan_serial_port()
         device_ctrl.temp_ports_dict = ports_dict
         # print("device_ctrl.p_list", device_ctrl.p_list)
-        # logger.info("device_ctrl.p_list %s", device_ctrl.p_list)
+        logger.info("device_ctrl.p_list %s", device_ctrl.p_list)
         if not ports_dict:
             # 全部清空 移除所有串口
             if device_ctrl.p_list:
@@ -1784,7 +1831,7 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
         #     device_ctrl.sendSocketMessage(
         #         code=1, msg="串口未连接,请检查", device_status=-1
         #     )
-    # device_ctrl.is_init_while = False
+    device_ctrl.is_init_while = False
     # device_ctrl.p_list = []
     # device_ctrl.temp_ports_dict = {}
     print("MCU断开连接,已释放")