blitzer-v2/radar_lib/reader.go
2025-08-10 16:20:52 +01:00

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)
}