using Serilog; using Ayay.SerilogLogs; namespace SHH.CameraSdk.DahuaFeatures; /// /// [大华功能组件] 预置点管理实现 /// 适配说明:使用 NETClient.PTZControl 接口,指令码为 10 (PTZ_POINT_CONTROL) /// public class DahuaPresetProvider : IPresetFeature { private ILogger _sdkLog = Log.ForContext("SourceContext", LogModules.DaHuaSdk); private readonly IDahuaContext _context; // 大华底层预置点控制命令常量 private const uint PTZ_POINT_CONTROL = 10; public DahuaPresetProvider(IDahuaContext context) { _context = context; } /// 跳转到预置点 /// 预置点编号 (1-255) public async Task GotoPresetAsync(int presetIndex) { await ExecutePresetAction(presetIndex, 2, "调用"); } /// 设置/保存当前位置为预置点 public async Task SetPresetAsync(int presetIndex) { await ExecutePresetAction(presetIndex, 0, "保存"); } /// 删除预置点 public async Task RemovePresetAsync(int presetIndex) { await ExecutePresetAction(presetIndex, 1, "删除"); } /// 统一执行预置点动作 /// 编号 /// 0:保存, 1:删除, 2:跳转 /// 日志描述 private async Task ExecutePresetAction(int index, int actionType, string actionName) { IntPtr loginId = _context.GetUserId(); if (loginId == IntPtr.Zero) return; await Task.Run(() => { // Modified: [原因] 严格适配 NETClient.PTZControl 的 8 参数签名 // lParam1: 0 (无意义) // lParam2: 预置点值 (nIndex) // lParam3: 动作类型 (0-保存, 1-删除, 2-跳转) bool result = NETClient.PTZControl( loginId, 0, // nChannelID PTZ_POINT_CONTROL, // dwPTZCommand = 10 0, // lParam1 index, // lParam2: 预置点编号 actionType, // lParam3: 动作类型 false, // dwStop: 预置点操作不涉及停止位 IntPtr.Zero // param4 ); if (!result) { string error = NETClient.GetLastError(); _sdkLog.Warning("[SDK] Dahua 预置点{Action}失败. Index: {Index}, Error: {Error}", actionName, index, error); } else { _sdkLog.Debug("[SDK] Dahua 预置点{Action}成功. Index: {Index}", actionName, index); } }); } }