rambo 4 maanden geleden
bovenliggende
commit
c73efb298a
3 gewijzigde bestanden met toevoegingen van 194 en 149 verwijderingen
  1. 102 26
      python/mcu/DeviceControl.py
  2. 92 122
      python/mcu/LineControl.py
  3. 0 1
      python/sockets/socket_server.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
 
 # mcu命令
@@ -27,6 +28,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
@@ -198,6 +201,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))
@@ -851,7 +892,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)
@@ -864,7 +905,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、进行临时连接,并发送命令,成功后,自动连接对应设备
@@ -887,7 +928,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             print("串口:{} 被占用".format(port_name))
             return
 
-        time.sleep(2)
+        await asyncio.sleep(2)
         print("开始发送命令")
         data = [90, 1]
         try:
@@ -915,7 +956,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
@@ -928,10 +969,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",
@@ -941,20 +982,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)
@@ -975,11 +1048,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)
@@ -994,7 +1067,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 )
                 self.serial_ins = None
                 self.connect_state = False
-                return False
+                return False,None
 
         except:
             message_data = {
@@ -1007,7 +1080,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             )
             self.serial_ins = None
             self.connect_state = False
-            return False
+            return False, None
 
         message_data = {
             "_type": "show_info",
@@ -1024,7 +1097,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(
@@ -1148,6 +1221,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":
@@ -1577,7 +1653,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断开连接,已释放")

+ 92 - 122
python/mcu/LineControl.py

@@ -8,13 +8,13 @@ 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, metaclass=SingletonType):
+class LineControl(BaseClass):
     # sign_data = Signal(dict)
 
-    def __init__(self, windows=None):
-        super().__init__()
-        self.windows = windows
+    def __init__(self, websocket_manager: ConnectionManager):
+        super().__init__(websocket_manager)
         self.serial_ins = None
         self.connect_state = False
         self.is_running = False
@@ -83,9 +83,33 @@ class LineControl(BaseClass, metaclass=SingletonType):
     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": {
@@ -119,93 +143,10 @@ class LineControl(BaseClass, metaclass=SingletonType):
             device_status=2,
         )
         self.goods_art_no = None
-        self.msg_type = "blue_tooth"
+        self.msg_type = "line_control"
         self.photo_take_state = 2
 
-    async def handlerTakePhoto(self):
-        """处理单独拍照"""
-        await asyncio.sleep(0.1)
-        print("开始单拍0")
-        session = SqlQuery()
-        crud = CRUD(PhotoRecord)
-        record = crud.read(session=session, order_by="id", ascending=False)
-        print("开始单拍0-读取数据库")
-        if record == None:
-            # 发送失败消息
-            self.sendSocketMessage(
-                code=1,
-                msg="单拍失败,请先输入货号或扫码进行组合拍摄",
-                data=None,
-                device_status=2,
-            )
-        else:
-            print("开始单拍1")
-            if record.image_index == 19:
-                self.msg_type = "photo_take"
-                self.sendSocketMessage(
-                    code=1,
-                    msg="单拍失败,单个货号最多允许拍摄20张产品图",
-                    data=None,
-                    device_status=2,
-                )
-                self.msg_type = "blue_tooth"
-                return
-            deviceConfig = CRUD(DeviceConfig)
-            deviceConfigData = deviceConfig.read(
-                session=session, conditions={"id": record.action_id}
-            )
-            select_tab_id = deviceConfigData.tab_id
-            AllTabConfig = deviceConfig.read_all(
-                session=session, conditions={"tab_id": select_tab_id}
-            )
-            action_id = 0
-            if AllTabConfig[len(AllTabConfig) - 1].take_picture == True:
-                action_id = AllTabConfig[0].id
-            else:
-                action_id = AllTabConfig[len(AllTabConfig) - 1].id
-            image_index = record.image_index + 1
-            self.photo_take_state = 1
-            state, record_id = insert_photo_records(
-                record.image_deal_mode,
-                record.goods_art_no,
-                image_index,
-                action_id,
-            )
-            print("开始单拍1-插入数据")
-            capture_one = DigiCam()
-            try:
-                watch_dog = FileEventHandler()
-                if watch_dog.observer is None:
-                    captrure_folder_path = capture_one.getCaptureFolderPath()
-                    watch_dog.start_observer(captrure_folder_path)
-                watch_dog.goods_art_no = record.goods_art_no
-                watch_dog.image_index = image_index
-                watch_dog.record_id = record_id
-                print("开始单拍1-检查相机")
-                # camera_is_connect = capture_one.checkCameraConnect()
-                # if camera_is_connect is not True:
-                #     self.sendSocketMessage(1, "相机未连接,请检查", device_status=-1)
-                #     return
-                capture_one.run_capture_action("Capture")
-                print("开始单拍1-完成拍照")
-                await asyncio.sleep(1)
-                self.msg_type = "photo_take"
-                self.sendSocketMessage(
-                    code=0,
-                    msg="{} 执行完成~".format(
-                        "执行右脚程序"
-                        if record.image_deal_mode == 1
-                        else "执行左脚程序"
-                    ),
-                    data={"goods_art_no": record.goods_art_no},
-                    device_status=2,
-                )
-                self.msg_type = "blue_tooth"
-            except Exception as e:
-                self.sendSocketMessage(1, "digicam未初始化,请检查", device_status=-1)
-        self.photo_take_state = 0
-
-    async def analysis_received_data(self):
+    async def analysis_received_data(self,):
         await asyncio.sleep(0.01)
         if not self.connect_state:
             return
@@ -213,14 +154,16 @@ class LineControl(BaseClass, metaclass=SingletonType):
         if receive_data is False:
             self.connect_state = False
             return False
+
         if not receive_data:
             return
         else:
-            print(
-                "read receive_data {}".format(
-                    self.serial_ins.change_hex_to_int(receive_data)
-                )
-            )
+            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:
@@ -228,47 +171,74 @@ class LineControl(BaseClass, metaclass=SingletonType):
             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}
-            )
+            # 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:
-            switch_1, switch_2, button_value = receive_data[1:]
-            data = {
-                "switch_1": True if switch_1 == 1 else False,
-                "switch_2": True if switch_2 == 1 else False,
-                "button_value": button_value,
-            }
-            self.sign_data.emit(
-                {"_type": 9, "plugins_mode": "remote_control", "data": data}
-            )
+            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.show_info.emit("未连接")
-        # self.data_command_sign.emit(data)
         self.is_running = True
-        while self.is_running:
+        while True:
             await asyncio.sleep(0.06)
             if not self.connect_state:
-                self.sign_data.emit(
-                    {
-                        "_type": "show_info",
-                        "plugins_mode": "remote_control",
-                        "data": "遥控设备 未连接",
-                    }
+                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:
-            self.sign_data.emit(
-                {
-                    "_type": "show_info",
-                    "plugins_mode": "remote_control",
-                    "data": "遥控设备 未连接",
-                }
+            message = {
+                "_type": "show_info",
+                "plugins_mode": "remote_control",
+                "data": {"msg": "有线遥控器 未连接"},
+            }
+            self.sendSocketMessage(
+                code=1,
+                msg="有线遥控器 未连接",
+                data=message,
+                device_status=-1,
             )

+ 0 - 1
python/sockets/socket_server.py

@@ -58,7 +58,6 @@ async def websocket_endpoint(websocket: WebSocket):
                 except Exception as e:
                     print(e)
                     break
-
         await asyncio.gather(handler_messages(), send_message())
     except WebSocketDisconnect:
         # socket_manager.close()