public static void StartCalcText(BackgroundWorker ProgressBar, bool[] EnableChannel, DoWorkEventArgs e) { if (Create_CSV("Summary") != DialogResult.OK) // Создание файла CSV проверка на отмену) { return; } InitCsv(); //ulong NumEv; // Номер Event var fs = new FileStream(String.Format("{0}", ReadFilePath), FileMode.Open); // Экземпляр потока чтения var fsr = new StreamReader(fs); string readerLine = ""; BackGroundWorkerResult calculationresult; ulong TimeStampnSec; // Время тригера сек int NumEv = 0; // Время тригера сек ulong TimeStampSec; // Время ригера нсек ulong StartTimeStampnSec; // Время тригера сек int NumCircleNumEvent = 0; // Количество кругов Event //long prog_st = (fs.Length / 10000) - 1; // шаг для Progress Bar using (writer) { AddHeaderCalc(EnableChannel);// Запись загаловка файл readerLine = fsr.ReadLine(); readerLine = readerLine.Substring(4); readerLine = readerLine.Substring(readerLine.IndexOf(' ') + 1); StartTimeStampnSec = ulong.Parse(readerLine.Substring(readerLine.IndexOf(" ") + 1, readerLine.IndexOf('.') - 2 - readerLine.IndexOf(" ") + 1)) * 1000000000; // Запись время триггера нсек*/ readerLine = readerLine.Substring(readerLine.IndexOf('.') + 1); StartTimeStampnSec += ulong.Parse(readerLine.ToString()); fs.Position = 0; fsr.DiscardBufferedData(); readerLine = fsr.ReadLine(); while (!fsr.EndOfStream) { BufferData <CalcInterf> buferfiledata = new BufferData <CalcInterf>(); // Экземпляр для хранения данных вычислений BlockData <Adc_Interface> adcbuffer = new BlockData <Adc_Interface>(); // экземпляр данных adc в блоке event BlockData <Tdc_Interface> tdcbuffer = new BlockData <Tdc_Interface>(); // экземпляр данных tdc в блоке event if (readerLine.Substring(0, 3) == "Ev:") { readerLine = readerLine.Substring(4); if (NumEv == 16777215 + 16777215 * NumCircleNumEvent) { NumCircleNumEvent++; } NumEv = int.Parse(readerLine.Substring(0, readerLine.IndexOf(" "))) + 16777215 * NumCircleNumEvent; readerLine = readerLine.Substring(readerLine.IndexOf(' ') + 1); TimeStampSec = uint.Parse(readerLine.Substring(readerLine.IndexOf(" ") + 1, readerLine.IndexOf('.') - 2 - readerLine.IndexOf(" ") + 1)); // Чтение даты и времени глобального Event и конвертация из unix в стандратный вид readerLine = readerLine.Substring(readerLine.IndexOf('.') + 1); TimeStampnSec = uint.Parse(readerLine.ToString()); // добавление к дате времени в нс buferfiledata.AddHeaderEvent(NumEv, TimeStampSec, TimeStampnSec); //Запись данных триггера bool isenddata = false; while (!isenddata) { readerLine = fsr.ReadLine(); if (readerLine is null) { break; } switch (readerLine.Substring(0, 3)) { case "Tdc": { readerLine = readerLine.Substring(4); int ch = int.Parse(readerLine.Substring(0, readerLine.IndexOf(':'))); //Добавление канала, данных, if (!IsNeedChannel(ch + 1, CChannel)) { break; //проверка нужды канала } uint value = uint.Parse(readerLine.Substring(readerLine.IndexOf(": ") + 2)) * 25; //чтение данных tdc tdcbuffer.Newrecord(ch, new Tdc_Interface(LEADING_FRONT, value)); //Запись данных в блок данных tdc break; } case "Adc": { readerLine = readerLine.Substring(4); int ch = int.Parse(readerLine.Substring(0, readerLine.IndexOf(':'))); //чтение канала данных if (!IsNeedChannel(ch + 1, CChannel)) { break; //проверка нужды канала } uint timestamp = uint.Parse(readerLine.Substring(readerLine.IndexOf(": ") + 1, readerLine.IndexOf(';') - (readerLine.IndexOf(": ") + 1))) * 8; readerLine = readerLine.Substring(readerLine.IndexOf(';') + 2); List <int> databuf = new List <int>(); //Массив для sample adc while (true) { try { //databuf.Add(int.Parse(readerLine.Substring(0, readerLine.IndexOf(' ')))); databuf.Add(TQDC2Configs.ChGain[ch] ? (int.Parse(readerLine.Substring(0, readerLine.IndexOf(' '))) + (int)TQDC2Configs.X4[ch]) : (int.Parse(readerLine.Substring(0, readerLine.IndexOf(' '))) + (int)TQDC2Configs.X1[ch])); readerLine = readerLine.Substring(readerLine.IndexOf(' ') + 1); } catch { //databuf.Add(int.Parse(readerLine)); databuf.Add(TQDC2Configs.ChGain[ch] ? (int.Parse(readerLine) + (int)TQDC2Configs.X4[ch]) : (int.Parse(readerLine) + (int)TQDC2Configs.X1[ch])); break; } } adcbuffer.Newrecord(ch, new Adc_Interface(databuf, timestamp)); // Чтение временной метки ADC в нС break; } case "Ev:": { isenddata = true; break; } } } } AddRecordCalc(buferfiledata, tdcbuffer, adcbuffer); // запись данных event в блок вычисленных данных WriteFileCalc(buferfiledata, writer, StartTimeStampnSec); //запись в файл ProgressBar.ReportProgress((int)NumEv, adcbuffer); // Возращение прогресса в BackgroundWorker ProgressBar (повышение строки прогресса в окне) if (ProgressBar.CancellationPending == true) { CloseCsv(); // закрытие потока записи fs.Close(); // закрытие потока чтения return; } } } calculationresult = new BackGroundWorkerResult(CALCULATION, 100, OK); e.Result = calculationresult; //Возращение переменной для различия процесса CloseCsv(); // закрытие потока записи fs.Close(); // закрытие потока чтения }
public static void StartCalcBinary(BackgroundWorker ProgressBar, bool[] EnableChannel, DoWorkEventArgs e) { if (Create_CSV("Summary") != DialogResult.OK) // Создание файла CSV { return; } InitCsv(); // Инициирование экземпляров записи BackGroundWorkerResult calculationresult; int EvLeng; // Длина глобального Event в байтах int MSLeng; // Длина блока MStream int DataPLLeng; // Длина блока DataPayload int NumEv = 0; // Номер Event long pos = 0; // Позиция в блоке файла long pospl; // Позиция в блоке DataPayload long prog = 0; // Позиция для Progress Bar ulong TimeStampnSec; // Время тригера сек ulong TimeStampSec; // Время тригера нсек ulong StartTimeStampnSec; // Время тригера сек int NumCircleNumEvent = 0; // Количество кругов Event var fs = new FileStream(string.Format("{0}", ReadFilePath), FileMode.Open); // Экземпляр потока чтения using (writer) // поток для записи { AddHeaderCalc(EnableChannel); // Запись загаловка файл StartTimeStampnSec = ((ulong)Byte2uInt(ReadBytes(24, 4, fs)) * 1000000000) + (ulong)(Byte2uInt(ReadBytes(28, 4, fs)) >> 2); // Запись время триггера нсек while (pos < fs.Length) // Главный цикл (пока позиция в блоке Event меньше длины файла в байтах) { BufferData <CalcInterf> buferfiledata = new BufferData <CalcInterf>(); // Экземпляр для хранения данных вычислений EvLeng = Byte2Int(ReadBytes(pos + 4, 4, fs)); // Чтение длины Event if (NumEv == 16777215 + 16777215 * NumCircleNumEvent) { NumCircleNumEvent++; } NumEv = Byte2Int(ReadBytes(pos + 8, 4, fs)) + 16777215 * NumCircleNumEvent; // Номер Event MSLeng = Byte2Int(ReadBytes(pos + 21, 3, fs)) >> 2; // Чтение длины блока MStream TimeStampSec = Byte2uInt(ReadBytes(pos + 24, 4, fs)); // Запись время триггера сек TimeStampnSec = Byte2uInt(ReadBytes(pos + 28, 4, fs)) >> 2; // Запись время триггера нсек buferfiledata.AddHeaderEvent(NumEv, TimeStampSec, TimeStampnSec); //Запись данных триггера pospl = pos + 32; // присваивание поцизии в блоке MSPayload начального значения BlockData <Adc_Interface> adcbuffer = new BlockData <Adc_Interface>(); // экземпляр данных adc в блоке event BlockData <Tdc_Interface> tdcbuffer = new BlockData <Tdc_Interface>(); // экземпляр данных tdc в блоке event while (pospl != pos + EvLeng + 12) // Цикл на чтение Data Block ( пока позиция в блоке Data block не в конце блока Data block) { DataPLLeng = Byte2Int(ReadBytes(pospl + 2, 2, fs)); //Чтение длины DataPayload switch ((Byte2Int(ReadBytes(pospl, 1, fs))) >> 4) // Проверка типа DataPayload ( 0 TDC, 1 ADC) { case 0: { pospl += 4; //переход на новую строку for (int i = 0; i < DataPLLeng / 4; i++) // Чтение данных с Data Block { switch (Byte2Int(ReadBytes(pospl, 1, fs)) >> 4) // Проверка на тип Header записи TDC { case 2: { pospl += 4; break; } case 3: { pospl += 4; break; } case 4: { int ch = ((Byte2Int(ReadBytes(pospl, 4, fs))) << 7) >> 28; //чтение канала данных if (!IsNeedChannel(ch + 1, CChannel)) { break; //проверка нужды канала } uint value = (((Byte2uInt(ReadBytes(pospl, 4, fs))) << 11) >> 11) * 25; //чтение данных tdc if (inl_config) { //value += TQDC2Configs.Inl[2][12]; } tdcbuffer.Newrecord(ch, new Tdc_Interface(LEADING_FRONT, value)); //Запись данных в блок данных tdc pospl += 4; break; } case 5: { int ch = ((Byte2Int(ReadBytes(pospl, 4, fs))) << 7) >> 28; //чтение канала данных if (!IsNeedChannel(ch + 1, CChannel)) { break; //проверка нужды канала } uint value = (((Byte2uInt(ReadBytes(pospl, 4, fs))) << 11) >> 11) * 25; //чтение данных tdc tdcbuffer.Newrecord(ch, new Tdc_Interface(TRAILING_FRONT, value)); //Запись данных в блок данных tdc pospl += 4; break; } case 7: { pospl += 4; break; } } } break; } case 1: { int ch = (int)(((Byte2Int(ReadBytes(pospl, 1, fs))) << 28) >> 28); // Считываемый канал данных if (!IsNeedChannel(ch + 1, CChannel)) //проверка нужды канала { pospl = pospl + DataPLLeng + 4; break; } long apospl = pospl; // Запись положения Header ADC pospl += 4; //переход на новую строку if (pospl == apospl + DataPLLeng) { pospl += 4; break; } // Проверка на отсуствие данных в Data Block while (pospl != apospl + DataPLLeng + 4) // Цикл на чтение данных ADC (пока позиция в блоке Data Block не в конце блока ADC) { List <int> buf = new List <int>(); //Массив для sample adc uint DataLen = Byte2uInt(ReadBytes(pospl, 2, fs)); //Длина в блоке ADC в байтах bool odd = false; // переменная четности количества данных ( в строках 32 байта) uint timestamp = Byte2uInt(ReadBytes(pospl + 2, 2, fs)) * 8; //чтение метки времени pospl += 4; if (DataLen % 4 != 0) // проверка на нечетность { odd = true; } for (uint i = 0; i < ((DataLen / 4) * 4 == DataLen ? (DataLen / 4) : (DataLen / 4) + 1); i++) //цикл на чтение Sample ADC { buf.Add(TQDC2Configs.ChGain[ch] ? (Byte2Sample(ReadBytes(pospl + 2, 2, fs)) + (int)TQDC2Configs.X4[ch]) : (Byte2Sample(ReadBytes(pospl + 2, 2, fs)) + (int)TQDC2Configs.X1[ch])); // Запись первого Sample в лист if (odd & i == (DataLen / 4)) // если данные нечетные и последняя строка данных, то последнее 16 битный sample не читается { } else { buf.Add(TQDC2Configs.ChGain[ch] ? (Byte2Sample(ReadBytes(pospl, 2, fs)) + (int)TQDC2Configs.X4[ch]) : (Byte2Sample(ReadBytes(pospl + 2, 2, fs)) + (int)TQDC2Configs.X1[ch])); // Запись второго Sample в лист } pospl += 4; //переход на новую строку } adcbuffer.Newrecord(ch, new Adc_Interface(buf, timestamp)); // Чтение временной метки ADC в нС //pospl += 4; //переход на новую строку } break; } } } AddRecordCalc(buferfiledata, tdcbuffer, adcbuffer); // запись данных event в блок вычисленных данных WriteFileCalc(buferfiledata, writer, StartTimeStampnSec); //запись в файл prog += EvLeng + 12; //Повышение позиции для Progress Bar pos = pos + EvLeng + 12; // Запись новой позиции в файле ProgressBar.ReportProgress((int)NumEv, adcbuffer); // Возращение прогресса в BackgroundWorker ProgressBar ( повышение строки прогресса в окне) if (ProgressBar.CancellationPending == true) { fs.Close(); //Закрытие чтение CloseCsv(); //и записи return; } } } calculationresult = new BackGroundWorkerResult(CALCULATION, 100, OK); e.Result = calculationresult; //Возращение переменной для различия процесса fs.Close(); //Закрытие чтение CloseCsv(); //и записи }