1
0
Fork 0
mirror of https://codeberg.org/icewind/mitemp-rs.git synced 2026-06-03 17:24:08 +02:00

switch from channel api to iterator

this allows the api consumer to controll the threading
This commit is contained in:
Robin Appelman 2020-12-12 15:06:00 +01:00
commit 16cf74d09f
2 changed files with 28 additions and 31 deletions

View file

@ -7,9 +7,8 @@ fn main() -> Result<(), btleplug::Error> {
let addr = BDAddr::from_str("00:1A:7D:DA:71:08").unwrap(); let addr = BDAddr::from_str("00:1A:7D:DA:71:08").unwrap();
let adapter = adapter_by_mac(addr)?; let adapter = adapter_by_mac(addr)?;
let rx = listen(adapter)?; for sensor in listen(adapter)? {
loop { println!("{}: {:?}", sensor.mac, sensor.data);
let data = rx.recv().unwrap();
println!("{}: {:?}", data.mac, data.data);
} }
Ok(())
} }

View file

@ -5,8 +5,6 @@ use btleplug::bluez::manager::Manager;
use num_enum::TryFromPrimitive; use num_enum::TryFromPrimitive;
use std::collections::HashMap; use std::collections::HashMap;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::sync::mpsc::{channel, Receiver};
use std::thread::spawn;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Sensor { pub struct Sensor {
@ -37,9 +35,7 @@ impl SensorRawData {
pub fn listen<P: Peripheral, A: Central<P> + 'static>( pub fn listen<P: Peripheral, A: Central<P> + 'static>(
adapter: A, adapter: A,
) -> Result<Receiver<Sensor>, btleplug::Error> { ) -> Result<impl Iterator<Item = Sensor>, btleplug::Error> {
let (tx, rx) = channel();
let mut sensors: HashMap<BDAddr, SensorRawData> = HashMap::new(); let mut sensors: HashMap<BDAddr, SensorRawData> = HashMap::new();
let event_receiver = adapter.event_receiver().unwrap(); let event_receiver = adapter.event_receiver().unwrap();
@ -47,29 +43,31 @@ pub fn listen<P: Peripheral, A: Central<P> + 'static>(
// start scanning for devices // start scanning for devices
adapter.start_scan()?; adapter.start_scan()?;
spawn(move || { Ok(event_receiver
while let Ok(event) = event_receiver.recv() { .into_iter()
match event { .filter_map(|event| match event {
CentralEvent::DeviceDiscovered(bd_addr) | CentralEvent::DeviceUpdated(bd_addr) => { CentralEvent::DeviceDiscovered(bd_addr) | CentralEvent::DeviceUpdated(bd_addr) => {
Some(bd_addr)
}
_ => None,
})
.flat_map(move |bd_addr| {
let peripheral = adapter.peripheral(bd_addr).unwrap(); let peripheral = adapter.peripheral(bd_addr).unwrap();
for data in peripheral.properties().service_data.values() { peripheral
if let Ok(update) = parse_advertising_data(data.as_slice()) { .properties()
.service_data
.into_iter()
.map(move |(_, data)| (bd_addr, data))
})
.filter_map(|(bd_addr, data)| Some((bd_addr, parse_advertising_data(&data).ok()?)))
.map(move |(bd_addr, update)| {
let sensor_data = sensors.entry(bd_addr).or_default(); let sensor_data = sensors.entry(bd_addr).or_default();
sensor_data.update(update); sensor_data.update(update);
tx.send(Sensor { Sensor {
mac: bd_addr, mac: bd_addr,
data: (*sensor_data).into(), data: (*sensor_data).into(),
})
.unwrap();
} }
} }))
}
_ => {}
}
}
});
Ok(rx)
} }
#[derive(Default, Clone, Debug)] #[derive(Default, Clone, Debug)]