#![no_std]
#![no_main]
#![allow(dead_code, unused_variables)]
extern crate at_parser_rs;
use at_parser_rs::context::AtContext;
use at_parser_rs::parser::AtParser;
use at_parser_rs::{Args, AtError, AtResult, at_response};
const SIZE: usize = 64;
pub struct EchoModule {
pub echo: bool,
}
impl AtContext<SIZE> for EchoModule {
fn exec(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; if self.echo { "ON" } else { "OFF" }))
}
fn query(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; if self.echo { 1u8 } else { 0u8 }))
}
fn test(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; "(0,1)"))
}
fn set(&mut self, at_response: &'static str, args: Args) -> AtResult<'_, SIZE> {
let value = args.get(0).ok_or((at_response, AtError::InvalidArgs))?;
match value.as_ref() {
"0" => {
self.echo = false;
Ok(at_response!(SIZE, at_response; "OK"))
}
"1" => {
self.echo = true;
Ok(at_response!(SIZE, at_response; "OK"))
}
_ => Err((at_response, AtError::InvalidArgs)),
}
}
}
pub struct ResetModule;
impl AtContext<SIZE> for ResetModule {
fn exec(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; "OK"))
}
fn test(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; "Reset the system"))
}
}
pub struct InfoModule {
pub version: &'static str,
}
impl AtContext<SIZE> for InfoModule {
fn exec(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; self.version))
}
fn query(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; "AT-Parser-RS - AT Command Parser Library"))
}
}
pub struct LedModule {
pub state: bool,
pub brightness: u8,
}
impl AtContext<SIZE> for LedModule {
fn exec(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; if self.state { "ON" } else { "OFF" }))
}
fn query(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; self.state as u8, self.brightness))
}
fn test(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
Ok(at_response!(SIZE, at_response; "<state: 0|1>,<brightness: 0-100>"))
}
fn set(&mut self, at_response: &'static str, args: Args) -> AtResult<'_, SIZE> {
let state_str = args.get(0).ok_or((at_response, AtError::InvalidArgs))?;
self.state = match state_str.as_ref() {
"0" => false,
"1" => true,
_ => return Err((at_response, AtError::InvalidArgs)),
};
if let Some(brightness_str) = args.get(1) {
let bri = brightness_str
.parse::<u8>()
.map_err(|_| (at_response, AtError::InvalidArgs))?;
if bri > 100 {
return Err((at_response, AtError::InvalidArgs));
}
self.brightness = bri;
}
Ok(at_response!(SIZE, at_response; "OK"))
}
}
#[unsafe(no_mangle)]
pub extern "C" fn main() -> ! {
let mut echo = EchoModule { echo: false };
let mut reset = ResetModule;
let mut info = InfoModule { version: "v1.0.0" };
let mut led = LedModule { state: false, brightness: 0 };
let mut parser: AtParser<dyn AtContext<SIZE>, SIZE> = AtParser::new();
let commands: &mut [(&str, &str, &mut dyn AtContext<SIZE>)] = &mut [
("AT+ECHO", "+ECHO: ", &mut echo),
("AT+RST", "+RST: ", &mut reset),
("AT+INFO", "+INFO: ", &mut info),
("AT+LED", "+LED: ", &mut led),
];
parser.set_commands(commands);
let _ = parser.execute("AT+INFO"); let _ = parser.execute("AT+INFO?");
let _ = parser.execute("AT+ECHO"); let _ = parser.execute("AT+ECHO=?"); let _ = parser.execute("AT+ECHO=1"); let _ = parser.execute("AT+ECHO?"); let _ = parser.execute("AT+ECHO=0");
let _ = parser.execute("AT+LED=?"); let _ = parser.execute("AT+LED=1"); let _ = parser.execute("AT+LED?"); let _ = parser.execute("AT+LED=1,75"); let _ = parser.execute("AT+LED=0");
let _ = parser.execute("AT+RST=?"); let _ = parser.execute("AT+RST");
let _ = parser.execute("AT+ECHO=2"); let _ = parser.execute("AT+UNKNOWN");
loop {}
}