Merge branch 'master' of ssh://git.swordlost.top:222/SikongJueluo/FPGA_WebLab into dpp

This commit is contained in:
alivender 2025-04-22 14:20:51 +08:00
commit 301b2a20f4
2 changed files with 40 additions and 4 deletions

View File

@ -184,15 +184,48 @@ public class JtagController : ControllerBase
else { return TypedResults.InternalServerError(ret.Error); }
}
/// <summary>
/// 通过Jtag下载比特流文件
/// </summary>
/// <param name="address"> 设备地址 </param>
/// <param name="port"> 设备端口 </param>
/// <param name="file">比特流文件最大32MB</param>
[HttpGet("DownloadBitstream")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async ValueTask<IResult> DownloadBitstream(string address, int port, IFormFile file)
{
// 检查文件
if (file is null || file.Length <= 0)
throw new ArgumentException("Empty file", nameof(file));
// 定义缓冲区大小例如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();
var ret = await jtagCtrl.DownloadBitstream(fileBytes);
if (ret.IsSuccessful) { return TypedResults.Ok(ret.Value); }
else { return TypedResults.InternalServerError(ret.Error); }
}
}
}

View File

@ -532,6 +532,9 @@ class Jtag
public async ValueTask<Result<bool>> DownloadBitstream(byte[] bitstream)
{
// Clear Data
await MsgBus.UDPServer.ClearUDPData(this.address);
{
var ret = await CloseTest();
if (!ret.IsSuccessful) throw ret.Error;