protected override void OnWrite(ChannelContextGroup contextGroup, ulong fileOffset, ulong bufferOffset, ulong length) { var projectDescription = this.DataWriterContext.ProjectDescription; var dataFilePath = Path.Combine(this.DataWriterContext.DataDirectoryPath, $"{projectDescription.PrimaryGroupName}_{projectDescription.SecondaryGroupName}_{projectDescription.ProjectName}_V{projectDescription.Version }_{_lastFileStartDateTime.ToString("yyyy-MM-ddTHH-mm-ss")}Z_{contextGroup.SampleRate.SamplesPerDay}_samples_per_day.csv"); if (length <= 0) { throw new Exception(ErrorMessage.CsvWriter_SampleRateTooLow); } var simpleBuffers = contextGroup.ChannelContextSet.Select(channelContext => channelContext.Buffer.ToSimpleBuffer()).ToList(); using (StreamWriter streamWriter = new StreamWriter(File.Open(dataFilePath, FileMode.Append, FileAccess.Write))) { for (ulong rowIndex = 0; rowIndex < length; rowIndex++) { switch (_settings.RowIndexFormat) { case CsvRowIndexFormat.Index: streamWriter.Write($"{string.Format(_nfi, "{0:N0}", fileOffset + rowIndex)};"); break; case CsvRowIndexFormat.Unix: streamWriter.Write($"{string.Format(_nfi, "{0:N5}", _unixStart + (double)((fileOffset + rowIndex) / contextGroup.SampleRate.SamplesPerSecond))};"); break; default: throw new NotSupportedException($"The row index format '{_settings.RowIndexFormat}' is not supported."); } for (int i = 0; i < simpleBuffers.Count; i++) { var value = simpleBuffers[i].Buffer[(int)(bufferOffset + rowIndex)]; streamWriter.Write($"{string.Format(_nfi, $"{{0:G{_settings.SignificantFigures}}}", value)};"); } streamWriter.WriteLine(); } } }
protected override void OnWrite(ChannelContextGroup contextGroup, ulong fileOffset, ulong bufferOffset, ulong length) { long groupId = -1; try { var firstChunk = (long)this.ToChunkIndex(fileOffset, contextGroup.SampleRate); var lastChunk = (long)this.ToChunkIndex(fileOffset + length, contextGroup.SampleRate) - 1; groupId = H5G.open(_fileId, $"/info"); _lastCompletedChunk = IOHelper.ReadDataset <double>(groupId, "last_completed_chunk").FirstOrDefault(); // this does not work in conjunction with multiple context groups if (firstChunk <= _lastCompletedChunk) { // throw new Exception(ErrorMessage.Mat73Writer_ChunkAlreadyWritten); } // write data for (int i = 0; i < contextGroup.ChannelContextSet.Count(); i++) { this.WriteData(fileOffset, bufferOffset, length, contextGroup.ChannelContextSet[i]); } // write last_completed_chunk IOHelper.WriteDataset(groupId, "last_completed_chunk", new double[] { lastChunk }); } finally { if (H5I.is_valid(groupId) > 0) { H5G.close(groupId); } H5F.flush(_fileId, H5F.scope_t.GLOBAL); } }
protected override void OnWrite(ChannelContextGroup contextGroup, ulong fileOffset, ulong bufferOffset, ulong length) { if (length <= 0) { throw new Exception(ErrorMessage.FamosWriter_SampleRateTooLow); } var simpleBuffers = contextGroup.ChannelContextSet.Select(channelContext => channelContext.Buffer.ToSimpleBuffer()).ToList(); var fieldIndex = _spdToFieldIndexMap[contextGroup.SampleRate.SamplesPerDay]; var field = _famosFile.Fields[fieldIndex]; _famosFile.Edit(writer => { for (int i = 0; i < simpleBuffers.Count; i++) { var component = field.Components[i]; var data = simpleBuffers[i].Buffer.Slice((int)bufferOffset, (int)length); _famosFile.WriteSingle(writer, component, (int)fileOffset, data); } }); }