public bool WriteModifiedTALBlocks() { if (OpenReadOnly) { throw new ArgumentException(EdfConstants.FileIsReadOnly); } if (!Active) { return(false); } int i = 0; bool writeOk = true; if (AnnotationSignalNrs.Count > 0) { while (writeOk && (i < _tal.BlockCount)) { EdfPlusAnnotationDataBlock talBlock; if (TAL.BlockInMemory(i)) { talBlock = TAL.Block(i); if (talBlock.Modified) { WriteTALs(this, talBlock.DataRecNr, ref writeOk); } } i++; } } return(writeOk); }
protected void TALPrereader(object data) { TALPrereadError.Clear(); int currentBlockIndex = 0; bool finished = false; try { while (!finished && !TALPrereadError.Signaled) { // Get all TAL blocks one-by-one; this will read data from file if not available TAL.LastError = TalError.None; TAL.Block(currentBlockIndex); // read the data, ignore the result currentBlockIndex++; finished = (currentBlockIndex >= FileInfo.NrDataRecords); if ((TAL.LastError & TalError.BlockOrder) == TalError.BlockOrder) { TALPrereadError.Add(EdfConstants.DataRecordsNotOrdered, EdfConstants.ErrorIdEdfPlusBlockOrder); } } } catch (ThreadAbortException) { // Thread was stopped } catch (Exception ex) { TALPrereadError.Add(ex.Message, ErrorMessage.EIdException); } DoHandlePrereadTALsFinished(this); }
protected void WriteTALs(object sender, int blockNr, ref bool writeOk) { if ((blockNr >= 0) && (blockNr <= FileInfo.NrDataRecords)) { try { writeOk = true; if (blockNr < FileInfo.NrDataRecords) { DoReadDataBlock(blockNr, ref _talDataBuffer); } else { _talDataBuffer = CreateDataBuffer(); } for (int i = 0; i < AnnotationSignalNrs.Count; i++) { writeOk = TAL.WriteToBuffer( blockNr, ref _talDataBuffer, SignalInfo[AnnotationSignalNrs[i]].BufferOffset, SignalInfo[AnnotationSignalNrs[i]].NrSamples * sizeof(short), i); } if (writeOk) { DoWriteDataBlock(blockNr, _talDataBuffer); TAL.Block(blockNr).Modified = false; } } catch { writeOk = false; } } else { writeOk = false; } }
protected override void DoOpenFile() { _tal.Clear(); base.DoOpenFile(); // Extended DataRecordDuration valid check // DataRecDuration can be '0' if either: // 1) Each ordinary signal only 1 sample/block and file is discontinuous // 2) Only time stamped event signals if (ValidFormat && (FileInfo.SampleRecDuration == 0)) { int count = 0; int i = 0; while (ValidFormat && (i < FileInfo.NrSignals)) { if (!((EdfPlusSignalInfo)SignalInfo[i]).IsAnnotationSignal) { count++; if (SignalInfo[i].NrSamples > 1) { ValidFormat = false; } } i++; } if (ValidFormat && (count > 0) && FileInfo.SignalDataIsContinuous) { ValidFormat = false; } if (!ValidFormat) { FileInfo.FieldValid[(int)EdfFileInfoBase.Field.SampleRecDuration] = false; } } if (ValidFormat) { TAL.Clear(); TAL.BlockDuration = FileInfo.SampleRecDuration; TAL.SetBlocksListCapacity(FileInfo.NrDataRecords); GetAnnotationsSignalNrs(); bool readOk = true; // Always preread first and last block (for getting file time) ReadTALs(this, 0, ref readOk); if (readOk && (FileInfo.NrDataRecords > 1)) { ReadTALs(this, FileInfo.NrDataRecords - 1, ref readOk); } if (readOk) { if ((TAL.Block(0).DataRecOnset < 0) || (TAL.Block(0).DataRecOnset >= 1)) { HeaderError |= EdfHeaderErrorType.EdfPlusAnnotationFirstOffsetError; } try { FileInfo.FirstDataBlockOnset = TAL.Block(0).DataRecOnset; } catch { } // Use the fileheader startdate/time, not the startdate/time of the first datablock! TAL.FileStartDateTime = FileInfo.StartDateTime.HasValue ? new HPDateTime(FileInfo.StartDateTime.Value) : new HPDateTime(); switch (PrereadTALs) { case PrereadTALs.None: break; case PrereadTALs.OnOpenFile: TALPrereader(null); DoHandlePrereadTALsFinished(this); break; case PrereadTALs.UseThread: StartTALsPrereadThread(); break; default: break; } } else { ValidFormat = false; HeaderError |= EdfHeaderErrorType.EdfPlusAnnotationSignalError; } } }