embedded_sensors/ublox/
mod.rs1use core::marker::PhantomData;
2
3use embedded_hal::serial;
4pub use nmea0183 as parser;
5
6use result::Error;
7use result::Result;
8
9pub mod result;
10
11pub struct Ublox<SERIAL>
12where
13 SERIAL: serial::Read<u8> + serial::Write<u8>,
14{
15 parser: parser::Parser,
16 _serial: PhantomData<SERIAL>,
17}
18
19impl<SERIAL> Ublox<SERIAL>
20where
21 SERIAL: serial::Read<u8> + serial::Write<u8>,
22{
23 pub fn new() -> Self {
24 Self {
25 parser: parser::Parser::new(),
26 _serial: PhantomData::default(),
27 }
28 }
29
30 pub fn read(&mut self, serial: &mut SERIAL) -> Result<parser::ParseResult> {
31 match nb::block!(serial.read()) {
32 Ok(v) => match self.parser.parse_from_byte(v) {
33 Some(v) => match v {
34 Ok(v) => Ok(v),
35 Err(e) => Err(Error::ParserError(e)),
36 },
37 None => Err(Error::NotEnoughData),
38 },
39 Err(_) => Err(Error::SerialError),
40 }
41 }
42}