| #![no_std] |
| |
| use libtock::ble_parser; |
| use libtock::result::TockResult; |
| use libtock::simple_ble; |
| use serde::Deserialize; |
| |
| #[derive(Deserialize)] |
| struct LedCommand { |
| pub nr: u8, |
| pub st: bool, |
| } |
| |
| #[libtock::main] |
| async fn main() -> TockResult<()> { |
| let mut drivers = libtock::retrieve_drivers()?; |
| let leds_driver = drivers.leds.init_driver()?; |
| |
| let mut ble_scanning_driver_factory = drivers.ble_scanning; |
| let mut ble_scanning_driver = ble_scanning_driver_factory.create_driver(); |
| let mut ble_scanning_driver_sharing = ble_scanning_driver.share_memory()?; |
| let ble_scanning_driver_scanning = ble_scanning_driver_sharing.start()?; |
| |
| loop { |
| let value = ble_scanning_driver_scanning.stream_values().await; |
| ble_parser::find(&value, simple_ble::gap_data::SERVICE_DATA as u8) |
| .and_then(|service_data| ble_parser::extract_for_service([91, 79], service_data)) |
| .and_then(|payload| corepack::from_bytes::<LedCommand>(&payload).ok()) |
| .and_then(|msg| leds_driver.get(msg.nr as usize).ok()) |
| .and_then(|led| led.on().ok()); |
| } |
| } |