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);
        }
コード例 #2
0
        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");
        }