Read AT Command response properly

This commit is contained in:
Sofia 2026-05-15 01:36:32 +03:00
parent ad86af1b74
commit 851955e3fc

View File

@ -1,6 +1,10 @@
use alloc::string::String;
use alloc::vec::Vec;
use core::fmt::Write;
use esp_hal::{Blocking, delay::Delay, gpio::Output, uart::Uart};
static RESPONSES: [&'static str; 3] = ["OK", "ERROR", "DOWNLOAD"];
pub struct ATCommands<'a, 'd> {
pub rst: Output<'a>,
pub pwr_key: Output<'a>,
@ -40,8 +44,33 @@ impl<'a, 'd> ATCommands<'a, 'd> {
self.uart.flush().unwrap();
self.delay.delay_millis(500);
log::info!("Wrote command");
let response = self.read_response();
log::info!("Response: {}", response);
}
fn read_response(&mut self) -> String {
let mut buffer = [0u8; 1024];
let mut contents = String::new();
while {
let parts: Vec<&str> = contents.split("\r\n").collect();
!RESPONSES.iter().any(|r| parts.contains(r))
} {
let length = self.uart.read(&mut buffer).unwrap();
log::info!("text: {:?}", str::from_utf8(&buffer[..length]));
contents += str::from_utf8(&buffer[..length]).unwrap();
}
let parts: Vec<&str> = contents.split("\r\n").collect();
let (idx, _) = parts
.iter()
.enumerate()
.find(|(_, part)| RESPONSES.contains(part))
.unwrap();
parts
.into_iter()
.take(idx + 1)
.collect::<Vec<_>>()
.join("\n")
}
}