ソースを参照

feat(PTZ): 添加PTZ控制调试日志和错误处理

增加PTZ控制过程中的详细调试日志输出,包括参数转换和命令执行结果
添加错误处理功能,当PTZ控制失败时输出SDK错误码
wenhongquan 4 日 前
コミット
7ff5255fe8
2 ファイル変更33 行追加5 行削除
  1. 26 1
      dual_camera_system/dahua_sdk.py
  2. 7 4
      dual_camera_system/ptz_camera.py

+ 26 - 1
dual_camera_system/dahua_sdk.py

@@ -218,6 +218,10 @@ class DahuaSDK:
         self.sdk.CLIENT_SnapPicture.argtypes = [c_long, POINTER(self.SNAP_PARAMS)]
         self.sdk.CLIENT_SnapPicture.restype = ctypes.c_bool
         
+        # CLIENT_GetLastError() -> DWORD
+        self.sdk.CLIENT_GetLastError.argtypes = []
+        self.sdk.CLIENT_GetLastError.restype = c_uint32
+        
         # === 可选函数(某些SDK版本/平台可能缺失)===
         self._optional_funcs = {}
         
@@ -387,10 +391,31 @@ class DahuaSDK:
             是否成功
         """
         if not self.sdk or login_handle <= 0:
+            print(f"[PTZ] 失败: sdk={self.sdk is not None}, handle={login_handle}")
             return False
-        return self.sdk.CLIENT_DHPTZControlEx(
+        
+        # 命令名称映射 (用于调试日志)
+        cmd_names = {
+            0: 'UP', 1: 'DOWN', 2: 'LEFT', 3: 'RIGHT',
+            4: 'ZOOM_ADD', 5: 'ZOOM_DEC',
+            0x20: 'LEFTTOP', 0x21: 'RIGHTTOP', 0x22: 'LEFTDOWN', 0x23: 'RIGHTDOWN',
+            0x33: 'FASTGOTO', 0x43: 'EXACTGOTO', 0x44: 'RESETZERO',
+            0x45: 'MOVE_ABSOLUTELY', 0x46: 'MOVE_CONTINUOUSLY', 0x47: 'GOTOPRESET',
+        }
+        cmd_name = cmd_names.get(command, f'CMD_{command:#x}')
+        
+        result = self.sdk.CLIENT_DHPTZControlEx(
             login_handle, channel, command, param1, param2, param3, stop
         )
+        
+        print(f"[PTZ] {cmd_name}(ch={channel}, p1={param1}, p2={param2}, p3={param3}, stop={stop}) → {'✓' if result else '✗'}")
+        
+        if not result:
+            # 获取SDK错误码
+            error = self.sdk.CLIENT_GetLastError() if hasattr(self.sdk, 'CLIENT_GetLastError') else -1
+            print(f"[PTZ] 错误码: {error}")
+        
+        return result
     
     def snap_picture(self, login_handle: int, channel: int = 0, 
                      cmd_serial: int = 0) -> bool:

+ 7 - 4
dual_camera_system/ptz_camera.py

@@ -133,16 +133,19 @@ class PTZCamera:
         Returns:
             是否成功
         """
-        # SDK参数: pan 0~3600 (0.1度单位), tilt -1800~1800, zoom 1~128
-        param1 = int(pan * 10)      # 转换为0.1度单位
-        param2 = int(tilt * 10)     # 转换为0.1度单位
-        param3 = int(min(zoom, 128))  # 限制最大128倍
+        param1 = int(pan * 10)
+        param2 = int(tilt * 10)
+        param3 = int(min(zoom, 128))
+        
+        print(f"[PTZCamera] goto_exact_position: pan={pan:.1f}° tilt={tilt:.1f}° zoom={zoom} → p1={param1} p2={param2} p3={param3}")
         
         result = self.ptz_control(PTZCommand.EXACTGOTO, param1, param2, param3)
         
         if result:
             with self.position_lock:
                 self.current_position = PTZPosition(pan=pan, tilt=tilt, zoom=zoom)
+        else:
+            print(f"[PTZCamera] goto_exact_position FAILED!")
         
         return result