Example #1
0
        /// <summary>
        /// Загружает данные из файла.
        /// </summary>
        /// <param name="path">
        /// Путь к файлу.
        /// </param>
        /// <param name="readMode">
        /// Значение, определяющее режим чтения файла кадра регистрации.
        /// </param>
        /// <returns>
        /// Данные, загруженные из файла.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// Параметр <paramref name="path"/> имеет значение пустой ссылки.
        /// </exception>
        /// <exception cref="ArgumentException">
        /// Параметр <paramref name="path"/> является пустой строкой (""),
        /// содержит только пробелы или содержит один или несколько недопустимых знаков.
        /// -или-
        /// <paramref name="path"/> ссылается на устройство,
        /// которое не является файловым, например "con:", "com1:", "lpt1:" и т. д., в среде NTFS.
        /// </exception>
        /// <exception cref="ArgumentException">
        /// Параметр path является пустой строкой (""), содержит только пробелы или содержит
        /// один или несколько недопустимых знаков.
        /// </exception>
        /// <exception cref="NotSupportedException">
        /// path ссылается на устройство, которое не является файловым, например "con:", "com1:", "lpt1:" и т. д., в среде, отличной от NTFS.
        /// </exception>
        /// <exception cref="FileNotFoundException">
        /// Невозможно найти файл, например, когда mode содержит FileMode.Truncate или FileMode.Open,
        /// а файл, заданный в path, не существует.Файл должен уже существовать в этих режимах.
        /// </exception>
        /// <exception cref="IOException">
        /// Произошла ошибка ввода-вывода, например, задано FileMode.CreateNew, когда файл,
        /// указанный в path, уже существует. – или –Компьютер работает под управлением операционной
        /// системы Windows 98 или Windows 98 Second Edition, и для параметра share задано
        /// значение FileShare.Delete.– или –Поток закрыт.
        /// </exception>
        /// <exception cref="SecurityException">
        /// У вызывающего объекта отсутствует необходимое разрешение.
        /// </exception>
        /// <exception cref="DirectoryNotFoundException">
        /// Указанный путь недопустим; возможно, он соответствует неподключенному диску.
        /// </exception>
        /// <exception cref="UnauthorizedAccessException">
        /// Запрошенный параметр access не разрешен операционной системой для заданного path,
        /// например, когда параметр access равен Write или ReadWrite, а файл или каталог
        /// установлены на доступ только для чтения.
        /// </exception>
        /// <exception cref="PathTooLongException">
        /// Длина указанного пути, имени файла или обоих параметров превышает установленное
        /// в системе максимальное значение.Например, для платформ на основе Windows длина
        /// пути не должна превышать 248 символов, а имена файлов не должны содержать более
        /// 260 символов.
        /// </exception>
        /// <exception cref="ArgumentOutOfRangeException">
        /// Параметр mode содержит недопустимое значение.
        /// </exception>
        public static Tuple <FrameHeader, ChannelCollection> LoadFrame(string path, FileReadMode readMode)
        {
            FileReader reader = null;

            try
            {
                reader = new FileReader(path);
                long fileSize = reader.FileSize;

                reader.Position = 0;
                if (fileSize >= 350 && reader.ReadUInt64() == 0x42414C54534554UL)
                {
                    return(LoadTestLabFrame(path, reader, readMode));
                }

                reader.Position = 0;
                if (fileSize >= 2 && reader.ReadInt16() == 0x1394)
                {
                    return(LoadCatmanFrame(path, reader, readMode));
                }
            }
            finally
            {
                reader?.Close();
            }
            throw new InvalidDataException("Произошла попытка загрузить файл неизвестного формата.");
        }
Example #2
0
        /// <summary>
        /// Инициализирует новый экземпляр класса.
        /// </summary>
        /// <param name="path">
        /// Путь к файлу.
        /// </param>
        /// <param name="readMode">
        /// Значение, определяющее режим чтения файла кадра регистрации.
        /// </param>
        internal Frame(string path, FileReadMode readMode)
        {
            Tuple <FrameHeader, ChannelCollection> tuple = Kernel.LoadFrame(path, readMode);

            Header   = tuple.Item1;
            Channels = tuple.Item2;
        }
