public void Save(IRpdDumpRule rule) { var bw = new AdvancedBinaryWriter(_stream, false); bw.Write((byte)rule.Type); bw.Write((short)rule.ControlValue); bw.Write((short)rule.MaxValue); bw.Write((short)rule.MinValue); }
public static void UpdateChannelCondition(IRpdDumpRule rule, IDumpCondition condtitionToUpdate) { //condtitionToModify.ConnectionPointIndex = connectionPointIndex;//connectionPointIndex определяется при создании RPD канала из записи таблицы измерителей condtitionToUpdate.IsUsed = condtitionToUpdate.ConnectionPointIndex > 0; condtitionToUpdate.ControlValue = rule.ControlValue; condtitionToUpdate.HighLimit = rule.MaxValue; condtitionToUpdate.LowLimit = rule.MinValue; condtitionToUpdate.UseValueAbs = (rule.Type & 0x01) == 0x01; condtitionToUpdate.UseHighLimit = (rule.Type & 0x02) == 0x02; condtitionToUpdate.UseLowLimit = (rule.Type & 0x04) == 0x04; condtitionToUpdate.UseControlValue = (rule.Type & 0x08) == 0x08; condtitionToUpdate.UseLogicalAnd = false; }
public static bool IsEqual(this IRpdDumpRule rule, IRpdDumpRule anotherRule) { //если хоть один параметр не совпадает - считаем что правла не совпали (параметр Value не контролируется): if (rule.Type != anotherRule.Type) { return(false); } if (rule.MaxValue != anotherRule.MaxValue) { return(false); } if (rule.MinValue != anotherRule.MinValue) { return(false); } if (rule.ControlValue != anotherRule.ControlValue) { return(false); } return(true); }
public DumpConditionBuilderFromRpdDumpRule(IRpdDumpRule rpdDumpRule, int conditionPointIndex) { _rpdDumpRule = rpdDumpRule; _conditionPointIndex = conditionPointIndex; }
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"); }