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);
        }
Beispiel #2
0
        public void WriteToStream(Stream stream)
        {
            var bw = new AdvancedBinaryWriter(stream, false);

            bw.Write(Type);
            bw.Write(ControlValue);
            bw.Write(MaxValue);
            bw.Write(MinValue);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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());             // перевычисляем КС по имеющимся данным
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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();
            }
        }