Added draft GPS checks though NMEA reports.
This commit is contained in:
@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"go.bug.st/serial"
|
||||
@ -18,6 +19,8 @@ const (
|
||||
type atPort struct {
|
||||
logger *log.Logger
|
||||
|
||||
mutex sync.Mutex // Mutex for all operation with serial port
|
||||
|
||||
baudrate int
|
||||
portName string
|
||||
port serial.Port
|
||||
@ -27,7 +30,8 @@ type atPort struct {
|
||||
type Port interface {
|
||||
GetName() string
|
||||
GetBaudrate() int
|
||||
GetSerialPort() serial.Port // For extra need
|
||||
SerialPort() serial.Port // For extra need
|
||||
Mutex() sync.Locker // retruns pointer to mutex for advanced use like readign NMEA reports
|
||||
|
||||
Connect() error
|
||||
Disconnect() error
|
||||
@ -56,11 +60,18 @@ func (p *atPort) GetBaudrate() int {
|
||||
return p.baudrate
|
||||
}
|
||||
|
||||
func (p *atPort) GetSerialPort() serial.Port {
|
||||
func (p *atPort) SerialPort() serial.Port {
|
||||
return p.port
|
||||
}
|
||||
|
||||
func (p *atPort) Mutex() sync.Locker {
|
||||
return &p.mutex
|
||||
}
|
||||
|
||||
func (p *atPort) Connect() error {
|
||||
p.mutex.Lock()
|
||||
defer p.mutex.Unlock()
|
||||
|
||||
p.logger.Println("Connecting to", p.portName, "...")
|
||||
s, err := serial.Open(p.portName, &serial.Mode{BaudRate: p.baudrate})
|
||||
if err != nil {
|
||||
@ -76,8 +87,10 @@ func (p *atPort) Connect() error {
|
||||
}
|
||||
|
||||
func (p *atPort) Disconnect() error {
|
||||
p.mutex.Lock()
|
||||
defer func() {
|
||||
p.port = nil
|
||||
p.mutex.Unlock()
|
||||
}()
|
||||
if err := p.port.Close(); err != nil {
|
||||
return fmt.Errorf("close port: %w", err)
|
||||
@ -86,16 +99,22 @@ func (p *atPort) Disconnect() error {
|
||||
}
|
||||
|
||||
func (p *atPort) IsConnected() bool {
|
||||
p.mutex.Lock()
|
||||
defer p.mutex.Unlock()
|
||||
|
||||
return p.port != nil
|
||||
}
|
||||
|
||||
// Low level write/read function
|
||||
func (p *atPort) RawSend(msg string) (string, error) {
|
||||
p.mutex.Lock()
|
||||
defer p.mutex.Unlock()
|
||||
|
||||
// Write
|
||||
if _, err := p.port.Write([]byte(msg)); err != nil {
|
||||
return "", fmt.Errorf("serial port write: %w", err)
|
||||
}
|
||||
time.Sleep(time.Millisecond)
|
||||
// time.Sleep(time.Millisecond)
|
||||
// Read
|
||||
readLen, err := p.port.Read(p.inputBuf)
|
||||
// p.logger.Println(msg, "\x1b[38;2;150;150;150mRAWREAD:", string(p.inputBuf[:readLen]), "\x1b[38;2;255;255;255m")
|
||||
@ -121,5 +140,8 @@ func (p *atPort) Send(cmd string) (Resp, error) {
|
||||
}
|
||||
|
||||
func (p *atPort) Close() error {
|
||||
p.mutex.Lock()
|
||||
defer p.mutex.Unlock()
|
||||
|
||||
return p.port.Close()
|
||||
}
|
||||
|
Reference in New Issue
Block a user