111 lines
3.0 KiB
C#
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;
|
||
|
}
|
||
|
}
|