ia7 0.1.0

A library to get data from a Adafruit Ultimate GPS , using UART
Documentation


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{ //$GPGGA
    uart: Uart,
    time:String,
    latitude:String,
    longitude:String,
    altitude:String,
}

impl DataGPS{
    /// Create a new DataGPS.
    ///
    /// # Examples
    ///
    /// ```
    /// let baud = Bauds::Baud9600;
    /// let data_gps = DataGPS::new(baud);
    /// assert_eq!(baud.get_value(),data_gps.get_baud_rate());
    /// ```

    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()
        }
    }

    /// Read all data. It gets time, latitude, longitude and altitude.
    ///

    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])
        }

    }

    /// Print time, latitude, longitude and altitude.
    /// 

    pub fn print_all_value(&mut self){
        println!("Altitude: {},Longitude: {},Latitude: {},Time: {}",self.get_altitude(),self.get_longitude(),self.get_latitude(),self.get_time());
    }

    /// Set time, latitude, longitude and altitude. This function is private and it is used by the function read_all_data().
    ///

    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;
    }

    /// Return Altitude value. If it is not set yet, it returns "No value".
    /// 

    pub fn get_altitude(&mut self) -> String{
        if self.altitude.is_empty(){
           "No value".to_string()
        }else{
           self.altitude.to_string()
        }
    }

    /// Return Latitude value. If it is not set yet, it returns "No value".
    /// 

    pub fn get_latitude(&mut self) -> String{
        if self.latitude.is_empty(){
            "No value".to_string()
        }else{
            self.latitude.to_string()
        }
    }

    /// Return Time value. If it is not set yet, it returns "No value".
    /// 

    pub fn get_time(&mut self) -> String{
        if self.time.is_empty(){
            "No value".to_string()
        }else{
            self.time.to_string()
        }
    }

    /// Return Longitude value. If it is not set yet, it returns "No value".
    /// 

    pub fn get_longitude(&mut self) -> String{
        if self.longitude.is_empty(){
            "No value".to_string()
        }else{
            self.longitude.to_string()
        }
    }

    /// Return BaudRate value. It refers to the BaudRate of our DataGPS's UART.
    /// 

    pub fn get_baud_rate(&self) -> u32{
        self.uart.baud_rate()
    }

    /// Return UART Statis value. It refers to the Status of our DataGPS's UART.
    /// 

    pub fn get_uart_status(&self) -> rpi_embedded::uart::Status{
        self.uart.status().expect("Error getting status")
    }

    /// Set a baud rate on already existing DataGPS.
    ///
    /// # Examples
    ///
    /// ```
    /// let data_gps = DataGPS::new(Bauds::Baud57600);
    /// let new_baud = Bauds::Baud9600;
    /// data_gps.set_baud_rate(&new_baud);
    /// assert_eq!(new_baud.get_value(),data_gps.get_baud_rate());
    /// ```

    pub fn set_baud_rate(&mut self,baud_rate:&Bauds) {
        self.uart.set_baud_rate(baud_rate.get_value()).expect("Error setting baud rate");
    }
}