acc_gyro_errors/
acc_gyro_errors.rs1use embedded_error_chain::prelude::*;
2
3#[derive(Clone, Copy, ErrorCategory)]
4#[repr(u8)]
5enum SpiError {
6 BusError,
7 }
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 #[error("{variant}: {summary}")]
23 InvalidValue,
24}
25
26fn main() {
27 if let Err(err) = calibrate() {
28 println!("{:?}", err);
30 }
32
33 if let Err(err) = gyro_acc_readout_check() {
34 println!("{:?}", err);
36 }
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 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}