gps: revamp validSentence() to avoid heap allocation for errors. This error can occur too frequently to allow for such allocations

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2025-12-30 17:56:04 +01:00
committed by Ron Evans
parent 0a41786a77
commit 1513808425
3 changed files with 6 additions and 29 deletions
+2 -25
View File
@@ -20,30 +20,9 @@ var (
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")
)
type GPSError struct {
Err error
Info string
Sentence string
}
func newGPSError(err error, sentence string, info string) GPSError {
return GPSError{
Info: info,
Err: err,
Sentence: sentence,
}
}
func (ge GPSError) Error() string {
return ge.Err.Error() + " " + ge.Info + " " + ge.Sentence
}
func (ge GPSError) Unwrap() error {
return ge.Err
}
const (
minimumNMEALength = 7
startingDelimiter = '$'
@@ -182,9 +161,7 @@ func validSentence(sentence string) error {
}
checksum := strings.ToUpper(hex.EncodeToString([]byte{cs}))
if checksum != sentence[len(sentence)-2:len(sentence)] {
return newGPSError(errInvalidNMEAChecksum, sentence,
"expected "+sentence[len(sentence)-2:len(sentence)]+
" got "+checksum)
return errInvalidNMEASentanceFormat
}
return nil
+1 -1
View File
@@ -104,7 +104,7 @@ func (parser *Parser) Parse(sentence string) (Fix, error) {
return fix, nil
}
return fix, newGPSError(errUnknownNMEASentence, sentence, typ)
return fix, errInvalidNMEASentanceFormat
}
// findTime returns the time from an NMEA sentence:
+3 -3
View File
@@ -8,13 +8,13 @@ import (
)
func TestParseUnknownSentence(t *testing.T) {
c := qt.New(t)
p := NewParser()
val := "$GPGSV,3,1,09,07,14,317,22,08,31,284,25,10,32,133,39,16,85,232,29*7F"
_, err := p.Parse(val)
c.Assert(err.Error(), qt.Contains, "unsupported NMEA sentence type")
if err == nil {
t.Error("should have unknown sentence err")
}
}
func TestParseGGA(t *testing.T) {