balise detect
This commit is contained in:
parent
7a75716196
commit
2ed1f5aaed
@ -53,15 +53,14 @@ type TrainBtm struct {
|
||||
AboveBalise bool
|
||||
//列车在运行方向顺序扫描到的应答器
|
||||
//避免丢失
|
||||
scannedBalises chan *TrainBaliseTelegram
|
||||
//*TrainBaliseTelegram
|
||||
scannedBalises *telegramQueue
|
||||
//最近经过的应答器id
|
||||
lastTelegram *TrainBaliseTelegram
|
||||
}
|
||||
|
||||
const SB_LEN = 16
|
||||
|
||||
func NewTrainBtm() *TrainBtm {
|
||||
return &TrainBtm{scannedBalises: make(chan *TrainBaliseTelegram, SB_LEN)}
|
||||
return &TrainBtm{scannedBalises: &telegramQueue{}}
|
||||
}
|
||||
|
||||
// 应答器计数器加1,[0,255]
|
||||
@ -80,12 +79,11 @@ func (t *TrainBtm) baliseMessageCounterAdd1() {
|
||||
}
|
||||
}
|
||||
|
||||
func (t *TrainBtm) FindScannedBalises() <-chan *TrainBaliseTelegram {
|
||||
if len(t.scannedBalises) > 0 {
|
||||
return t.scannedBalises
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
func (t *TrainBtm) FindScannedBalises() *TrainBaliseTelegram {
|
||||
return t.scannedBalises.removeHead()
|
||||
}
|
||||
func (t *TrainBtm) ClearScannedBalises() {
|
||||
t.scannedBalises.clear()
|
||||
}
|
||||
|
||||
// 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)
|
||||
if isNewTbt {
|
||||
t.lastTelegram = telegram
|
||||
}
|
||||
//
|
||||
if isNewTbt {
|
||||
if len(t.scannedBalises) < SB_LEN {
|
||||
t.scannedBalises <- telegram
|
||||
}
|
||||
t.scannedBalises.addTail(telegram)
|
||||
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 (
|
||||
TrainPositionInfoType = ecs.NewComponentType[TrainPositionInfo]()
|
||||
TrainBtmType = ecs.NewComponentType[TrainBtm]()
|
||||
|
@ -108,12 +108,12 @@ func TrainBalisePowerAmplifierSwitch(w ecs.World, turnOn bool) error {
|
||||
}
|
||||
|
||||
// GetScannedBaliseTelegram 获取扫描到的应答器报文
|
||||
func GetScannedBaliseTelegram(w ecs.World) (<-chan *component.TrainBaliseTelegram, error) {
|
||||
result := <-ecs.Request[<-chan *component.TrainBaliseTelegram](w, func() ecs.Result[<-chan *component.TrainBaliseTelegram] {
|
||||
func GetScannedBaliseTelegram(w ecs.World) (*component.TrainBaliseTelegram, error) {
|
||||
result := <-ecs.Request[*component.TrainBaliseTelegram](w, func() ecs.Result[*component.TrainBaliseTelegram] {
|
||||
//获取当前关联CANET设备的列车
|
||||
canetTrain := findCanetTrain(w)
|
||||
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)
|
||||
@ -121,7 +121,7 @@ func GetScannedBaliseTelegram(w ecs.World) (<-chan *component.TrainBaliseTelegra
|
||||
if tbt != nil {
|
||||
return ecs.NewOkResult(tbt)
|
||||
} else {
|
||||
return ecs.NewResult[<-chan *component.TrainBaliseTelegram](nil, fmt.Errorf("此刻没有要发送的应答器报文"))
|
||||
return ecs.NewResult[*component.TrainBaliseTelegram](nil, fmt.Errorf("此刻没有要发送的应答器报文"))
|
||||
}
|
||||
})
|
||||
return result.Val, result.Err
|
||||
|
@ -51,6 +51,8 @@ func (s *BaliseDetectSystem) DetectBalise(w ecs.World, trainEntry *ecs.Entry, la
|
||||
btm.Scanning(true, tbt)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
btm.ClearScannedBalises()
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user