embedded_nrf24l01_async/
device.rs1use crate::command::Command;
2use crate::registers::{Config, Register, Status};
3
4pub trait Device {
7 type Error;
9
10 fn ce_enable(&mut self);
12 fn ce_disable(&mut self);
14 fn with_ce_disabled<F, R>(&mut self, f: F) -> R
17 where
18 F: FnOnce(&mut Self) -> R,
19 {
20 self.ce_disable();
21 let r = f(self);
22 self.ce_enable();
23 r
24 }
25
26 async fn send_command<C: Command>(&mut self, command: &C) -> Result<(Status, C::Response), Self::Error>;
28 async fn write_register<R: Register>(&mut self, register: R) -> Result<Status, Self::Error>;
30 async fn read_register<R: Register>(&mut self) -> Result<(Status, R), Self::Error>;
32
33 async fn update_register<Reg, F, R>(&mut self, f: F) -> Result<R, Self::Error>
35 where
36 Reg: Register + PartialEq + Clone,
37 F: FnOnce(&mut Reg) -> R,
38 {
39 assert_ne!(Reg::addr(), 0x00);
41
42 let (_, old_register) = self.read_register::<Reg>().await?;
43 let mut register = old_register.clone();
44 let result = f(&mut register);
45
46 if register != old_register {
47 self.write_register(register).await?;
48 }
49 Ok(result)
50 }
51
52 async fn update_config<F, R>(&mut self, f: F) -> Result<R, Self::Error>
54 where
55 F: FnOnce(&mut Config) -> R;
56}