mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-13 19:33:39 +00:00
gps: add support for GLL sentence type, add original sentence to gps errors
Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
+12
-8
@@ -17,22 +17,25 @@ var (
|
|||||||
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")
|
||||||
)
|
)
|
||||||
|
|
||||||
type GPSError struct {
|
type GPSError struct {
|
||||||
Info string
|
Err error
|
||||||
Err error
|
Info string
|
||||||
|
Sentence string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newGPSError(err error, info string) GPSError {
|
func newGPSError(err error, sentence string, info string) GPSError {
|
||||||
return GPSError{
|
return GPSError{
|
||||||
Info: info,
|
Info: info,
|
||||||
Err: err,
|
Err: err,
|
||||||
|
Sentence: sentence,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ge GPSError) Error() string {
|
func (ge GPSError) Error() string {
|
||||||
return ge.Err.Error() + " " + ge.Info
|
return ge.Err.Error() + " " + ge.Info + " " + ge.Sentence
|
||||||
}
|
}
|
||||||
|
|
||||||
// Device wraps a connection to a GPS device.
|
// Device wraps a connection to a GPS device.
|
||||||
@@ -156,8 +159,9 @@ func validSentence(sentence string) error {
|
|||||||
}
|
}
|
||||||
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:len(sentence)] {
|
||||||
return newGPSError(errInvalidNMEAChecksum, "expected "+sentence[len(sentence)-2:len(sentence)]+
|
return newGPSError(errInvalidNMEAChecksum, sentence,
|
||||||
" got "+checksum)
|
"expected "+sentence[len(sentence)-2:len(sentence)]+
|
||||||
|
" got "+checksum)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
+17
-1
@@ -54,6 +54,7 @@ func (parser *Parser) Parse(sentence string) (Fix, error) {
|
|||||||
typ := sentence[3:6]
|
typ := sentence[3:6]
|
||||||
switch typ {
|
switch typ {
|
||||||
case "GGA":
|
case "GGA":
|
||||||
|
// https://docs.novatel.com/OEM7/Content/Logs/GPGGA.htm
|
||||||
fields := strings.Split(sentence, ",")
|
fields := strings.Split(sentence, ",")
|
||||||
if len(fields) != 15 {
|
if len(fields) != 15 {
|
||||||
return fix, errInvalidGGASentence
|
return fix, errInvalidGGASentence
|
||||||
@@ -66,8 +67,23 @@ func (parser *Parser) Parse(sentence string) (Fix, error) {
|
|||||||
fix.Time = findTime(fields[1])
|
fix.Time = findTime(fields[1])
|
||||||
fix.Valid = (fix.Altitude != -99999) && (fix.Satellites > 0)
|
fix.Valid = (fix.Altitude != -99999) && (fix.Satellites > 0)
|
||||||
|
|
||||||
|
return fix, nil
|
||||||
|
case "GLL":
|
||||||
|
// https://docs.novatel.com/OEM7/Content/Logs/GPGLL.htm
|
||||||
|
fields := strings.Split(sentence, ",")
|
||||||
|
if len(fields) != 8 {
|
||||||
|
return fix, errInvalidGLLSentence
|
||||||
|
}
|
||||||
|
|
||||||
|
fix.Latitude = findLatitude(fields[2], fields[3])
|
||||||
|
fix.Longitude = findLongitude(fields[4], fields[5])
|
||||||
|
fix.Time = findTime(fields[6])
|
||||||
|
|
||||||
|
fix.Valid = (fields[7] == "A")
|
||||||
|
|
||||||
return fix, nil
|
return fix, nil
|
||||||
case "RMC":
|
case "RMC":
|
||||||
|
// https://docs.novatel.com/OEM7/Content/Logs/GPRMC.htm
|
||||||
fields := strings.Split(sentence, ",")
|
fields := strings.Split(sentence, ",")
|
||||||
if len(fields) != 13 {
|
if len(fields) != 13 {
|
||||||
return fix, errInvalidRMCSentence
|
return fix, errInvalidRMCSentence
|
||||||
@@ -83,7 +99,7 @@ func (parser *Parser) Parse(sentence string) (Fix, error) {
|
|||||||
return fix, nil
|
return fix, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return fix, newGPSError(errUnknownNMEASentence, typ)
|
return fix, newGPSError(errUnknownNMEASentence, sentence, typ)
|
||||||
}
|
}
|
||||||
|
|
||||||
// findTime returns the time from an NMEA sentence:
|
// findTime returns the time from an NMEA sentence:
|
||||||
|
|||||||
Reference in New Issue
Block a user