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

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
}