Loading uwb/aidl/default/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ rust_binary { prefer_rlib: true, rustlibs: [ "android.hardware.uwb-V1-rust", "liblibc", "liblogger", "liblog_rust", "libbinder_rs", Loading uwb/aidl/default/src/uwb_chip.rs +15 −16 Original line number Diff line number Diff line Loading @@ -6,7 +6,6 @@ use android_hardware_uwb::binder; use async_trait::async_trait; use binder::{DeathRecipient, IBinder, Result, Strong}; use log::info; use std::sync::Arc; use tokio::io::unix::AsyncFd; use tokio::select; Loading @@ -16,12 +15,13 @@ use tokio_util::sync::CancellationToken; use std::fs::{File, OpenOptions}; use std::io::{self, Read, Write}; use std::os::fd::AsRawFd; use std::os::unix::fs::OpenOptionsExt; enum State { Closed, Opened { callbacks: Strong<dyn IUwbClientCallback>, _handle: tokio::task::JoinHandle<()>, handle: tokio::task::JoinHandle<()>, serial: File, death_recipient: DeathRecipient, token: CancellationToken, Loading @@ -46,12 +46,12 @@ impl UwbChip { impl State { /// Terminate the reader task. #[allow(dead_code)] fn close(&mut self) -> Result<()> { if let State::Opened { ref mut token, ref callbacks, ref mut death_recipient, .. } = *self { async fn close(&mut self) -> Result<()> { if let State::Opened { ref mut token, ref callbacks, ref mut death_recipient, ref mut handle, .. } = *self { log::info!("waiting for task cancellation"); callbacks.as_binder().unlink_to_death(death_recipient)?; token.cancel(); handle.await.unwrap(); log::info!("task successfully cancelled"); callbacks.onHalEvent(UwbEvent::CLOSE_CPLT, UwbStatus::OK)?; *self = State::Closed; Loading @@ -69,11 +69,6 @@ pub fn makeraw(file: File) -> io::Result<File> { cfmakeraw(&mut attrs); tcsetattr(fd, SetArg::TCSANOW, &attrs)?; // Configure the file descriptor as non blocking. use nix::fcntl::*; let flags = OFlag::from_bits(fcntl(fd, FcntlArg::F_GETFL)?).unwrap(); fcntl(fd, FcntlArg::F_SETFL(flags | OFlag::O_NONBLOCK))?; Ok(file) } Loading Loading @@ -114,6 +109,7 @@ impl IUwbChipAsyncServer for UwbChip { .read(true) .write(true) .create(false) .custom_flags(libc::O_NONBLOCK) .open(&self.path) .and_then(makeraw) .map_err(|_| binder::StatusCode::UNKNOWN_ERROR)?; Loading @@ -122,7 +118,10 @@ impl IUwbChipAsyncServer for UwbChip { let mut death_recipient = DeathRecipient::new(move || { let mut state = state_death_recipient.blocking_lock(); log::info!("Uwb service has died"); state.close().unwrap(); if let State::Opened { ref mut token, .. } = *state { token.cancel(); *state = State::Closed; } }); callbacks.as_binder().link_to_death(&mut death_recipient)?; Loading @@ -137,7 +136,7 @@ impl IUwbChipAsyncServer for UwbChip { .map_err(|_| binder::StatusCode::UNKNOWN_ERROR)?; let join_handle = tokio::task::spawn(async move { info!("UCI reader task started"); log::info!("UCI reader task started"); let mut reader = AsyncFd::new(reader).unwrap(); loop { Loading @@ -159,7 +158,7 @@ impl IUwbChipAsyncServer for UwbChip { // the OS will only notify Tokio when the file descriptor // transitions from not-ready to ready. For this to work // you should first try to read or write and only poll for // readiness if that fails with an error of // readiness if that fails with an error of // std::io::ErrorKind::WouldBlock. match reader.get_mut().read(&mut buffer) { Ok(0) => { Loading @@ -173,7 +172,7 @@ impl IUwbChipAsyncServer for UwbChip { let mut guard = select! { _ = cloned_token.cancelled() => { info!("task is cancelled!"); log::info!("task is cancelled!"); return; }, result = reader.readable() => result.unwrap() Loading @@ -199,7 +198,7 @@ impl IUwbChipAsyncServer for UwbChip { *state = State::Opened { callbacks: callbacks.clone(), _handle: join_handle, handle: join_handle, serial, death_recipient, token, Loading @@ -214,7 +213,7 @@ impl IUwbChipAsyncServer for UwbChip { let mut state = self.state.lock().await; if matches!(*state, State::Opened { .. }) { state.close() state.close().await } else { Err(binder::ExceptionCode::ILLEGAL_STATE.into()) } Loading Loading
uwb/aidl/default/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ rust_binary { prefer_rlib: true, rustlibs: [ "android.hardware.uwb-V1-rust", "liblibc", "liblogger", "liblog_rust", "libbinder_rs", Loading
uwb/aidl/default/src/uwb_chip.rs +15 −16 Original line number Diff line number Diff line Loading @@ -6,7 +6,6 @@ use android_hardware_uwb::binder; use async_trait::async_trait; use binder::{DeathRecipient, IBinder, Result, Strong}; use log::info; use std::sync::Arc; use tokio::io::unix::AsyncFd; use tokio::select; Loading @@ -16,12 +15,13 @@ use tokio_util::sync::CancellationToken; use std::fs::{File, OpenOptions}; use std::io::{self, Read, Write}; use std::os::fd::AsRawFd; use std::os::unix::fs::OpenOptionsExt; enum State { Closed, Opened { callbacks: Strong<dyn IUwbClientCallback>, _handle: tokio::task::JoinHandle<()>, handle: tokio::task::JoinHandle<()>, serial: File, death_recipient: DeathRecipient, token: CancellationToken, Loading @@ -46,12 +46,12 @@ impl UwbChip { impl State { /// Terminate the reader task. #[allow(dead_code)] fn close(&mut self) -> Result<()> { if let State::Opened { ref mut token, ref callbacks, ref mut death_recipient, .. } = *self { async fn close(&mut self) -> Result<()> { if let State::Opened { ref mut token, ref callbacks, ref mut death_recipient, ref mut handle, .. } = *self { log::info!("waiting for task cancellation"); callbacks.as_binder().unlink_to_death(death_recipient)?; token.cancel(); handle.await.unwrap(); log::info!("task successfully cancelled"); callbacks.onHalEvent(UwbEvent::CLOSE_CPLT, UwbStatus::OK)?; *self = State::Closed; Loading @@ -69,11 +69,6 @@ pub fn makeraw(file: File) -> io::Result<File> { cfmakeraw(&mut attrs); tcsetattr(fd, SetArg::TCSANOW, &attrs)?; // Configure the file descriptor as non blocking. use nix::fcntl::*; let flags = OFlag::from_bits(fcntl(fd, FcntlArg::F_GETFL)?).unwrap(); fcntl(fd, FcntlArg::F_SETFL(flags | OFlag::O_NONBLOCK))?; Ok(file) } Loading Loading @@ -114,6 +109,7 @@ impl IUwbChipAsyncServer for UwbChip { .read(true) .write(true) .create(false) .custom_flags(libc::O_NONBLOCK) .open(&self.path) .and_then(makeraw) .map_err(|_| binder::StatusCode::UNKNOWN_ERROR)?; Loading @@ -122,7 +118,10 @@ impl IUwbChipAsyncServer for UwbChip { let mut death_recipient = DeathRecipient::new(move || { let mut state = state_death_recipient.blocking_lock(); log::info!("Uwb service has died"); state.close().unwrap(); if let State::Opened { ref mut token, .. } = *state { token.cancel(); *state = State::Closed; } }); callbacks.as_binder().link_to_death(&mut death_recipient)?; Loading @@ -137,7 +136,7 @@ impl IUwbChipAsyncServer for UwbChip { .map_err(|_| binder::StatusCode::UNKNOWN_ERROR)?; let join_handle = tokio::task::spawn(async move { info!("UCI reader task started"); log::info!("UCI reader task started"); let mut reader = AsyncFd::new(reader).unwrap(); loop { Loading @@ -159,7 +158,7 @@ impl IUwbChipAsyncServer for UwbChip { // the OS will only notify Tokio when the file descriptor // transitions from not-ready to ready. For this to work // you should first try to read or write and only poll for // readiness if that fails with an error of // readiness if that fails with an error of // std::io::ErrorKind::WouldBlock. match reader.get_mut().read(&mut buffer) { Ok(0) => { Loading @@ -173,7 +172,7 @@ impl IUwbChipAsyncServer for UwbChip { let mut guard = select! { _ = cloned_token.cancelled() => { info!("task is cancelled!"); log::info!("task is cancelled!"); return; }, result = reader.readable() => result.unwrap() Loading @@ -199,7 +198,7 @@ impl IUwbChipAsyncServer for UwbChip { *state = State::Opened { callbacks: callbacks.clone(), _handle: join_handle, handle: join_handle, serial, death_recipient, token, Loading @@ -214,7 +213,7 @@ impl IUwbChipAsyncServer for UwbChip { let mut state = self.state.lock().await; if matches!(*state, State::Opened { .. }) { state.close() state.close().await } else { Err(binder::ExceptionCode::ILLEGAL_STATE.into()) } Loading