From 442e40d87a3feca888b580aa2bb977baa39cf9b9 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Tue, 22 Apr 2025 13:34:05 +0800 Subject: [PATCH] add web api for download bitstream --- server/src/Controllers.cs | 41 +++++++++++++++++++++++++++++++++++---- server/src/JtagClient.cs | 3 +++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/server/src/Controllers.cs b/server/src/Controllers.cs index d910b3d..ecd5411 100644 --- a/server/src/Controllers.cs +++ b/server/src/Controllers.cs @@ -184,15 +184,48 @@ public class JtagController : ControllerBase else { return TypedResults.InternalServerError(ret.Error); } } + /// + /// 通过Jtag下载比特流文件 + /// + /// 设备地址 + /// 设备端口 + /// 比特流文件(最大32MB) [HttpGet("DownloadBitstream")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async ValueTask DownloadBitstream(string address, int port, IFormFile file) { - var jtagCtrl = new JtagClient.Jtag(address, port); - var ret = await jtagCtrl.DownloadBitstream(); + // 检查文件 + if (file is null || file.Length <= 0) + throw new ArgumentException("Empty file", nameof(file)); - if (ret.IsSuccessful) { return TypedResults.Ok(ret.Value); } - else { return TypedResults.InternalServerError(ret.Error); } + // 定义缓冲区大小(例如:1MB) + const int bufferSize = 1024 * 1024; // 1MB + byte[] buffer = new byte[bufferSize]; + long totalBytesRead = 0; + + // 使用异步流读取文件 + using (var memoryStream = new MemoryStream()) + { + using (var stream = file.OpenReadStream()) + { + int bytesRead; + while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0) + { + await memoryStream.WriteAsync(buffer, 0, bytesRead); + totalBytesRead += bytesRead; + } + } + + // 将所有数据转换为字节数组(注意:如果文件非常大,可能不适合完全加载到内存) + byte[] fileBytes = memoryStream.ToArray(); + + // 下载比特流 + var jtagCtrl = new JtagClient.Jtag(address, port); + var ret = await jtagCtrl.DownloadBitstream(fileBytes); + + if (ret.IsSuccessful) { return TypedResults.Ok(ret.Value); } + else { return TypedResults.InternalServerError(ret.Error); } + } } } diff --git a/server/src/JtagClient.cs b/server/src/JtagClient.cs index d515763..9119f25 100644 --- a/server/src/JtagClient.cs +++ b/server/src/JtagClient.cs @@ -532,6 +532,9 @@ class Jtag public async ValueTask> DownloadBitstream(byte[] bitstream) { + // Clear Data + await MsgBus.UDPServer.ClearUDPData(this.address); + { var ret = await CloseTest(); if (!ret.IsSuccessful) throw ret.Error;