use super::AsyncClient;
use super::StackError;
use crate::stack::socket_callbacks::WifiModuleState;
use crate::transfer::Xfer;
const AP_CONNECT_TIMEOUT_MILLISECONDS: u32 = 60_000;
impl<X: Xfer> AsyncClient<'_, X> {
pub async fn start_wifi_module(&mut self) -> Result<(), StackError> {
if self.callbacks.borrow().state != WifiModuleState::Reset {
return Err(StackError::InvalidState);
}
self.callbacks.borrow_mut().state = WifiModuleState::Starting;
self.manager.borrow_mut().set_crc_state(true);
let mut state = Default::default();
loop {
let result = self
.manager
.borrow_mut()
.boot_the_chip(&mut state)
.map_err(StackError::WincWifiFail)?;
if result {
self.callbacks.borrow_mut().state = WifiModuleState::Unconnected;
return Ok(());
}
self.dispatch_events()?;
self.yield_once().await; }
}
pub async fn connect_to_saved_ap(&mut self) -> Result<(), StackError> {
if matches!(
self.callbacks.borrow().state,
WifiModuleState::Reset | WifiModuleState::Starting
) {
return Err(StackError::InvalidState);
}
let mut countdown = AP_CONNECT_TIMEOUT_MILLISECONDS;
self.callbacks.borrow_mut().state = WifiModuleState::ConnectingToAp;
self.manager.borrow_mut().send_default_connect()?;
loop {
countdown -= 1;
if countdown == 0 {
return Err(StackError::GeneralTimeout);
}
let read_state = self.callbacks.borrow().state.clone();
match read_state {
WifiModuleState::ConnectionFailed => {
let mut callbacks = self.callbacks.borrow_mut();
let res = callbacks.connection_state.conn_error.take().unwrap();
return Err(StackError::ApJoinFailed(res));
}
WifiModuleState::ConnectedToAp => {
return Ok(());
}
_ => {}
}
self.dispatch_events()?;
self.yield_once().await;
}
}
}