From a00cc84e48ace4d9366facbe1c54f5add04b3025 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Fri, 15 Aug 2025 13:02:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E4=B8=8ESignalR=E6=97=A0=E6=B3=95=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/Program.cs | 15 ++---- server/src/Controllers/DataController.cs | 7 +-- server/src/Controllers/DebuggerController.cs | 7 +-- server/src/Controllers/ExamController.cs | 16 ++---- .../Controllers/HdmiVideoStreamController.cs | 5 +- server/src/Controllers/JtagController.cs | 9 ++-- .../Controllers/LogicAnalyzerController.cs | 7 +-- .../src/Controllers/OscilloscopeController.cs | 7 +-- server/src/Controllers/ProgressController.cs | 0 server/src/Controllers/ResourceController.cs | 10 +--- .../src/Controllers/VideoStreamController.cs | 7 +-- server/src/Database/ExamManager.cs | 7 +-- server/src/Database/ResourceManager.cs | 7 +-- server/src/Database/UserManager.cs | 7 +-- server/src/Hubs/DigitalTubesHub.cs | 52 ++++++++++++++++--- server/src/Hubs/JtagHub.cs | 5 +- .../Peripherals/SevenDigitalTubesClient.cs | 2 +- .../Services/HttpHdmiVideoStreamService.cs | 13 +---- server/src/Services/HttpVideoStreamService.cs | 10 +--- server/src/UdpClientPool.cs | 8 +-- 20 files changed, 78 insertions(+), 123 deletions(-) delete mode 100644 server/src/Controllers/ProgressController.cs diff --git a/server/Program.cs b/server/Program.cs index 9e2c8bf..211c2b3 100644 --- a/server/Program.cs +++ b/server/Program.cs @@ -86,7 +86,8 @@ try var path = context.HttpContext.Request.Path; if (!string.IsNullOrEmpty(accessToken) && ( path.StartsWithSegments("/hubs/JtagHub") || - path.StartsWithSegments("/hubs/ProgressHub") + path.StartsWithSegments("/hubs/ProgressHub") || + path.StartsWithSegments("/hubs/DigitalTubesHub") )) { // Read the token out of the query string @@ -172,12 +173,6 @@ try options.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); - // 添加数据库资源管理器服务 - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - // 添加 HTTP 视频流服务 builder.Services.AddSingleton(); builder.Services.AddHostedService(provider => provider.GetRequiredService()); @@ -257,9 +252,9 @@ try // Router app.MapControllers(); - app.MapHub("hubs/JtagHub"); - app.MapHub("hubs/ProgressHub"); - app.MapHub("hubs/DigitalTubesHub"); + app.MapHub("/hubs/JtagHub"); + app.MapHub("/hubs/ProgressHub"); + app.MapHub("/hubs/DigitalTubesHub"); // Setup Program MsgBus.Init(); diff --git a/server/src/Controllers/DataController.cs b/server/src/Controllers/DataController.cs index 71e38ce..6c1af29 100644 --- a/server/src/Controllers/DataController.cs +++ b/server/src/Controllers/DataController.cs @@ -18,16 +18,11 @@ public class DataController : ControllerBase { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly Database.UserManager _userManager; + private readonly Database.UserManager _userManager = new(); // 固定的实验板IP,端口,MAC地址 private const string BOARD_IP = "169.254.109.0"; - public DataController(Database.UserManager userManager) - { - _userManager = userManager; - } - /// /// 获取本机IP地址(优先选择与实验板同网段的IP) /// diff --git a/server/src/Controllers/DebuggerController.cs b/server/src/Controllers/DebuggerController.cs index a47e5a6..3890f62 100644 --- a/server/src/Controllers/DebuggerController.cs +++ b/server/src/Controllers/DebuggerController.cs @@ -15,12 +15,7 @@ public class DebuggerController : ControllerBase { private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly Database.UserManager _userManager; - - public DebuggerController(Database.UserManager userManager) - { - this._userManager = userManager; - } + private readonly Database.UserManager _userManager = new(); /// /// 获取当前用户绑定的调试器实例 diff --git a/server/src/Controllers/ExamController.cs b/server/src/Controllers/ExamController.cs index 85faee6..f8c9590 100644 --- a/server/src/Controllers/ExamController.cs +++ b/server/src/Controllers/ExamController.cs @@ -15,19 +15,9 @@ public class ExamController : ControllerBase { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly ExamManager _examManager; - private readonly ResourceManager _resourceManager; - private readonly UserManager _userManager; - - public ExamController( - ExamManager examManager, - ResourceManager resourceManager, - UserManager userManager) - { - _examManager = examManager; - _resourceManager = resourceManager; - _userManager = userManager; - } + private readonly ExamManager _examManager = new(); + private readonly ResourceManager _resourceManager = new(); + private readonly UserManager _userManager = new(); /// /// 获取所有实验列表 diff --git a/server/src/Controllers/HdmiVideoStreamController.cs b/server/src/Controllers/HdmiVideoStreamController.cs index cdcbb92..3faa603 100644 --- a/server/src/Controllers/HdmiVideoStreamController.cs +++ b/server/src/Controllers/HdmiVideoStreamController.cs @@ -14,12 +14,11 @@ public class HdmiVideoStreamController : ControllerBase private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly HttpHdmiVideoStreamService _videoStreamService; - private readonly Database.UserManager _userManager; + private readonly Database.UserManager _userManager = new(); - public HdmiVideoStreamController(HttpHdmiVideoStreamService videoStreamService, Database.UserManager userManager) + public HdmiVideoStreamController(HttpHdmiVideoStreamService videoStreamService) { _videoStreamService = videoStreamService; - _userManager = userManager; } // 管理员获取所有板子的 endpoints diff --git a/server/src/Controllers/JtagController.cs b/server/src/Controllers/JtagController.cs index a992eb0..bfd6d18 100644 --- a/server/src/Controllers/JtagController.cs +++ b/server/src/Controllers/JtagController.cs @@ -17,17 +17,14 @@ public class JtagController : ControllerBase private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly ProgressTrackerService _tracker; - private readonly UserManager _userManager; - private readonly ResourceManager _resourceManager; + private readonly UserManager _userManager = new(); + private readonly ResourceManager _resourceManager = new(); private const string BITSTREAM_PATH = "bitstream/Jtag"; - public JtagController( - ProgressTrackerService tracker, UserManager userManager, ResourceManager resourceManager) + public JtagController(ProgressTrackerService tracker) { _tracker = tracker; - _userManager = userManager; - _resourceManager = resourceManager; } /// diff --git a/server/src/Controllers/LogicAnalyzerController.cs b/server/src/Controllers/LogicAnalyzerController.cs index ee6ded3..66b5ffd 100644 --- a/server/src/Controllers/LogicAnalyzerController.cs +++ b/server/src/Controllers/LogicAnalyzerController.cs @@ -15,12 +15,7 @@ public class LogicAnalyzerController : ControllerBase { private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly Database.UserManager _userManager; - - public LogicAnalyzerController(Database.UserManager userManager) - { - _userManager = userManager; - } + private readonly Database.UserManager _userManager = new(); /// /// 获取逻辑分析仪实例 diff --git a/server/src/Controllers/OscilloscopeController.cs b/server/src/Controllers/OscilloscopeController.cs index ef8f629..dee7b48 100644 --- a/server/src/Controllers/OscilloscopeController.cs +++ b/server/src/Controllers/OscilloscopeController.cs @@ -15,12 +15,7 @@ public class OscilloscopeApiController : ControllerBase { private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly Database.UserManager _userManager; - - public OscilloscopeApiController(Database.UserManager userManager) - { - _userManager = userManager; - } + private readonly Database.UserManager _userManager = new(); /// /// 获取示波器实例 diff --git a/server/src/Controllers/ProgressController.cs b/server/src/Controllers/ProgressController.cs deleted file mode 100644 index e69de29..0000000 diff --git a/server/src/Controllers/ResourceController.cs b/server/src/Controllers/ResourceController.cs index e852a9a..03334a3 100644 --- a/server/src/Controllers/ResourceController.cs +++ b/server/src/Controllers/ResourceController.cs @@ -15,14 +15,8 @@ public class ResourceController : ControllerBase { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly UserManager _userManager; - private readonly ResourceManager _resourceManager; - - public ResourceController(UserManager userManager, ResourceManager resourceManager) - { - _userManager = userManager; - _resourceManager = resourceManager; - } + private readonly UserManager _userManager = new(); + private readonly ResourceManager _resourceManager = new(); /// /// 添加资源(文件上传) diff --git a/server/src/Controllers/VideoStreamController.cs b/server/src/Controllers/VideoStreamController.cs index 63fa381..22438bd 100644 --- a/server/src/Controllers/VideoStreamController.cs +++ b/server/src/Controllers/VideoStreamController.cs @@ -18,7 +18,7 @@ public class VideoStreamController : ControllerBase private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly HttpVideoStreamService _videoStreamService; - private readonly Database.UserManager _userManager; + private readonly Database.UserManager _userManager = new(); public class AvailableResolutionsResponse { @@ -32,13 +32,10 @@ public class VideoStreamController : ControllerBase /// 初始化HTTP视频流控制器 /// /// HTTP视频流服务 - /// 用户管理服务 - public VideoStreamController( - HttpVideoStreamService videoStreamService, Database.UserManager userManager) + public VideoStreamController(HttpVideoStreamService videoStreamService) { logger.Info("创建VideoStreamController,命名空间:{Namespace}", this.GetType().Namespace); _videoStreamService = videoStreamService; - _userManager = userManager; } private Optional TryGetBoardId() diff --git a/server/src/Database/ExamManager.cs b/server/src/Database/ExamManager.cs index 477280c..e003a41 100644 --- a/server/src/Database/ExamManager.cs +++ b/server/src/Database/ExamManager.cs @@ -8,12 +8,7 @@ public class ExamManager { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly AppDataConnection _db; - - public ExamManager(AppDataConnection db) - { - this._db = db; - } + private AppDataConnection _db = new(); /// /// 创建新实验 diff --git a/server/src/Database/ResourceManager.cs b/server/src/Database/ResourceManager.cs index e34458c..323c17c 100644 --- a/server/src/Database/ResourceManager.cs +++ b/server/src/Database/ResourceManager.cs @@ -9,12 +9,7 @@ public class ResourceManager { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly AppDataConnection _db; - - public ResourceManager(AppDataConnection db) - { - this._db = db; - } + private readonly AppDataConnection _db = new(); /// /// 根据文件扩展名获取MIME类型 diff --git a/server/src/Database/UserManager.cs b/server/src/Database/UserManager.cs index 72c68ae..f0f12e9 100644 --- a/server/src/Database/UserManager.cs +++ b/server/src/Database/UserManager.cs @@ -8,12 +8,7 @@ public class UserManager { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly AppDataConnection _db; - - public UserManager(AppDataConnection db) - { - this._db = db; - } + private readonly AppDataConnection _db = new(); /// /// 添加一个新的用户到数据库 diff --git a/server/src/Hubs/DigitalTubesHub.cs b/server/src/Hubs/DigitalTubesHub.cs index 5a7f419..30627ba 100644 --- a/server/src/Hubs/DigitalTubesHub.cs +++ b/server/src/Hubs/DigitalTubesHub.cs @@ -16,6 +16,7 @@ public interface IDigitalTubesHub Task StartScan(); Task StopScan(); Task SetFrequency(int frequency); + Task GetStatus(); } [Receiver] @@ -24,7 +25,20 @@ public interface IDigitalTubesReceiver Task OnReceive(byte[] data); } -class DigitalTubeInfo +[TranspilationSource] +public class DigitalTubeTaskStatus +{ + public int Frequency { get; set; } = 100; + public bool IsRunning { get; set; } = false; + + public DigitalTubeTaskStatus(DigitalTubeInfo info) + { + Frequency = info.Frequency; + IsRunning = info.IsRunning; + } +} + +public class DigitalTubeInfo { public string ClientID { get; set; } public SevenDigitalTubesCtrl TubeClient { get; set; } @@ -46,16 +60,13 @@ public class DigitalTubesHub : Hub, IDigitalTubesHub private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly IHubContext _hubContext; - private readonly Database.UserManager _userManager; + private readonly Database.UserManager _userManager = new(); private ConcurrentDictionary _infoDict = new(); - public DigitalTubesHub( - IHubContext hubContext, - Database.UserManager userManager) + public DigitalTubesHub(IHubContext hubContext) { _hubContext = hubContext; - _userManager = userManager; } private Optional TryGetBoard() @@ -172,8 +183,8 @@ public class DigitalTubesHub : Hub, IDigitalTubesHub { try { - if (frequency < 1 || frequency > 1000) - throw new ArgumentException("Frequency must be between 1 and 1000"); + if (frequency < 1 || frequency > 1000) return Task.FromException( + new ArgumentException("Frequency must be between 1 and 1000")); var board = TryGetBoard().OrThrow(() => new Exception("Board not found")); if (_infoDict.GetOrAdd( @@ -194,4 +205,29 @@ public class DigitalTubesHub : Hub, IDigitalTubesHub return Task.FromResult(false); } } + + public Task GetStatus() + { + try + { + var board = TryGetBoard().OrThrow(() => new Exception("Board not found")); + if (_infoDict.GetOrAdd( + board.ID.ToString(), + (_) => new DigitalTubeInfo( + Context.ConnectionId, + new SevenDigitalTubesCtrl(board.IpAddr, board.Port, 2)) + ) is DigitalTubeInfo info) + { + return Task.FromResult(new DigitalTubeTaskStatus(info)); + } + + return Task.FromException(new ArgumentException("Wrong argument")); + } + catch (Exception ex) + { + logger.Error(ex, "Failed to get status"); + return Task.FromException(new Exception("Failed to get status")); + } + } + } diff --git a/server/src/Hubs/JtagHub.cs b/server/src/Hubs/JtagHub.cs index 9acd195..78bca4f 100644 --- a/server/src/Hubs/JtagHub.cs +++ b/server/src/Hubs/JtagHub.cs @@ -30,15 +30,14 @@ public class JtagHub : Hub, IJtagHub private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly IHubContext _hubContext; - private readonly Database.UserManager _userManager; + private readonly Database.UserManager _userManager = new(); private static ConcurrentDictionary FreqTable = new(); private static ConcurrentDictionary CancellationTokenSourceTable = new(); - public JtagHub(IHubContext hubContext, Database.UserManager userManager) + public JtagHub(IHubContext hubContext) { _hubContext = hubContext; - _userManager = userManager; } private Optional GetJtagClient(string userName) diff --git a/server/src/Peripherals/SevenDigitalTubesClient.cs b/server/src/Peripherals/SevenDigitalTubesClient.cs index 1c95936..4c1abc9 100644 --- a/server/src/Peripherals/SevenDigitalTubesClient.cs +++ b/server/src/Peripherals/SevenDigitalTubesClient.cs @@ -42,7 +42,7 @@ public class SevenDigitalTubesCtrl if (num < 0 || num > 31) throw new ArgumentOutOfRangeException(nameof(num), "Tube number must be between 0 and 31"); - var ret = await UDPClientPool.ReadAddr( + var ret = await UDPClientPool.ReadAddrByte( this.ep, this.taskID, SevenDigitalTubesAddr.BASE + (UInt32)num, this.timeout); if (!ret.IsSuccessful) { diff --git a/server/src/Services/HttpHdmiVideoStreamService.cs b/server/src/Services/HttpHdmiVideoStreamService.cs index c438d08..deb308b 100644 --- a/server/src/Services/HttpHdmiVideoStreamService.cs +++ b/server/src/Services/HttpHdmiVideoStreamService.cs @@ -26,17 +26,10 @@ public class HttpHdmiVideoStreamService : BackgroundService { private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly IServiceProvider _serviceProvider; - private HttpListener? _httpListener; private readonly int _serverPort = 4322; private readonly ConcurrentDictionary _clientDict = new(); - public HttpHdmiVideoStreamService(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - public override async Task StartAsync(CancellationToken cancellationToken) { _httpListener = new HttpListener(); @@ -124,8 +117,7 @@ public class HttpHdmiVideoStreamService : BackgroundService { if (_clientDict.TryGetValue(boardId, out var client)) return client; - using var scope = _serviceProvider.CreateScope(); - var userManager = scope.ServiceProvider.GetRequiredService(); + var userManager = new Database.UserManager(); var boardRet = userManager.GetBoardByID(Guid.Parse(boardId)); if (!boardRet.IsSuccessful || !boardRet.Value.HasValue) @@ -362,8 +354,7 @@ public class HttpHdmiVideoStreamService : BackgroundService /// 返回所有可用的HDMI视频流终端点列表 public List? GetAllVideoEndpoints() { - using var scope = _serviceProvider.CreateScope(); - var userManager = scope.ServiceProvider.GetRequiredService(); + var userManager = new Database.UserManager(); var boards = userManager.GetAllBoard(); if (boards == null) diff --git a/server/src/Services/HttpVideoStreamService.cs b/server/src/Services/HttpVideoStreamService.cs index 2a14caf..fbaa37b 100644 --- a/server/src/Services/HttpVideoStreamService.cs +++ b/server/src/Services/HttpVideoStreamService.cs @@ -95,8 +95,6 @@ public class HttpVideoStreamService : BackgroundService { private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly IServiceProvider _serviceProvider; - private HttpListener? _httpListener; private readonly int _serverPort = 4321; @@ -109,11 +107,6 @@ public class HttpVideoStreamService : BackgroundService private readonly object _usbCameraLock = new object(); #endif - public HttpVideoStreamService(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - private Optional TryGetClient(string boardId) { if (_clientDict.TryGetValue(boardId, out var client)) @@ -131,8 +124,7 @@ public class HttpVideoStreamService : BackgroundService return client; } - using var scope = _serviceProvider.CreateScope(); - var userManager = scope.ServiceProvider.GetRequiredService(); + var userManager = new Database.UserManager(); var boardRet = userManager.GetBoardByID(Guid.Parse(boardId)); if (!boardRet.IsSuccessful || !boardRet.Value.HasValue) diff --git a/server/src/UdpClientPool.cs b/server/src/UdpClientPool.cs index 5efb1f9..1797630 100644 --- a/server/src/UdpClientPool.cs +++ b/server/src/UdpClientPool.cs @@ -229,11 +229,11 @@ public class UDPClientPool public static async ValueTask> ReadAddr( IPEndPoint endPoint, int taskID, uint devAddr, int dataLength, int timeout = 1000) { - if (dataLength <= 0) - return new(new ArgumentException("Data length must be greater than 0")); + if (dataLength <= 0) return new(new ArgumentException( + $"Data length must be greater than 0, instead of {dataLength}")); - if (dataLength > 255) - return new(new ArgumentException("Data length must be less than or equal to 255")); + if (dataLength > 255) return new(new ArgumentException( + $"Data length must be less than or equal to 255, instead of {dataLength}")); var ret = false; var opts = new SendAddrPackOptions()