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);
}
});
}
}