use std::{time::Duration};
use rpi_embedded::uart::{Parity, Uart};
pub enum Bauds{
Baud9600,
Baud57600,
Baud115200
}
impl Bauds{
pub fn get_value(&self) -> u32{
let v: u32;
match self{
Bauds::Baud9600 => { v = 9600 }
Bauds::Baud57600 => { v = 57600 }
Bauds::Baud115200 => { v = 115200 }
}
v
}
}
pub struct DataGPS{ uart: Uart,
time:String,
latitude:String,
longitude:String,
altitude:String,
}
impl DataGPS{
pub fn new(baud: Bauds) -> Self{
let mut _uart = Uart::new(baud.get_value(), Parity::None, 8, 1).expect("Error UART");
_uart.set_read_mode(1, Duration::default()).expect("Error setting read mode");
Self{
uart: _uart,
time: "".to_string(),
latitude: "".to_string(),
longitude: "".to_string(),
altitude: "".to_string()
}
}
pub fn read_all_data(&mut self) {
let input = self.uart.read_line().expect("Error reading data");
if input.contains("$GPGGA"){
let x : Vec<&str> = input.split(",").collect();
self.set_data(x[1].to_string(), x[2].to_string()+x[3], x[4].to_string()+x[5], x[9].to_string()+x[10])
}
}
pub fn print_all_value(&mut self){
println!("Altitude: {},Longitude: {},Latitude: {},Time: {}",self.get_altitude(),self.get_longitude(),self.get_latitude(),self.get_time());
}
fn set_data(&mut self, time:String, latitude: String, longitude: String, altitude: String){
self.time = time;
self.latitude = latitude;
self.longitude = longitude;
self.altitude = altitude;
}
pub fn get_altitude(&mut self) -> String{
if self.altitude.is_empty(){
"No value".to_string()
}else{
self.altitude.to_string()
}
}
pub fn get_latitude(&mut self) -> String{
if self.latitude.is_empty(){
"No value".to_string()
}else{
self.latitude.to_string()
}
}
pub fn get_time(&mut self) -> String{
if self.time.is_empty(){
"No value".to_string()
}else{
self.time.to_string()
}
}
pub fn get_longitude(&mut self) -> String{
if self.longitude.is_empty(){
"No value".to_string()
}else{
self.longitude.to_string()
}
}
pub fn get_baud_rate(&self) -> u32{
self.uart.baud_rate()
}
pub fn get_uart_status(&self) -> rpi_embedded::uart::Status{
self.uart.status().expect("Error getting status")
}
pub fn set_baud_rate(&mut self,baud_rate:&Bauds) {
self.uart.set_baud_rate(baud_rate.get_value()).expect("Error setting baud rate");
}
}