C# API Reference¶
Comprehensive API reference for the C# / .NET binding.
Writer API¶
MeasFile.CreateWriter¶
Create a new measurement file writer.
Parameters:
path- File path for the new measurement file
Returns: MeasFileWriter instance (implements IDisposable)
Example:
MeasFileWriter.AddGroup¶
Add a new group to organize channels.
Parameters:
name- Group name
Returns: MeasGroupWriter instance
Example:
MeasGroupWriter.AddChannel\<T>¶
Add a typed channel to the group.
Type Parameters:
T- Data type (float,double,int,long,bool, etc.)
Parameters:
name- Channel name
Returns: MeasChannelWriter<T> instance
Example:
var temp = group.AddChannel<float>("Temperature");
var pressure = group.AddChannel<double>("Pressure");
var count = group.AddChannel<int>("Count");
MeasChannelWriter.Write¶
Write data to the channel.
public void Write(T value)
public void Write(Span<T> values)
public void Write(ReadOnlySpan<T> values)
Parameters:
value- Single value to writevalues- Span of values for efficient batch writing (zero-copy)
Example:
// Single value
temp.Write(25.5f);
// Multiple values (efficient)
float[] batch = new float[10000];
temp.Write(batch.AsSpan());
MeasFileWriter.Flush¶
Flush current data to a new segment on disk.
Creates a new data segment and clears the in-memory buffer. Use this periodically during streaming writes to keep memory usage bounded.
Example:
while (recording)
{
float[] batch = ReadSensorData();
temp.Write(batch.AsSpan());
writer.Flush(); // Write segment, clear buffer
}
MeasFileWriter.Dispose¶
Finalize and close the file.
Automatically called when using using statement. Writes any remaining data and updates file header.
Reader API¶
MeasFile.OpenRead¶
Open an existing measurement file for reading.
Parameters:
path- Path to existing measurement file
Returns: MeasFileReader instance (implements IDisposable)
Example:
MeasFileReader Indexer¶
Access a group by name.
Parameters:
groupName- Group name
Returns: MeasGroupReader instance
Example:
MeasGroupReader Indexer¶
Access a channel by name.
Parameters:
channelName- Channel name
Returns: MeasChannelReader instance
Example:
MeasChannelReader.ReadAll\<T>¶
Read all samples as ReadOnlySpan<T>.
Type Parameters:
T- Data type matching the channel type
Returns: ReadOnlySpan<T> containing all samples
Example:
var temp = reader["Sensors"]["Temperature"];
var data = temp.ReadAll<float>();
foreach (float value in data)
{
Console.WriteLine(value);
}
MeasChannelReader.ReadChunks\<T>¶
Iterate through data chunks (streaming).
Type Parameters:
T- Data type matching the channel type
Returns: Enumerable of ReadOnlySpan<T> chunks
Example:
// Only one chunk in memory at a time
foreach (var chunk in channel.ReadChunks<float>())
{
Process(chunk);
}
MeasChannelReader.Statistics¶
Get pre-computed statistics (instant, no I/O).
Returns: MeasStatistics instance or null if no statistics available
Properties:
Count- Number of samplesMin- Minimum valueMax- Maximum valueMean- Average valueStdDev- Standard deviation
Example:
var stats = channel.Statistics;
if (stats != null)
{
Console.WriteLine($"Min: {stats.Min}, Max: {stats.Max}");
Console.WriteLine($"Mean: {stats.Mean}, StdDev: {stats.StdDev}");
}
MeasChannelReader.Properties¶
Access channel metadata.
Example:
Bus Data API¶
For automotive bus data (CAN, LIN, FlexRay, Ethernet).
MeasFileWriter.AddBusGroup¶
Add a bus channel.
Parameters:
name- Group nameconfig- Bus configuration (CAN, LIN, FlexRay, Ethernet)
Returns: MeasBusGroupWriter instance
Example:
var canConfig = new CanBusConfig { BusType = CanBusType.CanFd };
var busGroup = writer.AddBusGroup("CAN1", canConfig);
MeasBusGroupWriter.DefineCanFrame¶
Define a CAN frame with signals.
Parameters:
name- Frame nameid- CAN identifierlength- Payload length in bytes
Returns: CanFrameDefinition instance
Example:
var engineFrame = busGroup.DefineCanFrame("Engine", 0x123, 8);
engineFrame.Signals.Add(new SignalDefinition
{
Name = "RPM",
StartBit = 0,
BitLength = 16,
Factor = 0.25,
Offset = 0,
Unit = "rpm"
});
MeasBusGroupWriter.WriteFrame¶
Write raw frame bytes with timestamp.
Parameters:
timestamp- Nanosecond-precision timestampid- Frame identifierdata- Frame payload bytes
Example:
byte[] payload = new byte[] { 0x12, 0x34, 0x56, 0x78 };
busGroup.WriteFrame(MeasTimestamp.Now, 0x123, payload);
MeasBusGroupReader.DecodeSignal¶
Decode and extract signal values from frames.
Parameters:
signalName- Signal name
Returns: Decoded signal values (with factor/offset applied)
Example:
var rpm = busGroup.DecodeSignal("RPM");
Console.WriteLine($"Average RPM: {rpm.ToArray().Average()}");
Common Patterns¶
Streaming Write¶
Record continuous data with bounded memory:
using var writer = MeasFile.CreateWriter("recording.meas");
var sensors = writer.AddGroup("Sensors");
var temp = sensors.AddChannel<float>("Temperature");
while (recording)
{
float[] batch = ReadFromSensor(batchSize: 10_000);
temp.Write(batch.AsSpan());
writer.Flush(); // Write segment, clear buffer
}
Streaming Read¶
Process large files chunk by chunk:
using var reader = MeasFile.OpenRead("recording.meas");
var channel = reader["Sensors"]["Temperature"];
foreach (var chunk in channel.ReadChunks<float>())
{
// Only one chunk in memory at a time
ProcessChunk(chunk);
}
Instant Statistics¶
Get statistics without reading data:
using var reader = MeasFile.OpenRead("data.meas");
var channel = reader["Sensors"]["Temperature"];
var stats = channel.Statistics;
Console.WriteLine($"Range: {stats?.Min} - {stats?.Max}");
Console.WriteLine($"Mean: {stats?.Mean}");
// No data was read!