using DotNext;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace BsdlParser;
///
/// [TODO:description]
///
public class BoundaryScanRegs
{
///
/// [TODO:description]
///
public class CellEntry
{
///
/// [TODO:description]
///
[JsonProperty("cell_number")]
[JsonRequired]
public int CellNumber { get; set; }
///
/// [TODO:description]
///
[JsonProperty("cell_name")]
[JsonRequired]
public string CellName { get; set; } = "UnknownCellName";
///
/// [TODO:description]
///
[JsonProperty("port_id")]
public string? PortID { get; set; }
///
/// [TODO:description]
///
[JsonProperty("function")]
[JsonRequired]
public string? Function { get; set; }
///
/// [TODO:description]
///
[JsonProperty("safe_bit")]
[JsonRequired]
public string? SafeBit { get; set; }
///
/// [TODO:description]
///
[JsonProperty("ccell")]
public string? CCell { get; set; }
///
/// [TODO:description]
///
[JsonProperty("disabel_value")]
public string? DisableValue { get; set; }
///
/// [TODO:description]
///
[JsonProperty("disabel_result")]
public string? DisableResult { get; set; }
}
///
/// [TODO:description]
///
[JsonProperty("register_length")]
[JsonRequired]
public int RegisterLength { get; set; }
///
/// [TODO:description]
///
[JsonProperty("registers")]
[JsonRequired]
public CellEntry[] Registers { get; set; } = new CellEntry[] { };
}
///
/// [TODO:description]
///
public class Parser
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private const string BOUNDARY_REGS_DESP = "boundary_registers.json";
///
/// [TODO:description]
///
public JObject BoundaryRegsDesp { get; }
///
/// [TODO:description]
///
/// [TODO:return]
public Parser()
{
var filePath = Path.Combine(Environment.CurrentDirectory, BOUNDARY_REGS_DESP);
if (!Path.Exists(filePath))
throw new Exception($"Counld not find boundary_registers.json in {filePath}");
this.BoundaryRegsDesp = JObject.Parse(File.ReadAllText(filePath));
}
///
/// [TODO:description]
///
public Optional GetBoundaryRegsNum()
{
var ret = this.BoundaryRegsDesp["register_length"];
if (ret is null) return new();
return Convert.ToInt32(ret);
}
///
/// [TODO:description]
///
/// [TODO:return]
public Optional> GetBoundaryPorts()
{
var registers = this.BoundaryRegsDesp["registers"]?.ToList();
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;
}
///
/// [TODO:description]
///
/// [TODO:return]
public Optional> GetBoundaryLogicalPorts()
{
var registers = this.BoundaryRegsDesp["registers"]?.ToList().Where((item) =>
{
return item["port_id"] is not null;
});
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()
// {
// using (Py.GIL())
// {
// using (PyModule scope = Py.CreateScope())
// {
// string code = $@"
// bsdl_parser = BsdlParser({this.filePath})
// result = json.dumps(bsdl_parser.GetLogicPortDesp(), indent=2)
// ";
//
// var localVariables = new PyDict();
// scope.Exec(code, localVariables);
// if (!localVariables.HasKey("result"))
// return new(new Exception($"PythonNet doesn't has result from dict: {localVariables}"));
//
// var result = localVariables.GetItem("result");
// if (result is null)
// return new(new Exception($"PythonNet get null from dict: {localVariables}"));
//
// var resultString = result.ToString();
// if (resultString is null)
// return new(new Exception($"Pythonnet convert PyObject to string failed :{result}"));
// return resultString;
// }
// }
// }
}