X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fcommon%2Fgps.rs;h=178e55198879edffbd1fb2dec11947579320daa6;hb=8f0161e8492d090b09782c13b43ef71201787186;hp=b9fcbc3f23d9a732676082fbc3cccac4d2535310;hpb=0ed02a94b60d886b568f4803a7ec09eef29ad1ca;p=gps-watch.git diff --git a/src/common/gps.rs b/src/common/gps.rs index b9fcbc3..178e551 100644 --- a/src/common/gps.rs +++ b/src/common/gps.rs @@ -21,7 +21,6 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -use ringbuf::Ringbuf; use systick; enum ParseState { @@ -63,20 +62,6 @@ fn to_lower(c: u8) -> u8 { c | 0x20 } -fn try_read() -> Option { - extern { - static mut uart0_rx_buf: Ringbuf; - } - - unsafe { - if uart0_rx_buf.is_empty() { - None - } else { - Some(uart0_rx_buf.read()) - } - } -} - fn parse_coordinate(s: &[u8]) -> i32 { // Find the position of the decimal separator for the minutes. let dot_position = s.iter().enumerate().find(|(_, &c)| { @@ -205,17 +190,23 @@ impl Gps { } } - pub fn update(&mut self, tap: &mut TimeAndPos) -> bool { + pub fn update(&mut self, tap: &mut TimeAndPos, mut read_func: F) -> bool + where F: FnMut() -> Option + { let hexdigits = b"0123456789abcdef"; - while let Some(received) = try_read() { + while let Some(received) = read_func() { + if received == b'$' { + self.state = ParseState::InPacket; + self.offset = 0; + self.checksum = 0x00; + + continue; + } + match self.state { ParseState::Start => { - if received == b'$' { - self.state = ParseState::InPacket; - self.offset = 0; - self.checksum = 0x00; - } + // Empty. }, ParseState::InPacket => { if received == b'*' { @@ -343,8 +334,16 @@ impl Gps { return false; } - if pos_fix_indicator != b"1" { - return false; + match pos_fix_indicator { + b"1" => { + // Valid standard GPS fix (low resolution). + }, + b"2" => { + // Valid differential GPS fix (high resolution). + }, + _ => { + return false; + } } if utc_time.len() < 6 {