Procházet zdrojové kódy

```
feat(DeviceControl): 添加设备移动时间记录功能并优化相机控制逻辑

- 添加last_camera_height和last_move_time属性用于跟踪设备状态
- 在设备移动操作中记录最后移动时间
- 将程序项中的最后移动时间同步到设备控制器
- 实现相机运动检测功能,确保拍照前设备已停止运动
- 优化相机高度控制逻辑,避免重复执行相同的移动命令

fix(ProgramItem): 增强设备状态监控和错误处理机制

- 添加运动检测等待函数,检查相机、转盘等设备是否完全停止
- 在设备控制中添加异步延时,确保命令正确执行
- 记录设备移动历史,防止不必要的重复操作
- 添加日志记录,便于调试和问题追踪

fix(base_deal): 修复文件夹处理显示错误并优化单图像处理

- 修复回调函数中显示的文件夹名称变量错误
- 为单张图片处理添加额外延时,确保处理完成
```

rambo před 1 týdnem
rodič
revize
bc60d40e6d

+ 6 - 2
python/mcu/DeviceControl.py

@@ -47,6 +47,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         self.state_camera_steering = 3
         self.state_turntable_steering = 3
         self.state_overturn_steering = 3
+        self.last_camera_height = 0
         # 是否实时获取mcu状态信息
         self.is_get_mcu_state = True
         self.state_move_turntable_steering = 3
@@ -78,6 +79,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             "mp3_player": 8,
             "mcu": 99,
         }
+        self.last_move_time = time.time()
         self.device_name_dict_mapping = {
             0:"相机角度",
             1:"相机高度",
@@ -1359,7 +1361,6 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
         print("移动", time.time())
         logger.info("移动,%s", time.time())
         speed = settings.moveSpeed()
-
         cmd = 1
         device_id = self.device_name_dict[device_name]
         # if device_id != 1:
@@ -1385,7 +1386,6 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     if down_speed is None
                     else down_speed
                 )
-
                 value = value / 10  # value 单位毫米
                 assert 0 <= value <= 40
                 assert 0 <= max_speed <= 10000
@@ -1452,6 +1452,8 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
             is_relative,
         ]
         self.add_send_data_queue(data)
+        current_time = time.time()
+        self.last_move_time = current_time
 
     def to_get_mcu_base_info(self):
         if self.connect_state:
@@ -1668,6 +1670,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                     record_id=record_id,
                     is_get_mcu_state=True,
                 )
+                program_item.last_move_time = self.last_move_time
                 if self.action_state != 1:
                     # 异常终止
                     print("action异常终止")
@@ -1744,6 +1747,7 @@ class DeviceControl(BaseClass, metaclass=SingletonType):
                 record_id=action_id,
                 is_get_mcu_state=False,
             )
+            program_item.last_move_time = self.last_move_time
             if self.action_state != 1:
                 # 异常终止
                 print("action异常终止")

+ 63 - 7
python/mcu/ProgramItem.py

@@ -7,7 +7,9 @@ import settings
 import time
 from .capture.module_digicam import DigiCam
 from .capture.module_watch_dog import FileEventHandler
+import logging
 
+logger = logging.getLogger(__name__)
 
 class ProgramItem(BaseClass):
     # program_sign = Signal(dict)
@@ -52,6 +54,7 @@ class ProgramItem(BaseClass):
         self.is_need_confirm = self.get_value(action_data, "is_need_confirm", False)
         self.image_index = self.get_value(action_data, "picture_index", 99)
         self.camera_height = self.get_value(action_data, "camera_height", 0)
+        self.last_camera_height = 0
         self.camera_angle = float(self.get_value(action_data, "camera_angle", 0.0))
         self.af_times = self.get_value(action_data, "number_focus", 0)
         self.shoe_overturn = self.get_value(action_data, "shoe_upturn", False)
@@ -73,7 +76,7 @@ class ProgramItem(BaseClass):
 
         self.set_other()
         self.error_info_text = ""  # 错误提示信息
-
+        self.last_move_time = None
         # self.setParent(parent)
         self.mcu = mcu
 
@@ -182,7 +185,38 @@ class ProgramItem(BaseClass):
         print("\033[1;31m执行结束\033[0m", self.mcu.action_state)
         # await asyncio.sleep(0.1)
         # self.mcu.to_get_mcu_base_info()
