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