mdf4_rs/
channel_group.rs

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