-
+    async def camera_check_mcu_move_is_stop(self, re_check=False):
+        self.error_info_text = ""
+        # 发送基础数据信息
+        # self.mcu.to_get_mcu_base_info()
+        _s = time.time()
+        check_times = 0
+        await self.mcu.cleanAllReceiveData()
+        while 1:
+            if self.mcu.action_state != 1:
+                return False
+            # 发送获取设备状态消息
+            self.mcu.send_get_all_info_to_mcu()
+            await asyncio.sleep(0.5)
+            if all(
+                    value == 2
+                    for value in [
+                        self.mcu.state_camera_motor,
+                        self.mcu.state_camera_steering,
+                        self.mcu.state_turntable_steering,
+                        self.mcu.state_overturn_steering,
+                    ]
+                ):
+                logger.info("拍照前运动检测状态[成功]")
+                # await asyncio.sleep(0.5)
+                return True
+            else:
+                check_times += 1
+                if check_times > 5:
+                    logger.info("拍照前运动检测状态[失败]")
+                    return False
+                # return True
+        print("\033[1;31m执行结束\033[0m", self.mcu.action_state)
     async def run(self, total_len=5, *args):
         if total_len == 1:
             self.mode_type = "其他配置"
@@ -240,6 +274,7 @@ class ProgramItem(BaseClass):
         # if not self.goods_art_no:  # and self.action_name != "初始化位置"
         #     return False
         start_time = time.time()
+        current_time = time.time()
         self.mcu.is_get_mcu_state = self.is_get_mcu_state 
         # ============连接MCU 处理步进电机与舵机等
         if settings.IS_MCU:
@@ -258,30 +293,46 @@ class ProgramItem(BaseClass):
 
             if self.shoe_overturn:
                 self.mcu.to_deal_device(device_name="overturn_steering")
-                # time.sleep(0.1)
+                await asyncio.sleep(0.01)
             if self.camera_height is not None:
+                if (current_time - self.last_move_time)>110:
+                    if self.camera_height == 0:
+                        self.mcu.to_device_move(
+                            device_name="camera_high_motor", value=1
+                        )
+                    elif self.camera_height == 400:
+                        self.mcu.to_device_move(
+                            device_name="camera_high_motor", value=399
+                        )
+                    else:
+                        self.mcu.to_device_move(
+                            device_name="camera_high_motor", value=self.camera_height-1
+                        )
+                    await asyncio.sleep(0.01)
+                    logger.info("设备延迟执行===>,%s",time.time())
                 self.mcu.to_device_move(
                     device_name="camera_high_motor", value=self.camera_height
                 )
-                # time.sleep(0.1)
+                self.last_camera_height = self.camera_height
+                await asyncio.sleep(0.01)
             if self.camera_angle is not None:
                 self.mcu.to_device_move(
                     device_name="camera_steering", value=self.camera_angle
                 )
-                # time.sleep(0.1)
+                await asyncio.sleep(0.01)
 
             if self.turntable_position is not None:
                 self.mcu.to_device_move(
                     device_name="turntable_position_motor",
                     value=self.turntable_position,
                 )
-                # time.sleep(0.1)
+                await asyncio.sleep(0.01)
 
             if self.turntable_angle is not None:
                 self.mcu.to_device_move(
                     device_name="turntable_steering", value=self.turntable_angle
                 )
-                # time.sleep(0.1)
+                await asyncio.sleep(0.01)
 
             # MCU运动是否有停止检查,设定超时时间
             # self.mcu.send_all_cmd()
@@ -292,6 +343,7 @@ class ProgramItem(BaseClass):
                 if await self.check_mcu_move_is_stop(re_check=True) is False:
                     print("MCU检测运动未停止,自动退出,   提前退出")
                     return
+        # logger.info("设备最后一次执行时间===>,%s",current_time)
         self.mcu.is_get_mcu_state = True
         if self.delay_time:
             await asyncio.sleep(self.delay_time)
@@ -299,6 +351,10 @@ class ProgramItem(BaseClass):
             # print("photograph==================")
             self.mcu.to_deal_device(device_name="buzzer", times=1)
             # 用于临时拍照计数
+            if not await self.camera_check_mcu_move_is_stop(re_check=True):
+                logger.info("拍照前运动检测失败===>")
+                return
+            await asyncio.sleep(0.5)
             is_af = True if self.af_times > 0 else False
             if self.smart_shooter != None:
                 # 拍照

+ 3 - 1
python/service/base_deal.py

@@ -90,7 +90,7 @@ class BaseDealImage(object):
                 if windows.state != 1:
                     break
             folder_name = goods_art_no_folder_data["folder_name"]
-            callback_func("开始处理文件夹==========  {} ".format(folder_name))
+            callback_func("开始处理文件夹==========  {} ".format(all_goods_art_no_folder_data))
             if settings.IS_TEST:
                 flag = self.shoes_run_one_folder_to_deal(
                     goods_art_no_folder_data=goods_art_no_folder_data,
@@ -312,6 +312,8 @@ class BaseDealImage(object):
         self.check_path("{}/800x800".format(folder_path))
         self.crate_all_folders(folder_path)
         print("all_original_images====>", all_original_images)
+        if len(all_original_images) == 1:
+            time.sleep(1.5)
         if not all_original_images:
             return None
             # _ = ["俯视", "侧视", "后跟", "鞋底", "内里"]