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:
parent
2d673c48fa
commit
16cf74d09f
2 changed files with 28 additions and 31 deletions
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
52
src/lib.rs
52
src/lib.rs
|
|
@ -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) => {
|
||||||
let peripheral = adapter.peripheral(bd_addr).unwrap();
|
Some(bd_addr)
|
||||||
for data in peripheral.properties().service_data.values() {
|
|
||||||
if let Ok(update) = parse_advertising_data(data.as_slice()) {
|
|
||||||
let sensor_data = sensors.entry(bd_addr).or_default();
|
|
||||||
sensor_data.update(update);
|
|
||||||
tx.send(Sensor {
|
|
||||||
mac: bd_addr,
|
|
||||||
data: (*sensor_data).into(),
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
}
|
_ => None,
|
||||||
});
|
})
|
||||||
|
.flat_map(move |bd_addr| {
|
||||||
Ok(rx)
|
let peripheral = adapter.peripheral(bd_addr).unwrap();
|
||||||
|
peripheral
|
||||||
|
.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();
|
||||||
|
sensor_data.update(update);
|
||||||
|
Sensor {
|
||||||
|
mac: bd_addr,
|
||||||
|
data: (*sensor_data).into(),
|
||||||
|
}
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Clone, Debug)]
|
#[derive(Default, Clone, Debug)]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue