diff --git a/.gitignore b/.gitignore index f9c250d..393ca3d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ lerna-debug.log* node_modules .DS_Store +.vscode dist **/wwwroot dist-ssr diff --git a/.justfile b/.justfile index 9f5a3b3..916d5f5 100644 --- a/.justfile +++ b/.justfile @@ -1,3 +1,4 @@ +set windows-shell := ["powershell.exe", "-NoLogo", "-Command"] isSelfContained := "false" @_show-dir: @@ -16,7 +17,7 @@ clean: update: npm install - cd server && dotnet restore + dotnet restore ./server/server.csproj git submodule update --init --remote --recursive # 生成Restful API到网页客户端 @@ -44,7 +45,7 @@ dev: dev-server # 测试服务器 dev-server: _show-dir - cd server && dotnet run --watch + dotnet run --watch --project ./server/server.csproj # 运行网页客户端 dev-web: diff --git a/server/src/BsdlParser.cs b/server/src/BsdlParser.cs index c175d18..70645f0 100644 --- a/server/src/BsdlParser.cs +++ b/server/src/BsdlParser.cs @@ -19,14 +19,14 @@ public class BoundaryScanRegs /// [JsonProperty("cell_number")] [JsonRequired] - public int? CellNumber { get; set; } + public int CellNumber { get; set; } /// /// [TODO:description] /// [JsonProperty("cell_name")] [JsonRequired] - public string? CellName { get; set; } + public string CellName { get; set; } /// /// [TODO:description] @@ -124,17 +124,42 @@ public class Parser /// [TODO:description] /// /// [TODO:return] - public Optional> GetBoundaryLogicalPorts() + public Optional> GetBoundaryPorts() { var registers = this.BoundaryRegsDesp["registers"]?.ToList(); if (registers is null) return new(); - var cellList = registers.Where((item) => + var cellList = new List(); + foreach (var item in registers) { + var cell = item.ToObject(); + if (cell is null) return new(); + cellList.Add(cell); + } + + return cellList; + } + + /// + /// [TODO:description] + /// + /// [TODO:return] + public Optional> GetBoundaryLogicalPorts() + { + var registers = this.BoundaryRegsDesp["registers"]?.ToList().Where((item)=>{ return item["port_id"] is not null; }); - if (cellList is null) return new(); + if (registers is null) return new(); + var cellList = new List(); + foreach (var item in registers) + { + var cell = item.ToObject(); + if (cell is null) return new(); + cellList.Add(cell); + } + + return cellList; } // public Result GetLogicalPorts() diff --git a/server/src/Controllers.cs b/server/src/Controllers.cs index e1cb381..7132012 100644 --- a/server/src/Controllers.cs +++ b/server/src/Controllers.cs @@ -338,12 +338,12 @@ public class JtagController : ControllerBase /// [TODO:parameter] /// [TODO:parameter] /// [TODO:return] - [HttpPost("BoundaryScan")] + [HttpPost("BoundaryScanAllPorts")] [EnableCors("Users")] [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] - public async ValueTask BoundaryScan(string address, int port) + public async ValueTask BoundaryScanAllPorts(string address, int port) { var jtagCtrl = new JtagClient.Jtag(address, port); var ret = await jtagCtrl.BoundaryScan(); @@ -356,6 +356,31 @@ public class JtagController : ControllerBase return TypedResults.Ok(ret.Value); } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("BoundaryScanLogicalPorts")] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] + public async ValueTask BoundaryScanLogicalPorts(string address, int port) + { + var jtagCtrl = new JtagClient.Jtag(address, port); + var ret = await jtagCtrl.BoundaryScanLogicalPorts(); + if (!ret.IsSuccessful) + { + if (ret.Error is ArgumentException) + return TypedResults.BadRequest(ret.Error); + else return TypedResults.InternalServerError(ret.Error); + } + + return TypedResults.Ok(ret.Value); + } } /// @@ -750,94 +775,25 @@ public class DDSController : ControllerBase } -// /// -// /// [TODO:description] -// /// -// [ApiController] -// [Route("api/[controller]")] -// public class BsdlParserController : ControllerBase -// { -// private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); -// -// const string BSDL_PATH = "bsdl"; -// -// /// -// /// [TODO:description] -// /// -// /// [TODO:parameter] -// /// [TODO:parameter] -// /// [TODO:return] -// [EnableCors("Users")] -// [HttpPost("UploadBsdlModelFile")] -// public async ValueTask UploadBsdlModelFile(string address, IFormFile file) -// { -// if (file == null || file.Length == 0) -// return TypedResults.BadRequest("未选择文件"); -// -// // 生成安全的文件名(避免路径遍历攻击) -// var fileName = Path.GetRandomFileName(); -// var uploadsFolder = Path.Combine(Environment.CurrentDirectory, $"{BSDL_PATH}/{address}"); -// -// // 如果存在文件,则删除原文件再上传 -// if (Directory.Exists(uploadsFolder)) -// { -// Directory.Delete(uploadsFolder, true); -// } -// Directory.CreateDirectory(uploadsFolder); -// -// var filePath = Path.Combine(uploadsFolder, fileName); -// -// using (var stream = new FileStream(filePath, FileMode.Create)) -// { -// await file.CopyToAsync(stream); -// } -// -// logger.Info($"Device {address} Upload Bitstream Successfully"); -// return TypedResults.Ok(true); -// } -// -// /// -// /// [TODO:description] -// /// -// /// [TODO:parameter] -// /// [TODO:return] -// [EnableCors("Users")] -// [HttpGet("GetLogicalPortsDescription")] -// public IResult GetLogicalPortsDescription(string address) -// { -// // 检查文件 -// var fileDir = Path.Combine(Environment.CurrentDirectory, $"{BSDL_PATH}/{address}"); -// if (!Directory.Exists(fileDir)) -// return TypedResults.BadRequest("Empty bitstream, Please upload it first"); -// -// try -// { -// // 读取文件 -// var filePath = Directory.GetFiles(fileDir)[0]; -// -// // 下载比特流 -// var parser = new BsdlParser.Parser(filePath); -// var ret = parser.GetLogicalPorts(); -// -// if (ret.IsSuccessful) -// { -// logger.Info($"Device {address} Update bitstream successfully"); -// return TypedResults.Ok(ret.Value); -// } -// else -// { -// logger.Error(ret.Error); -// return TypedResults.InternalServerError(ret.Error); -// } -// -// } -// catch (Exception error) -// { -// return TypedResults.InternalServerError(error); -// } -// -// } -// } +/// +/// [TODO:description] +/// +[ApiController] +[Route("api/[controller]")] +public class BsdlParserController : ControllerBase +{ + private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); + + [EnableCors("Development")] + [HttpGet("GetBoundaryLogicalPorts")] + public IResult GetBoundaryLogicalPorts() + { + var parser = new BsdlParser.Parser(); + var ret = parser.GetBoundaryLogicalPorts(); + if (ret.IsNull) return TypedResults.InternalServerError("Get Null"); + return TypedResults.Ok(ret.Value); + } +} /// diff --git a/server/src/JtagClient.cs b/server/src/JtagClient.cs index 7712684..27a8a17 100644 --- a/server/src/JtagClient.cs +++ b/server/src/JtagClient.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Net; +using BsdlParser; using DotNext; using Newtonsoft.Json; using WebProtocol; @@ -818,8 +819,24 @@ public class Jtag return bitArray; } - // public async ValueTask> BoundaryScanLogicalPorts() - // { - // - // } + /// + /// [TODO:description] + /// + /// [TODO:return] + public async ValueTask>> BoundaryScanLogicalPorts() + { + var bitArray = await BoundaryScan(); + if (!bitArray.IsSuccessful) return new(bitArray.Error); + + var paser = new BsdlParser.Parser(); + var cellList = paser.GetBoundaryLogicalPorts(); + if (cellList.IsNull) return new(new Exception("Get boundary logical ports failed")); + + var portStatus = new Dictionary(); + foreach (var cell in cellList.Value) { + portStatus.Add(cell.PortID ?? "UnknownPortID", bitArray.Value[cell.CellNumber]); + } + + return portStatus; + } }