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() {
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)
}
+7 -8
View File
@@ -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
+3 -3
View File
@@ -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: