summaryrefslogtreecommitdiff
path: root/examples/src/bin/ble_l2cap_central.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/src/bin/ble_l2cap_central.rs')
-rw-r--r--examples/src/bin/ble_l2cap_central.rs130
1 files changed, 59 insertions, 71 deletions
diff --git a/examples/src/bin/ble_l2cap_central.rs b/examples/src/bin/ble_l2cap_central.rs
index 9b2cb5a..6f1a05d 100644
--- a/examples/src/bin/ble_l2cap_central.rs
+++ b/examples/src/bin/ble_l2cap_central.rs
@@ -8,78 +8,17 @@ mod example_common;
use core::ptr::NonNull;
use core::{mem, slice};
-use cortex_m_rt::entry;
use defmt::{info, *};
-use embassy_executor::executor::Executor;
-use embassy_util::Forever;
+use embassy_executor::Spawner;
use nrf_softdevice::ble::l2cap::Packet as _;
use nrf_softdevice::ble::{central, l2cap, Address, TxPower};
use nrf_softdevice::{raw, Softdevice};
-static EXECUTOR: Forever<Executor> = Forever::new();
-
const PSM: u16 = 0x2349;
#[embassy_executor::task]
-async fn softdevice_task(sd: &'static Softdevice) {
- sd.run().await;
-}
-
-#[embassy_executor::task]
-async fn ble_central_task(sd: &'static Softdevice) {
- info!("Scanning for peer...");
-
- let config = central::ScanConfig {
- whitelist: None,
- tx_power: TxPower::ZerodBm,
- ..Default::default()
- };
- let res = central::scan(sd, &config, |params| unsafe {
- let mut data = slice::from_raw_parts(params.data.p_data, params.data.len as usize);
- while data.len() != 0 {
- let len = data[0] as usize;
- if data.len() < len + 1 {
- break;
- }
- if len < 1 {
- break;
- }
- let key = data[1];
- let value = &data[2..len + 1];
-
- if key == 0x06
- && value
- == &[
- 0xeb, 0x04, 0x8b, 0xfd, 0x5b, 0x03, 0x21, 0xb5, 0xeb, 0x11, 0x65, 0x2f, 0x18, 0xce, 0x9c, 0x82,
- ]
- {
- return Some(Address::from_raw(params.peer_addr));
- }
- data = &data[len + 1..];
- }
- None
- })
- .await;
- let address = unwrap!(res);
- info!("Scan found address {:?}", address);
-
- let addrs = &[&address];
-
- let mut config = central::ConnectConfig::default();
- config.scan_config.whitelist = Some(addrs);
- let conn = unwrap!(central::connect(sd, &config).await);
- info!("connected");
-
- let l = l2cap::L2cap::<Packet>::init(sd);
- let config = l2cap::Config { credits: 8 };
- let ch = unwrap!(l.setup(&conn, &config, PSM).await);
- info!("l2cap connected");
-
- for i in 0..10 {
- unwrap!(ch.tx(Packet::new(&[i; Packet::MTU])).await);
- info!("l2cap tx done");
- }
- futures::future::pending::<()>().await;
+async fn softdevice_task(sd: &'static Softdevice) -> ! {
+ sd.run().await
}
use atomic_pool::{pool, Box};
@@ -133,8 +72,8 @@ impl l2cap::Packet for Packet {
}
}
-#[entry]
-fn main() -> ! {
+#[embassy_executor::main]
+async fn main(spawner: Spawner) {
info!("Hello World!");
let config = nrf_softdevice::Config {
@@ -179,10 +118,59 @@ fn main() -> ! {
};
let sd = Softdevice::enable(&config);
+ unwrap!(spawner.spawn(softdevice_task(sd)));
+
+ info!("Scanning for peer...");
+
+ let config = central::ScanConfig {
+ whitelist: None,
+ tx_power: TxPower::ZerodBm,
+ ..Default::default()
+ };
+ let res = central::scan(sd, &config, |params| unsafe {
+ let mut data = slice::from_raw_parts(params.data.p_data, params.data.len as usize);
+ while data.len() != 0 {
+ let len = data[0] as usize;
+ if data.len() < len + 1 {
+ break;
+ }
+ if len < 1 {
+ break;
+ }
+ let key = data[1];
+ let value = &data[2..len + 1];
- let executor = EXECUTOR.put(Executor::new());
- executor.run(move |spawner| {
- unwrap!(spawner.spawn(softdevice_task(sd)));
- unwrap!(spawner.spawn(ble_central_task(sd)));
- });
+ if key == 0x06
+ && value
+ == &[
+ 0xeb, 0x04, 0x8b, 0xfd, 0x5b, 0x03, 0x21, 0xb5, 0xeb, 0x11, 0x65, 0x2f, 0x18, 0xce, 0x9c, 0x82,
+ ]
+ {
+ return Some(Address::from_raw(params.peer_addr));
+ }
+ data = &data[len + 1..];
+ }
+ None
+ })
+ .await;
+ let address = unwrap!(res);
+ info!("Scan found address {:?}", address);
+
+ let addrs = &[&address];
+
+ let mut config = central::ConnectConfig::default();
+ config.scan_config.whitelist = Some(addrs);
+ let conn = unwrap!(central::connect(sd, &config).await);
+ info!("connected");
+
+ let l = l2cap::L2cap::<Packet>::init(sd);
+ let config = l2cap::Config { credits: 8 };
+ let ch = unwrap!(l.setup(&conn, &config, PSM).await);
+ info!("l2cap connected");
+
+ for i in 0..10 {
+ unwrap!(ch.tx(Packet::new(&[i; Packet::MTU])).await);
+ info!("l2cap tx done");
+ }
+ futures::future::pending::<()>().await;
}