浏览代码

Merge branch 'dev-python' into smart-shooter-merge

rambo 4 月之前
父节点
当前提交
88ea947a53
共有 4 个文件被更改,包括 347 次插入33 次删除
  1. 102 26
      python/mcu/DeviceControl.py
  2. 244 0
      python/mcu/LineControl.py
  3. 0 5
      python/mcu/McuDeviationSet.py
  4. 1 2
      python/mcu/RemoteControlV2.py

+ 102 - 26
python/mcu/DeviceControl.py

@@ -15,6 +15,7 @@ from databases import insert_photo_records
 from .McuDeviationSet import McuDeviationSet
 from .OtherSet import OtherSet
 from .DebugUart import DebugUart
+from .LineControl import LineControl
 import copy
 from mcu.capture.smart_shooter_class import SmartShooter
 # mcu命令
@@ -29,6 +30,8 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.mcu_deviation_set = McuDeviationSet(self)
         self.mcu_other_set = OtherSet(self)
         self.debug_uart = DebugUart(self)
+        self.debug_uart = DebugUart(self)
+        self.line_control = LineControl(websocket_manager)
         self.m_t = 1
         # 0未开始  1进行中 2已结束  99异常
         self.action_state = 2
@@ -201,6 +204,44 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.sendSocketMessage(code=1, msg="MCU 连接失败", data=message,device_status=-1)
         self.close_connect()
 
+    async def initControlLine(self,serial_handle):
+        '''实例化有线控制设备'''
+        self.line_control.connect_state = True
+        self.line_control.serial_ins = serial_handle
+        await self.line_control.run()
+        # if self.init_state == True:
+        #     print("已经初始化过,请勿重复初始化")
+        #     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)
+        # print("MCU 开始循环~")
+        # while 1:
+        #     await asyncio.sleep(0.01)
+        #     if not self.serial_ins or not self.connect_state:
+        #         break
+        #     try:
+        #         # print("mcu   send_cmd")
+        #         self.send_cmd()
+        #         # time.sleep(0.01)
+        #         self.get_basic_info_mcu()
+        #         # self.close_other_window()
+        #     except BaseException as e:
+        #         print("121231298908", e)
+        #         break
+
+        # self.is_running = False
+        # self.connect_state = False
+        # print("MCU 循环退出~")
+        # # self.sign_data.emit(
+        # #     {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
+        # # )
+        # message = {"_type": "show_info", "plugins_mode": "mcu", "data": "MCU 连接失败"}
+        # self.sendSocketMessage(
+        #     code=1, msg="MCU 连接失败", data=message, device_status=-1
+        # )
+        # self.close_connect()
+
     def stop_mcu(self):
         buf = [self.command["stop_mcu"]]
         buf.extend(self.encapsulation_data(data=1, len_data=1))
@@ -856,7 +897,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         }
         self.sendSocketMessage(1, "串口被移除", data)
 
-    def add_port_by_linkage(self, port_name):
+    async def add_port_by_linkage(self, port_name):
         # port_value :串口基础信息
         # todo 根据prot_value 信息自动进行连接
         print("add", port_name)
@@ -869,7 +910,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.sendSocketMessage(
             msg="开始识别接口:{}".format(port_name), data=message_data, device_status=1
         )
