You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
6.4 KiB
191 lines
6.4 KiB
using EC.Util.CameraSDK;
|
|
using System;
|
|
|
|
namespace JiLinApp.Pages.PtzManage;
|
|
|
|
public class PtzCmd
|
|
{
|
|
public static PtzControlType GetControlType(string ctrlStr)
|
|
{
|
|
return ctrlStr switch
|
|
{
|
|
"PelcoD" => PtzControlType.PelcoD,
|
|
"PelcoP" => PtzControlType.PelcoP,
|
|
"HikSdk" => PtzControlType.HikSdk,
|
|
_ => PtzControlType.None
|
|
};
|
|
}
|
|
|
|
public static PtzCmdType GetCmdType(string cmdStr)
|
|
{
|
|
return cmdStr switch
|
|
{
|
|
"Top" => PtzCmdType.Top,
|
|
"Down" => PtzCmdType.Down,
|
|
"Left" => PtzCmdType.Left,
|
|
"Right" => PtzCmdType.Right,
|
|
"TopLeft" => PtzCmdType.TopLeft,
|
|
"TopRight" => PtzCmdType.TopRight,
|
|
"DownLeft" => PtzCmdType.DownLeft,
|
|
"DownRight" => PtzCmdType.DownRight,
|
|
"Stop" => PtzCmdType.Stop,
|
|
"AutoStart" => PtzCmdType.AutoStart,
|
|
"AutoStop" => PtzCmdType.AutoStop,
|
|
"PresetSet" => PtzCmdType.PresetSet,
|
|
"PresetClear" => PtzCmdType.PresetClear,
|
|
"PresetGoto" => PtzCmdType.PresetGoto,
|
|
_ => PtzCmdType.None
|
|
};
|
|
}
|
|
|
|
public static byte[] GetCmd(PtzControlType ctrlType, PtzCmdType cmdType, byte[] args = null)
|
|
{
|
|
args ??= new byte[] { 1, 1, 1 };
|
|
byte[] cmd = ctrlType switch
|
|
{
|
|
PtzControlType.PelcoD => GetPelcoDCmd(cmdType, args),
|
|
PtzControlType.PelcoP => GetPelcoPCmd(cmdType, args),
|
|
_ => Array.Empty<byte>(),
|
|
};
|
|
return cmd;
|
|
}
|
|
|
|
public static byte[] GetPelcoDCmd(PtzCmdType cmdType, byte[] args)
|
|
{
|
|
uint addr = args[0];
|
|
uint panSpeed = 0x2f;
|
|
uint tiltSpeed = (uint)(PelcoD.TiltSpeedMax + PelcoD.TiltSpeedMin) / 2;
|
|
byte[] cmd = cmdType switch
|
|
{
|
|
PtzCmdType.Top => PelcoD.CameraTilt(addr, PelcoD.Tilt.Up, tiltSpeed),
|
|
PtzCmdType.Down => PelcoD.CameraTilt(addr, PelcoD.Tilt.Down, tiltSpeed),
|
|
PtzCmdType.Left => PelcoD.CameraPan(addr, PelcoD.Pan.Left, panSpeed),
|
|
PtzCmdType.Right => PelcoD.CameraPan(addr, PelcoD.Pan.Right, panSpeed),
|
|
PtzCmdType.TopLeft => PelcoD.CameraPan(addr, PelcoD.Pan.LeftUp, panSpeed),
|
|
PtzCmdType.TopRight => PelcoD.CameraPan(addr, PelcoD.Pan.RightUp, panSpeed),
|
|
PtzCmdType.DownLeft => PelcoD.CameraPan(addr, PelcoD.Pan.LeftDown, panSpeed),
|
|
PtzCmdType.DownRight => PelcoD.CameraPan(addr, PelcoD.Pan.RightDown, panSpeed),
|
|
PtzCmdType.Stop => PelcoD.CameraStop(addr),
|
|
PtzCmdType.AutoStart => PelcoD.CameraScan(addr, PelcoD.Scan.Auto),
|
|
PtzCmdType.AutoStop => PelcoD.CameraScan(addr, PelcoD.Scan.Manual),
|
|
PtzCmdType.PresetGoto => PelcoD.Preset(addr, PelcoD.PresetAction.Goto, args[1]),
|
|
PtzCmdType.None => Array.Empty<byte>(),
|
|
_ => Array.Empty<byte>(),
|
|
};
|
|
return cmd;
|
|
}
|
|
|
|
public static byte[] GetPelcoPCmd(PtzCmdType cmdType, byte[] args)
|
|
{
|
|
uint addr = args[0];
|
|
uint panSpeed = (uint)(PelcoP.PanSpeedMax + PelcoP.PanSpeedMin) / 2;
|
|
uint tiltSpeed = (uint)(PelcoP.TiltSpeedMax + PelcoP.TiltSpeedMin) / 2;
|
|
byte[] cmd = cmdType switch
|
|
{
|
|
PtzCmdType.Top => PelcoP.CameraTilt(addr, PelcoP.Tilt.Up, tiltSpeed),
|
|
PtzCmdType.Down => PelcoP.CameraTilt(addr, PelcoP.Tilt.Down, tiltSpeed),
|
|
PtzCmdType.Left => PelcoP.CameraPan(addr, PelcoP.Pan.Left, panSpeed),
|
|
PtzCmdType.Right => PelcoP.CameraPan(addr, PelcoP.Pan.Right, panSpeed),
|
|
PtzCmdType.TopLeft => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Left, panSpeed, PelcoP.Tilt.Up, tiltSpeed),
|
|
PtzCmdType.TopRight => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Right, panSpeed, PelcoP.Tilt.Up, tiltSpeed),
|
|
PtzCmdType.DownLeft => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Left, panSpeed, PelcoP.Tilt.Down, tiltSpeed),
|
|
PtzCmdType.DownRight => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Right, panSpeed, PelcoP.Tilt.Down, tiltSpeed),
|
|
PtzCmdType.Stop => PelcoP.CameraStop(addr),
|
|
PtzCmdType.AutoStart => PelcoP.AutoScan(addr, PelcoP.Action.Start),
|
|
PtzCmdType.AutoStop => PelcoP.AutoScan(addr, PelcoP.Action.Stop),
|
|
PtzCmdType.PresetGoto => PelcoP.Preset(addr, PelcoP.PresetAction.Goto, args[1]),
|
|
PtzCmdType.None => Array.Empty<byte>(),
|
|
_ => Array.Empty<byte>(),
|
|
};
|
|
return cmd;
|
|
}
|
|
|
|
public static void HikPtzMove(ref HiKSDK sdk, PtzCmdType cmdType, uint[] args)
|
|
{
|
|
if (sdk == null || args == null) return;
|
|
uint[] arr = new uint[args.Length + 1];
|
|
args.CopyTo(arr, 1);
|
|
switch (cmdType)
|
|
{
|
|
case PtzCmdType.Top:
|
|
arr[0] = HiKOriSDK.TILT_UP;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.Down:
|
|
arr[0] = HiKOriSDK.TILT_DOWN;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.Left:
|
|
arr[0] = HiKOriSDK.PAN_LEFT;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.Right:
|
|
arr[0] = HiKOriSDK.PAN_RIGHT;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.TopLeft:
|
|
arr[0] = HiKOriSDK.UP_LEFT;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.TopRight:
|
|
arr[0] = HiKOriSDK.UP_RIGHT;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.DownLeft:
|
|
arr[0] = HiKOriSDK.DOWN_LEFT;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.DownRight:
|
|
arr[0] = HiKOriSDK.DOWN_RIGHT;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.AutoStart:
|
|
arr[0] = HiKOriSDK.PAN_AUTO;
|
|
sdk.PtzMove(arr);
|
|
break;
|
|
|
|
case PtzCmdType.PresetGoto:
|
|
arr[0] = HiKOriSDK.GOTO_PRESET;
|
|
sdk.PtzPreset(arr);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public enum PtzControlType
|
|
{
|
|
PelcoD,
|
|
PelcoP,
|
|
HikSdk,
|
|
None
|
|
}
|
|
|
|
public enum PtzCmdType
|
|
{
|
|
Top,
|
|
Down,
|
|
Left,
|
|
Right,
|
|
TopLeft,
|
|
TopRight,
|
|
DownLeft,
|
|
DownRight,
|
|
Stop,
|
|
AutoStart,
|
|
AutoStop,
|
|
PresetSet,
|
|
PresetClear,
|
|
PresetGoto,
|
|
None
|
|
}
|