acc_gyro_errors/
acc_gyro_errors.rs

1use embedded_error_chain::prelude::*;
2
3#[derive(Clone, Copy, ErrorCategory)]
4#[repr(u8)]
5enum SpiError {
6    BusError,
7    // ...
8}
9
10static LAST_GYRO_ACC_READOUT: usize = 200;
11
12#[derive(Clone, Copy, ErrorCategory)]
13#[error_category(links(SpiError))]
14#[repr(u8)]
15enum GyroAccError {
16    InitFailed,
17
18    #[error("{variant} (readout={})", LAST_GYRO_ACC_READOUT)]
19    ReadoutFailed,
20
21    /// Value must be in range [0, 256)
22    #[error("{variant}: {summary}")]
23    InvalidValue,
24}
25
26fn main() {
27    if let Err(err) = calibrate() {
28        // log the error
29        println!("{:?}", err);
30        // ...
31    }
32
33    if let Err(err) = gyro_acc_readout_check() {
34        // log the error
35        println!("{:?}", err);
36        // ...
37    }
38
39    let _readout = match gyro_acc_readout() {
40        Ok(val) => val,
41        Err(err) => {
42            println!("{:?}", err);
43            if let Some(_spi_error) = err.code_of_category::<SpiError>() {
44                // try to fix it
45                0
46            } else {
47                panic!("unfixable spi error");
48            }
49        }
50    };
51}
52
53fn spi_init() -> Result<(), SpiError> {
54    Err(SpiError::BusError)
55}
56
57fn gyro_acc_init() -> Result<(), Error<GyroAccError>> {
58    spi_init().chain_err(GyroAccError::InitFailed)?;
59    Ok(())
60}
61
62fn gyro_acc_readout() -> Result<u32, Error<GyroAccError>> {
63    Err(SpiError::BusError.chain(GyroAccError::ReadoutFailed))
64}
65
66fn gyro_acc_readout_check() -> Result<u32, Error<GyroAccError>> {
67    Err(SpiError::BusError.chain(GyroAccError::InvalidValue))
68}
69
70fn calibrate() -> Result<(), DynError> {
71    gyro_acc_init()?;
72    Ok(())
73}