public ISystemConfiguration BuildConfiguration() { var systemConfiguration = new SystemConfigurationSimple(); systemConfiguration.ArrayDumpPsnStartPageNumber = _deviceConfiguration.Diagnostic.ArrayDumpPsnStartPageNumber; systemConfiguration.BadBlocksCount = _deviceConfiguration.Diagnostic.BadBlocksCount; var configurationByte = _deviceConfiguration.UseHammingForNand ? 0x01 : 0x00; if (_deviceConfiguration.LogPsn) { configurationByte |= 0x02; } if (_deviceConfiguration.SaveByteInterval) { configurationByte |= 0x04; } if (_deviceConfiguration.ResetFaultsDump) { configurationByte |= 0x08; } systemConfiguration.ConfigurationByte = configurationByte; systemConfiguration.CurrentPsnLogNumber = _deviceConfiguration.Diagnostic.CurrentPsnLogNumber; systemConfiguration.DeviceAddress = _deviceConfiguration.Address; // TODO: systemConfiguration.DumpRules = _deviceConfiguration. systemConfiguration.FatOffsetFromPageZero = _deviceConfiguration.Diagnostic.FatOffsetFromPageZero; systemConfiguration.FaultsCount = _rpdFaultsCount; // TODO: where to get faultsDumpTable? :0 var faultsDumpTable = new List <IRpdDataInformation>(); // TODO: foreach (var rpdLogInfo in _deviceConfiguration.?) {} systemConfiguration.FaultDumpsTable = faultsDumpTable; systemConfiguration.FirmwareVersion = _deviceConfiguration.Diagnostic.FirmwareVersion; systemConfiguration.FirstWrittenAfterResetPageNumber = _deviceConfiguration.Diagnostic.FirstWrittenAfterResetPageNumber; systemConfiguration.LastReadedBlockAddress = _deviceConfiguration.Diagnostic.LastReadedBlockAddress; systemConfiguration.LastWrittenPageAddress = _deviceConfiguration.Diagnostic.LastWrittenPageAddress; systemConfiguration.LastWrittenPageNumber = _deviceConfiguration.Diagnostic.LastWrittenPageNumber; systemConfiguration.MetersCount = _deviceConfiguration.RpdMeters.Count; var rpdMeterInfos = new List <IRpdMeterSystemInformation>(); foreach (var rpdMeter in _deviceConfiguration.RpdMeters) { var builder = new RpdMeterSystemInformationBuilderFromRpdMeterSystem(rpdMeter); var rpdMeterInfo = builder.Build(); rpdMeterInfos.Add(rpdMeterInfo); } systemConfiguration.MetersTable = rpdMeterInfos; systemConfiguration.NetAddress = _deviceConfiguration.NetAddress; systemConfiguration.PsnLogStartPageNumber = _deviceConfiguration.Diagnostic.PsnLogStartPageNumber; // TODO: think about: systemConfiguration.PsnLogPowerUpFragmentInfos = new List <IPsnDataFragmentInformation>(); systemConfiguration.PsnLogPredefinedFragmentInfos = new List <IPsnDataFragmentInformation>(); systemConfiguration.PsnRegisterStatusMasks = new byte[21]; // TODO: 21 - это максимальное число обусловленное бинарным форматом! systemConfiguration.RpdPagesCountTransmittedToPsnLog = _deviceConfiguration.Diagnostic.RpdPagesCountTransmittedToPsnLog; return(systemConfiguration); }
public ISystemConfiguration BuildConfiguration() { var sysconf = new SystemConfigurationSimple(); if (File.Exists(_fileName)) { var raw = File.ReadAllBytes(_fileName); if (raw.Length != FileSize) { throw new Exception("SYSCONF.BIN file size must be " + FileSize); } using (var br = new AdvancedBinaryReader(new MemoryStream(raw, false), false)) { //br.Read(sysconf.Raw, 0, sysconf.Raw.Length); br.BaseStream.Seek(0, SeekOrigin.Begin); //-----------------------------------------------------------0 (0) sysconf.DeviceAddress = br.ReadUInt16(); sysconf.NetAddress = (int)br.ReadUInt32(); var locomotiveAndSectionNumbers = br.ReadUInt16(); sysconf.LocomotiveNumber = locomotiveAndSectionNumbers & 0x7FFF; sysconf.SectionNumber = (locomotiveAndSectionNumbers & 0x8000) > 0 ? 2 : 1; //br.BaseStream.Seek(8, SeekOrigin.Begin); sysconf.FirmwareVersion = br.ReadUInt16(); sysconf.LastWrittenPageAddress = (int)br.ReadUInt32(); sysconf.LastReadedBlockAddress = br.ReadUInt16(); sysconf.BadBlocksCount = br.ReadUInt16(); sysconf.LastWrittenPageNumber = br.ReadUInt16(); sysconf.FirstWrittenAfterResetPageNumber = (int)br.ReadUInt32(); sysconf.PsnLogStartPageNumber = (int)br.ReadUInt32(); sysconf.ArrayDumpPsnStartPageNumber = (int)br.ReadUInt32(); sysconf.FatOffsetFromPageZero = (int)br.ReadUInt32(); sysconf.RpdPagesCountTransmittedToPsnLog = (int)br.ReadUInt32(); sysconf.ConfigurationByte = br.ReadByte(); //-----------------------------------------------------------1 (2048) br.BaseStream.Seek(2048, SeekOrigin.Begin); sysconf.FaultsCount = br.ReadByte(); var rpdLogInfos = new IRpdDataInformation[FaultLogTableRecordsMax]; var rpdLogInfoBuilder = new RpdDataInformationBuilderFromStream(br.BaseStream); for (int i = 0; i < FaultLogTableRecordsMax; ++i) { rpdLogInfos[i] = rpdLogInfoBuilder.Build(); } sysconf.FaultDumpsTable = rpdLogInfos; //-----------------------------------------------------------2 (4096) br.BaseStream.Seek(4096, SeekOrigin.Begin); sysconf.MetersCount = br.ReadByte(); var rpdMeters = new IRpdMeterSystemInformation[MetersTableRecordsMax]; var rpdMeterInfoBuilder = new RpdMeterSystemInformationBuilderFromStream(br.BaseStream); for (int i = 0; i < MetersTableRecordsMax; ++i) { rpdMeters[i] = rpdMeterInfoBuilder.Build(); } sysconf.MetersTable = rpdMeters; //4096 + 1217: br.BaseStream.Seek(4096 + 1217, SeekOrigin.Begin); // установим необходимое смещение var psnRegisterStatusMasks = new byte[PsnRegisterStatusMasksMax]; br.Read(psnRegisterStatusMasks, 0, PsnRegisterStatusMasksMax); sysconf.PsnRegisterStatusMasks = psnRegisterStatusMasks; //4096 + 1238: br.BaseStream.Seek(4096 + 1238, SeekOrigin.Begin); // установим необходимое смещение var dumpRules = new IRpdDumpRule[DumpRulesMax]; var rpdDumpRulesBuilder = new RpdDumpRuleBuilderFromStream(br.BaseStream); for (int i = 0; i < DumpRulesMax; ++i) { dumpRules[i] = rpdDumpRulesBuilder.Build(); } sysconf.DumpRules = dumpRules; //------------------------------------------------------------3 (6144) const int offsetPage3 = 6144; const int offsetPowerOnStartPages = offsetPage3 + 2; const int offsetFixedStartPages = offsetPage3 + 500; br.BaseStream.Seek(offsetPage3, SeekOrigin.Begin); sysconf.CurrentPsnLogNumber = br.ReadUInt16(); br.BaseStream.Seek(offsetPowerOnStartPages, SeekOrigin.Begin); var powerOnOffsetInfos = new List <IPsnDataFragmentInformation>(); var psnLogFragmentInfoBuilder = new PsnDataFragmentInformationBuilderFromStream(br.BaseStream); for (int i = 0; i < PsnLogPowerOnStartPagesMaxCount; ++i) { var psnLogFragmentInfo = psnLogFragmentInfoBuilder.Build(); if (psnLogFragmentInfo.StartOffset >= sysconf.PsnLogStartPageNumber) { powerOnOffsetInfos.Add(psnLogFragmentInfo); } } // —писок инвертируетс¤, т.к. перед записью элементы таблицы смещаютс¤ и последний элемент оказываетс¤ в начале таблицы powerOnOffsetInfos.Reverse(); sysconf.PsnLogPowerUpFragmentInfos = powerOnOffsetInfos; br.BaseStream.Seek(offsetFixedStartPages, SeekOrigin.Begin); // „итаем фиксированные смещени¤: var predefinedFragmentInfos = new List <IPsnDataFragmentInformation>(); for (int i = 0; i < PsnPredefinedFragmentStartInfosMaxCount; ++i) { predefinedFragmentInfos.Add(psnLogFragmentInfoBuilder.Build()); } sysconf.PsnLogPredefinedFragmentInfos = predefinedFragmentInfos; br.BaseStream.Close(); } return(sysconf); } throw new Exception("Cannot find binary file, file " + _fileName + " is not exist"); }