Pārlūkot izejas kodu

```
fix(config): 修改鞋子翻转配置默认值

将action.json中的shoe_upturn字段默认值从true改为false

fix(logging): 将打印语句替换为日志记录

- 将DeviceControl.py中的print语句替换为logger.info
- 统一使用日志系统进行消息记录

fix(serial): 优化串口设备检测逻辑

将串口检测条件从"CH340"改为"CH34",扩大设备兼容性

refactor(cutout): 移除调试打印语句

注释掉抠图功能中的调试打印代码,减少控制台输出

feat(socket): 增强WebSocket异常处理机制

- 添加CancelledError异常捕获
- 改进任务取消和清理逻辑
- 优化连接管理流程

fix(socket): 简化socket断开处理逻辑

移除多余的设备控制器清理操作,使用日志记录替代部分打印语句
```

rambo 3 nedēļas atpakaļ
vecāks
revīzija
c1a3d0db7d

+ 1 - 1
python/action.json

@@ -72,7 +72,7 @@
         "take_picture": true,
         "turntable_position": 100.0,
         "turntable_angle": 0.0,
-        "shoe_upturn": true,
+        "shoe_upturn": false,
         "pre_delay": 3.0,
         "after_delay": 0.0,
         "led_switch": false,

+ 1 - 1
python/api.py

@@ -571,7 +571,7 @@ async def _process_cutout(run_main, config_data, goods_art_no_arrays, move_folde
                 "success": True,
                 "info": "处理成功",
             })
-    print("抠图是否完成",len(have_handler_keys) == len(goods_art_no_arrays) or (len(have_handler_keys) == 0  and cutout_res),handler_result)        
+    # print("抠图是否完成",len(have_handler_keys) == len(goods_art_no_arrays) or (len(have_handler_keys) == 0  and cutout_res),handler_result)        
     if len(have_handler_keys) == len(goods_art_no_arrays) or (len(have_handler_keys) == 0  and cutout_res):
         handler_result_folder = handler_result_folder.replace("\\", "/")
         success_items = [item for item in handler_result if item.get('success') == True]

+ 2 - 2
python/mcu/DeviceControl.py

@@ -1771,7 +1771,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             program_item.smart_shooter = smart_shooter
             await program_item.run(3)
             self.msg_type = "mcu"
-            print(
+            logger.info(
                 "发送 run_mcu_signle消息",
                 "{} 执行完成~".format(program_item.action_name),
             )
@@ -1783,7 +1783,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             )
             self.action_state = 2
             self.msg_type = "run_mcu_single"
