mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-18 13:43:58 +00:00
gps: export some errors for checking/supression from client
Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
@@ -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
@@ -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
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user