move common serial io code to a module

closes: #6
closes: #7
This commit is contained in:
Vladan Popovic 2022-07-11 20:13:52 +02:00
parent 1fc1218ba6
commit 6f90f46b68
5 changed files with 243 additions and 153 deletions

View file

@ -1,8 +1,11 @@
use anyhow;
use std::sync::mpsc::SyncSender;
use std::thread;
use std::time::Duration;
use std::{
sync::mpsc::SyncSender,
thread,
time::Duration,
io::Read,
};
use esp_idf_hal::prelude::*;
use esp_idf_hal::serial;
@ -10,10 +13,11 @@ use esp_idf_hal::serial;
use ublox::*;
use crate::modem::Msg;
use crate::serial::SerialIO;
pub fn main<T: Sync + Send>(
rx: esp_idf_hal::gpio::Gpio32<T>,
tx: esp_idf_hal::gpio::Gpio33<T>,
rx: esp_idf_hal::gpio::Gpio32<T>,
uart: serial::UART2,
sender: SyncSender<Msg>,
) -> Result<(), anyhow::Error> {
@ -23,35 +27,46 @@ pub fn main<T: Sync + Send>(
cts: None,
rts: None,
};
let _serial: serial::Serial<serial::UART2, _, _> = serial::Serial::new(
let serial: serial::Serial<serial::UART2, _, _> = serial::Serial::new(
uart,
serial_pins,
serial::config::Config::default().baudrate(Hertz(9600)),
)?;
let (tx, rx) = serial.split();
let mut serial_io = SerialIO::new(tx, rx);
let mut parser = Parser::default();
let mut it = parser.consume(&raw_packet);
loop {
match it.next() {
Some(Ok(packet)) => {
println!("We've received a &PacketRef, we can handle it ... {:?}", packet);
}
Some(Err(err)) => {
println!("Received a malformed packet {:?}", err);
}
None => {
println!("The internal buffer is now empty");
break;
}
}
}
println!("entering GPS sender loop ...");
for i in 0..20 {
println!("sending GPS message ({}) of 20 ...", i);
let _ = sender.send(Msg::Location("{\"lat\": 20.4322, \"long\": 44.5432}".to_string()))?;
loop {
let mut local_buf = [0; 100];
println!("reading 100 bytes from serial ...");
let nbytes = serial_io.read(&mut local_buf)?;
println!("READ: {}", local_buf.iter().map(|&b| char::from(b)).collect::<String>());
if nbytes == 0 {
println!("received 0 bytes, exiting ...");
break;
}
let mut it = parser.consume(&local_buf);
loop {
match it.next() {
Some(Ok(packet)) => {
let msg = format!("We've received a &PacketRef, we can handle it ... {:?}", packet);
println!("{}", msg);
sender.send(Msg::Location(msg))?;
}
Some(Err(err)) => {
println!("Received a malformed packet {:?}", err);
}
None => {
println!("The internal buffer is now empty");
break;
}
}
}
thread::sleep(Duration::from_millis(2000));
}
println!("exiting GPS sender loop :)");
Ok(())
}