Skip to main content

bh1750_embedded/
error.rs

1//! Error types for the BH1750 driver.
2//!
3//! This module defines the [`Error`] type that can occur when interacting
4//! with the BH1750 sensor. The error type is generic over the underlying
5//! I2C error type, allowing it to work with any `embedded-hal` I2C
6//! implementation.
7//!
8//! # Example: Error Handling
9//!
10//! ```
11//! use bh1750_embedded::{Address, Bh1750, Error, MeasurementTime, Resolution};
12//!
13//! # fn example<I2C, D, E>(i2c: I2C, delay: D) -> Result<(), Error<E>>
14//! # where
15//! #     I2C: embedded_hal::i2c::I2c<Error = E>,
16//! #     D: embedded_hal::delay::DelayNs,
17//! #     E: embedded_hal::i2c::Error,
18//! # {
19//! let mut sensor = Bh1750::new(i2c, delay, Address::Low);
20//!
21//! match sensor.one_time_measurement(Resolution::High) {
22//!     Ok(lux) => {
23//!         // Use the lux value
24//!         # let _ = lux;
25//!     }
26//!     Err(Error::I2c(_e)) => {
27//!         // Handle I2C communication error
28//!     }
29//!     Err(Error::MeasurementTimeOutOfRange) => {
30//!         // Handle invalid measurement time
31//!     }
32//! }
33//! # Ok(())
34//! # }
35//! ```
36//!
37//! # Example: Validating Measurement Time
38//!
39//! ```
40//! use bh1750_embedded::{Error, MeasurementTime};
41//!
42//! // This will succeed (value in range 31..=254)
43//! let valid_mt = MeasurementTime::new(100);
44//! assert!(valid_mt.is_some());
45//!
46//! // This will fail (value out of range)
47//! let invalid_mt = MeasurementTime::new(10);
48//! assert!(invalid_mt.is_none());
49//! ```
50
51use embedded_hal::i2c as ehal;
52
53/// Driver error.
54#[derive(Debug, Clone, Copy, PartialEq, Eq)]
55pub enum Error<E> {
56    /// Underlying I2C bus error.
57    I2c(E),
58    /// Measurement time register was outside the allowed range.
59    MeasurementTimeOutOfRange,
60}
61
62impl<E> From<E> for Error<E> {
63    fn from(e: E) -> Self {
64        Self::I2c(e)
65    }
66}
67
68impl<E> ehal::Error for Error<E>
69where
70    E: ehal::Error,
71{
72    fn kind(&self) -> ehal::ErrorKind {
73        match self {
74            Self::I2c(e) => e.kind(),
75            Self::MeasurementTimeOutOfRange => ehal::ErrorKind::Other,
76        }
77    }
78}