use std::{cell::Cell, collections::VecDeque, time::Instant};
fn reset_sim() -> bool {
println!("Module stalled. Resetting...");
true
}
fn main() {
let uart = VecDeque::from([0]);
let mut new_msg_callback = |sender: &str, msg: &str| {
println!("New message from {sender}: {msg}");
};
let call_elapsed_time = Cell::new(None);
let mut incoming_call_callback = |caller: &str| {
if caller == "+123456789" {
call_elapsed_time.set(Some(Instant::now()));
return true; }
false };
let mut module_powered_down_cb = || {};
let _cfg = simx00x::Config::default()
.with_sim_card_pin("1234")
.with_module_powered_down_callback(&mut module_powered_down_cb)
.with_received_sms_callback(&mut new_msg_callback)
.with_received_call_callback(&mut incoming_call_callback);
let cfg = simx00x::Config {
sim_card_pin: Some("1234"),
auto_reset_when_stalled: true,
module_stalled_callback: Some(&mut reset_sim),
module_powered_down_callback: Some(&mut module_powered_down_cb),
received_sms_callback: Some(&mut new_msg_callback),
received_call_callback: Some(&mut incoming_call_callback),
..Default::default() };
let mut sim = simx00x::SimX00X::new(uart, cfg);
let _ = sim.send_ussd("*123#");
let mut last_updated = Instant::now();
let start = Instant::now();
loop {
if start.elapsed().as_secs() >= 5 {
break;
}
if last_updated.elapsed().as_secs() >= 2 {
let _ = sim.update();
last_updated = Instant::now();
} else {
let _ = sim.tick();
}
let _ = sim.enqueue_sms("+123456789", "This is a test");
let _ = sim.dial("+123456789");
if call_elapsed_time
.get()
.is_some_and(|t| t.elapsed().as_secs() > 30)
{
call_elapsed_time.set(None);
sim.hang_up_call();
}
}
}