Example #3
0
        /// <summary>
        /// Closes opened file after read
        /// </summary>
        private void CasCloseRead()
        {
            if (m_read_mode == FileReadMode.File)
            {
                if (m_read_file != null)
                {
                    try
                    {
                        m_read_file.Close();
                        m_read_stream.Close();

                        EndFunction(CoProcessorConstants.ERR_OK);
                    }
                    catch
                    {
                        EndFunction(CoProcessorConstants.ERR_DISK_FULL);
                    }
                    finally
                    {
                        m_read_file   = null;
                        m_read_stream = null;
                    }
                }
                else
                {
                    EndFunction(CoProcessorConstants.ERR_NO_OPENED_FILE);
                }
            }
            else
            {
                m_read_mode = FileReadMode.File;
                m_directory_file.Close();

                EndFunction(CoProcessorConstants.ERR_OK);
            }
        }
Example #4
0
        unsafe public static Tuple <FrameHeader, ChannelCollection> LoadTestLabFrame(string path, FileReader reader, FileReadMode readMode)
        {
            TestLabFrameHeader frameHeader = new TestLabFrameHeader();
            ChannelCollection  channels    = new ChannelCollection();

            reader.Position = 8;

            frameHeader.Title     = ReadASCIIString(reader, 61);
            frameHeader.Character = ReadASCIIString(reader, 121);
            frameHeader.Region    = ReadASCIIString(reader, 121);

            try
            {
                frameHeader.Time = DateTime.Parse(ReadASCIIString(reader, 11) + " " + ReadASCIIString(reader, 9));
            }
            catch
            {
                throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
            }


            int numberOfChannels = reader.ReadUInt16();

            reader.Position += 17;

            if (numberOfChannels == 0)
            {
                if (reader.FileSize != 350)
                {
                    throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                }
            }
            else
            {
                long fullSize = 350 + 192 * numberOfChannels;
                if (reader.FileSize < fullSize)
                {
                    throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                }

                for (int i = 0; i != numberOfChannels; ++i)
                {
                    TestLabChannelHeader channelHeader = new TestLabChannelHeader();
                    channelHeader.Name        = ReadASCIIString(reader, 13);
                    channelHeader.Description = ReadASCIIString(reader, 121);
                    channelHeader.Unit        = ReadASCIIString(reader, 13);
                    channelHeader.Offset      = reader.ReadFloat32();
                    channelHeader.Scale       = reader.ReadFloat32();
                    channelHeader.Cutoff      = reader.ReadFloat32();
                    channelHeader.Sampling    = reader.ReadUInt16();
                    channelHeader.Type        = TestLabChannelHeader.Validation((TestLabChannelType)reader.ReadUInt8());
                    channelHeader.DataFormat  = TestLabChannelHeader.Validation((TestLabDataFormat)reader.ReadUInt8());
                    uint channelLength = reader.ReadUInt32();
                    if (channelLength > int.MaxValue)
                    {
                        throw new InvalidOperationException("Файл содержит канал слишеом большой длины.");
                    }
                    Channel channel = new Channel(channelHeader, new Algebra.RealVector((int)channelLength));
                    channels.Add(channel);
                    reader.Position += 25;

                    fullSize += channelLength * TestLabChannelHeader.GetItemSize(channelHeader.DataFormat) + 2;
                }

                if ((readMode & FileReadMode.DisableCheckExceedingFileSize) == 0)
                {
                    if (reader.FileSize != fullSize)
                    {
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }
                }
                else
                {
                    if (reader.FileSize < fullSize)
                    {
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }
                }

                for (int i = 0; i != numberOfChannels; ++i)
                {
                    Channel channel             = channels[i];
                    TestLabChannelHeader header = (TestLabChannelHeader)channel.Header;
                    int     length      = channel.Length;
                    byte[]  buffer      = reader.ReadBytes(length * TestLabChannelHeader.GetItemSize(header.DataFormat));
                    double  offset      = header.Offset;
                    double  scale       = header.Scale;
                    double *destination = (double *)channel.Vector.Pointer;

                    switch (header.DataFormat)
                    {
                    case TestLabDataFormat.UInt8:
                        fixed(void *pointer = buffer)
                        {
                            byte *source = (byte *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.UInt16:
                        fixed(void *pointer = buffer)
                        {
                            ushort *source = (ushort *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.UInt32:
                        fixed(void *pointer = buffer)
                        {
                            uint *source = (uint *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Int8:
                        fixed(void *pointer = buffer)
                        {
                            sbyte *source = (sbyte *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Int16:
                        fixed(void *pointer = buffer)
                        {
                            short *source = (short *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Int32:
                        fixed(void *pointer = buffer)
                        {
                            int *source = (int *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Float32:
                        fixed(void *pointer = buffer)
                        {
                            float *source = (float *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    case TestLabDataFormat.Float64:
                        fixed(void *pointer = buffer)
                        {
                            double *source = (double *)pointer;

                            for (int j = 0; j != length; ++j)
                            {
                                destination[j] = scale * (source[j] - offset);
                            }
                        }

                        break;

                    default:
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }

                    if (reader.ReadUInt16() != 65535)
                    {
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }
                }
            }

            return(new Tuple <FrameHeader, ChannelCollection>(frameHeader, channels));
        }
Example #5
0
        /// <summary>
        /// Opens file for reading
        /// </summary>
        /// <param name="in_data">Function parameter bytes</param>
        private void CasOpen(byte in_data)
        {
            if (m_write_data_index == 0)
            {
                m_filename_length_param = in_data;
                m_filename_param        = "";
            }

            // store filename character
            int filename_index = m_write_data_index - 1;

            if (filename_index >= 0 && filename_index < m_filename_length_param)
            {
                m_filename_param += (char)in_data;
            }

            // if last character is received
            if (filename_index + 1 == m_filename_length_param)
            {
                if (m_filename_param == "+")
                {
                    m_read_mode = FileReadMode.Directory;

                    m_directory_file.Open();

                    m_filename_param = "+";
                    SetReadResult(CoProcessorReadFilename);
                }
                else
                {
                    if (m_read_stream == null)
                    {
                        // Last filename character received
                        m_read_mode = FileReadMode.File;

                        string filename;
                        if (m_filename_length_param == 0)
                        {
                            filename = GetFilePath("start");
                        }
                        else
                        {
                            filename = GetFilePath(m_filename_param);
                        }

                        if (!File.Exists(filename))
                        {
                            EndFunction(CoProcessorConstants.ERR_FILE_NOT_FOUND);
                        }
                        else
                        {
                            if (!Directory.Exists(Path.GetDirectoryName(filename)))
                            {
                                EndFunction(CoProcessorConstants.ERR_NO_PATH);
                            }
                            else
                            {
                                // try to open the file
                                try
                                {
                                    m_read_stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                                    m_read_file   = new BinaryReader(m_read_stream);

                                    // In case of CAS file skip UPM header
                                    if (string.Compare(Path.GetExtension(filename), ".CAS", true) == 0)
                                    {
                                        m_read_stream.Seek(Marshal.SizeOf(typeof(TVCFileTypes.CASUPMHeaderType)), SeekOrigin.Begin);
                                    }

                                    // generate result file name
                                    filename = Path.GetFileName(filename);
                                    if (filename.Length < m_filename_length_param)
                                    {
                                        m_filename_length_param = filename.Length;
                                    }
                                    m_filename_param = TVCCharacterCodePage.UNICODEStringToTVCString(filename);
                                    SetReadResult(CoProcessorReadFilename);
                                }
                                catch
                                {
                                    EndFunction(CoProcessorConstants.ERR_FILE_NOT_FOUND);
                                }
                            }
                        }
                    }
                    else
                    {
                        // if file is already created
                        EndFunction(CoProcessorConstants.ERR_ALREADY_OPENED);
                    }
                }
            }

            m_write_data_index++;
        }
Example #6
0
        public static Tuple <FrameHeader, ChannelCollection> LoadCatmanFrame(string path, FileReader reader, FileReadMode readMode)
        {
            try
            {
                reader.Position = 2;
                CatmanFrameHeader frameHeader = new CatmanFrameHeader();
                ChannelCollection channels    = new ChannelCollection();

                int dataOffset = reader.ReadInt32();
                frameHeader.Comment = ReadASCIIString(reader, reader.ReadInt16());
                for (int i = 0; i != 32; ++i)
                {
                    frameHeader.Reserve[i] = ReadASCIIString(reader, reader.ReadInt16());
                }

                int   numberOfChannels    = reader.ReadInt16();
                int[] offsetChannelLength = new int[numberOfChannels];

                frameHeader.MaximumChannelLength = reader.ReadInt32();
                for (int i = 0; i != numberOfChannels; ++i)
                {
                    offsetChannelLength[i] = reader.ReadInt32();
                }

                //  Проверка компресии данных.
                if (reader.ReadInt32() != 0)
                {
                    throw new NotSupportedException("Произошла попытка чтения файла с компресией данных.");
                }

                if (numberOfChannels > 0)
                {
                    for (int i = 0; i != numberOfChannels; ++i)
                    {
                        int channelLength = 0;
                        reader.Position = offsetChannelLength[i] - 2;
                        CatmanChannelHeader channelHeader = new CatmanChannelHeader();


                        channelHeader.LocationInDatabase = reader.ReadInt16();
                        channelLength                      = reader.ReadInt32();
                        channelHeader.Name                 = ReadASCIIString(reader, reader.ReadInt16());
                        channelHeader.Unit                 = ReadASCIIString(reader, reader.ReadInt16());
                        channelHeader.Comment              = ReadASCIIString(reader, reader.ReadInt16());
                        channelHeader.DataFormat           = (CatmanDataFormat)reader.ReadInt16();
                        channelHeader.DataWidth            = reader.ReadInt16();
                        channelHeader.Time                 = DateTime.FromOADate(reader.ReadFloat64());
                        channelHeader.SizeOfExtendedHeader = reader.ReadInt32();

                        if (channelHeader.SizeOfExtendedHeader < 148)
                        {
                            throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                        }

                        channelHeader.StartTime                   = DateTime.FromOADate(reader.ReadFloat64());
                        channelHeader.SamplingTimeStep            = reader.ReadFloat64();
                        channelHeader.Sampling                    = 1000 / channelHeader.SamplingTimeStep;
                        channelHeader.CodeOfSensorType            = (CatmanCodeOfSensorType)reader.ReadInt16();
                        channelHeader.CodeOfSupplyVoltage         = (CatmanCodeOfSupplyVoltage)reader.ReadInt16();
                        channelHeader.CodeOfFilterCharacteristics = (CatmanCodeOfFilterCharacteristics)reader.ReadInt16();
                        channelHeader.CodeOfFilterFrequency       = (CatmanCodeOfFilterFrequency)reader.ReadInt16();
                        channelHeader.TareValue                   = reader.ReadFloat32();
                        channelHeader.ZeroValue                   = reader.ReadFloat32();
                        channelHeader.CodeOfMeasuringRange        = (CatmanCodeOfMeasuringRange)reader.ReadFloat32();
                        channelHeader.InputCharacteristics        = new double[4];
                        channelHeader.InputCharacteristics[0]     = reader.ReadFloat32();
                        channelHeader.InputCharacteristics[1]     = reader.ReadFloat32();
                        channelHeader.InputCharacteristics[2]     = reader.ReadFloat32();
                        channelHeader.InputCharacteristics[3]     = reader.ReadFloat32();
                        channelHeader.AmplifierSerialNumber       = ReadASCIIString(reader, 32);
                        channelHeader.PhysicalUnit                = ReadASCIIString(reader, 8);
                        channelHeader.NativeUnit                  = ReadASCIIString(reader, 8);
                        channelHeader.HardwareSlotNumber          = reader.ReadInt16();
                        channelHeader.HardwareSubSlotNumber       = reader.ReadInt16();
                        channelHeader.CodeOfAmplifierType         = reader.ReadInt16();
                        channelHeader.CodeOfAPConnectorType       = reader.ReadInt16();
                        channelHeader.GageFactor                  = reader.ReadFloat32();
                        channelHeader.BridgeFactor                = reader.ReadFloat32();
                        channelHeader.CodeOfMeasurementSignal     = reader.ReadInt16();
                        channelHeader.CodeOfAmplifierInput        = reader.ReadInt16();
                        channelHeader.CodeOfHighpassFilter        = reader.ReadInt16();
                        channelHeader.OnlineImportInfo            = reader.ReadUInt8();
                        channelHeader.CodeOfScaleType             = reader.ReadUInt8();
                        channelHeader.SoftwareZeroValue           = reader.ReadFloat32();
                        channelHeader.WriteProtected              = reader.ReadUInt8();
                        channelHeader.Alignment                   = new byte[3];
                        channelHeader.Alignment[0]                = reader.ReadUInt8();
                        channelHeader.Alignment[1]                = reader.ReadUInt8();
                        channelHeader.Alignment[2]                = reader.ReadUInt8();
                        channelHeader.NominalRange                = reader.ReadFloat32();
                        channelHeader.CableLengthCompensation     = reader.ReadFloat32();
                        channelHeader.ExportFormat                = reader.ReadUInt8();
                        channelHeader.ChannelType                 = reader.ReadInt8();
                        channelHeader.EDaqConnectorOnLayer        = reader.ReadUInt8();
                        channelHeader.EDaqLayer                   = reader.ReadUInt8();
                        channelHeader.ContentType                 = reader.ReadUInt8();
                        channelHeader.Reserved                    = new byte[3];
                        channelHeader.Reserved[0]                 = reader.ReadUInt8();
                        channelHeader.Reserved[1]                 = reader.ReadUInt8();
                        channelHeader.Reserved[2]                 = reader.ReadUInt8();

                        channelHeader.LinearisationMode        = reader.ReadUInt8();
                        channelHeader.UserScaleType            = reader.ReadUInt8();
                        channelHeader.NumberOfPointsScaleTable = reader.ReadUInt8();
                        if (channelHeader.NumberOfPointsScaleTable != 0)
                        {
                            channelHeader.PointsScaleTable = new double[channelHeader.NumberOfPointsScaleTable];
                            for (int j = 0; j != channelHeader.NumberOfPointsScaleTable; ++j)
                            {
                                channelHeader.PointsScaleTable[j] = reader.ReadFloat64();
                            }
                        }

                        channelHeader.ThermoType = reader.ReadInt16();
                        channelHeader.Formula    = ReadASCIIString(reader, reader.ReadInt16());
                        channelHeader.SensorInfo = new CatmanSensorInfo();
                        int sensorInfoSize = reader.ReadInt32();
                        if (sensorInfoSize != 68)
                        {
                            throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                        }
                        channelHeader.SensorInfo.InUse       = reader.ReadInt16() != 0;
                        channelHeader.SensorInfo.Description = ReadASCIIString(reader, 50);
                        channelHeader.SensorInfo.Tid         = ReadASCIIString(reader, 16);

                        RealVector vector = new RealVector(channelLength);
                        channels.Add(new Channel(channelHeader, vector));
                    }

                    reader.Position = dataOffset;
                    foreach (Channel channel in channels)
                    {
                        CatmanChannelHeader channelHeader = (CatmanChannelHeader)channel.Header;
                        switch (channelHeader.ExportFormat)
                        {
                        case 0:
                            for (int i = 0; i != channel.Length; ++i)
                            {
                                channel[i] = reader.ReadFloat64();
                            }
                            break;

                        case 1:
                            for (int i = 0; i != channel.Length; ++i)
                            {
                                channel[i] = reader.ReadFloat32();
                            }
                            break;

                        case 2:
                            channelHeader.MinValueFactor = reader.ReadFloat64();
                            channelHeader.MinValueFactor = reader.ReadFloat64();
                            for (int i = 0; i != channel.Length; ++i)
                            {
                                channel[i] = reader.ReadInt16() / 32767 * (channelHeader.MinValueFactor - channelHeader.MinValueFactor) + channelHeader.MinValueFactor;
                            }
                            break;

                        default:
                            throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                        }
                    }

                    //  Проверка Id Post data ares
                    if (reader.ReadInt16() != 4001)
                    {
                        throw new InvalidDataException("Произошла попытка загрузить файл некорректного формата.");
                    }

                    foreach (Channel channel in channels)
                    {
                        ((CatmanChannelHeader)channel.Header).FormatString = ReadASCIIString(reader, reader.ReadInt16());
                    }
                }
                return(new Tuple <FrameHeader, ChannelCollection>(frameHeader, channels));
            }
            catch (Exception ex)
            {
                throw new InvalidDataException("Произошла ошибка при чтении файла.", ex);
            }
        }