Beispiel #1
0
        public static byte CalculateCrc(this IRpdMeterSystemInformation rpdMeterSystemInformation)
        {
            int crc1 = ((rpdMeterSystemInformation.Address + rpdMeterSystemInformation.Type + (rpdMeterSystemInformation.ChannelsMask & 0x00FF) + ((rpdMeterSystemInformation.ChannelsMask & 0xFF00) >> 8) + rpdMeterSystemInformation.ChannelsDumpedCount) & 0x000000FF);
            var crc2 = (byte)~crc1;

            return(crc2);
        }
        public void Save(IRpdMeterSystemInformation rpdMeterSystemInformation)
        {
            var bw = new AdvancedBinaryWriter(_stream, false);

            bw.Write((byte)rpdMeterSystemInformation.Address);
            bw.Write((byte)rpdMeterSystemInformation.Type);
            bw.Write((byte)rpdMeterSystemInformation.Status);
            bw.Write((byte)rpdMeterSystemInformation.LinkErrorCounter);

            bw.Write((ushort)rpdMeterSystemInformation.ChannelsMask);
            bw.Write((ushort)rpdMeterSystemInformation.ChannelsMaskFromMeter);             // TODO: как быть? поидее не нужно переписывать
            bw.Write((byte)rpdMeterSystemInformation.ChannelsCount);
            bw.Write((byte)rpdMeterSystemInformation.ChannelsDumpedCount);
            bw.Write(rpdMeterSystemInformation.ChannelsDumpRulesCodes.ToArray(), 0, MaxChannels);

            bw.Write((byte)rpdMeterSystemInformation.HigherReadedFaultNumber);
            bw.Write((byte)rpdMeterSystemInformation.ReadedFaultsCount);
            bw.Write((byte)rpdMeterSystemInformation.NumberOfFaultDumpsForMeter);
            bw.Write((uint)rpdMeterSystemInformation.PageLine);
            bw.Write((uint)rpdMeterSystemInformation.PageLinesCountPerFault);
            bw.Write((byte)rpdMeterSystemInformation.CalculateCrc());             // перевычисляем КС по имеющимся данным
        }
 public RpdMeterBuilderFromRpdMeterInfo(IRpdMeterSystemInformation rpdMeterSystemInformation, string rpdMeterName)
 {
     _rpdMeterSystemInformation = rpdMeterSystemInformation;
     _rpdMeterName = rpdMeterName;
 }
        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");
        }