-        time.sleep(1)
+        await asyncio.sleep(1)
         """
         步骤:
         1、进行临时连接,并发送命令,成功后,自动连接对应设备
@@ -892,7 +933,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             print("串口:{} 被占用".format(port_name))
             return
 
-        time.sleep(2)
+        await asyncio.sleep(2)
         print("开始发送命令")
         data = [90, 1]
         try:
@@ -920,7 +961,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             serial_handle.close()
             return
 
-        time.sleep(0.3)
+        await asyncio.sleep(0.3)
         print("尝试接收命令")
         receive_data = self.read_cmd(serial_handle)
         device_id = 0
@@ -933,10 +974,10 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
 
         print("关闭串口:{}".format(port_name))
         serial_handle.close()
-
+        loop = asyncio.get_event_loop()
         if device_id > 0:
             if device_id == 1:
-                self.to_connect_com(port_name)
+                await self.to_connect_com(port_name)
                 message_data = {
                     "_type": "show_info",
                     "plugins_mode": "auto_select_com",
@@ -946,20 +987,52 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     msg="MCU开始连接", data=message_data, device_status=1
                 )
                 self.connected_ports_dict[port_name] = "MCU"
-            message_data = {
-                "_type": "select_port_name",
-                "plugins_mode": "auto_select_com",
-                "data": {
-                    "device_name": "mcu" if device_id == 1 else "remote_control",
-                    "port_name": port_name,
-                },
-            }
-            self.sendSocketMessage(
-                msg="MCU连接成功", data=message_data, device_status=2
-            )
-            time.sleep(2)
-            loop = asyncio.get_event_loop()
-            loop.create_task(self.initDevice(), name="init_mcu")
+                message_data = {
+                    "_type": "select_port_name",
+                    "plugins_mode": "auto_select_com",
+                    "data": {
+                        "device_name": "mcu" if device_id == 1 else "remote_control",
+                        "port_name": port_name,
+                    },
+                }
+                self.sendSocketMessage(
+                    msg="MCU连接成功", data=message_data, device_status=2
+                )
+                await asyncio.sleep(2)
+                # await self.initDevice()
+                loop.create_task(
+                    self.initDevice(port_name),
+                    name="initDevice",
+                )
+            elif device_id == 2:
+                # 有线接收器
+                print("device_id", device_id)
+                loop.create_task(
+                    self.line_control.to_connect_com(port_name),
+                    name="line_control_to_connect_com",
+                )
+                # message_data = {
+                #     "_type": "show_info",
+                #     "plugins_mode": "auto_select_com",
+                #     "data": {"text": "有线控制器开始连接"},
+                # }
+                # self.sendSocketMessage(
+                #     msg="有线控制器开始连接", data=message_data, device_status=1
+                # )
+                # self.connected_ports_dict[port_name] = "MCU"
+                # message_data = {
+                #     "_type": "select_port_name",
+                #     "plugins_mode": "auto_select_com",
+                #     "data": {
+                #         "device_name": "mcu" if device_id == 1 else "remote_control",
+                #         "port_name": port_name,
+                #     },
+                # }
+                # self.sendSocketMessage(
+                #     msg="有线控制器开始连接", data=message_data, device_status=2
+                # )
+                # await asyncio.sleep(2)
+                # await self.initControlLine(serial_handle)
             # async def getBaseInfo():
             #     while True:
             #         await asyncio.sleep(1)
@@ -980,11 +1053,11 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         # 连接不上,记录为其他列表
     def clearMyInstance(self):
         SingletonType.clear_instance()
-    def to_connect_com(self, port_name):
+    async def to_connect_com(self, port_name):
         # 关闭串口
         print("to_connect_com", port_name)
         self.close_connect()
-        time.sleep(0.3)
+        await asyncio.sleep(0.3)
         self.connect_state = False
         try:
             self.serial_ins = SerialIns(port_name=port_name, baud=115200, timeout=0.1)
@@ -999,7 +1072,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 )
                 self.serial_ins = None
                 self.connect_state = False
-                return False
+                return False,None
 
         except:
             message_data = {
@@ -1012,7 +1085,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             )
             self.serial_ins = None
             self.connect_state = False
-            return False
+            return False, None
 
         message_data = {
             "_type": "show_info",
@@ -1029,7 +1102,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.serial_ins.write_cmd(data)
 
         # 延迟接收数据
-        time.sleep(0.3)
+        await asyncio.sleep(0.3)
         receive_data = self.serial_ins.read_cmd(out_time=1)
         if receive_data:
             print(
@@ -1153,6 +1226,9 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
 
         cmd = 1
         device_id = self.device_name_dict[device_name]
+        if device_id != 1:
+            print("F非MCU设备,禁止处理")
+            return
         print("正在执行",device_name)
         match device_name:
             case "camera_high_motor":
@@ -1569,7 +1645,7 @@ async def checkMcuConnection(device_ctrl: DeviceControl):
                 if _port_name not in device_ctrl.p_list:
                     try:
                         device_ctrl.p_list.append(_port_name)
-                        device_ctrl.add_port_by_linkage(_port_name)
+                        await device_ctrl.add_port_by_linkage(_port_name)
                     except BaseException as e:
                         print("串口不存在{} {}".format(_port_name, e))
     print("MCU断开连接,已释放")

+ 244 - 0
python/mcu/LineControl.py

@@ -0,0 +1,244 @@
+import time
+
+# from import_qt_mode import *
+import asyncio
+from .SerialIns import SerialIns
+from .BaseClass import BaseClass
+from utils.SingletonType import SingletonType
+from databases import SqlQuery, PhotoRecord, DeviceConfig, CRUD, insert_photo_records
+from .capture.module_digicam import DigiCam
+from .capture.module_watch_dog import FileEventHandler
+from sockets.connect_manager import ConnectionManager
+
+class LineControl(BaseClass):
+    # sign_data = Signal(dict)
+
+    def __init__(self, websocket_manager: ConnectionManager):
+        super().__init__(websocket_manager)
+        self.serial_ins = None
+        self.connect_state = False
+        self.is_running = False
+        self.msg_type = "line_control"
+        self.goods_art_no = None
+        # 0 闲置;1进行中;2已完成;
+        self.photo_take_state = 0
+
+    async def to_connect_com(self, port_name):
+        self.close_connect()
+        await asyncio.sleep(0.5)
+        try:
+            # 原值为9600
+            self.serial_ins = SerialIns(port_name=port_name, baud=115200)
+            if self.serial_ins.serial_handle:
+                self.connect_state = True
+                message = {
+                    "_type": "show_info",
+                    "plugins_mode": "remote_control",
+                    "data": {"msg": "有线遥控器 打开串口成功", "port_name": port_name},
+                }
+                self.sendSocketMessage(
+                    code=0,
+                    msg="有线遥控器 打开串口成功",
+                    data=message,
+                    device_status=2,
+                )
+                # 循环监听消息
+                await self.run()
+                return True
+            else:
+                message = {
+                    "_type": "show_info",
+                    "plugins_mode": "remote_control",
+                    "data": {"msg": "有线遥控器 打开串口失败"},
+                }
+                self.sendSocketMessage(
+                    code=1,
+                    msg="有线遥控器 打开串口失败",
+                    data=message,
+                    device_status=-1,
+                )
+                self.serial_ins = None
+                self.connect_state = False
+        except:
+            message = {
+                "_type": "show_info",
+                "plugins_mode": "remote_control",
+                "data": {"msg": "有线遥控器 打开串口失败"},
+            }
+            self.sendSocketMessage(
+                code=1,
+                msg="有线遥控器 打开串口失败",
+                data=message,
+                device_status=-1,
+            )
+            self.serial_ins = None
+            self.connect_state = False
+            return False
+
+    def close_connect(self):
+        if self.connect_state:
+            self.serial_ins.close_serial_port()
+            self.connect_state = False
+
+    def __del__(self):
+        self.close_connect()
+
+    async def to_connect_linecontrol(self):
+        """连接有线控制器"""
+        print("to_connect_linecontrol 连接有线控制器,连接状态", self.connect_state)
+        if self.connect_state:
+            return
+        message = {
+            "_type": "show_info",
+            "plugins_mode": "remote_control",
+            "data": "有线遥控器 打开成功",
+        }
+        self.close_connect()
+        print(message)
+        self.sendSocketMessage(
+            code=0, msg="有线遥控器 打开蓝牙成功", data=message, device_status=2
+        )
+        self.connect_state = True
+        self.is_running = True
+        await self.run()
+
+    def handlerAction(self, button_value):
+        """处理拍照动作按键[左 右]"""
+        control_program = "执行左脚程序" if button_value == 1 else "执行右脚程序"
+        match button_value:
+            case 1:
+                control_program = "执行左脚程序"
+            case 2:
+                control_program = "执行右脚程序"
+        if self.goods_art_no == None or self.goods_art_no == "":
+            input_data = {
+                "data": {
+                    "action": control_program,
+                    "goods_art_no": "",
+                },
+                "type": "run_mcu",
+            }
+            self.msg_type = "blue_tooth_scan"
+            self.sendSocketMessage(
+                code=0,
+                msg=f"准备执行[{control_program}]",
+                data=input_data,
+                device_status=2,
+            )
+            self.msg_type = "blue_tooth"
+            return
+        self.photo_take_state = 1
+        input_data = {
+            "data": {
+                "action": control_program,
+                "goods_art_no": self.goods_art_no,
+            },
+            "type": "run_mcu",
+        }
+        self.msg_type = "blue_tooth_scan"
+        self.sendSocketMessage(
+            code=0,
+            msg=f"准备执行[{control_program}]",
+            data=input_data,
+            device_status=2,
+        )
+        self.goods_art_no = None
+        self.msg_type = "line_control"
+        self.photo_take_state = 2
+
+    async def analysis_received_data(self,):
+        await asyncio.sleep(0.01)
+        if not self.connect_state:
+            return
+        receive_data = self.serial_ins.read_cmd(out_time=1, check=0x6B)
+        if receive_data is False:
+            self.connect_state = False
+            return False
+
+        if not receive_data:
+            return
+        else:
+            print("有线控制器receive_data", receive_data)
+            # print(
+            #     "有线控制器 read receive_data {}".format(
+            #         self.serial_ins.change_hex_to_int(receive_data)
+            #     )
+            # )
+            pass
+        # 数据 结构 command,按命令解析
+        if receive_data[0] == 1:
+            # 扫码数据
+            bar_code = receive_data[1:].decode()
+            bar_code = bar_code.replace("\r", "")
+            bar_code = bar_code.replace("\n", "")
+            # self.sign_data.emit(
+            #     {"_type": 0, "plugins_mode": "remote_control", "data": bar_code}
+            # )
+            message = {"_type": 0, "plugins_mode": "remote_control", "data": bar_code}
+            print("有线控制器 扫码数据1", message)
+            self.sendSocketMessage(code=0, msg="", data=message, device_status=2)
+            return
+        if receive_data[0] == 9:
+            button_value = receive_data[1]
+            data = {"button_value": button_value}
+            message = {"_type": 9, "plugins_mode": "remote_control", "data": data}
+            if button_value in [1, 2]:
+                # 扫描货号
+                if self.photo_take_state != 0:
+                    self.sendSocketMessage(1, "前置拍照未完成,请稍后", device_status=-1)
+                    return
+                print("收到货号信息", self.goods_art_no)
+                self.handlerAction(button_value)
+                self.photo_take_state = 0
+            if button_value in [3]:
+                # 处理遥控器单拍
+                self.msg_type = "handler_take_picture"
+                # 0 闲置;1进行中;2已完成;
+                _data = {"type": self.msg_type, "data": None}
+                self.sendSocketMessage(0, "处理单拍消息", data=_data, device_status=-1)
+                self.msg_type = "line_control"
+            if button_value in [9]:
+                # 处理停止
+                self.msg_type = "stop_action"
+                # 0 闲置;1进行中;2已完成;
+                _data = {"type": self.msg_type, "data": None}
+                self.sendSocketMessage(
+                    0, "停止执行组合动作", data=_data, device_status=-1
+                )
+                self.msg_type = "line_control"
+            self.sendSocketMessage(code=0, msg="", data=message, device_status=2)
+            return
+        pass
+
+    async def run(self):
+        self.is_running = True
+        while True:
+            await asyncio.sleep(0.06)
+            if not self.connect_state:
+                message = {
+                    "_type": "show_info",
+                    "plugins_mode": "remote_control",
+                    "data": {"msg": "有线遥控器 未连接"},
+                }
+                self.sendSocketMessage(
+                    code=1,
+                    msg="有线遥控器 未连接",
+                    data=message,
+                    device_status=-1,
+                )
+                break
+            await self.analysis_received_data()
+
+        self.is_running = False
+        if not self.connect_state:
+            message = {
+                "_type": "show_info",
+                "plugins_mode": "remote_control",
+                "data": {"msg": "有线遥控器 未连接"},
+            }
+            self.sendSocketMessage(
+                code=1,
+                msg="有线遥控器 未连接",
+                data=message,
+                device_status=-1,
+            )

+ 0 - 5
python/mcu/McuDeviationSet.py

@@ -236,12 +236,7 @@ class McuDeviationSet:
         self.mcu.to_init_device_origin_point(device_name="mcu", is_force=True)
 
     def get_mcu_deviation(self):
-        # await asyncio.sleep(0.01)
-        # await self.mcu.getDeviationInfo()
-        # loop = asyncio.get_event_loop()
-        # loop.create_task(self.mcu.getDeviationInfo(), name="get_mcu_deviation")
         asyncio.run(self.mcu.getDeviationInfo())
-
     def get_mcu_deviation_info(self, data):
         if "_type" not in data:
             return

+ 1 - 2
python/mcu/RemoteControlV2.py

@@ -3,12 +3,11 @@
 
 import json
 import time, asyncio
-from model import DeviceConfig
 import settings
 from .SerialIns import SerialIns
 from .BaseClass import BaseClass
 from sockets.connect_manager import ConnectionManager
-from databases import SqlQuery, PhotoRecord,DeviceConfig, CRUD, insert_photo_records
+from databases import SqlQuery, PhotoRecord, DeviceConfig, CRUD, insert_photo_records
 from .capture.module_digicam import DigiCam
 from .capture.module_watch_dog import FileEventHandler