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.

380 lines
15 KiB
C#

using Microsoft.Extensions.DependencyInjection;
using SlnMesnac.Model.dto;
using SlnMesnac.Serilog;
using SlnMesnac.WPF.ViewModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Channels;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static SlnMesnac.WPF.CHCNetSDK;
namespace SlnMesnac.WPF.Page
{
/// <summary>
/// IndexControl.xaml 的交互逻辑
/// </summary>
public partial class IndexControl : UserControl
{
private IndexControlViewModel indexControlViewModel = new IndexControlViewModel();
private SerilogHelper serilogHelper = null;
private bool m_bInitSDK = false;
private Int32 m_lUserID = -1;
private Int32 m_lRealHandle_1 = -1;
private Int32 m_lRealHandle_2 = -1;
public CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo;
public CHCNetSDK.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40;
public CHCNetSDK.NET_DVR_PTZPOS m_struPtzCfg;
private bool bAuto = false;
private CHCNetSDK.RemoteConfigCallback _callback;
private CHCNetSDK.MSGCallBack_V31 m_falarmData_V31 = null;
private string DVRIPAddress = "192.168.1.64"; //设备IP地址或者域名 Device IP
private Int16 DVRPortNumber = 8000; //设备服务端口号 Device Port
private string DVRUserName = "admin"; //设备登录用户名 User name to login
private string DVRPassword = "haiwei@2024"; //设备登录密码 Password to login
public IndexControl()
{
InitializeComponent();
this.DataContext = indexControlViewModel;
serilogHelper = App.ServiceProvider.GetService<SerilogHelper>();
_callback = new CHCNetSDK.RemoteConfigCallback(GetThermInfoCallback);
Task.Run(() =>
{
App.Current.Dispatcher.Invoke(() =>
{
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
DebugInfo("热成像双光谱微型云台初始化失败 error!");
return;
}
else
{
//保存SDK日志 To save the SDK log
CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
DebugInfo("热成像双光谱微型云台初始化成功!");
}
Open_Device();
});
});
}
private void Open_Device()
{
try
{
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(DVRIPAddress, DVRPortNumber, DVRUserName, DVRPassword, ref DeviceInfo);
if (m_lUserID < 0)
{
string str = "热成像双光谱微型云台打开失败, error code= " + CHCNetSDK.NET_DVR_GetLastError(); ; //登录失败,输出错误号 Failed to login and output the error code
DebugInfo(str);
}
else
{
//登录成功
DebugInfo("热成像双光谱微型云台打开成功!");
Start_Grab(); //打开实时预览
///
/// 加载实时温度数据
///
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 = NET_DVR_StartRemoteConfig(m_lUserID, NET_DVR_GET_REALTIME_THERMOMETRY, pCond, size, _callback, IntPtr.Zero);
if (ret < 0)
{
DebugInfo("配置测温失败, 错误代码:" + NET_DVR_GetLastError()); //登录失败,输出错误号
return;
}
}
}
catch (Exception ex)
{
DebugInfo($"热成像双光谱微型云台加载异常: {ex.Message}");
}
}
public void GetThermInfoCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
{
var ret = Marshal.PtrToStructure<NET_DVR_THERMOMETRY_UPLOAD>(lpBuffer);
DebugInfo($"最高温度:{ret.struLinePolygonThermCfg.fMaxTemperature};最低温度:{ret.struLinePolygonThermCfg.fMinTemperature};平均温度:{ret.struLinePolygonThermCfg.fAverageTemperature};温差:{ret.struLinePolygonThermCfg.fTemperatureDiff}");
RealTemperatureInfo realTemperature = new RealTemperatureInfo();
realTemperature.fMaxTemperature = (float)Math.Round(ret.struLinePolygonThermCfg.fMaxTemperature, 1);
realTemperature.fMinTemperature = (float)Math.Round(ret.struLinePolygonThermCfg.fMinTemperature, 1);
realTemperature.fAverageTemperature = (float)Math.Round(ret.struLinePolygonThermCfg.fAverageTemperature, 1);
realTemperature.fTemperatureDiff = (float)Math.Round(ret.struLinePolygonThermCfg.fTemperatureDiff, 1);
indexControlViewModel.RefreshRealTemperature(realTemperature);
string sJpegPicFileName = $"F:\\桌面\\赛轮智慧热电项目\\日志信息\\picture\\{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.jpg";
if(realTemperature.fMaxTemperature > 65)
{
int lChannel = 2;
CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new CHCNetSDK.NET_DVR_JPEGPARA();
lpJpegPara.wPicQuality = 0; //图像质量 Image quality
lpJpegPara.wPicSize = 0xff; //抓图分辨率 Picture size: 2- 4CIF0xff- Auto(使用当前码流分辨率)抓图分辨率需要设备支持更多取值请参考SDK文档
//JPEG抓图 Capture a JPEG picture
if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(m_lUserID, lChannel, ref lpJpegPara, sJpegPicFileName))
{
var str = "NET_DVR_CaptureJPEGPicture failed, error code= " + NET_DVR_GetLastError();
DebugInfo(str);
return;
}
else
{
var str = "Successful to capture the JPEG file and the saved file is " + sJpegPicFileName;
DebugInfo(str);
}
}
}
private void RealHandle_1()
{
try
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.hPlayWnd = RealPlayWnd.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
m_lRealHandle_1 = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser);
if (m_lRealHandle_1 < 0)
{
var str = "光景图像预览加载失败, error code= " + CHCNetSDK.NET_DVR_GetLastError(); //预览失败,输出错误号 failed to start live view, and output the error code.
DebugInfo(str);
}
else
{
//预览成功
DebugInfo("光景图像预览加载成功!");
}
}
catch (Exception ex)
{
serilogHelper.Camera($"光景图像预览加载异常:{ex.Message}");
}
}
private void RealHandle_2()
{
try
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.hPlayWnd = RealPlayWnd2.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
m_lRealHandle_2 = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser);
if (m_lRealHandle_2 < 0)
{
var str = "热成像预览加载失败, error code= " + CHCNetSDK.NET_DVR_GetLastError(); //预览失败,输出错误号 failed to start live view, and output the error code.
DebugInfo(str);
}
else
{
//预览成功
DebugInfo("热成像预览加载成功!");
}
}
catch (Exception ex)
{
serilogHelper.Camera($"热成像图像预览加载异常:{ex.Message}");
}
}
private void Start_Grab()
{
RealHandle_1();
RealHandle_2();
}
private void Stop_Grab()
{
if (!CHCNetSDK.NET_DVR_StopRealPlay(m_lRealHandle_1))
{
var str = "NET_DVR_StopRealPlay failed, error code= " + CHCNetSDK.NET_DVR_GetLastError(); ;
DebugInfo(str);
return;
}
else
{
DebugInfo("NET_DVR_StopRealPlay succ!");
RealPlayWnd.Invalidate();//刷新窗口 refresh the window
}
if (!CHCNetSDK.NET_DVR_StopRealPlay(m_lRealHandle_2))
{
var str = "NET_DVR_StopRealPlay failed, error code= " + CHCNetSDK.NET_DVR_GetLastError(); ;
DebugInfo(str);
return;
}
else
{
DebugInfo("NET_DVR_StopRealPlay succ!");
RealPlayWnd2.Invalidate();//刷新窗口 refresh the window
}
}
private void Close_Device()
{
if (!CHCNetSDK.NET_DVR_Logout(m_lUserID))
{
var str = "NET_DVR_Logout failed, error code= " + CHCNetSDK.NET_DVR_GetLastError(); ;
DebugInfo(str);
return;
}
DebugInfo("NET_DVR_Logout succ!");
}
private void DebugInfo(string str)
{
serilogHelper.Camera(str);
}
private void btnUp_MouseDown(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.TILT_UP, 0, 4);
}
private void btnUp_MouseUp(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.TILT_UP, 1, 4);
}
private void btnDown_MouseDown(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.TILT_DOWN, 0, 4);
}
private void btnDown_MouseUp(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.TILT_DOWN, 1, 4);
}
private void btnLeft_MouseDown(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, (uint)CHCNetSDK.PAN_LEFT, 0, 4);
}
private void btnLeft_MouseUp(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.PAN_LEFT, 1, 4);
}
private void btnRight_MouseDown(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.PAN_RIGHT, 0, 4);
}
private void btnRight_MouseUp(object sender, MouseButtonEventArgs e)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.PAN_RIGHT, 1, 4);
}
private void btn_ptz_set_Click(object sender, RoutedEventArgs e)
{
if (bAuto)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.PAN_AUTO, 1, 4);
btnAuto.Text = "Auto";
bAuto = 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参数失败
DebugInfo(str);
return;
}
else
{
DebugInfo("云台回零加载成功!");
break;
}
Marshal.FreeHGlobal(ptrPtzCfg);
}
}
private void btn_auto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (!bAuto)
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.PAN_AUTO, 0, 4);
btnAuto.Text = "Stop";
bAuto = true;
}
else
{
CHCNetSDK.NET_DVR_PTZControlWithSpeed(m_lRealHandle_1, CHCNetSDK.PAN_AUTO, 1, 4);
btnAuto.Text = "Auto";
bAuto = false;
}
}
}
}