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;
+ }
}