gps: export some errors for checking/supression from client

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2026-01-08 13:49:30 +01:00
committed by Ron Evans
parent b390e3225a
commit 892265b733
3 changed files with 25 additions and 17 deletions
+15 -6
View File
@@ -8,7 +8,6 @@ import (
) )
func main() { func main() {
println("GPS UART Example")
machine.UART1.Configure(machine.UARTConfig{BaudRate: 9600}) machine.UART1.Configure(machine.UARTConfig{BaudRate: 9600})
ublox := gps.NewUART(machine.UART1) ublox := gps.NewUART(machine.UART1)
parser := gps.NewParser() parser := gps.NewParser()
@@ -16,14 +15,24 @@ func main() {
for { for {
s, err := ublox.NextSentence() s, err := ublox.NextSentence()
if err != nil { if err != nil {
println(err) switch err {
continue case gps.ErrUnknownNMEASentence, gps.ErrInvalidNMEASentence, gps.ErrInvalidNMEASentenceLength:
continue
default:
println("sentence error:", err)
continue
}
} }
fix, err = parser.Parse(s) fix, err = parser.Parse(s)
if err != nil { if err != nil {
println(err) switch err {
continue case gps.ErrUnknownNMEASentence, gps.ErrInvalidNMEASentence, gps.ErrInvalidNMEASentenceLength:
continue
default:
println("parse error:", err)
continue
}
} }
if fix.Valid { if fix.Valid {
print(fix.Time.Format("15:04:05")) print(fix.Time.Format("15:04:05"))
@@ -43,7 +52,7 @@ func main() {
} }
println() println()
} else { } else {
println("No fix") println("Waiting for fix...")
} }
time.Sleep(200 * time.Millisecond) time.Sleep(200 * time.Millisecond)
} }
+7 -8
View File
@@ -11,16 +11,15 @@ import (
) )
var ( var (
errInvalidNMEASentenceLength = errors.New("invalid NMEA sentence length") ErrInvalidNMEASentenceLength = errors.New("invalid NMEA sentence length")
errInvalidNMEAChecksum = errors.New("invalid NMEA sentence checksum") ErrInvalidNMEASentence = errors.New("invalid NMEA sentence format")
errEmptyNMEASentence = errors.New("cannot parse empty NMEA sentence") ErrEmptyNMEASentence = errors.New("cannot parse empty NMEA sentence")
errUnknownNMEASentence = errors.New("unsupported NMEA sentence type") ErrUnknownNMEASentence = errors.New("unsupported NMEA sentence type")
errInvalidGGASentence = errors.New("invalid GGA NMEA sentence") errInvalidGGASentence = errors.New("invalid GGA NMEA sentence")
errInvalidRMCSentence = errors.New("invalid RMC NMEA sentence") errInvalidRMCSentence = errors.New("invalid RMC NMEA sentence")
errInvalidGLLSentence = errors.New("invalid GLL NMEA sentence") errInvalidGLLSentence = errors.New("invalid GLL NMEA sentence")
errGPSCommandRejected = errors.New("GPS command rejected (NAK)") errGPSCommandRejected = errors.New("GPS command rejected (NAK)")
errNoACKToGPSCommand = errors.New("no ACK to GPS command") errNoACKToGPSCommand = errors.New("no ACK to GPS command")
errInvalidNMEASentanceFormat = errors.New("invalid NMEA sentence format")
) )
const ( const (
@@ -151,15 +150,15 @@ func (gps *Device) WriteBytes(bytes []byte) {
// It has to end with a '*' character following by a checksum. // It has to end with a '*' character following by a checksum.
func validSentence(sentence string) error { func validSentence(sentence string) error {
if len(sentence) < minimumNMEALength || sentence[0] != startingDelimiter || sentence[len(sentence)-3] != checksumDelimiter { if len(sentence) < minimumNMEALength || sentence[0] != startingDelimiter || sentence[len(sentence)-3] != checksumDelimiter {
return errInvalidNMEASentenceLength return ErrInvalidNMEASentenceLength
} }
var cs byte = 0 var cs byte = 0
for i := 1; i < len(sentence)-3; i++ { for i := 1; i < len(sentence)-3; i++ {
cs ^= sentence[i] cs ^= sentence[i]
} }
checksum := strings.ToUpper(hex.EncodeToString([]byte{cs})) checksum := strings.ToUpper(hex.EncodeToString([]byte{cs}))
if checksum != sentence[len(sentence)-2:len(sentence)] { if checksum != sentence[len(sentence)-2:] {
return errInvalidNMEASentanceFormat return ErrInvalidNMEASentence
} }
return nil return nil
+3 -3
View File
@@ -46,10 +46,10 @@ func NewParser() Parser {
func (parser *Parser) Parse(sentence string) (Fix, error) { func (parser *Parser) Parse(sentence string) (Fix, error) {
var fix Fix var fix Fix
if sentence == "" { if sentence == "" {
return fix, errEmptyNMEASentence return fix, ErrEmptyNMEASentence
} }
if len(sentence) < 6 { if len(sentence) < 6 {
return fix, errInvalidNMEASentenceLength return fix, ErrInvalidNMEASentenceLength
} }
typ := sentence[3:6] typ := sentence[3:6]
switch typ { switch typ {
@@ -104,7 +104,7 @@ func (parser *Parser) Parse(sentence string) (Fix, error) {
return fix, nil return fix, nil
} }
return fix, errInvalidNMEASentanceFormat return fix, ErrUnknownNMEASentence
} }
// findTime returns the time from an NMEA sentence: // findTime returns the time from an NMEA sentence: