esp32_nimble/client/
ble_remote_descriptor.rs

1use alloc::vec::Vec;
2
3use super::ble_remote_characteristic::BLERemoteCharacteristicState;
4use super::{BLEReader, BLEWriter};
5use crate::{
6    BLEError,
7    utilities::{BleUuid, WeakUnsafeCell},
8};
9use esp_idf_svc::sys as esp_idf_sys;
10
11#[derive(Clone)]
12pub struct BLERemoteDescriptor {
13    characteristic: WeakUnsafeCell<BLERemoteCharacteristicState>,
14    uuid: BleUuid,
15    handle: u16,
16}
17
18impl BLERemoteDescriptor {
19    pub(crate) fn new(
20        characteristic: WeakUnsafeCell<BLERemoteCharacteristicState>,
21        dsc: &esp_idf_sys::ble_gatt_dsc,
22    ) -> Self {
23        Self {
24            characteristic,
25            uuid: BleUuid::from(dsc.uuid),
26            handle: dsc.handle,
27        }
28    }
29
30    pub fn uuid(&self) -> BleUuid {
31        self.uuid
32    }
33
34    fn conn_handle(&self) -> u16 {
35        match self.characteristic.upgrade() {
36            Some(x) => x.conn_handle(),
37            None => esp_idf_sys::BLE_HS_CONN_HANDLE_NONE as _,
38        }
39    }
40
41    pub async fn read_value(&mut self) -> Result<Vec<u8>, BLEError> {
42        let mut reader = BLEReader::new(self.conn_handle(), self.handle);
43        reader.read_value().await
44    }
45
46    pub async fn write_value(&mut self, data: &[u8], response: bool) -> Result<(), BLEError> {
47        let mut writer = BLEWriter::new(self.conn_handle(), self.handle);
48        writer.write_value(data, response).await
49    }
50}