1 use android_hardware_uwb::aidl::android::hardware::uwb::{IUwb, IUwbChip};
2 use android_hardware_uwb::binder;
3 use binder::{Result, Strong};
4 use binder_tokio::TokioRuntime;
5 use tokio::runtime::Handle as TokioHandle;
6 
7 use crate::uwb_chip;
8 
9 pub struct Uwb {
10     chips: Vec<Strong<dyn IUwbChip::IUwbChip>>,
11 }
12 
13 impl Uwb {
from_chips( chips: impl IntoIterator<Item = uwb_chip::UwbChip>, handle: TokioHandle, ) -> Self14     pub fn from_chips(
15         chips: impl IntoIterator<Item = uwb_chip::UwbChip>,
16         handle: TokioHandle,
17     ) -> Self {
18         Self {
19             chips: chips
20                 .into_iter()
21                 .map(|chip| {
22                     IUwbChip::BnUwbChip::new_async_binder(
23                         chip,
24                         TokioRuntime(handle.clone()),
25                         binder::BinderFeatures::default(),
26                     )
27                 })
28                 .collect(),
29         }
30     }
31 }
32 
33 impl binder::Interface for Uwb {}
34 
35 impl IUwb::IUwb for Uwb {
getChips(&self) -> Result<Vec<String>>36     fn getChips(&self) -> Result<Vec<String>> {
37         log::debug!("getChips");
38         self.chips.iter().map(|chip| chip.getName()).collect()
39     }
40 
getChip(&self, name: &str) -> Result<Strong<dyn IUwbChip::IUwbChip>>41     fn getChip(&self, name: &str) -> Result<Strong<dyn IUwbChip::IUwbChip>> {
42         log::debug!("getChip {}", name);
43         let chip = self
44             .chips
45             .iter()
46             .find(|chip| chip.getName().as_deref() == Ok(name));
47         if let Some(chip) = chip {
48             Ok(chip.clone())
49         } else {
50             Err(binder::ExceptionCode::ILLEGAL_ARGUMENT.into())
51         }
52     }
53 }
54