You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

804 lines
32 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json.Linq;
using NVelocity.Util.Introspection;
using Quartz;
using SlnMesnac.Business;
using SlnMesnac.Business.@base;
using SlnMesnac.Config;
using SlnMesnac.Model.dto;
using SlnMesnac.Serilog;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static SlnMesnac.WPF.CHCNetSDK;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* 版权所有 (c) 2024 WenJY 保留所有权利。
* CLR版本4.0.30319.42000
* 机器名称T14-GEN3-7895
* 命名空间SlnMesnac.WPF.ViewModel
* 唯一标识018cae17-522c-47d7-be8b-558e6ddda75f
*
* 创建者WenJY
* 电子邮箱:
* 创建时间2024-10-31 9:40:56
* 版本V1.0.0
* 描述:
*
*--------------------------------------------------------------------
* 修改人:
* 时间:
* 修改说明:
*
* 版本V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
namespace SlnMesnac.WPF.ViewModel
{
public partial class IndexControlViewModel : ObservableObject
{
private SerilogHelper _log;
private AutoModeBusiness autoModeBusiness;
private InspModeBusiness inspModeBusiness;
private FixedPointBusiness fixedPointBusiness;
private WebSocketBusiness webSocketBusiness;
private CabinetInfoBusiness cabinetInfoBusiness;
private AppConfig _appConfig;
private CHCNetSDK.RemoteConfigCallback _callback;
private CHCNetSDK.MSGCallBack_V31 m_falarmData_V31;
public CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo;
private bool m_bInitSDK = false;
private Int32 m_lUserID = -1;
public Int32 Scenery_RealHandle = -1;
public Int32 Thermal_RealHandle = -1;
//private const string DVRIPAddress = "192.168.2.64"; //设备IP地址或者域名 Device IP
//private const Int16 DVRPortNumber = 8000; //设备服务端口号 Device Port
//private const string DVRUserName = "admin"; //设备登录用户名 User name to login
//private const string DVRPassword = "haiwei@2024"; //设备登录密码 Password to login
private readonly IScheduler _scheduler;
public IndexControlViewModel()
{
try
{
_log = App.ServiceProvider.GetService<SerilogHelper>();
_callback = new CHCNetSDK.RemoteConfigCallback(GetThermInfoCallback);
m_falarmData_V31 = new CHCNetSDK.MSGCallBack_V31(MsgCallback_V31);
_appConfig = App.ServiceProvider.GetService<AppConfig>();
autoModeBusiness = App.ServiceProvider.GetService<AutoModeBusiness>();
inspModeBusiness = App.ServiceProvider.GetService<InspModeBusiness>();
fixedPointBusiness = App.ServiceProvider.GetService<FixedPointBusiness>();
webSocketBusiness = App.ServiceProvider.GetService<WebSocketBusiness>();
cabinetInfoBusiness = App.ServiceProvider.GetService<CabinetInfoBusiness>();
_scheduler = App.ServiceProvider.GetService<IScheduler>();
autoModeBusiness.CaptureAlarmPictureEvent += CapturePicture;
autoModeBusiness.GimbaRotationControlEvent += GimbaRotationControl;
fixedPointBusiness.CaptureAlarmPictureEvent += CapturePicture;
fixedPointBusiness.GimbaRotationControlEvent += GimbaRotationControl;
inspModeBusiness.CaptureAlarmPictureEvent += CapturePicture;
inspModeBusiness.GimbaRotationControlEvent += GimbaRotationControl;
RefreshTrackMotorAddress();
}
catch (Exception ex)
{
_log.Error("巡检控制系统初始化失败", ex);
MessageBox.Show($"巡检控制系统初始化失败:{ex.Message}");
}
}
#region 参数定义
private string _gimbalAutoRunText = "Auto";
public string GimbalAutoRunText
{
get => _gimbalAutoRunText;
set => SetProperty(ref _gimbalAutoRunText, value);
}
private int _realPlcAddress = 0;
public int RealPlcAddress
{
get => _realPlcAddress;
set => SetProperty(ref _realPlcAddress, value);
}
private double _realDeviceSpeed = 0.0;
public double RealDeviceSpeed
{
get => _realDeviceSpeed;
set => SetProperty(ref _realDeviceSpeed, value);
}
private string _realDeviceStatus = "未连接";
public string RealDeviceStatus
{
get => _realDeviceStatus;
set => SetProperty(ref _realDeviceStatus, value);
}
public RealTemperatureInfo _realTemperature;
public RealTemperatureInfo RealTemperature
{
get => _realTemperature;
set => SetProperty(ref _realTemperature, value);
}
#endregion
#region 事件定义
public delegate void RefreshHighlightStation(int cabinetCode);
public event RefreshHighlightStation RefreshHighlightStationEvent;
#endregion
public void Login(PictureBox SceneryPreviewWnd, PictureBox ThermalPreviewWnd)
{
try
{
Task.Run(() =>
{
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
_log.Info("热成像双光谱微型云台初始化失败 error!");
return;
}
else
{
//保存SDK日志 To save the SDK log
CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
_log.Info("热成像双光谱微型云台初始化成功!");
}
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(_appConfig.cameraIp, _appConfig.cameraPort, _appConfig.cameraUserName, _appConfig.cameraPassword, ref DeviceInfo);
if (m_lUserID < 0)
{
string str = "热成像双光谱微型云台打开失败, error code= " + CHCNetSDK.NET_DVR_GetLastError(); ; //登录失败,输出错误号 Failed to login and output the error code
_log.Info(str);
}
else
{
//登录成功
_log.Info("热成像双光谱微型云台打开成功!");
SceneryPreview(SceneryPreviewWnd);
ThermalPreview(ThermalPreviewWnd);
///
/// 加载实时温度数据
///
var size = Marshal.SizeOf(typeof(CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND));
CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = new CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND();
struThermCond.dwSize = (uint)size;
struThermCond.byRuleID = 0; //规则ID0代表获取全部规则具体规则ID从1开始
struThermCond.dwChan = 2;// dwChannel; //从1开始0xffffffff代表获取全部通道
IntPtr pCond = Marshal.AllocCoTaskMem(size);
Marshal.StructureToPtr(struThermCond, pCond, false);
var ret = CHCNetSDK.NET_DVR_StartRemoteConfig(m_lUserID, CHCNetSDK.NET_DVR_GET_REALTIME_THERMOMETRY, pCond, size, _callback, IntPtr.Zero);
if (ret < 0)
{
_log.Info("配置测温失败, 错误代码:" + CHCNetSDK.NET_DVR_GetLastError()); //登录失败,输出错误号
return;
}
///
/// 报警布防
///
//设置透传报警信息类型
CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struLocalCfg = new CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
struLocalCfg.byAlarmJsonPictureSeparate = 1;//控制JSON透传报警数据和图片是否分离0-不分离(COMM_VCA_ALARM返回)1-分离分离后走COMM_ISAPI_ALARM回调返回
Int32 nSize = Marshal.SizeOf(struLocalCfg);
IntPtr ptrLocalCfg = Marshal.AllocHGlobal(nSize);
Marshal.StructureToPtr(struLocalCfg, ptrLocalCfg, false);
if (!CHCNetSDK.NET_DVR_SetSDKLocalCfg(17, ptrLocalCfg)) //NET_DVR_LOCAL_CFG_TYPE_GENERAL
{
MessageBox.Show("NET_DVR_SetSDKLocalCfg failed, error code= " + CHCNetSDK.NET_DVR_GetLastError());
}
Marshal.FreeHGlobal(ptrLocalCfg);
CHCNetSDK.NET_DVR_SETUPALARM_PARAM struAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM();
struAlarmParam.dwSize = (uint)Marshal.SizeOf(struAlarmParam);
struAlarmParam.byLevel = 1; //0- 一级布防,1- 二级布防
struAlarmParam.byAlarmInfoType = 1;//智能交通设备有效,新报警信息类型
struAlarmParam.byFaceAlarmDetection = 1;//1-人脸侦测
var m_lAlarmHandle = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(m_lUserID, ref struAlarmParam);
if (m_lAlarmHandle < 0)
{
_log.Info("布防失败,错误号::" + CHCNetSDK.NET_DVR_GetLastError());
}
var res = CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(m_falarmData_V31, IntPtr.Zero);
}
});
}
catch (Exception ex)
{
_log.Info($"热成像双光谱微型云台加载异常: {ex.Message}");
}
}
/// <summary>
/// 测温回调函数
/// </summary>
/// <param name="dwType"></param>
/// <param name="lpBuffer"></param>
/// <param name="dwBufLen"></param>
/// <param name="pUserData"></param>
public void GetThermInfoCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
{
var ret = Marshal.PtrToStructure<CHCNetSDK.NET_DVR_THERMOMETRY_UPLOAD>(lpBuffer);
this.RealTemperature = new RealTemperatureInfo()
{
fMaxTemperature = (float)Math.Round(ret.struLinePolygonThermCfg.fMaxTemperature, 1),
fMinTemperature = (float)Math.Round(ret.struLinePolygonThermCfg.fMinTemperature, 1),
fAverageTemperature = (float)Math.Round(ret.struLinePolygonThermCfg.fAverageTemperature, 1),
fTemperatureDiff = (float)Math.Round(ret.struLinePolygonThermCfg.fTemperatureDiff, 1),
};
using (var scope = App.ServiceProvider.CreateScope())
{
var info = scope.ServiceProvider.GetRequiredService<RealTemperatureInfo>();
info.fMaxTemperature = _realTemperature.fMaxTemperature;
info.fMinTemperature = _realTemperature.fMinTemperature;
info.fAverageTemperature = _realTemperature.fAverageTemperature;
info.fTemperatureDiff = _realTemperature.fTemperatureDiff;
}
webSocketBusiness.Encapsulation(false, null, null);
}
/// <summary>
/// 抓拍图像
/// </summary>
/// <param name="sJpegPicFileName"></param>
public void CapturePicture(string sJpegPicFileName)
{
for (int i = 1; i < 3; i++)
{
CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new CHCNetSDK.NET_DVR_JPEGPARA();
lpJpegPara.wPicQuality = 0;
lpJpegPara.wPicSize = 0xff;
var path = string.Empty;
if (i == 1)
{
path = $"{_appConfig.visibleRangePath}\\{sJpegPicFileName}";
}
else
{
path = $"{_appConfig.infraredImagePath}\\{sJpegPicFileName}";
}
if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(m_lUserID, i, ref lpJpegPara, path))
{
_log.Info("图像信息保存失败, error code= " + NET_DVR_GetLastError());
return;
}
else
{
_log.Info("图像信息保存成功: " + path);
}
}
}
/// <summary>
/// 可见光景预览加载
/// </summary>
/// <param name="SceneryPreviewWnd"></param>
public void SceneryPreview(PictureBox SceneryPreviewWnd)
{
try
{
App.Current.Dispatcher.Invoke(() =>
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.hPlayWnd = SceneryPreviewWnd.Handle;//预览窗口 live view window
lpPreviewInfo.lChannel = 1;//预览的设备通道 the device channel number
lpPreviewInfo.dwStreamType = 0;//码流类型0-主码流1-子码流2-码流33-码流4以此类推
lpPreviewInfo.dwLinkMode = 0;//连接方式0- TCP方式1- UDP方式2- 多播方式3- RTP方式4-RTP/RTSP5-RSTP/HTTP
lpPreviewInfo.bBlocked = true; //0- 非阻塞取流1- 阻塞取流
lpPreviewInfo.dwDisplayBufNum = 15; //播放库显示缓冲区最大帧数
IntPtr pUser = IntPtr.Zero;//用户数据 user data
Scenery_RealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser);
if (Scenery_RealHandle < 0)
{
_log.Info("光景图像预览加载失败, error code= " + CHCNetSDK.NET_DVR_GetLastError());
}
else
{
//预览成功
_log.Info("光景图像预览加载成功 ");
}
});
}
catch (Exception ex)
{
_log.Camera($"光景图像预览加载异常:{ex.Message}");
}
}
/// <summary>
/// 热成像预览加载
/// </summary>
/// <param name="ThermalPreviewWnd"></param>
public void ThermalPreview(PictureBox ThermalPreviewWnd)
{
try
{
App.Current.Dispatcher.Invoke(() =>
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.hPlayWnd = ThermalPreviewWnd.Handle;//预览窗口 live view window
lpPreviewInfo.lChannel = 2;//预览的设备通道 the device channel number
lpPreviewInfo.dwStreamType = 0;//码流类型0-主码流1-子码流2-码流33-码流4以此类推
lpPreviewInfo.dwLinkMode = 0;//连接方式0- TCP方式1- UDP方式2- 多播方式3- RTP方式4-RTP/RTSP5-RSTP/HTTP
lpPreviewInfo.bBlocked = true; //0- 非阻塞取流1- 阻塞取流
lpPreviewInfo.dwDisplayBufNum = 15; //播放库显示缓冲区最大帧数
IntPtr pUser = IntPtr.Zero;//用户数据 user data
Thermal_RealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser);
if (Thermal_RealHandle < 0)
{
_log.Info("热成像预览加载失败, error code= " + CHCNetSDK.NET_DVR_GetLastError());
}
else
{
//预览成功
_log.Info("热成像预览加载成功");
}
});
}
catch (Exception ex)
{
_log.Camera($"热成像图像预览加载异常:{ex.Message}");
}
}
/// <summary>
/// 关闭预览
/// </summary>
/// <param name="SceneryPreviewWnd"></param>
/// <param name="ThermalPreviewWnd"></param>
public void ClosePreview(PictureBox SceneryPreviewWnd, PictureBox ThermalPreviewWnd)
{
if (!CHCNetSDK.NET_DVR_StopRealPlay(Scenery_RealHandle))
{
var str = "NET_DVR_StopRealPlay failed, error code= " + CHCNetSDK.NET_DVR_GetLastError(); ;
_log.Info(str);
return;
}
else
{
_log.Info("NET_DVR_StopRealPlay succ!");
SceneryPreviewWnd.Invalidate();//刷新窗口 refresh the window
}
if (!CHCNetSDK.NET_DVR_StopRealPlay(Thermal_RealHandle))
{
var str = "NET_DVR_StopRealPlay failed, error code= " + CHCNetSDK.NET_DVR_GetLastError(); ;
_log.Info(str);
return;
}
else
{
_log.Info("NET_DVR_StopRealPlay succ!");
ThermalPreviewWnd.Invalidate();//刷新窗口 refresh the window
Thermal_RealHandle = 0;
}
}
/// <summary>
/// 退出设备
/// </summary>
public void Logout()
{
if (!CHCNetSDK.NET_DVR_Logout(m_lUserID))
{
_log.Info("NET_DVR_Logout failed, error code= " + CHCNetSDK.NET_DVR_GetLastError());
return;
}
if (!CHCNetSDK.NET_DVR_Cleanup())
{
_log.Info("NET_DVR_Cleanup failed, error code= " + CHCNetSDK.NET_DVR_GetLastError());
return;
}
else
{
this.RealTemperature = new RealTemperatureInfo()
{
fMaxTemperature = 0,
fMinTemperature = 0,
fAverageTemperature = 0,
fTemperatureDiff = 0,
};
}
_log.Info("NET_DVR_Logout succ!");
}
/// <summary>
/// 云台控制
/// </summary>
/// <param name="direction"></param>
/// <param name="is_MouseDown"></param>
public void GimbalOperate(string direction, bool is_MouseDown)
{
if (is_MouseDown)
{
switch (direction)
{
case "left":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, (uint)CHCNetSDK.PAN_LEFT, 0, 4);
break;
case "right":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.PAN_RIGHT, 0, 4);
break;
case "up":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.TILT_UP, 0, 4);
break;
case "down":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.TILT_DOWN, 0, 4);
break;
case "zoomIn":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.ZOOM_IN, 0);
break;
case "zoomOut":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.ZOOM_OUT, 0);
break;
case "focusNear":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.FOCUS_NEAR, 0);
break;
case "focusFar":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.FOCUS_FAR, 0);
break;
default:
break;
}
}
else
{
switch (direction)
{
case "left":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.PAN_LEFT, 1, 4);
break;
case "right":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.PAN_RIGHT, 1, 4);
break;
case "up":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.TILT_UP, 1, 4);
break;
case "down":
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.TILT_DOWN, 1, 4);
break;
case "zoomIn":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.ZOOM_IN, 1);
break;
case "zoomOut":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.ZOOM_OUT, 1);
break;
case "focusNear":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.FOCUS_NEAR, 1);
break;
case "focusFar":
CHCNetSDK.NET_DVR_PTZControl(Scenery_RealHandle, CHCNetSDK.FOCUS_FAR, 1);
break;
default:
break;
}
}
}
private bool gimbalAuto = false;
public CHCNetSDK.NET_DVR_PTZPOS m_struPtzCfg;
/// <summary>
/// 云台回原点
/// </summary>
[RelayCommand]
private void GimbalOrigin()
{
if (gimbalAuto)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.PAN_AUTO, 1, 4);
this.GimbalAutoRunText = "Auto";
gimbalAuto = false;
}
float wPanPos, wTiltPos, wZoomPos;
var flag = 0;
m_struPtzCfg.wAction = 1;
m_struPtzCfg.wPanPos = (ushort)(Convert.ToUInt16("20", 16));
m_struPtzCfg.wTiltPos = (ushort)(Convert.ToUInt16("4", 16));
m_struPtzCfg.wZoomPos = (ushort)(Convert.ToUInt16("10", 16));
while (flag == 0)
{
Int32 nSize = Marshal.SizeOf(m_struPtzCfg);
IntPtr ptrPtzCfg = Marshal.AllocHGlobal(nSize);
Marshal.StructureToPtr(m_struPtzCfg, ptrPtzCfg, false);
if (!CHCNetSDK.NET_DVR_SetDVRConfig(m_lUserID, CHCNetSDK.NET_DVR_SET_PTZPOS, 1, ptrPtzCfg, (UInt32)nSize))
{
var str = "云台回零加载异常, error code= " + CHCNetSDK.NET_DVR_GetLastError();
//设置POS参数失败
_log.Info(str);
return;
}
else
{
_log.Info("云台回零加载成功!");
break;
}
Marshal.FreeHGlobal(ptrPtzCfg);
}
}
public void GimbaRotationControl(string wPanPos, string wTiltPos, string wZoomPos)
{
try
{
var flag = 0;
m_struPtzCfg.wAction = 1;
m_struPtzCfg.wPanPos = (ushort)(Convert.ToUInt16(wPanPos, 16));
m_struPtzCfg.wTiltPos = (ushort)(Convert.ToUInt16(wTiltPos, 16));
m_struPtzCfg.wZoomPos = (ushort)(Convert.ToUInt16(wZoomPos, 16));
while (flag == 0)
{
Int32 nSize = Marshal.SizeOf(m_struPtzCfg);
IntPtr ptrPtzCfg = Marshal.AllocHGlobal(nSize);
Marshal.StructureToPtr(m_struPtzCfg, ptrPtzCfg, false);
if (!CHCNetSDK.NET_DVR_SetDVRConfig(m_lUserID, CHCNetSDK.NET_DVR_SET_PTZPOS, 1, ptrPtzCfg, (UInt32)nSize))
{
var str = "云台旋转控制异常, error code= " + CHCNetSDK.NET_DVR_GetLastError();
//设置POS参数失败
_log.Info(str);
return;
}
else
{
Marshal.FreeHGlobal(ptrPtzCfg);
_log.Info("云台旋转控制成功!");
break;
}
}
//bool isFlag = true;
//while (isFlag)
//{
// UInt32 dwReturn = 0;
// Int32 nSize = Marshal.SizeOf(m_struPtzCfg);
// IntPtr ptrPtzCfg = Marshal.AllocHGlobal(nSize);
// Marshal.StructureToPtr(m_struPtzCfg, ptrPtzCfg, false);
// //获取参数失败
// if (!CHCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, CHCNetSDK.NET_DVR_GET_PTZPOS, -1, ptrPtzCfg, (UInt32)nSize, ref dwReturn))
// {
// return;
// }
// else
// {
// m_struPtzCfg = (CHCNetSDK.NET_DVR_PTZPOS)Marshal.PtrToStructure(ptrPtzCfg, typeof(CHCNetSDK.NET_DVR_PTZPOS));
// //成功获取显示ptz参数
// ushort wPanPos2 = Convert.ToUInt16(Convert.ToString(m_struPtzCfg.wPanPos, 16));
// ushort wTiltPos2 = Convert.ToUInt16(Convert.ToString(m_struPtzCfg.wTiltPos, 16));
// ushort wZoomPos2 = Convert.ToUInt16(Convert.ToString(m_struPtzCfg.wZoomPos, 16));
// if (Convert.ToString(wPanPos2 * 1f) == wPanPos && Convert.ToString(wTiltPos2 * 1f) == wTiltPos && Convert.ToString(wZoomPos2 * 1f) == wZoomPos)
// {
// isFlag = false;
// }
// }
// Task.Delay(1000).Wait();
//}
}
catch (Exception ex)
{
_log.Info($"云台旋转控制异常:{ex.Message}");
}
}
/// <summary>
/// 云台自动运行模式
/// </summary>
public void GimbalAutoRun()
{
if (!gimbalAuto)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.PAN_AUTO, 0, 4);
this.GimbalAutoRunText = "Stop";
gimbalAuto = true;
}
else
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(Scenery_RealHandle, CHCNetSDK.PAN_AUTO, 1, 4);
this.GimbalAutoRunText = "Auto";
gimbalAuto = false;
}
}
/// <summary>
/// 开启自动模式
/// </summary>
public async void Start_AutoMode()
{
//autoModeBusiness.Start();
if (!_scheduler.IsStarted)
{
await _scheduler.Start();
}
var myJobKey = new JobKey("AutoModeJob", "AutoModeJobGroup");
await _scheduler.ResumeJob(myJobKey);
}
/// <summary>
/// 关闭自动模式
/// </summary>
public async void Stop_AutoMode()
{
var myJobKey = new JobKey("AutoModeJob", "AutoModeJobGroup");
await _scheduler.PauseJob(myJobKey);
autoModeBusiness.ClearPlcMode();
}
/// <summary>
/// 开启巡检模式
/// </summary>
public async void Start_InspMode()
{
//string taskCode = DateTime.Now.ToString("yyyyMMddHHmmssffff");
//string fileName = $"{taskCode}.mp4";
//inspModeBusiness.Start(taskCode, fileName);
if (!_scheduler.IsStarted)
{
await _scheduler.Start();
}
var myJobKey = new JobKey("InspModeJob", "InspModeJobGroup");
await _scheduler.ResumeJob(myJobKey);
}
/// <summary>
/// 关闭巡检模式
/// </summary>
public async void Stop_InspMode()
{
var myJobKey = new JobKey("InspModeJob", "InspModeJobGroup");
await _scheduler.PauseJob(myJobKey);
autoModeBusiness.ClearPlcMode();
}
public void Stop_PointMode()
{
fixedPointBusiness.EndFixedPoint(null, true);
autoModeBusiness.ClearPlcMode();
}
private int lastTrackMotorAddress = 0;
private void RefreshTrackMotorAddress()
{
Task.Run(() =>
{
while (true)
{
int trackMotorAddress = autoModeBusiness.GetTrackMotorAddress();
if (trackMotorAddress != lastTrackMotorAddress)
{
RealPlcAddress = trackMotorAddress;
RefreshHighlightStationEvent?.Invoke(trackMotorAddress);
}
double speed = autoModeBusiness.GetDeviceSpeed();
RealDeviceSpeed = Math.Round(speed, 2);
string deviceStatus = autoModeBusiness.GetDeviceStatus();
RealDeviceStatus = deviceStatus;
Task.Delay(1000).Wait();
}
});
}
public bool MsgCallback_V31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
AlarmMessageHandle(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
return true;
}
public void AlarmMessageHandle(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
switch (lCommand)
{
case CHCNetSDK.COMM_ISAPI_ALARM://ISAPI报警信息上传
ProcessCommAlarm_ISAPIAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
break;
default:
{
string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');
string stringAlarm = "报警上传信息类型0x" + Convert.ToString(lCommand, 16);
}
break;
}
}
private void ProcessCommAlarm_ISAPIAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
try
{
CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO struISAPIAlarm = new CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO();
uint dwSize = (uint)Marshal.SizeOf(struISAPIAlarm);
struISAPIAlarm = (CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO));
string stringAlarm = $"ISAPI报警信息byDataType{struISAPIAlarm.byDataType}";
_log.Info($"云台避障报警:{stringAlarm}");
autoModeBusiness.SendCameraAlarmToPlc();
}catch(Exception e)
{
_log.Info($"云台避障报警逻辑处理异常:{e.Message}");
}
}
public void QueryCabinetName(int cabinetCode, out string cabinetName)
{
cabinetInfoBusiness.QueryCabinetName(cabinetCode, out cabinetName);
}
}
}