Added a frame locked indicator. Once frame lock is achieved, frame hunting will stop now.

This commit is contained in:
NC Thompson
2017-09-14 21:21:02 +02:00
parent 2ed6ba8947
commit f95b358bd0

View File

@@ -22,6 +22,7 @@ type mk2Ser struct {
sc []scaling sc []scaling
scN int scN int
run chan struct{} run chan struct{}
locked bool
sync.RWMutex sync.RWMutex
} }
@@ -31,6 +32,7 @@ func NewMk2Connection(dev io.ReadWriter) (Mk2If, error) {
mk2.info = &Mk2Info{} mk2.info = &Mk2Info{}
mk2.report = &Mk2Info{} mk2.report = &Mk2Info{}
mk2.scN = 0 mk2.scN = 0
mk2.locked = false
mk2.sc = make([]scaling, 0) mk2.sc = make([]scaling, 0)
mk2.setTarget() mk2.setTarget()
mk2.run = make(chan struct{}) mk2.run = make(chan struct{})
@@ -40,31 +42,43 @@ func NewMk2Connection(dev io.ReadWriter) (Mk2If, error) {
// Locks to incoming frame. // Locks to incoming frame.
func (mk2 *mk2Ser) frameLock() { func (mk2 *mk2Ser) frameLock() {
buffer := make([]byte, 1)
frame := make([]byte, 256) frame := make([]byte, 256)
var size byte var size byte
var l int
for { for {
select { select {
case <-mk2.run: case <-mk2.run:
break break
default: default:
size = buffer[0] if mk2.locked {
_, err := mk2.p.Read(buffer) size = mk2.readByte()
if err != nil { l, err := io.ReadFull(mk2.p, frame[0:int(size)+1])
mk2.addError(fmt.Errorf("Read error: %v", err)) if err != nil {
time.Sleep(1 * time.Second) 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 { } else {
if buffer[0] == 0xff || buffer[0] == 0x20 { tmp := mk2.readByte()
l, err = io.ReadFull(mk2.p, frame[0:int(size)]) 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))
time.Sleep(1 * time.Second)
} else if l != int(size) { } else if l != int(size) {
mk2.addError(errors.New("Read Length Error")) mk2.addError(errors.New("Read Length Error"))
} else { } else {
mk2.handleFrame(size, buffer[0], frame[0:int(size)]) if checkChecksum(size, tmp, frame[0:int(size)]) {
mk2.locked = true
log.Printf("Locked")
}
} }
} }
size = tmp
} }
} }
} }
@@ -83,52 +97,64 @@ func (mk2 *mk2Ser) GetMk2Info() *Mk2Info {
return mk2.report return mk2.report
} }
func (mk2 *mk2Ser) readByte() byte {
buffer := make([]byte, 1)
_, err := io.ReadFull(mk2.p, buffer)
if err != nil {
mk2.addError(fmt.Errorf("Read error: %v", err))
return 0
}
return buffer[0]
}
// Adds error to error slice. // Adds error to error slice.
func (mk2 *mk2Ser) addError(err error) { func (mk2 *mk2Ser) addError(err error) {
if mk2.info.Errors == nil { if mk2.info.Errors == nil {
mk2.info.Errors = make([]error, 0) mk2.info.Errors = make([]error, 0)
} }
mk2.info.Errors = append(mk2.info.Errors, err) mk2.info.Errors = append(mk2.info.Errors, err)
mk2.info.Valid = false
} }
// Updates report. // Updates report.
func (mk2 *mk2Ser) updateReport() { func (mk2 *mk2Ser) updateReport() {
mk2.Lock() mk2.Lock()
defer mk2.Unlock() defer mk2.Unlock()
mk2.info.Valid = true
*mk2.report = *mk2.info *mk2.report = *mk2.info
mk2.info.Errors = nil mk2.info.Errors = nil
} }
// Checks for valid frame and chooses decoding. // Checks for valid frame and chooses decoding.
func (mk *mk2Ser) handleFrame(l, t byte, frame []byte) { func (mk2 *mk2Ser) handleFrame(l byte, frame []byte) {
if checkChecksum(l, t, frame) { if checkChecksum(l, frame[0], frame[1:]) {
switch t { switch frame[0] {
case 0xff: case 0xff:
switch frame[0] { switch frame[1] {
case 0x56: // V case 0x56: // V
mk.versionDecode(frame[1:]) mk2.versionDecode(frame[2:])
case 0x57: case 0x57:
switch frame[1] { switch frame[2] {
case 0x8e: case 0x8e:
mk.scaleDecode(frame[1:]) mk2.scaleDecode(frame[2:])
case 0x85: case 0x85:
mk.stateDecode(frame[1:]) mk2.stateDecode(frame[2:])
} }
case 0x4C: // L case 0x4C: // L
mk.ledDecode(frame[1:]) mk2.ledDecode(frame[2:])
} }
case 0x20: case 0x20:
switch frame[4] { switch frame[5] {
case 0x0C: case 0x0C:
mk.dcDecode(frame) mk2.dcDecode(frame[1:])
case 0x08: case 0x08:
mk.acDecode(frame) mk2.acDecode(frame[1:])
} }
} }
} else {
log.Printf("Failed")
mk2.locked = false
} }
} }
@@ -176,6 +202,7 @@ func (mk *mk2Ser) scaleDecode(frame []byte) {
// Decode the version number // Decode the version number
func (mk *mk2Ser) versionDecode(frame []byte) { func (mk *mk2Ser) versionDecode(frame []byte) {
mk.info.Version = 0 mk.info.Version = 0
mk.info.Valid = true
for i := 0; i < 4; i++ { for i := 0; i < 4; i++ {
mk.info.Version += uint32(frame[i]) << uint(i) * 8 mk.info.Version += uint32(frame[i]) << uint(i) * 8
} }