gps_data_collector_kim/
lib.rs1#[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}