Skip to main content

i2c_linux/
enumerate.rs

1use std::fs::File;
2use std::io;
3use {udev, I2c};
4
5/// Enumerates all available i2c devices on the system.
6///
7/// # udev dependency
8///
9/// Requires the `udev` feature enabled to use.
10pub struct Enumerator {
11    inner: udev::Devices,
12}
13
14impl Enumerator {
15    /// Create a new enumerator for available displays.
16    pub fn new() -> io::Result<Self> {
17        let udev = udev::Context::new()?;
18        let mut en = udev::Enumerator::new(&udev)?;
19        en.match_subsystem("i2c-dev")?;
20
21        Ok(Enumerator {
22            inner: en.scan_devices()?,
23        })
24    }
25}
26
27impl Iterator for Enumerator {
28    type Item = (I2c<File>, udev::Device);
29
30    fn next(&mut self) -> Option<Self::Item> {
31        while let Some(dev) = self.inner.next() {
32            let i2c = match dev.devnode() {
33                Some(devnode) => I2c::from_path(devnode),
34                None => continue,
35            };
36
37            if let Ok(i2c) = i2c {
38                return Some((i2c, dev))
39            }
40        }
41
42        None
43    }
44}