1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
use crate::bearer::{BearerError, IncomingEncryptedNetworkPDU, OutgoingEncryptedNetworkPDU}; use crate::btle::advertisement::{AdStructure, RawAdvertisement}; use crate::btle::advertiser::{Advertiser, Scanner, ScannerSink}; use crate::interface::{InputInterface, InterfaceSink, OutputInterface}; use crate::net; impl From<net::EncryptedPDU<'_>> for btle::advertisement::AdStructure { fn from(pdu: net::EncryptedPDU<'_>) -> Self { AdStructure::MeshPDU(btle::advertisement::AdStructureDataBuffer::new(pdu.data())) } } pub struct ScannerInterface<InterSink: InterfaceSink, Scan: Scanner<ScannerInputSink<InterSink>>> { scanner: Scan, _marker: core::marker::PhantomData<InterSink>, } pub struct ScannerInputSink<InterSink: InterfaceSink>(InterSink); impl<InterSink: InterfaceSink + Clone> Clone for ScannerInputSink<InterSink> { fn clone(&self) -> Self { Self(self.0.clone()) } } impl<InterSink: InterfaceSink> ScannerSink for ScannerInputSink<InterSink> { fn consume_advertisement(&mut self, advertisement: &RawAdvertisement) { match advertisement.iter().next() { Some(AdStructure::MeshPDU(buf)) => { if let Some(pdu) = net::OwnedEncryptedPDU::new(buf.as_ref()) { let incoming = IncomingEncryptedNetworkPDU { encrypted_pdu: pdu, rssi: advertisement.rssi(), dont_relay: false, }; self.0.consume_pdu(&incoming); } } _ => (), } } } impl<A: Advertiser> OutputInterface for A { fn send_pdu(&mut self, pdu: &OutgoingEncryptedNetworkPDU) -> Result<(), BearerError> { for _ in 0..u8::from(pdu.transmit_parameters.count) { self.advertise(&(&AdStructure::from(pdu.pdu.as_ref())).into()) .map_err(|_| BearerError::AdvertiseError)?; } Ok(()) } } impl<InterSink: InterfaceSink, Scan: Scanner<ScannerInputSink<InterSink>>> InputInterface<InterSink> for ScannerInterface<InterSink, Scan> { fn take_sink(&mut self, sink: InterSink) { self.scanner.take_sink(ScannerInputSink(sink)) } }