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; /// /// 相机管理器,用于全局管理相机的连接 /// public class CameraManager { private static CameraClient? _camera; /// /// 全局初始化连接相机 /// public static void Connect() { InitCamera(); } /// /// 对相机进行重连 /// public static void ReConnect() { ToastUtil.Info("正在尝试重新连接相机"); Log.Information("正在尝试重新连接相机"); if (_camera != null) { Close(); } InitCamera(); } private static void InitCamera() { try { EventBus.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.Publish(EventType.SetupNotify, $"相机连接失败,错误信息:{e.Message}"); } } private static CameraClient CreateCamera(string sn, Action action) { var client = CameraFactory.ToBuilder(sn).build(); client.RegisterCallback(action); return client; } /// /// 收到相机数据后统一向外发送数据 /// /// 相机sn /// 当前相机回调的数据 private static void CallBack(string name, Bitmap bitmap) { EventBus.Publish(EventType.CameraData, new CameraData(name, bitmap)); } public static void Close() { _camera!.Close(); } /// /// 获取相机对象 /// public static CameraClient? GetCamera() { if (_camera!.Connected) { return _camera; } EventBus.Publish(EventType.Exception, new CameraException($"无法链接到相机 {CameraConfig.CameraSn}", level: ExceptionLevel.ERROR)); return null; } }