Dispenser/DispenserHal/Camera/Factory/CameraManager.cs

111 lines
3.0 KiB
C#

using System.Drawing;
using DispenserCommon.Enums;
using DispenserCommon.Events;
using DispenserCommon.Exceptions;
using DispenserCommon.Utils;
using DispenserHal.Camera.Client;
using DispenserHal.Camera.DTO;
using DispenserHal.Camera.VO;
using DispenserUI.Exceptions;
using Serilog;
namespace DispenserHal.Camera.Factory;
/// <summary>
/// 相机管理器,用于全局管理相机的连接
/// </summary>
public class CameraManager
{
private static CameraClient? _camera;
/// <summary>
/// 全局初始化连接相机
/// </summary>
public static void Connect()
{
InitCamera();
}
/// <summary>
/// 对相机进行重连
/// </summary>
public static void ReConnect()
{
ToastUtil.Info("正在尝试重新连接相机");
Log.Information("正在尝试重新连接相机");
if (_camera != null)
{
Close();
}
InitCamera();
}
private static void InitCamera()
{
try
{
EventBus<string>.Publish(EventType.SetupNotify, "正在连接相机");
_camera = CreateCamera(CameraConfig.CameraSn, CallBack);
var cameraResponseVo = _camera.Connect();
if (!cameraResponseVo.IsSuccess())
{
ToastUtil.Error($"无法连接到相机 {CameraConfig.CameraSn}");
throw new CameraException($"无法连接到相机 {CameraConfig.CameraSn}");
}
ToastUtil.Success($"相机 {CameraConfig.CameraSn} 连接成功");
// 连接成功之后开启接收流
_camera.StartSteaming();
_camera.SwitchHardTriggerMode();
Console.WriteLine(cameraResponseVo);
// 开个子线程来处理接收的图片
// Task.Run(HandleImage);
}
catch (Exception e)
{
EventBus<string>.Publish(EventType.SetupNotify, $"相机连接失败,错误信息:{e.Message}");
}
}
private static CameraClient CreateCamera(string sn, Action<string, Bitmap> action)
{
var client = CameraFactory.ToBuilder(sn).build();
client.RegisterCallback(action);
return client;
}
/// <summary>
/// 收到相机数据后统一向外发送数据
/// </summary>
/// <param name="name">相机sn</param>
/// <param name="bitmap">当前相机回调的数据</param>
private static void CallBack(string name, Bitmap bitmap)
{
EventBus<CameraData>.Publish(EventType.CameraData, new CameraData(name, bitmap));
}
public static void Close()
{
_camera!.Close();
}
/// <summary>
/// 获取相机对象
/// </summary>
public static CameraClient? GetCamera()
{
if (_camera!.Connected)
{
return _camera;
}
EventBus<BizException>.Publish(EventType.Exception,
new CameraException($"无法链接到相机 {CameraConfig.CameraSn}", level: ExceptionLevel.ERROR));
return null;
}
}