-            print("发送 run_mcu_signle消息", "执行完成")
+            logger.info("发送 run_mcu_signle消息执行完成")
             self.sendSocketMessage(
                 code=0,
                 msg=f"执行完成",

+ 1 - 1
python/mcu/SerialIns.py

@@ -284,7 +284,7 @@ class SerialIns(object):
             for i in plist:
                 print("串口列表:", i.description)
                 print("串口列表:", i.name)
-                if "CH340" in i.description:
+                if "CH34" in i.description:
                     print("CH340:", i.name)
                     self.port_name = i.name
                     print("----------", i)

+ 1 - 1
python/mcu_test.py

@@ -37,7 +37,7 @@ class Main():
             print(f"产品ID: {port.product}")
             print(f"序列号: {port.serial_number}")
             print("-" * 40)
-            if "CH340" in port.description:
+            if "CH34" in port.description:
                 return port.name
         return False
 

+ 1 - 1
python/mcu_test_2.py

@@ -29,7 +29,7 @@ class Main():
             print(f"产品ID: {port.product}")
             print(f"序列号: {port.serial_number}")
             print("-" * 40)
-            if "CH340" in port.description:
+            if "CH34" in port.description:
                 return port.name
         return False
     def encapsulation_data(self, data, len_data, data_magnification=1):

+ 6 - 6
python/service/base_deal.py

@@ -702,12 +702,12 @@ class BaseDealImage(object):
         else:
             pass
         progress["status"] = "处理失败" if error_progress == total_progress else "处理完成"
-        sendAsyncMessage(
-                    msg="抠图完成",
-                    goods_arts=[],
-                    status="抠图完成",
-                    progress=progress
-                )
+        # sendAsyncMessage(
+        #             msg="抠图完成",
+        #             goods_arts=[],
+        #             status="抠图完成",
+        #             progress=progress
+        #         )
 
     def checkCutoutImage(self, image_dir: str, todo_goods_art_no_folder_name_list=None):
         """

+ 1 - 1
python/sockets/connect_manager.py

@@ -32,7 +32,7 @@ class ConnectionManager:
             print(f"[T4: {time.time()-t_send_start:.4f}s] 开始 websocket.send_json")
             await websocket.send_json(message)
             await asyncio.sleep(0) 
-            print(f"[T5: {time.time()-t_send_start:.4f}s] websocket.send_json 返回",message)
+            # print(f"[T5: {time.time()-t_send_start:.4f}s] websocket.send_json 返回",message)
         except Exception as e:
             logger.info(f"socket 消息发送异常:{str(e)}")
             await asyncio.sleep(0.001)

+ 22 - 31
python/sockets/socket_server.py

@@ -66,17 +66,33 @@ async def websocket_endpoint(websocket: WebSocket):
         # 创建任务来启动 connect_listen
         # listen_task = asyncio.create_task(restart_smart_shooter_listener())
         # 等待所有任务完成
-        await asyncio.gather(handler_task,listen_task)
+        await asyncio.gather(handler_task,listen_task, return_exceptions=True)
 
     except WebSocketDisconnect:
         print("Client disconnected")
+    except asyncio.CancelledError:
+        print("Connection cancelled")
     finally:
-        # 确保任务被正确取消
-        if listen_task and not listen_task.done():
-            listen_task.cancel()
+        # 确保任务被正确取消和清理
+        tasks_to_cancel = []
+        
+        if handler_task and not handler_task.done():
+            tasks_to_cancel.append(handler_task)
+        
         if send_task and not send_task.done():
-            send_task.cancel() # <--- 清理
+            tasks_to_cancel.append(send_task)
+        
+        # 取消所有待处理的任务
+        for task in tasks_to_cancel:
+            task.cancel()
+        
+        # 等待任务取消完成
+        if tasks_to_cancel:
+            await asyncio.gather(*tasks_to_cancel, return_exceptions=True)
+        
+        # 清理连接
         active_connections.discard(websocket)
+        print("WebSocket connection cleaned up")
 
 
 async def start_smart_shooter_listen():
@@ -96,16 +112,9 @@ async def handler_messages(websocket):
             socket_type = byteDats.get("type")
             if socket_type == "websocket.disconnect":
                 print("socket_type===>", byteDats)
-                smart_shooter.stop_listen = True
-                smart_shooter.is_init_while = False
                 if byteDats.get("code") == 1006:
                     continue
-                device_ctrl.close_connect()
-                device_ctrl.close_lineConnect()
-                device_ctrl.mcu_exit = True
-                device_ctrl.p_list = []
-                device_ctrl.temp_ports_dict = {}
-                device_ctrl.clearMyInstance()
+                logger.info("socket强制断开")
                 diviceList = blue_tooth.devices
                 if len(diviceList) == 0:
                     blue_tooth.bluetooth_exit = True
@@ -136,24 +145,6 @@ async def handler_messages(websocket):
             break
 
 
-# async def send_message(websocket):
-#     print("构建消息监听   send_message")
-#     while True:
-#         try:
-#             # 使用wait()而不是直接get()来避免阻塞
-#             # 从异步队列中获取消息(在新事件循环中运行)
-#             message = await message_queue.get()
-#             # 发送消息
-#             await websocket.send_json(message)
-#             message_queue.task_done()
-#         except asyncio.QueueEmpty:
-#             continue
-#         except asyncio.TimeoutError:
-#             # 超时继续循环,避免永久阻塞
-#             continue
-#         except Exception as e:
-#             print("socket报错",e)
-#             break
 async def message_generator():
     """异步生成器,用于从队列中获取消息"""
     while True: