using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Uestc.Auto6.Dso.Hardware.Driver { internal class FpgaVersion { public int MaxNum { get; set; } public int SubNum { get; set; } public int MinNum { get; set; } public string Designer { get; set; } = ""; public string Comment { get; set; } = ""; public DateTime BuildTime { get; set; } public string BuildTimeString { get { return BuildTime.Year + "-" + BuildTime.Month.ToString().PadLeft(2, '0') + "-"+BuildTime.Day.ToString().PadLeft(2, '0') + " " + BuildTime.Hour.ToString().PadLeft(2, '0') + ":" + BuildTime.Minute.ToString().PadLeft(2, '0') + ":" + BuildTime.Second.ToString().PadLeft(2, '0'); } } public override string ToString() { return $"[Version:{MaxNum}.{SubNum}.{MinNum},CompileTime={BuildTimeString},Designer={Designer},Comment={Comment}]"; } internal static bool ReadFPGAVersion(FpgaVersionRegs regs, ref FpgaVersion fpgaVersion) { int findFirstZeroPos(byte[] source) { for (int i = 0; i < source.Length; i++) { if (source[i] == 0) return i; } return source.Length; } #region 编译时间 Int64 readBackCompileTime = 0; readBackCompileTime = HdIO.ReadReg(regs.CompileTime_H16); readBackCompileTime <<= 16; readBackCompileTime |= HdIO.ReadReg(regs.CompileTime_L16); if (readBackCompileTime == 0) return false; DateTime compileTime = new DateTime(1970, 1, 1, 0, 0, 0); compileTime = compileTime.AddSeconds(readBackCompileTime); compileTime = TimeZoneInfo.ConvertTimeFromUtc(compileTime, TimeZoneInfo.Local); fpgaVersion.BuildTime = compileTime; #endregion #region version UInt32 readBackVersion = 0; readBackVersion = HdIO.ReadReg(regs.VerionNo_H16); readBackVersion <<= 16; readBackVersion |= HdIO.ReadReg(regs.VerionNo_L16); fpgaVersion.MinNum = (Int32)(readBackVersion & 0xffff); fpgaVersion.SubNum = (Int32)(readBackVersion >> 16 & 0xff); fpgaVersion.MaxNum = (Int32)(readBackVersion >> 24 & 0xff); #endregion #region designer UInt16[] readBackDesigner = new UInt16[4]; for (int i = 0; i < 4; i++) readBackDesigner[i] = (UInt16)HdIO.ReadReg(regs.Designer_Words[i]); byte[] bytesDesigner = new byte[8]; Buffer.BlockCopy(readBackDesigner, 0, bytesDesigner, 0, 8); byte[] bytesDesigner2 = bytesDesigner.Reverse().ToArray(); int firstZeroPos = findFirstZeroPos(bytesDesigner2); fpgaVersion.Designer = System.Text.Encoding.UTF8.GetString(bytesDesigner2, 0, firstZeroPos); #endregion #region comment UInt16[] readbackComment = new ushort[16]; for (int i = 0; i < 16; i++) readbackComment[i] = (UInt16)HdIO.ReadReg(regs.Comment_Words[i]); byte[] bytesComment = new byte[16 * 2]; Buffer.BlockCopy(readbackComment, 0, bytesComment, 0, 16 * 2); byte[] bytesComment2 = bytesComment.Reverse().ToArray(); firstZeroPos = findFirstZeroPos(bytesComment2); fpgaVersion.Comment = System.Text.Encoding.UTF8.GetString(bytesComment2, 0, firstZeroPos); #endregion return true; } public static string GetAllFPGAVersionInfo() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"[PCIE_Board]:{ Hd.currProduct?.PcieBd?.FpgaVersion?.ToString()}"); stringBuilder.AppendLine($"[S6_Board]:{ Hd.currProduct?.S6Bd?.FpgaVersion?.ToString()}"); stringBuilder.AppendLine($"[Process_Board]:{ Hd.currProduct?.ProcBd?.FpgaVersion?.ToString()}"); for (int fpgaIndex = 0; fpgaIndex < AbstractAcqBd.FPGATotalCount; fpgaIndex++) { FpgaVersion? fpgaVersion = Hd.currProduct?.AcqBd?.GetFpgaVersion(fpgaIndex)??null; if (fpgaVersion != null) stringBuilder.AppendLine($"[Acq_Board{fpgaIndex + 1}]:{fpgaVersion.ToString()}"); } return stringBuilder.ToString(); } } internal record FpgaVersionRegs( UInt32 CompileTime_L16, UInt32 CompileTime_H16, UInt32 VerionNo_L16, UInt32 VerionNo_H16, UInt32[/*4*/] Designer_Words, UInt32[/*16*/] Comment_Words); }