esp32_nimble/client/
ble_remote_descriptor.rs1use 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}