Skip to main content

gps_data_collector_kim/
lib.rs

1//! ##Examples
2//! ```
3//!
4//! use gps_data_collector_kim
5//! use rpi_embedded::uart::{Uart, Parity};
6//!
7//! fn main() {
8//! let mut gps1 = MyGps::new();
9//!
10//! let mut uart = Uart::new(gps1.baud_rate as u32, Parity::None, 8, 1).unwrap();
11//!
12//! let data = uart.read_until('\n').unwrap();
13//! gps1.read_gpgga(data);
14//! gps1.print_gpgga();
15//! }
16//!
17//! ```
18
19#[cfg(test)]
20mod tests {
21
22    use super::*;
23
24    #[test]
25    fn recognizing_gpgga_works() {
26        let mut gps1 = MyGps::new();
27
28        let input = String::from("$GPGGA");
29        assert_eq!(true, gps1.is_gpgga_data(input));
30    }
31
32    #[test]
33    fn recognizing_other_format_works() {
34        let mut gps1 = MyGps::new();
35
36        let input = String::from("$GPGSA");
37        assert_eq!(false, gps1.is_gpgga_data(input));
38    }
39
40    #[test]
41    fn parsing_works() {
42        let mut gps1 = MyGps::new();
43
44        let input = String::from("$GPGGA,112503.101,6507.4485,N,02255.5355,W,1,04,2.26,17.7,M,60.6,M,,*44");
45        gps1.read_gpgga(input);
46        assert_eq!(112503.101, gps1.time);
47        assert_eq!(6507.4485, gps1.long);
48        assert_eq!(02255.5355, gps1.lat);
49        assert_eq!("N", gps1.n_s);
50        assert_eq!("W", gps1.e_w);
51        assert_eq!(17.7, gps1.alt);
52        assert_eq!(04, gps1.n_of_sat);
53    }
54
55    #[test]
56    fn test_uart() {
57        let mut uart = Uart::new(UartSettings::BaudRate9600 as u32, Parity::None, 8, 1).unwrap();
58        uart.set_read_mode(1, Duration::default()).unwrap();
59        let data = uart.read_until(',').unwrap();
60
61        if 0 == data.len() {
62            panic!("Uart not working");
63        }
64    }
65}
66
67
68use rpi_embedded::uart::{Uart, Parity};
69use std::time::Duration;
70
71#[derive(Copy, Clone)]
72enum UartSettings {
73    BaudRate9600 = 9600,
74    BaudRate28800 = 28800,
75    BaudRate76800 = 76800,
76    BaudRate115200 = 115200,
77}
78
79pub struct MyGps {
80    baud_rate: UartSettings,
81    time: f64,
82    long: f64,
83    lat: f64,
84    n_s: String,
85	e_w: String,
86    fix_quality: u8,
87    n_of_sat: u8,
88    alt: f64,
89}
90
91impl MyGps {
92    pub fn new() -> Self {
93        let mut _out = Self {
94            baud_rate: UartSettings::BaudRate9600,
95            time: 0.0,
96            long: 0.0,
97            lat: 0.0,
98            n_s: String::from("N"),
99	        e_w: String::from("W"),
100            fix_quality: 0,
101            n_of_sat: 0,
102            alt: 0.0,
103        };
104        _out
105    }
106
107    pub fn read_gpgga (& mut self, raw_data: String) {
108        let v: Vec<&str> = raw_data.split(",").collect();
109        let gpgga = v[0].parse::<String>().unwrap();
110
111        if self.is_gpgga_data(gpgga) {
112            self.time = v[1].parse::<f64>().unwrap();
113            self.long = v[2].parse::<f64>().unwrap();
114            self.n_s = v[3].parse::<String>().unwrap();
115            self.lat = v[4].parse::<f64>().unwrap();
116            self.e_w = v[5].parse::<String>().unwrap();
117            self.fix_quality = v[6].parse::<u8>().unwrap();
118            self.n_of_sat = v[7].parse::<u8>().unwrap();
119            self.alt = v[9].parse::<f64>().unwrap();
120        }
121    }
122
123    fn is_gpgga_data (& mut self, gpgga: String) -> bool {
124        if gpgga == "$GPGGA" {
125            true
126        }
127        else {
128            false
129        }
130    }
131
132    pub fn print_gpgga(& mut self) {
133        let print_str = format!("\n Time: {}\n Latitude: {}\n Longitude: {}\n Altitude: {}\n Orientation: {}{}\n Number of active satellites: {}\n",self.time,self.lat,self.long,self.alt,self.n_s,self.e_w,self.n_of_sat);
134			println!("{}",print_str);
135    }
136}