balise detect

This commit is contained in:
xzb 2023-11-29 17:28:33 +08:00
parent 7a75716196
commit 2ed1f5aaed
3 changed files with 45 additions and 20 deletions

View File

@ -53,15 +53,14 @@ type TrainBtm struct {
AboveBalise bool AboveBalise bool
//列车在运行方向顺序扫描到的应答器 //列车在运行方向顺序扫描到的应答器
//避免丢失 //避免丢失
scannedBalises chan *TrainBaliseTelegram //*TrainBaliseTelegram
scannedBalises *telegramQueue
//最近经过的应答器id //最近经过的应答器id
lastTelegram *TrainBaliseTelegram lastTelegram *TrainBaliseTelegram
} }
const SB_LEN = 16
func NewTrainBtm() *TrainBtm { func NewTrainBtm() *TrainBtm {
return &TrainBtm{scannedBalises: make(chan *TrainBaliseTelegram, SB_LEN)} return &TrainBtm{scannedBalises: &telegramQueue{}}
} }
// 应答器计数器加1[0,255] // 应答器计数器加1[0,255]
@ -80,12 +79,11 @@ func (t *TrainBtm) baliseMessageCounterAdd1() {
} }
} }
func (t *TrainBtm) FindScannedBalises() <-chan *TrainBaliseTelegram { func (t *TrainBtm) FindScannedBalises() *TrainBaliseTelegram {
if len(t.scannedBalises) > 0 { return t.scannedBalises.removeHead()
return t.scannedBalises }
} else { func (t *TrainBtm) ClearScannedBalises() {
return nil t.scannedBalises.clear()
}
} }
// Scanning BTM通过车载应答器天线接收到应答器报文 // Scanning BTM通过车载应答器天线接收到应答器报文
@ -94,12 +92,7 @@ func (t *TrainBtm) Scanning(aboveBalise bool, telegram *TrainBaliseTelegram) {
isNewTbt := telegram != nil && (t.lastTelegram == nil || t.lastTelegram.Up != telegram.Up || t.lastTelegram.BaliseId != telegram.BaliseId) isNewTbt := telegram != nil && (t.lastTelegram == nil || t.lastTelegram.Up != telegram.Up || t.lastTelegram.BaliseId != telegram.BaliseId)
if isNewTbt { if isNewTbt {
t.lastTelegram = telegram t.lastTelegram = telegram
} t.scannedBalises.addTail(telegram)
//
if isNewTbt {
if len(t.scannedBalises) < SB_LEN {
t.scannedBalises <- telegram
}
t.baliseMessageCounterAdd1() t.baliseMessageCounterAdd1()
} }
// //
@ -111,6 +104,36 @@ func (t *TrainBtm) Scanning(aboveBalise bool, telegram *TrainBaliseTelegram) {
} }
} }
type telegramQueue struct {
queue [3]*TrainBaliseTelegram
}
func (q *telegramQueue) moveHead() {
q.queue[0], q.queue[1], q.queue[2] = q.queue[1], q.queue[2], nil
}
func (q *telegramQueue) addTail(t *TrainBaliseTelegram) {
if q.queue[len(q.queue)-1] == nil {
q.queue[len(q.queue)-1] = t
} else {
q.moveHead()
q.queue[len(q.queue)-1] = t
}
}
func (q *telegramQueue) removeHead() *TrainBaliseTelegram {
for i, rt := range q.queue {
if rt != nil {
q.queue[i] = nil
return rt
}
}
return nil
}
func (q *telegramQueue) clear() {
for i, _ := range q.queue {
q.queue[i] = nil
}
}
var ( var (
TrainPositionInfoType = ecs.NewComponentType[TrainPositionInfo]() TrainPositionInfoType = ecs.NewComponentType[TrainPositionInfo]()
TrainBtmType = ecs.NewComponentType[TrainBtm]() TrainBtmType = ecs.NewComponentType[TrainBtm]()

View File

@ -108,12 +108,12 @@ func TrainBalisePowerAmplifierSwitch(w ecs.World, turnOn bool) error {
} }
// GetScannedBaliseTelegram 获取扫描到的应答器报文 // GetScannedBaliseTelegram 获取扫描到的应答器报文
func GetScannedBaliseTelegram(w ecs.World) (<-chan *component.TrainBaliseTelegram, error) { func GetScannedBaliseTelegram(w ecs.World) (*component.TrainBaliseTelegram, error) {
result := <-ecs.Request[<-chan *component.TrainBaliseTelegram](w, func() ecs.Result[<-chan *component.TrainBaliseTelegram] { result := <-ecs.Request[*component.TrainBaliseTelegram](w, func() ecs.Result[*component.TrainBaliseTelegram] {
//获取当前关联CANET设备的列车 //获取当前关联CANET设备的列车
canetTrain := findCanetTrain(w) canetTrain := findCanetTrain(w)
if canetTrain == nil { if canetTrain == nil {
return ecs.NewResult[<-chan *component.TrainBaliseTelegram](nil, fmt.Errorf("系统中当前不存在与CANET设备关联的列车实体")) return ecs.NewResult[*component.TrainBaliseTelegram](nil, fmt.Errorf("系统中当前不存在与CANET设备关联的列车实体"))
} }
// //
train := component.TrainBtmType.Get(canetTrain) train := component.TrainBtmType.Get(canetTrain)
@ -121,7 +121,7 @@ func GetScannedBaliseTelegram(w ecs.World) (<-chan *component.TrainBaliseTelegra
if tbt != nil { if tbt != nil {
return ecs.NewOkResult(tbt) return ecs.NewOkResult(tbt)
} else { } else {
return ecs.NewResult[<-chan *component.TrainBaliseTelegram](nil, fmt.Errorf("此刻没有要发送的应答器报文")) return ecs.NewResult[*component.TrainBaliseTelegram](nil, fmt.Errorf("此刻没有要发送的应答器报文"))
} }
}) })
return result.Val, result.Err return result.Val, result.Err

View File

@ -51,6 +51,8 @@ func (s *BaliseDetectSystem) DetectBalise(w ecs.World, trainEntry *ecs.Entry, la
btm.Scanning(true, tbt) btm.Scanning(true, tbt)
} }
} }
} else {
btm.ClearScannedBalises()
} }
} }