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 void WriteToStream(Stream stream) { var bw = new AdvancedBinaryWriter(stream, false); bw.Write(Type); bw.Write(ControlValue); bw.Write(MaxValue); bw.Write(MinValue); }
public void Save(IRpdDataInformation rpdLogInformation) { var bw = new AdvancedBinaryWriter(_stream, false); bw.Write((byte)rpdLogInformation.Number); bw.Write((byte)rpdLogInformation.Status); bw.Write((byte)rpdLogInformation.Day); bw.Write((byte)rpdLogInformation.Month); bw.Write((byte)rpdLogInformation.Year); bw.Write((byte)rpdLogInformation.Hour); bw.Write((byte)rpdLogInformation.Minute); bw.Write((byte)rpdLogInformation.Second); bw.Write((int)rpdLogInformation.DescriptionPageAddress); bw.Write((int)rpdLogInformation.LastWrittenPageAddress); bw.Write((byte)rpdLogInformation.FaultWasReaded); bw.Write((short)rpdLogInformation.BadPageCounter); }
public void Save(IPsnLogFragmentInfo psnLogFragmentInfo) { var bw = new AdvancedBinaryWriter(_stream, false); bw.Write((uint)psnLogFragmentInfo.StartOffset); var day = (byte)(psnLogFragmentInfo.StartTime.HasValue ? psnLogFragmentInfo.StartTime.Value.Day : 0); var month = (byte)(psnLogFragmentInfo.StartTime.HasValue ? psnLogFragmentInfo.StartTime.Value.Month : 0); var year = (byte)(psnLogFragmentInfo.StartTime.HasValue ? psnLogFragmentInfo.StartTime.Value.Year - 2000 : 0); var hour = (byte)(psnLogFragmentInfo.StartTime.HasValue ? psnLogFragmentInfo.StartTime.Value.Hour : 0); var minute = (byte)(psnLogFragmentInfo.StartTime.HasValue ? psnLogFragmentInfo.StartTime.Value.Minute : 0); var second = (byte)(psnLogFragmentInfo.StartTime.HasValue ? psnLogFragmentInfo.StartTime.Value.Second : 0); bw.Write(day); bw.Write(month); bw.Write(year); bw.Write(hour); bw.Write(minute); bw.Write(second); }
public void WriteToStream(Stream stream) { var bw = new AdvancedBinaryWriter(stream, false); bw.Write(Address); bw.Write(Type); bw.Write(Status); bw.Write(LinkErrorCounter); bw.Write(ChannelsMask); bw.Write(ChannelsMaskFromMeter); //как быть? поидее не нужно переписывать bw.Write(ChannelsCount); bw.Write(ChannelsDumpedCount); bw.Write(ChannelsDumpRulesCodes, 0, 16); bw.Write(HigherReadedFaultNumber); bw.Write(ReadedFaultsCount); bw.Write(NumberOfFaultDumpsForMeter); bw.Write(PageLine); bw.Write(PageLinesCountPerFault); bw.Write(CalculateCrc()); //перевычисляем КС по имеющимся данным }
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 void WriteCommandSync(IRpdControlCommand cmd, int pauseSeconds) { using (var bw = new AdvancedBinaryWriter(new FileStream(_cmdBinPath, FileMode.Open, FileAccess.ReadWrite), false)) { var code = (byte)cmd.Code; var info = cmd.Info; var lenH = (byte)((info.Count & 0xFF00) >> 8); var lenL = (byte)(info.Count & 0xFF); var cmdRequest = new byte[1 + 2 + info.Count]; cmdRequest[0] = code; cmdRequest[1] = lenH; cmdRequest[2] = lenL; info.CopyTo(cmdRequest, 3); var crc = MathExtensions.GetCrc16FromList(cmdRequest.ToList()); var resultRequest = new byte[cmdRequest.Length + 2]; cmdRequest.CopyTo(resultRequest, 0); resultRequest[resultRequest.Length - 2] = crc.High; resultRequest[resultRequest.Length - 1] = crc.Low; bw.Write(resultRequest); bw.BaseStream.Close(); } Thread.Sleep(pauseSeconds * 1000); }
public void SaveConfiguration(ISystemConfiguration configuration) { if (!File.Exists(_fileName)) { if (!_createFileIfNotExist) { throw new Exception("File " + _fileName + " is not exist!"); } using (var stream = File.Create(_fileName)) { var buffer = new byte[] { 0 }; for (int i = 0; i < FileSize; ++i) { stream.Write(buffer, 0, buffer.Length); } stream.Close(); } } using (var bw = new AdvancedBinaryWriter(new FileStream(_fileName, FileMode.Open, FileAccess.Write), false)) { // Page #0 / 0000 bw.Write((ushort)configuration.DeviceAddress); bw.Write((uint)configuration.NetAddress); bw.Write((ushort)(configuration.LocomotiveNumber + (configuration.SectionNumber > 1 ? 0x8000 : 0))); //bw.BaseStream.Seek(8, SeekOrigin.Begin); bw.Write((ushort)configuration.FirmwareVersion); bw.Write((uint)configuration.LastWrittenPageAddress); bw.Write((ushort)configuration.LastReadedBlockAddress); bw.Write((ushort)configuration.BadBlocksCount); bw.Write((ushort)configuration.LastWrittenPageNumber); bw.Write((uint)configuration.FirstWrittenAfterResetPageNumber); bw.Write((uint)configuration.PsnLogStartPageNumber); bw.Write((uint)configuration.ArrayDumpPsnStartPageNumber); bw.Write((uint)configuration.FatOffsetFromPageZero); bw.Write((uint)configuration.RpdPagesCountTransmittedToPsnLog); bw.Write((byte)configuration.ConfigurationByte); // Page #1 / 2048 bw.BaseStream.Seek(2048, SeekOrigin.Begin); bw.Write((byte)configuration.FaultsCount); if (configuration.FaultDumpsTable.Count > FaultLogTableRecordsMax) { throw new Exception("Rpd meters count is not " + FaultLogTableRecordsMax); } var rpdLogInfoSaver = new RpdDataInformationSaverToStream(bw.BaseStream); foreach (var rpdLogInfo in configuration.FaultDumpsTable) { rpdLogInfoSaver.Save(rpdLogInfo); } // Page #2 / 4096 bw.BaseStream.Seek(4096, SeekOrigin.Begin); bw.Write((byte)configuration.MetersCount); // Таблица измерителей: var rpdMeterInfoSaver = new RpdMeterSystemInformationSaverToStream(bw.BaseStream); if (configuration.MetersTable.Count > MetersTableRecordsMax) { throw new Exception("Rpd meters count is more than " + MetersTableRecordsMax); } foreach (var rpdMeterInfo in configuration.MetersTable) { rpdMeterInfoSaver.Save(rpdMeterInfo); } //4096 + 1217: bw.BaseStream.Seek(4096 + 1217, SeekOrigin.Begin); // установим необходимое смещение //TODO: ------------------------------------------------ //if (configuration.PsnRegisterStatusMasks.Count != PsnRegisterStatusMasksMax) //throw new Exception("Psn register status masks count is not " + PsnRegisterStatusMasksMax); //bw.Write(configuration.PsnRegisterStatusMasks.ToArray(), 0, PsnRegisterStatusMasksMax); //------------------------------------------------------ //4096 + 1238: //TODO: ------------------------------------------------ //bw.BaseStream.Seek(4096 + 1238, SeekOrigin.Begin); // установим необходимое смещение //var rpdDumpRuleSaver = new RpdDumpRuleSaverToStream(bw.BaseStream); //if (configuration.DumpRules.Count != DumpRulesMax) //throw new Exception("Rpd dump rules count is not " + PsnRegisterStatusMasksMax); //foreach (var rpdDumpRule in configuration.DumpRules) { //rpdDumpRuleSaver.Save(rpdDumpRule); //} //------------------------------------------------------ // Page #3 (6144) //TODO: ------------------------------------------------ /* * const int offsetPage3 = 6144; * const int offsetPowerOnStartPages = offsetPage3 + 2; * const int offsetFixedStartPages = offsetPage3 + 500; * bw.BaseStream.Seek(offsetPage3, SeekOrigin.Begin); * bw.Write((ushort)configuration.CurrentPsnLogNumber); * * * if (configuration.PsnLogPowerUpFragmentInfos.Count > PsnLogPowerOnStartPagesMaxCount) * throw new Exception("Psn log fragments info on power up must not be more than " + PsnLogPowerOnStartPagesMaxCount); * * bw.BaseStream.Seek(offsetPowerOnStartPages, SeekOrigin.Begin); * var psnLogFragmentInfoSaver = new PsnLogFragmentInfoSaverToStream(bw.BaseStream); * foreach (var psnLogPowerUpFragmentInfo in configuration.PsnLogPowerUpFragmentInfos) { * psnLogFragmentInfoSaver.Save(psnLogPowerUpFragmentInfo); * } */ // PsnLogPredefinedFragmentInfos are not saving /*if (configuration.PsnLogPredefinedFragmentInfos.Count > PsnPredefinedFragmentStartInfosMaxCount) * throw new Exception("Psn log fragments info fixed length must not be more than " + PsnPredefinedFragmentStartInfosMaxCount); * * bw.BaseStream.Seek(offsetFixedStartPages, SeekOrigin.Begin); * foreach (var psnLogPredefinedFragmentInfo in configuration.PsnLogPredefinedFragmentInfos) { * psnLogFragmentInfoSaver.Save(psnLogPredefinedFragmentInfo); * }*/ //----------------------------------------------------- // TODO: 5 страница - копия второй: // Page #5 / 10240 bw.BaseStream.Seek(10240, SeekOrigin.Begin); bw.Write((byte)configuration.MetersCount); // Таблица измерителей: var rpdMeterInfoSaverPage5 = new RpdMeterSystemInformationSaverToStream(bw.BaseStream); if (configuration.MetersTable.Count > MetersTableRecordsMax) { throw new Exception("RPD.DAL число измерителей больше чем " + MetersTableRecordsMax); } foreach (var rpdMeterInfo in configuration.MetersTable) { rpdMeterInfoSaverPage5.Save(rpdMeterInfo); } bw.BaseStream.Close(); } }