Make mk2ser wait for goroutine to finish on Close.
This commit is contained in:
52
mk2if/mk2.go
52
mk2if/mk2.go
@@ -25,6 +25,7 @@ type mk2Ser struct {
|
|||||||
locked bool
|
locked bool
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
infochan chan *Mk2Info
|
infochan chan *Mk2Info
|
||||||
|
wg sync.WaitGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMk2Connection(dev io.ReadWriter) (Mk2If, error) {
|
func NewMk2Connection(dev io.ReadWriter) (Mk2If, error) {
|
||||||
@@ -38,6 +39,7 @@ func NewMk2Connection(dev io.ReadWriter) (Mk2If, error) {
|
|||||||
mk2.setTarget()
|
mk2.setTarget()
|
||||||
mk2.run = make(chan struct{})
|
mk2.run = make(chan struct{})
|
||||||
mk2.infochan = make(chan *Mk2Info)
|
mk2.infochan = make(chan *Mk2Info)
|
||||||
|
mk2.wg.Add(1)
|
||||||
go mk2.frameLock()
|
go mk2.frameLock()
|
||||||
return mk2, nil
|
return mk2, nil
|
||||||
}
|
}
|
||||||
@@ -50,38 +52,39 @@ func (mk2 *mk2Ser) frameLock() {
|
|||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-mk2.run:
|
case <-mk2.run:
|
||||||
break
|
mk2.wg.Done()
|
||||||
|
return
|
||||||
default:
|
default:
|
||||||
if mk2.locked {
|
}
|
||||||
size = mk2.readByte()
|
if mk2.locked {
|
||||||
l, err := io.ReadFull(mk2.p, frame[0:int(size)+1])
|
size = mk2.readByte()
|
||||||
|
l, err := io.ReadFull(mk2.p, frame[0:int(size)+1])
|
||||||
|
if err != nil {
|
||||||
|
mk2.addError(fmt.Errorf("Read Error: %v", err))
|
||||||
|
mk2.locked = false
|
||||||
|
} else if l != int(size)+1 {
|
||||||
|
mk2.addError(errors.New("Read Length Error"))
|
||||||
|
mk2.locked = false
|
||||||
|
} else {
|
||||||
|
mk2.handleFrame(size, frame[0:int(size+1)])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tmp := mk2.readByte()
|
||||||
|
if tmp == 0xff || tmp == 0x20 {
|
||||||
|
l, err := io.ReadFull(mk2.p, frame[0:int(size)])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mk2.addError(fmt.Errorf("Read Error: %v", err))
|
mk2.addError(fmt.Errorf("Read Error: %v", err))
|
||||||
mk2.locked = false
|
time.Sleep(1 * time.Second)
|
||||||
} else if l != int(size)+1 {
|
} else if l != int(size) {
|
||||||
mk2.addError(errors.New("Read Length Error"))
|
mk2.addError(errors.New("Read Length Error"))
|
||||||
mk2.locked = false
|
|
||||||
} else {
|
} else {
|
||||||
mk2.handleFrame(size, frame[0:int(size+1)])
|
if checkChecksum(size, tmp, frame[0:int(size)]) {
|
||||||
}
|
mk2.locked = true
|
||||||
} else {
|
log.Printf("Locked")
|
||||||
tmp := mk2.readByte()
|
|
||||||
if tmp == 0xff || tmp == 0x20 {
|
|
||||||
l, err := io.ReadFull(mk2.p, frame[0:int(size)])
|
|
||||||
if err != nil {
|
|
||||||
mk2.addError(fmt.Errorf("Read Error: %v", err))
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
} else if l != int(size) {
|
|
||||||
mk2.addError(errors.New("Read Length Error"))
|
|
||||||
} else {
|
|
||||||
if checkChecksum(size, tmp, frame[0:int(size)]) {
|
|
||||||
mk2.locked = true
|
|
||||||
log.Printf("Locked")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size = tmp
|
|
||||||
}
|
}
|
||||||
|
size = tmp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,6 +92,7 @@ func (mk2 *mk2Ser) frameLock() {
|
|||||||
// Close Mk2
|
// Close Mk2
|
||||||
func (mk2 *mk2Ser) Close() {
|
func (mk2 *mk2Ser) Close() {
|
||||||
close(mk2.run)
|
close(mk2.run)
|
||||||
|
mk2.wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns last known state with all reported errors since previous poll.
|
// Returns last known state with all reported errors since previous poll.
|
||||||
|
|||||||
Reference in New Issue
Block a user