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.
438 lines
14 KiB
438 lines
14 KiB
using EC.Util.CameraSDK;
|
|
using EC.Util.Common;
|
|
using EC.Util.Port;
|
|
using ImTools;
|
|
using JiLinApp.Biz.TransmitAlarm;
|
|
using JiLinApp.Components;
|
|
using JiLinApp.Core;
|
|
using JiLinApp.Docking.Military;
|
|
using JiLinApp.Docking.Ptz;
|
|
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.IO.Ports;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Threading;
|
|
|
|
namespace JiLinApp.Pages.PtzManage;
|
|
|
|
/// <summary>
|
|
/// Main.xaml 的交互逻辑
|
|
/// </summary>
|
|
public partial class Main : UserControl
|
|
{
|
|
#region Fields
|
|
|
|
private AppConfig AppConfig { get; }
|
|
|
|
private MilitaryService MilitaryService { get; }
|
|
|
|
private YcSerialPort Port { get; set; }
|
|
|
|
private List<CameraLinkageInfo> CameraLinkageList { get; set; }
|
|
|
|
private ConcurrentDictionary<string, ICameraSDK> CameraSdkDict { get; } = new();
|
|
|
|
private ConcurrentDictionary<string, CameraRealPlay> RealPlayDict { get; } = new();
|
|
|
|
#endregion Fields
|
|
|
|
public Main()
|
|
{
|
|
InitializeComponent();
|
|
AppConfig = Global.AppConfig;
|
|
MilitaryService = Global.MilitaryService;
|
|
Init();
|
|
}
|
|
|
|
#region Init
|
|
|
|
private void Init()
|
|
{
|
|
if (DataContext != null)
|
|
{
|
|
MainViewModel vm = DataContext as MainViewModel;
|
|
vm.SetView(this);
|
|
}
|
|
|
|
// 初始化串口
|
|
string[] ports = SerialPort.GetPortNames();
|
|
ports = ports.OrderBy(s => int.Parse(Regex.Match(s, @"\d+").Value)).ToArray();
|
|
foreach (string port in ports)
|
|
{
|
|
ComName.Items.Add(new ComboBoxItem { Content = port });
|
|
}
|
|
|
|
// 加载 Military 信息
|
|
LoadMilitaryInfo();
|
|
|
|
// 初始化云台控制类型
|
|
foreach (var cfg in AppConfig.Base.PtzCtrlTypes)
|
|
{
|
|
ControlTypeName.Items.Add(new ComboBoxItem { Content = cfg.Name });
|
|
}
|
|
|
|
// 初始化下拉框 Id
|
|
for (int i = 1; i <= 5; i++)
|
|
{
|
|
CameraId.Items.Add(new ComboBoxItem { Content = i });
|
|
}
|
|
|
|
for (int i = 1; i <= 8; i++)
|
|
{
|
|
PresetId.Items.Add(new ComboBoxItem { Content = i });
|
|
}
|
|
|
|
// 绑定云台响应事件
|
|
List<Button> btnList = new();
|
|
WpfUtil.FindVisualChild(PtzPanel, ref btnList);
|
|
foreach (var btn in btnList)
|
|
{
|
|
btn.AddHandler(MouseDownEvent, new MouseButtonEventHandler(PtzBtn_MouseDown), true);
|
|
btn.AddHandler(MouseUpEvent, new MouseButtonEventHandler(PtzBtn_MouseUp), true);
|
|
}
|
|
|
|
// 刷新控件状态
|
|
ControlTypeName.SelectedIndex = 0;
|
|
}
|
|
|
|
private bool IsConnect()
|
|
{
|
|
return Port != null && Port.IsOpen();
|
|
}
|
|
|
|
private void ChangeState(bool openState)
|
|
{
|
|
if (openState)
|
|
{
|
|
OpenBtn.IsEnabled = false;
|
|
StopBtn.IsEnabled = true;
|
|
}
|
|
else
|
|
{
|
|
OpenBtn.IsEnabled = true;
|
|
StopBtn.IsEnabled = false;
|
|
}
|
|
}
|
|
|
|
#endregion Init
|
|
|
|
#region ElementEvent
|
|
|
|
private void OpenBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (!IsConnect())
|
|
{
|
|
try
|
|
{
|
|
SerialPortParam param = new()
|
|
{
|
|
ComName = ComName.Text,
|
|
BaudRate = int.Parse(BaudRate.Text),
|
|
Parity = 0,
|
|
DataBits = int.Parse(DataBits.Text),
|
|
StopBits = int.Parse(StopBits.Text),
|
|
};
|
|
Port = new YcSerialPort(param);
|
|
Port.OpenCom();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Port = null;
|
|
MessageBox.Show(ex.ToString());
|
|
throw;
|
|
}
|
|
}
|
|
ChangeState(true);
|
|
}
|
|
|
|
private void StopBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (IsConnect())
|
|
{
|
|
Port.CloseCom();
|
|
Port = null;
|
|
}
|
|
ChangeState(false);
|
|
}
|
|
|
|
private void PtzBtn_MouseDown(object sender, RoutedEventArgs e)
|
|
{
|
|
PtzControlType ctrlType = PtzControlTypeConfigHelper.GetControlType(ControlTypeName.Text);
|
|
PtzCmdType cmdType = PtzCmd.GetCmdType(((Button)sender).Name.Replace("Btn", ""));
|
|
|
|
switch (ctrlType)
|
|
{
|
|
case PtzControlType.PelcoD:
|
|
case PtzControlType.PelcoP:
|
|
if (!IsConnect()) break;
|
|
byte cameraId = byte.Parse(CameraId.Text);
|
|
byte[] cmd = PtzComCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId });
|
|
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
|
|
break;
|
|
|
|
case PtzControlType.DCamera:
|
|
if (!IsConnect()) break;
|
|
cmd = PtzComCmd.GetCmd(ctrlType, cmdType);
|
|
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
|
|
break;
|
|
|
|
case PtzControlType.CameraSdk:
|
|
string cameraIp = CameraIp.Text;
|
|
CameraSdkDict.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
|
|
if (cameraSdk == null) break;
|
|
int stop = 0;
|
|
PtzCameraCmd.PtzMove(cameraSdk, cmdType, new int[] { stop });
|
|
break;
|
|
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
private void PtzBtn_MouseUp(object sender, RoutedEventArgs e)
|
|
{
|
|
PtzControlType ctrlType = PtzControlTypeConfigHelper.GetControlType(ControlTypeName.Text);
|
|
PtzCmdType cmdType;
|
|
switch (ctrlType)
|
|
{
|
|
case PtzControlType.PelcoD:
|
|
case PtzControlType.PelcoP:
|
|
if (!IsConnect()) break;
|
|
cmdType = PtzCmd.GetCmdType("Stop");
|
|
byte cameraId = byte.Parse(CameraId.Text);
|
|
byte[] cmd = PtzComCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId });
|
|
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
|
|
break;
|
|
|
|
case PtzControlType.DCamera:
|
|
if (!IsConnect()) break;
|
|
cmdType = PtzCmd.GetCmdType("Stop");
|
|
cmd = PtzComCmd.GetCmd(ctrlType, cmdType);
|
|
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
|
|
break;
|
|
|
|
case PtzControlType.CameraSdk:
|
|
string cameraIp = CameraIp.Text;
|
|
CameraSdkDict.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
|
|
if (cameraSdk == null) break;
|
|
cmdType = PtzCmd.GetCmdType(((Button)sender).Name.Replace("Btn", ""));
|
|
int stop = 1;
|
|
PtzCameraCmd.PtzMove(cameraSdk, cmdType, new int[] { stop });
|
|
break;
|
|
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
private void GotoBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
PtzControlType ctrlType = PtzControlTypeConfigHelper.GetControlType(ControlTypeName.Text);
|
|
PtzCmdType cmdType = PtzCmdType.PresetGoto;
|
|
byte presetId = byte.Parse(PresetId.Text);
|
|
|
|
switch (ctrlType)
|
|
{
|
|
case PtzControlType.PelcoD:
|
|
case PtzControlType.PelcoP:
|
|
if (!IsConnect()) break;
|
|
byte cameraId = byte.Parse(CameraId.Text);
|
|
byte[] cmd = PtzComCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId, presetId });
|
|
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
|
|
break;
|
|
|
|
case PtzControlType.CameraSdk:
|
|
string cameraIp = CameraIp.Text;
|
|
CameraSdkDict.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
|
|
if (cameraSdk == null) break;
|
|
PtzCameraCmd.PtzMove(cameraSdk, cmdType, new int[] { presetId });
|
|
break;
|
|
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
private void ControlType_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (CameraId == null || CameraIp == null) return;
|
|
string ctrlTypeStr = ((ComboBoxItem)e.AddedItems[0]).Content.ToString();
|
|
PtzControlType ctrlType = PtzCmd.GetControlType(ctrlTypeStr);
|
|
|
|
switch (ctrlType)
|
|
{
|
|
case PtzControlType.PelcoD:
|
|
case PtzControlType.PelcoP:
|
|
case PtzControlType.DCamera:
|
|
CameraId.IsEnabled = true;
|
|
CameraIp.IsEnabled = false;
|
|
break;
|
|
|
|
case PtzControlType.CameraSdk:
|
|
CameraId.IsEnabled = false;
|
|
CameraIp.IsEnabled = true;
|
|
break;
|
|
|
|
default:
|
|
CameraId.IsEnabled = false;
|
|
CameraIp.IsEnabled = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void ControlTypeName_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (CameraId == null || CameraIp == null) return;
|
|
string ctrlTypeName = ((ComboBoxItem)e.AddedItems[0]).Content.ToString();
|
|
PtzControlType ctrlType = PtzControlTypeConfigHelper.GetControlType(ctrlTypeName);
|
|
|
|
switch (ctrlType)
|
|
{
|
|
case PtzControlType.PelcoD:
|
|
case PtzControlType.PelcoP:
|
|
case PtzControlType.DCamera:
|
|
CameraId.IsEnabled = true;
|
|
CameraIp.IsEnabled = false;
|
|
break;
|
|
|
|
case PtzControlType.CameraSdk:
|
|
CameraId.IsEnabled = false;
|
|
CameraIp.IsEnabled = true;
|
|
break;
|
|
|
|
default:
|
|
CameraId.IsEnabled = false;
|
|
CameraIp.IsEnabled = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endregion ElementEvent
|
|
|
|
#region InvokeEvent
|
|
|
|
public void HandleAlarmInvoke(AlarmMessage alarm)
|
|
{
|
|
if (alarm == null) return;
|
|
bool realPlay = AppConfig.AlarmPlatform.RealPlay;
|
|
string deviceId = alarm.LabelCode;
|
|
string sensorId = alarm.ChannelId;
|
|
//CameraLinkageInfo cameraLinkage = GetCameraLinkage(sensorId);
|
|
List<CameraLinkageInfo> cameraLinkages = GetCameraLinkageList(sensorId);
|
|
foreach (var item in cameraLinkages)
|
|
{
|
|
if (item == null) { LogUnit.Error(this, $"CameraLinkageInfo(sensorId:{sensorId}) not found."); return; }
|
|
string cameraId = item.CameraId;
|
|
ICameraSDK cameraSdk = GetCameraSdk(cameraId);
|
|
if (cameraSdk == null) { LogUnit.Error(this, $"CameraSdk(cameraId:{cameraId}) not found."); return; }
|
|
if (realPlay) Dispatcher.Invoke(() => ShowLiveVideo(cameraSdk));
|
|
|
|
// TODO: 设计 PriorityQueue
|
|
int len = item.PresetIds.Length;
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
int presetId = item.PresetIds[i];
|
|
PtzCameraCmd.PtzMove(cameraSdk, PtzCmdType.PresetGoto, new int[] { presetId });
|
|
if (i != len) Thread.Sleep(5000);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ShowLiveVideo(string cameraIp)
|
|
{
|
|
CameraSdkDict.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
|
|
if (cameraSdk == null) return;
|
|
RealPlayDict.TryGetValue(cameraIp, out CameraRealPlay realPlay);
|
|
if (realPlay == null || realPlay.IsClosed)
|
|
{
|
|
realPlay = new(cameraSdk);
|
|
realPlay.Owner = Window.GetWindow(this);
|
|
RealPlayDict[cameraIp] = realPlay;
|
|
}
|
|
realPlay.Show();
|
|
realPlay.HideMinButton();
|
|
realPlay.StartPlay();
|
|
}
|
|
|
|
public void ShowLiveVideo(ICameraSDK cameraSdk)
|
|
{
|
|
if (cameraSdk == null) return;
|
|
string cameraIp = cameraSdk.CameraInfo.Ip;
|
|
RealPlayDict.TryGetValue(cameraIp, out CameraRealPlay realPlay);
|
|
if (realPlay == null || realPlay.IsClosed)
|
|
{
|
|
realPlay = new(cameraSdk);
|
|
realPlay.Owner = Window.GetWindow(this);
|
|
realPlay.HideMinButton();
|
|
RealPlayDict[cameraIp] = realPlay;
|
|
}
|
|
realPlay.Show();
|
|
if (!realPlay.IsPlaying()) realPlay.StartPlayFirmly();
|
|
}
|
|
|
|
#endregion InvokeEvent
|
|
|
|
#region Military
|
|
|
|
private void LoadMilitaryInfo()
|
|
{
|
|
List<CameraInfo> cameraList = MilitaryService.GetCameraList();
|
|
CameraLinkageList = MilitaryService.GetCameraLinkageList();
|
|
//List<CameraInfo> cameraList = new();
|
|
//CameraLinkageList = new();
|
|
TaskUtil.RunCatch(() => Dispatcher.Invoke(() => LoadCameraSdkDict(cameraList)));
|
|
}
|
|
|
|
private void LoadCameraSdkDict(List<CameraInfo> cameraList)
|
|
{
|
|
CameraSdkDict.Clear();
|
|
for (int i = 0; i < cameraList.Count; i++)
|
|
{
|
|
CameraInfo info = cameraList[i];
|
|
string ip = info.Ip;
|
|
if (CameraSdkDict.ContainsKey(ip)) continue;
|
|
CameraSdkDict[ip] = null;
|
|
CameraIp.Items.Add(new ComboBoxItem { Content = ip });
|
|
TaskUtil.RunCatch(() =>
|
|
{
|
|
ICameraSDK sdk = CameraFactory.BuildCameraSdk(info);
|
|
bool ret = sdk.Init();
|
|
if (!ret) return;
|
|
CameraSdkDict[ip] = sdk;
|
|
});
|
|
}
|
|
}
|
|
|
|
private CameraLinkageInfo GetCameraLinkage(string sensorId)
|
|
{
|
|
foreach (var item in CameraLinkageList)
|
|
{
|
|
if (sensorId.Equals(item.SensorId)) return item;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private List<CameraLinkageInfo> GetCameraLinkageList(string sensorId)
|
|
{
|
|
List<CameraLinkageInfo> list = new();
|
|
foreach (var item in CameraLinkageList)
|
|
{
|
|
if (sensorId.Equals(item.SensorId)) list.Add(item);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private ICameraSDK GetCameraSdk(string cameraId)
|
|
{
|
|
foreach (var item in CameraSdkDict.Values)
|
|
{
|
|
if (cameraId.Equals(item.CameraInfo.Id)) return item;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
#endregion Military
|
|
}
|