增加大华设备对云台移动、缩放、聚集、光圈、校时、重启的支持
增加海康、大华对预置点的支持
This commit is contained in:
81
SHH.CameraSdk/Drivers/DaHua/Features/DahuaPresetProvider.cs
Normal file
81
SHH.CameraSdk/Drivers/DaHua/Features/DahuaPresetProvider.cs
Normal file
@@ -0,0 +1,81 @@
|
||||
using Serilog;
|
||||
using Ayay.SerilogLogs;
|
||||
|
||||
namespace SHH.CameraSdk.DahuaFeatures;
|
||||
|
||||
/// <summary>
|
||||
/// [大华功能组件] 预置点管理实现
|
||||
/// <para>适配说明:使用 NETClient.PTZControl 接口,指令码为 10 (PTZ_POINT_CONTROL)</para>
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>跳转到预置点</summary>
|
||||
/// <param name="presetIndex">预置点编号 (1-255)</param>
|
||||
public async Task GotoPresetAsync(int presetIndex)
|
||||
{
|
||||
await ExecutePresetAction(presetIndex, 2, "调用");
|
||||
}
|
||||
|
||||
/// <summary>设置/保存当前位置为预置点</summary>
|
||||
public async Task SetPresetAsync(int presetIndex)
|
||||
{
|
||||
await ExecutePresetAction(presetIndex, 0, "保存");
|
||||
}
|
||||
|
||||
/// <summary>删除预置点</summary>
|
||||
public async Task RemovePresetAsync(int presetIndex)
|
||||
{
|
||||
await ExecutePresetAction(presetIndex, 1, "删除");
|
||||
}
|
||||
|
||||
/// <summary>统一执行预置点动作</summary>
|
||||
/// <param name="index">编号</param>
|
||||
/// <param name="actionType">0:保存, 1:删除, 2:跳转</param>
|
||||
/// <param name="actionName">日志描述</param>
|
||||
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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user