embedded_sensors/ublox/
mod.rs

1use 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}