1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use crate::{
Result,
blocks::read_string_block,
channel::Channel,
parsing::{RawChannelGroup, RawDataGroup, SourceInfo},
};
/// High level wrapper for a channel group.
///
/// The struct references raw channel group data and provides ergonomic access
/// to its metadata and channels without decoding any actual samples.
pub struct ChannelGroup<'a> {
raw_data_group: &'a RawDataGroup,
raw_channel_group: &'a RawChannelGroup,
mmap: &'a [u8],
}
impl<'a> ChannelGroup<'a> {
/// Create a new [`ChannelGroup`] referencing the underlying raw blocks.
///
/// # Arguments
/// * `raw_data_group` - Parent data group containing this channel group
/// * `raw_channel_group` - The raw channel group block
/// * `mmap` - Memory mapped file backing all data
///
/// # Returns
/// A [`ChannelGroup`] handle with no decoded data.
pub fn new(
raw_data_group: &'a RawDataGroup,
raw_channel_group: &'a RawChannelGroup,
mmap: &'a [u8],
) -> Self {
ChannelGroup {
raw_data_group,
raw_channel_group,
mmap,
}
}
/// Retrieve the human readable group name.
pub fn name(&self) -> Result<Option<String>> {
read_string_block(self.mmap, self.raw_channel_group.block.acq_name_addr)
}
/// Retrieve the group comment if present.
pub fn comment(&self) -> Result<Option<String>> {
read_string_block(self.mmap, self.raw_channel_group.block.comment_addr)
}
/// Get the acquisition source information if available.
pub fn source(&self) -> Result<Option<SourceInfo>> {
let addr = self.raw_channel_group.block.acq_source_addr;
SourceInfo::from_mmap(self.mmap, addr)
}
/// Build all [`Channel`] objects for this group.
///
/// No channel data is decoded; the returned channels simply reference the
/// raw blocks.
pub fn channels(&self) -> Vec<Channel<'a>> {
let mut channels = Vec::new();
for raw_channel in &self.raw_channel_group.raw_channels {
let channel = Channel::new(
&raw_channel.block,
self.raw_data_group,
self.raw_channel_group,
raw_channel,
self.mmap,
);
channels.push(channel);
}
channels
}
/// Get the raw data group (for internal use)
pub fn raw_data_group(&self) -> &RawDataGroup {
self.raw_data_group
}
/// Get the raw channel group (for internal use)
pub fn raw_channel_group(&self) -> &RawChannelGroup {
self.raw_channel_group
}
/// Get the memory mapped data (for internal use)
pub fn mmap(&self) -> &[u8] {
self.mmap
}
}