From 892265b7332bf9eee098b741c9f3413ac0016d53 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Thu, 8 Jan 2026 13:49:30 +0100 Subject: [PATCH] gps: export some errors for checking/supression from client Signed-off-by: deadprogram --- examples/gps/uart/main.go | 21 +++++++++++++++------ gps/gps.go | 15 +++++++-------- gps/gpsparser.go | 6 +++--- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/examples/gps/uart/main.go b/examples/gps/uart/main.go index 7e6a2c4..c5309bf 100644 --- a/examples/gps/uart/main.go +++ b/examples/gps/uart/main.go @@ -8,7 +8,6 @@ import ( ) func main() { - println("GPS UART Example") machine.UART1.Configure(machine.UARTConfig{BaudRate: 9600}) ublox := gps.NewUART(machine.UART1) parser := gps.NewParser() @@ -16,14 +15,24 @@ func main() { for { s, err := ublox.NextSentence() if err != nil { - println(err) - continue + switch err { + case gps.ErrUnknownNMEASentence, gps.ErrInvalidNMEASentence, gps.ErrInvalidNMEASentenceLength: + continue + default: + println("sentence error:", err) + continue + } } fix, err = parser.Parse(s) if err != nil { - println(err) - continue + switch err { + case gps.ErrUnknownNMEASentence, gps.ErrInvalidNMEASentence, gps.ErrInvalidNMEASentenceLength: + continue + default: + println("parse error:", err) + continue + } } if fix.Valid { print(fix.Time.Format("15:04:05")) @@ -43,7 +52,7 @@ func main() { } println() } else { - println("No fix") + println("Waiting for fix...") } time.Sleep(200 * time.Millisecond) } diff --git a/gps/gps.go b/gps/gps.go index bc81797..b064bbe 100644 --- a/gps/gps.go +++ b/gps/gps.go @@ -11,16 +11,15 @@ import ( ) var ( - errInvalidNMEASentenceLength = errors.New("invalid NMEA sentence length") - errInvalidNMEAChecksum = errors.New("invalid NMEA sentence checksum") - errEmptyNMEASentence = errors.New("cannot parse empty NMEA sentence") - errUnknownNMEASentence = errors.New("unsupported NMEA sentence type") + ErrInvalidNMEASentenceLength = errors.New("invalid NMEA sentence length") + ErrInvalidNMEASentence = errors.New("invalid NMEA sentence format") + ErrEmptyNMEASentence = errors.New("cannot parse empty NMEA sentence") + ErrUnknownNMEASentence = errors.New("unsupported NMEA sentence type") errInvalidGGASentence = errors.New("invalid GGA NMEA sentence") errInvalidRMCSentence = errors.New("invalid RMC NMEA sentence") errInvalidGLLSentence = errors.New("invalid GLL NMEA sentence") errGPSCommandRejected = errors.New("GPS command rejected (NAK)") errNoACKToGPSCommand = errors.New("no ACK to GPS command") - errInvalidNMEASentanceFormat = errors.New("invalid NMEA sentence format") ) const ( @@ -151,15 +150,15 @@ func (gps *Device) WriteBytes(bytes []byte) { // It has to end with a '*' character following by a checksum. func validSentence(sentence string) error { if len(sentence) < minimumNMEALength || sentence[0] != startingDelimiter || sentence[len(sentence)-3] != checksumDelimiter { - return errInvalidNMEASentenceLength + return ErrInvalidNMEASentenceLength } var cs byte = 0 for i := 1; i < len(sentence)-3; i++ { cs ^= sentence[i] } checksum := strings.ToUpper(hex.EncodeToString([]byte{cs})) - if checksum != sentence[len(sentence)-2:len(sentence)] { - return errInvalidNMEASentanceFormat + if checksum != sentence[len(sentence)-2:] { + return ErrInvalidNMEASentence } return nil diff --git a/gps/gpsparser.go b/gps/gpsparser.go index 8434587..8419b29 100644 --- a/gps/gpsparser.go +++ b/gps/gpsparser.go @@ -46,10 +46,10 @@ func NewParser() Parser { func (parser *Parser) Parse(sentence string) (Fix, error) { var fix Fix if sentence == "" { - return fix, errEmptyNMEASentence + return fix, ErrEmptyNMEASentence } if len(sentence) < 6 { - return fix, errInvalidNMEASentenceLength + return fix, ErrInvalidNMEASentenceLength } typ := sentence[3:6] switch typ { @@ -104,7 +104,7 @@ func (parser *Parser) Parse(sentence string) (Fix, error) { return fix, nil } - return fix, errInvalidNMEASentanceFormat + return fix, ErrUnknownNMEASentence } // findTime returns the time from an NMEA sentence: