Skip to content

Commit cf6f011

Browse files
committed
wip: bluetooth connection to the own displays
1 parent fb6e650 commit cf6f011

File tree

4 files changed

+99
-1
lines changed

4 files changed

+99
-1
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ rand_core = { version = "0.6.4", features = ["getrandom"] }
4646
ag-lcd-async = { git = "https://github.com/filipton/ag-lcd-async", features = [] }
4747
esp-hal-mfrc522 = { version = "0.3.2", features = ["embassy-time"] }
4848
esp-bootloader-esp-idf = { version = "0.2.0", features = ["log-04", "esp32c3"] }
49+
trouble-host = { version = "0.2.4", features = ["scan"] }
4950

5051
[features]
5152
default = ["sleep"]

src/bluetooth.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
use core::cell::RefCell;
2+
use embassy_futures::join::join;
3+
use embassy_time::{Duration, Timer};
4+
use esp_wifi::{EspWifiController, ble::controller::BleConnector};
5+
use trouble_host::prelude::*;
6+
7+
#[embassy_executor::task]
8+
pub async fn bluetooth_timer_task(
9+
init: &'static EspWifiController<'static>,
10+
bt: esp_hal::peripherals::BT<'static>,
11+
) {
12+
let connector = BleConnector::new(init, bt);
13+
let controller: ExternalController<_, 20> = ExternalController::new(connector);
14+
15+
let address: Address = Address::random(esp_hal::efuse::Efuse::mac_address());
16+
log::info!("[ble] address = {address:x?}");
17+
18+
let mut resources: HostResources<DefaultPacketPool, 1, 3> = HostResources::new();
19+
let stack = trouble_host::new(controller, &mut resources).set_random_address(address);
20+
let Host {
21+
central,
22+
mut runner,
23+
..
24+
} = stack.build();
25+
26+
let printer = Printer {
27+
seen: RefCell::new(heapless::Deque::new()),
28+
};
29+
let mut scanner = Scanner::new(central);
30+
let _ = join(runner.run_with_handler(&printer), async {
31+
let config = ScanConfig::default();
32+
let mut _session = scanner.scan(&config).await.unwrap();
33+
// Scan forever
34+
loop {
35+
Timer::after(Duration::from_secs(1)).await;
36+
}
37+
})
38+
.await;
39+
40+
// let central = scanner.into_inner();
41+
}
42+
43+
#[allow(dead_code)]
44+
struct Printer {
45+
seen: RefCell<heapless::Deque<BdAddr, 128>>,
46+
}
47+
48+
impl EventHandler for Printer {
49+
fn on_adv_reports(&self, mut it: LeAdvReportsIter<'_>) {
50+
let mut seen = self.seen.borrow_mut();
51+
while let Some(Ok(report)) = it.next() {
52+
if !seen.iter().any(|b| b.raw() == report.addr.raw()) {
53+
log::info!(
54+
"[ble] discovered: {:?} with name: {:?}",
55+
report.addr,
56+
parse_device_name(report.data)
57+
);
58+
if seen.is_full() {
59+
seen.pop_front();
60+
}
61+
seen.push_back(report.addr).unwrap();
62+
}
63+
}
64+
}
65+
}
66+
67+
#[allow(dead_code)]
68+
fn parse_device_name(data: &[u8]) -> Option<&str> {
69+
let mut i = 0;
70+
while i < data.len() {
71+
let len = data[i] as usize;
72+
if len == 0 || i + len >= data.len() {
73+
break;
74+
}
75+
76+
let ad_type = data[i + 1];
77+
let ad_data = &data[i + 2..i + 1 + len];
78+
79+
// 0x09 = Complete Local Name, 0x08 = Shortened Local Name
80+
if ad_type == 0x09 || ad_type == 0x08 {
81+
return core::str::from_utf8(ad_data).ok();
82+
}
83+
84+
i += 1 + len;
85+
}
86+
None
87+
}

src/main.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use ws_framer::{WsUrl, WsUrlOwned};
2323
use esp_wifi::esp_now::{EspNowManager, EspNowSender};
2424

2525
mod battery;
26+
mod bluetooth;
2627
mod board;
2728
mod buttons;
2829
mod consts;
@@ -227,7 +228,7 @@ async fn main(spawner: Spawner) {
227228
board.rng,
228229
board.timg0.timer0,
229230
board.wifi,
230-
board.bt,
231+
unsafe { board.bt.clone_unchecked() },
231232
Some(wifi_setup_sig),
232233
)
233234
.await;
@@ -303,6 +304,14 @@ async fn main(spawner: Spawner) {
303304
));
304305
spawner.must_spawn(logger_task(global_state.clone()));
305306

307+
// BUG: this fails after wifi setup (its good if wifi is saved and ble isnt spawned)
308+
/*
309+
spawner.must_spawn(bluetooth::bluetooth_timer_task(
310+
wifi_res.wifi_init,
311+
board.bt,
312+
));
313+
*/
314+
306315
set_brownout_detection(true);
307316
global_state.state.lock().await.scene = Scene::WaitingForCompetitor;
308317
if let Some(saved_state) = SavedGlobalState::from_nvs(&nvs).await {

0 commit comments

Comments
 (0)