104 lines
2.2 KiB
Go
104 lines
2.2 KiB
Go
package radar_lib
|
|
|
|
import (
|
|
"log"
|
|
"time"
|
|
|
|
"git.ctdo.de/henne/blitzer-v2/db"
|
|
)
|
|
|
|
var lastSpeed int = 0
|
|
var lastFlashTime time.Time = time.Now()
|
|
|
|
func (r *Radar) listenSerial() {
|
|
rcvBuf := make([]byte, 100)
|
|
lastIndex := 0
|
|
for {
|
|
buf := make([]byte, 100)
|
|
n, err := r.port.Read(buf)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
break
|
|
}
|
|
if n == 0 {
|
|
log.Println("Radar: EOF")
|
|
break
|
|
}
|
|
for i := range n {
|
|
rcvBuf[lastIndex] = buf[i]
|
|
if i > 1 && buf[i-1] == 0x0D && buf[i] == 0x0A {
|
|
go r.decodeInput(rcvBuf[0 : lastIndex+1])
|
|
lastIndex = 0
|
|
} else {
|
|
lastIndex++
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (r *Radar) decodeInput(buf []byte) {
|
|
log.Printf("RCV> %x", buf)
|
|
// trigger message
|
|
if len(buf) > 2 && buf[0] == 0x56 && buf[1] == 0x50 {
|
|
log.Printf("Radar Trigger Message Event %d", buf[2])
|
|
//if int(buf[2]) == 1 {
|
|
//if r.handler != nil {
|
|
//go r.handler(lastSpeed)
|
|
//}
|
|
//}
|
|
return
|
|
}
|
|
// config response
|
|
if len(buf) > 2 && buf[0] == 0x46 && buf[1] == 0x43 {
|
|
s := "FAIL"
|
|
if buf[3] == 0 {
|
|
s = "SUCCESS"
|
|
}
|
|
log.Printf("%s response: Code: %d", s, buf[2])
|
|
return
|
|
}
|
|
// speed information
|
|
if len(buf) > 2 && buf[0] == 0x56 && buf[1] == 0x52 {
|
|
dir := "incoming"
|
|
if buf[2]&(1<<(6)) != 0 {
|
|
dir = "outgoing"
|
|
}
|
|
overspeed := "no"
|
|
if buf[2]&(1<<(3)) == 1 {
|
|
overspeed = "yes"
|
|
}
|
|
valid := "no"
|
|
if buf[2]&(1<<(0)) == 1 {
|
|
valid = "yes"
|
|
}
|
|
log.Printf("Speed: %dkm/h (%s, Over: %s, Valid: %s)", buf[3], dir, overspeed, valid)
|
|
if r.speedHandler != nil && valid == "yes" {
|
|
lastSpeed = int(buf[3])
|
|
go r.speedHandler(int(buf[3]))
|
|
} else {
|
|
log.Printf("speedhandler = nil")
|
|
}
|
|
if r.handler != nil && lastSpeed > db.GetConfig().TriggerSpeed && valid == "yes" && time.Now().After(lastFlashTime.Add(3*time.Second)) {
|
|
lastFlashTime = time.Now()
|
|
go r.handler(lastSpeed)
|
|
}
|
|
return
|
|
}
|
|
// Target info
|
|
if len(buf) > 2 && buf[0] == 0x56 && buf[1] == 0x51 {
|
|
i := 0
|
|
if int(buf[2]) > 0 && int(buf[2]) < 11 {
|
|
for i = range int(buf[2]) {
|
|
curIndex := 4*i + 3
|
|
id := int(buf[curIndex])
|
|
distance := int(buf[curIndex+1])
|
|
speed := int(buf[curIndex+2])
|
|
energy := int(buf[curIndex+3])
|
|
log.Printf("TargetID: %d, Distance: %d, Speed: %d, Energy: %d", id, distance, speed, energy)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
log.Printf("%# x\n", buf)
|
|
}
|