esp-hosted: wait for esp firmware init.
This commit is contained in:
parent
082f1ab494
commit
764b43e82c
@ -29,6 +29,9 @@ impl<'a> Control<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn init(&mut self) {
|
pub async fn init(&mut self) {
|
||||||
|
debug!("wait for init event...");
|
||||||
|
self.shared.init_wait().await;
|
||||||
|
|
||||||
debug!("set wifi mode");
|
debug!("set wifi mode");
|
||||||
self.set_wifi_mode(WifiMode::Sta as _).await;
|
self.set_wifi_mode(WifiMode::Sta as _).await;
|
||||||
let mac_addr = self.get_mac_addr().await;
|
let mac_addr = self.get_mac_addr().await;
|
||||||
|
@ -23,6 +23,7 @@ pub struct Shared(RefCell<SharedInner>);
|
|||||||
|
|
||||||
struct SharedInner {
|
struct SharedInner {
|
||||||
ioctl: IoctlState,
|
ioctl: IoctlState,
|
||||||
|
is_init: bool,
|
||||||
control_waker: WakerRegistration,
|
control_waker: WakerRegistration,
|
||||||
runner_waker: WakerRegistration,
|
runner_waker: WakerRegistration,
|
||||||
}
|
}
|
||||||
@ -31,6 +32,7 @@ impl Shared {
|
|||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self(RefCell::new(SharedInner {
|
Self(RefCell::new(SharedInner {
|
||||||
ioctl: IoctlState::Done { resp_len: 0 },
|
ioctl: IoctlState::Done { resp_len: 0 },
|
||||||
|
is_init: false,
|
||||||
control_waker: WakerRegistration::new(),
|
control_waker: WakerRegistration::new(),
|
||||||
runner_waker: WakerRegistration::new(),
|
runner_waker: WakerRegistration::new(),
|
||||||
}))
|
}))
|
||||||
@ -97,4 +99,25 @@ impl Shared {
|
|||||||
warn!("IOCTL Response but no pending Ioctl");
|
warn!("IOCTL Response but no pending Ioctl");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// // // // // // // // // // // // // // // // // // // //
|
||||||
|
|
||||||
|
pub fn init_done(&self) {
|
||||||
|
let mut this = self.0.borrow_mut();
|
||||||
|
this.is_init = true;
|
||||||
|
this.control_waker.wake();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn init_wait(&self) {
|
||||||
|
poll_fn(|cx| {
|
||||||
|
let mut this = self.0.borrow_mut();
|
||||||
|
if this.is_init {
|
||||||
|
Poll::Ready(())
|
||||||
|
} else {
|
||||||
|
this.control_waker.register(cx.waker());
|
||||||
|
Poll::Pending
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ use ioctl::Shared;
|
|||||||
use proto::CtrlMsg;
|
use proto::CtrlMsg;
|
||||||
|
|
||||||
use crate::ioctl::PendingIoctl;
|
use crate::ioctl::PendingIoctl;
|
||||||
|
use crate::proto::CtrlMsgPayload;
|
||||||
|
|
||||||
mod proto;
|
mod proto;
|
||||||
|
|
||||||
@ -308,6 +309,16 @@ where
|
|||||||
};
|
};
|
||||||
|
|
||||||
debug!("event: {:?}", &event);
|
debug!("event: {:?}", &event);
|
||||||
|
|
||||||
|
let Some(payload) = &event.payload else {
|
||||||
|
warn!("event without payload?");
|
||||||
|
return
|
||||||
|
};
|
||||||
|
|
||||||
|
match payload {
|
||||||
|
CtrlMsgPayload::EventEspInit(_) => self.shared.init_done(),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,9 +69,6 @@ async fn main(spawner: Spawner) {
|
|||||||
|
|
||||||
unwrap!(spawner.spawn(wifi_task(runner)));
|
unwrap!(spawner.spawn(wifi_task(runner)));
|
||||||
|
|
||||||
// TODO: wait for ESP_INIT event instead of hardcoding delay.
|
|
||||||
Timer::after(Duration::from_secs(3)).await;
|
|
||||||
|
|
||||||
control.init().await;
|
control.init().await;
|
||||||
control.join(env!("WIFI_NETWORK"), env!("WIFI_PASSWORD")).await;
|
control.join(env!("WIFI_NETWORK"), env!("WIFI_PASSWORD")).await;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user