列车btm调整重构

This commit is contained in:
tiger_zhou 2024-08-13 17:32:49 +08:00
parent 98310f427b
commit 30c932f178
8 changed files with 1382 additions and 1311 deletions

File diff suppressed because it is too large Load Diff

@ -1 +1 @@
Subproject commit 73e7f83cfae775d13e60b6882231b69adab58b5c Subproject commit 12df28cc3716e39d24ddcada44d1d4a4233405d4

@ -1 +1 @@
Subproject commit 61b489dcf80d992891e3266d0224fbe05fd49d0f Subproject commit ec6c571a37999ad7bab8f613deeb207b202468f0

View File

@ -3,7 +3,6 @@ package can_btm
import ( import (
"fmt" "fmt"
"joylink.club/bj-rtsts-server/config" "joylink.club/bj-rtsts-server/config"
"joylink.club/bj-rtsts-server/const/balise_const"
"joylink.club/bj-rtsts-server/dto/state_proto" "joylink.club/bj-rtsts-server/dto/state_proto"
"joylink.club/bj-rtsts-server/third_party/message" "joylink.club/bj-rtsts-server/third_party/message"
"joylink.club/bj-rtsts-server/third_party/udp" "joylink.club/bj-rtsts-server/third_party/udp"
@ -11,7 +10,6 @@ import (
"joylink.club/rtsssimulation/entity" "joylink.club/rtsssimulation/entity"
"log/slog" "log/slog"
"sort" "sort"
"strings"
"sync" "sync"
"time" "time"
) )
@ -55,61 +53,20 @@ type btmCanetClient struct {
baliseDetector *BaliseDetector baliseDetector *BaliseDetector
} }
func (s *btmCanetClient) FindNotSendState() (state_proto.BTMState, bool) { func (s *btmCanetClient) FindNotSendState(train *state_proto.TrainState) (*state_proto.BTMState, byte, byte, byte) {
s.baliseDetector.eqLock.Lock() s.baliseDetector.eqLock.Lock()
defer s.baliseDetector.eqLock.Unlock() defer s.baliseDetector.eqLock.Unlock()
detector := s.baliseDetector cache := train.BtmBaliseCache
for _, info := range detector.eq { for _, btmCache := range cache.BaliseList {
if info != nil && !info.IsSend { if btmCache != nil && !btmCache.IsSend {
info.IsSend = true
return s.getStateFromDeta(info, uint32(detector.baliseCounter), uint32(detector.messageCounter), detector.aboveBalise), true
} ndsn := BaliseCounterAdd(cache.Dsn)
cache.Dsn = uint32(ndsn)
} return btmCache, ndsn, byte(cache.BaliseCount), byte(cache.MessageCounter)
return state_proto.BTMState{}, false
}
/*
func (s *btmCanetClient) GetAllData() {
detector := s.baliseDetector
for _, info := range detector.eq {
slog.Info("获取应答器信息 id:%v,是否发送:%v", info.BaliseId)
} }
} }
*/
func (s *btmCanetClient) getStateFromDeta(info *BtmAntennaScanningBaliseInfo, bc, mc uint32, aboveBalise bool) state_proto.BTMState {
var telegram string
var tel128 string
var dis int64
var baliseId string
if /*detector.aboveBalise &&*/ info != nil && len(info.telegram) != 0 {
telegram = fmt.Sprintf("%X", info.telegram)
tel128 = fmt.Sprintf("%X", info.telegram128)
dis = info.Distance
baliseId = info.BaliseId
} else {
telegram = strings.Repeat("00", balise_const.UserTelegramByteLen)
tel128 = strings.Repeat("00", balise_const.TelegramByteLen)
}
return state_proto.BTMState{
BaliseId: baliseId,
DataSerialNumber: uint32(s.dsn),
BaliseCount: bc,
MessageCounter: mc,
Telegram: telegram,
Telegram128: tel128,
Distance: dis,
AboveBalise: aboveBalise,
}
}
func (s *btmCanetClient) GetState() state_proto.BTMState {
detector := s.baliseDetector
info := detector.eq[len(detector.eq)-1]
return s.getStateFromDeta(info, uint32(detector.baliseCounter), uint32(detector.messageCounter), detector.aboveBalise)
return nil, 0, 0, 0
} }
type BtmClock struct { type BtmClock struct {
@ -127,12 +84,9 @@ type BtmCanetClient interface {
Stop() Stop()
//HandleTrainHeadPositionInfo 处理收到列车位置信息 //HandleTrainHeadPositionInfo 处理收到列车位置信息
HandleTrainHeadPositionInfo(w ecs.World, vobcBtm *state_proto.VobcBtmState, h *TrainHeadPositionInfo) HandleTrainHeadPositionInfo(w ecs.World, vobcBtm *state_proto.VobcBtmState, h *TrainHeadPositionInfo)
// GetState 获取BTM显示状态 + btm最新的状态 HandleTrainHeadPositionInfoForTrain(w ecs.World, train *state_proto.TrainBtmCache, h *TrainHeadPositionInfo)
//
// Deprecated 请从列车的btmBaliseCache中获取 FindNotSendState(train *state_proto.TrainState) (*state_proto.BTMState, byte, byte, byte)
GetState() state_proto.BTMState
//GetAllData()
FindNotSendState() (state_proto.BTMState, bool)
} }
var ( var (
@ -148,6 +102,19 @@ func Default() BtmCanetClient {
} }
return btmClient return btmClient
} }
func (s *btmCanetClient) HandleTrainHeadPositionInfoForTrain(w ecs.World, btmCache *state_proto.TrainBtmCache, h *TrainHeadPositionInfo) {
wd := entity.GetWorldData(w)
repo := wd.Repo
h2 := &TrainHeadPositionInfo{
TrainId: h.TrainId,
Up: h.Up,
Link: h.OldLink,
LinkOffset: h.OldLinkOffset,
Speed: h.Speed,
Acceleration: h.Acceleration}
s.baliseDetector.newDetect(wd, repo, h, h2, btmCache)
//s.baliseDetector.detect2(wd, repo, h, h2, vobcBtm)
}
// HandleTrainHeadPositionInfo 处理来自动力学的列车位置信息 // HandleTrainHeadPositionInfo 处理来自动力学的列车位置信息
func (s *btmCanetClient) HandleTrainHeadPositionInfo(w ecs.World, vobcBtm *state_proto.VobcBtmState, h *TrainHeadPositionInfo) { func (s *btmCanetClient) HandleTrainHeadPositionInfo(w ecs.World, vobcBtm *state_proto.VobcBtmState, h *TrainHeadPositionInfo) {

View File

@ -78,7 +78,37 @@ func (t *BaliseDetector) tryRebind(th *TrainHeadPositionInfo) {
//slog.Debug(fmt.Sprintf("列车[%s]与CAN-BTM绑定", t.trianId)) //slog.Debug(fmt.Sprintf("列车[%s]与CAN-BTM绑定", t.trianId))
} }
} }
func (t *BaliseDetector) newDetect(wd *component.WorldData, repo *repository.Repository, th, th2 *TrainHeadPositionInfo, btmCache *state_proto.TrainBtmCache) {
//BTM天线中心点运行信息
curAntennaRi := t.createBtmAntennaRunningInfo(wd, repo, th) //目前车头
curAntennaRi2 := t.createBtmAntennaRunningInfo(wd, repo, th2) //上次车头
var startBalises []*repository.Transponder
//startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th.Up, curAntennaRi2.LinkId, th2.LinkOffset, th.LinkOffset)
startBalises = t.searchBalisesFromBetweenLinkPosition(repo, th2.Up, curAntennaRi2.LinkId, curAntennaRi2.LinkOffset, curAntennaRi.LinkOffset)
balises := make([]*repository.Transponder, 0)
for _, balise := range startBalises {
find := false
for _, transponder := range balises {
if transponder.Id() == balise.Id() {
find = true
break
}
}
if !find {
balises = append(balises, balise)
}
}
if len(balises) > 0 {
balise := balises[0]
telegram, utel := t.rcvTelegram(wd, balise.Id())
t.addNewExpectedBalise(balise, btmCache, telegram, utel)
}
}
func (t *BaliseDetector) detect2(wd *component.WorldData, repo *repository.Repository, th, th2 *TrainHeadPositionInfo, vobcBtm *state_proto.VobcBtmState) { func (t *BaliseDetector) detect2(wd *component.WorldData, repo *repository.Repository, th, th2 *TrainHeadPositionInfo, vobcBtm *state_proto.VobcBtmState) {
t.tryRebind(th) t.tryRebind(th)
@ -198,6 +228,15 @@ func (t *BaliseDetector) baliseMessageCounterAdd1() {
} }
} }
func BaliseCounterAdd(counter uint32) byte {
c := byte(counter)
c++
if c > 255 {
c = 0
}
return c
}
// BTM天线接收应答器报文(线程不安全) // BTM天线接收应答器报文(线程不安全)
func (t *BaliseDetector) rcvTelegram(wd *component.WorldData, baliseId string) ([]byte, []byte) { func (t *BaliseDetector) rcvTelegram(wd *component.WorldData, baliseId string) ([]byte, []byte) {
@ -224,6 +263,37 @@ func (t *BaliseDetector) rcvTelegram(wd *component.WorldData, baliseId string) (
} }
return nil, nil return nil, nil
} }
func (t *BaliseDetector) addNewExpectedBalise(balise *repository.Transponder, btmCache *state_proto.TrainBtmCache, telegram, userTelegram []byte) bool {
t.eqLock.Lock()
defer t.eqLock.Unlock()
bl := btmCache.BaliseList
for _, tt := range bl {
if tt != nil && tt.BaliseId == balise.Id() {
return false
}
}
for i := 1; i < len(bl); i++ {
bl[i-1] = bl[i]
}
unpack := false
bc := BaliseCounterAdd(btmCache.BaliseCount)
mc := btmCache.MessageCounter
if userTelegram != nil && len(userTelegram) > 0 {
mc = uint32(BaliseCounterAdd(mc))
unpack = true
}
btmCache.BaliseCount = uint32(bc)
btmCache.MessageCounter = mc
//存入队尾
bl[len(bl)-1] = &state_proto.BTMState{BaliseId: balise.Id(),
Telegram: fmt.Sprintf("%x", userTelegram),
Telegram128: fmt.Sprintf("%x", telegram),
Unpack: unpack,
BaliseType: int32(balise.BaliseType().Number()),
AboveBalise: true}
return true
}
// true-新增false-更新 // true-新增false-更新
func (t *BaliseDetector) addExpectedBalise(curExpect *BtmAntennaScanningBaliseInfo) bool { func (t *BaliseDetector) addExpectedBalise(curExpect *BtmAntennaScanningBaliseInfo) bool {

View File

@ -48,8 +48,6 @@ type TrainPcSim interface {
CreateOrRemoveTrain(train *state_proto.TrainState, isCreate bool) error CreateOrRemoveTrain(train *state_proto.TrainState, isCreate bool) error
// TrainPluseCount 计算列车脉冲 // TrainPluseCount 计算列车脉冲
TrainPluseCount(sta *state_proto.TrainState, h1, h2, t1, t2 float32) TrainPluseCount(sta *state_proto.TrainState, h1, h2, t1, t2 float32)
DsnAddAndReturn() byte
} }
type TrainPcSimManage interface { type TrainPcSimManage interface {
@ -77,7 +75,6 @@ type trainPcSimService struct {
context context.Context context context.Context
trainPcSimManage TrainPcSimManage trainPcSimManage TrainPcSimManage
configs []config.VehiclePCSimConfig configs []config.VehiclePCSimConfig
btmDsn uint8
} }
var ( var (
@ -111,13 +108,6 @@ func (d *trainPcSimService) TrueService() bool {
func (d *trainPcSimService) ServiceDesc() string { func (d *trainPcSimService) ServiceDesc() string {
return Name return Name
} }
func (d *trainPcSimService) DsnAddAndReturn() byte {
defer initLock.Unlock()
initLock.Lock()
returnVal := d.btmDsn
d.btmDsn = returnVal + 1
return returnVal
}
func FindTrainPcSimClientKey2(t *state_proto.TrainState) string { func FindTrainPcSimClientKey2(t *state_proto.TrainState) string {
return t.ConnState.TypeName return t.ConnState.TypeName
@ -455,14 +445,12 @@ func (d *trainPcSimService) SendDriverActive(train *state_proto.TrainState) {
func (d *trainPcSimService) SendHandleSwitch(oldTraction, oldBrakeForce int64, tractionState bool, train *state_proto.TrainState) { func (d *trainPcSimService) SendHandleSwitch(oldTraction, oldBrakeForce int64, tractionState bool, train *state_proto.TrainState) {
trainClient, trainDataErr := d.findTrainConn(train) trainClient, trainDataErr := d.findTrainConn(train)
if trainDataErr != nil { if trainDataErr != nil {
slog.Error(fmt.Sprintf("发送列车牵引知道失败未找到对应的列车id:%v", train.Id)) slog.Error(fmt.Sprintf("发送列车牵引失败未找到对应的列车id:%v", train.Id))
return return
} }
tc := train.ConnState tc := train.ConnState
if tc.Conn { if tc.Conn {
vobc := train.VobcState vobc := train.VobcState
msg := &message.TrainPcSimBaseMessage{} msg := &message.TrainPcSimBaseMessage{}
newTraction := vobc.TractionForce newTraction := vobc.TractionForce
if tractionState { if tractionState {

View File

@ -100,6 +100,7 @@ func AddTrainStateNew(vs *VerifySimulation, status *state_proto.TrainState, conf
status.TailDeviceId = vs.GetComIdByUid(tailDeviceId) status.TailDeviceId = vs.GetComIdByUid(tailDeviceId)
status.TailOffset = tailDeviceOffset status.TailOffset = tailDeviceOffset
status.TailDevicePort = tailDevicePort status.TailDevicePort = tailDevicePort
status.BtmBaliseCache = &state_proto.TrainBtmCache{BaliseList: make([]*state_proto.BTMState, 3)}
//初始化列车参数状态 //初始化列车参数状态
createOrUpdateStateDynamicConfig(status, configTrainData, trainEndsA, trainEndsB) createOrUpdateStateDynamicConfig(status, configTrainData, trainEndsA, trainEndsB)
tl := configTrainData.TrainLoad tl := configTrainData.TrainLoad
@ -113,7 +114,7 @@ func AddTrainStateNew(vs *VerifySimulation, status *state_proto.TrainState, conf
//status.TrainActiveDirection = trainActDir //status.TrainActiveDirection = trainActDir
status.Tcc = initTrainTcc(vs) status.Tcc = initTrainTcc(vs)
status.VobcBtm = &state_proto.VobcBtmState{TelegramState: make([]*state_proto.VobcBtmState_TelegramState, 0), History: make(map[uint32]*state_proto.VobcBtmState_VobcBtmHistoryState)} status.VobcBtm = &state_proto.VobcBtmState{TelegramState: make([]*state_proto.VobcBtmState_TelegramState, 3), History: make(map[uint32]*state_proto.VobcBtmState_VobcBtmHistoryState)}
//slog.Debug("列车初始化", "trainIndex", trainIndex, "linkId", linkId, "loffset", loffset) //slog.Debug("列车初始化", "trainIndex", trainIndex, "linkId", linkId, "loffset", loffset)
linkIdInt, _ := strconv.Atoi(linkId) linkIdInt, _ := strconv.Atoi(linkId)
err := dynamics.Default().RequestAddTrain(&message.InitTrainInfo{ err := dynamics.Default().RequestAddTrain(&message.InitTrainInfo{
@ -343,9 +344,7 @@ func UpdateTrainStateByDynamics(vs *VerifySimulation, trainId string, info *mess
sta.OldLinkOffset = outLinkOffset sta.OldLinkOffset = outLinkOffset
sta.OldLink = outLinkId sta.OldLink = outLinkId
} }
if sta.BtmBaliseCache == nil {
sta.BtmBaliseCache = make([]*state_proto.BTMState, 0)
}
updateTrainBtmPosition(vs, info, sta, outLinkId, outLinkOffset) updateTrainBtmPosition(vs, info, sta, outLinkId, outLinkOffset)
//slog.Info(fmt.Sprintf("动力学,当前速度(米/秒):%v,加速度:%v,位移距离:%v", info.Speed, info.Acceleration, info.Displacement)) //slog.Info(fmt.Sprintf("动力学,当前速度(米/秒):%v,加速度:%v,位移距离:%v", info.Speed, info.Acceleration, info.Displacement))
if sta.OldLink != outLinkId { if sta.OldLink != outLinkId {
@ -412,8 +411,7 @@ func updateTrainActiveDirFromDynamic(vs *VerifySimulation, info *message.Dynamic
func updateTrainBtmPosition(vs *VerifySimulation, info *message.DynamicsTrainInfo, sta *state_proto.TrainState, outLinkId string, outLinkOffset int64) { func updateTrainBtmPosition(vs *VerifySimulation, info *message.DynamicsTrainInfo, sta *state_proto.TrainState, outLinkId string, outLinkOffset int64) {
// 更新BTM中列车位置信息 // 更新BTM中列车位置信息
//isup := sta.TrainActiveDirection == 1 //isup := sta.TrainActiveDirection == 1
can_btm.Default().HandleTrainHeadPositionInfoForTrain(vs.World, sta.BtmBaliseCache, &fi.TrainHeadPositionInfo{
can_btm.Default().HandleTrainHeadPositionInfo(vs.World, sta.VobcBtm, &fi.TrainHeadPositionInfo{
TrainId: sta.Id, TrainId: sta.Id,
Up: info.Up, Up: info.Up,
Link: outLinkId, Link: outLinkId,
@ -423,10 +421,20 @@ func updateTrainBtmPosition(vs *VerifySimulation, info *message.DynamicsTrainInf
OldLinkOffset: sta.OldLinkOffset, OldLinkOffset: sta.OldLinkOffset,
OldLink: sta.OldLink, OldLink: sta.OldLink,
}) })
state := can_btm.Default().GetState() /*can_btm.Default().HandleTrainHeadPositionInfo(vs.World, sta.VobcBtm, &fi.TrainHeadPositionInfo{
if sta.BtmState == nil || sta.BtmState.BaliseId != state.BaliseId { TrainId: sta.Id,
sta.BtmState = &state Up: info.Up,
} Link: outLinkId,
LinkOffset: outLinkOffset,
Speed: info.Speed,
Acceleration: info.Acceleration,
OldLinkOffset: sta.OldLinkOffset,
OldLink: sta.OldLink,
})*/
/* state := can_btm.Default().GetState()
if sta.BtmState == nil || sta.BtmState.BaliseId != state.BaliseId {
sta.BtmState = &state
}*/
} }
@ -490,28 +498,6 @@ func removeTrain(vs *VerifySimulation, trainId string, train *state_proto.TrainS
return fi.RemoveTrainFromWorld(vs.World, trainId) return fi.RemoveTrainFromWorld(vs.World, trainId)
} }
// 删除列车状态
/*func RemoveTrainState(vs *VerifySimulation, id string) {
allTrainMap := &vs.Memory.Status.TrainStateMap
d, ok := allTrainMap.Load(id)
if ok {
t := d.(*state_proto.TrainState)
trainIndex, _ := strconv.ParseUint(id, 10, 16)
err := dynamics.Default().RequestRemoveTrain(&message.RemoveTrainReq{
TrainIndex: uint16(trainIndex),
})
if err != nil {
panic(dto.ErrorDto{Code: dto.DynamicsError, Message: err.Error()})
}
// 从仿真内存中移除列车
t.Show = false
// 移除车
fi.RemoveTrainFromWorld(vs.World, id)
allTrainMap.Store(id, t)
} else {
panic(fmt.Sprintf("列车【%s】不存在", id))
}
}*/
func RemoveTrainState(vs *VerifySimulation, id string) { func RemoveTrainState(vs *VerifySimulation, id string) {
allTrainMap := &vs.Memory.Status.TrainStateMap allTrainMap := &vs.Memory.Status.TrainStateMap
d, ok := allTrainMap.Load(id) d, ok := allTrainMap.Load(id)

View File

@ -6,7 +6,6 @@ import (
"fmt" "fmt"
uuid2 "github.com/google/uuid" uuid2 "github.com/google/uuid"
"joylink.club/bj-rtsts-server/config" "joylink.club/bj-rtsts-server/config"
"joylink.club/bj-rtsts-server/const/balise_const"
"joylink.club/bj-rtsts-server/dto/data_proto" "joylink.club/bj-rtsts-server/dto/data_proto"
"joylink.club/bj-rtsts-server/dto/request_proto" "joylink.club/bj-rtsts-server/dto/request_proto"
"joylink.club/bj-rtsts-server/dto/state_proto" "joylink.club/bj-rtsts-server/dto/state_proto"
@ -17,7 +16,6 @@ import (
train_pc_sim "joylink.club/bj-rtsts-server/third_party/train_pc_sim" train_pc_sim "joylink.club/bj-rtsts-server/third_party/train_pc_sim"
"log/slog" "log/slog"
"math" "math"
"strings"
"time" "time"
) )
@ -512,7 +510,7 @@ func (s *VerifySimulation) reportTrainMockInitMsg(train *state_proto.TrainState,
ebTce := controlEBBtn(vobc, true, jjzdBtn) ebTce := controlEBBtn(vobc, true, jjzdBtn)
tce = append(tce, ebTce...) tce = append(tce, ebTce...)
tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, state}}) tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, state}})
tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_TRACTION_CUTED, 1}}) //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_TRACTION_CUTED, 1}})
//tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.NOT_BREAK, 0}}) //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.NOT_BREAK, 0}})
//tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{0x38, 0}}) //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{0x38, 0}})
//tce = append(tce, message.TrainPcSimBaseMessage{Type: message.RECIVE_TRAIN_HAND_KEY_CANCLE_FORWARD}) //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.RECIVE_TRAIN_HAND_KEY_CANCLE_FORWARD})
@ -706,11 +704,11 @@ func (s *VerifySimulation) TrainBtmQuery(train *state_proto.TrainState, data []b
slog.Error("列车btm查询报文长度错误:", len(data)) slog.Error("列车btm查询报文长度错误:", len(data))
return return
} }
if train.BtmState == nil { balise, dsn, bc, mc := can_btm.Default().FindNotSendState(train)
slog.Warn(fmt.Sprintf("列车暂时未获取到应答器信息,无法进行btm查询列车id:%v", train.Id)) /*if balise == nil {
//slog.Warn(fmt.Sprintf("列车暂时未获取到应答器信息,无法进行btm查询列车id:%v", train.Id))
return return
} }*/
notSendBtm, ok := can_btm.Default().FindNotSendState()
trainAtm := message.NewBtmHeadFrame(data) trainAtm := message.NewBtmHeadFrame(data)
atpReq := &message.AtpRequestFrame{} atpReq := &message.AtpRequestFrame{}
@ -720,18 +718,17 @@ func (s *VerifySimulation) TrainBtmQuery(train *state_proto.TrainState, data []b
} }
cl := clock(atpReq) cl := clock(atpReq)
dsn := train_pc_sim.Default().DsnAddAndReturn()
//btmRepFrame := createBtmStatus(trainAtm.CanId.ID4, train.BtmState, atpReq, cl, dsn) btmRepFrame := createBtmStatus(trainAtm.CanId.ID4, balise, atpReq, cl, dsn, bc, mc)
btmRepFrame := createBtmStatus(trainAtm.CanId.ID4, &notSendBtm, atpReq, cl, dsn)
//slog.Info(fmt.Sprintf("id1:%x,id2:%x,id3:%x,id4:%x,resendRequest:%v,reqTime:%v,dsn:%v", trainAtm.CanId.ID1, trainAtm.CanId.ID2, trainAtm.CanId.ID3, trainAtm.CanId.ID4, atpReq.ResendRequest, atpReq.Time, dsn))
if atpReq.ResendRequest == 2 { if atpReq.ResendRequest == 2 {
slog.Info(fmt.Sprintf("rrrrrrrrrrrrrrrrr:%v", atpReq.String())) slog.Info(fmt.Sprintf("rrrrrrrrrrrrrrrrr:%v", atpReq.String()))
//重新发送 //重新发送
//if len(train.BtmState.BaliseTelegramForPcSimResend) > 0 { //if len(train.BtmState.BaliseTelegramForPcSimResend) > 0 {
if len(notSendBtm.BaliseTelegramForPcSimResend) > 0 { if len(balise.BaliseTelegramForPcSimResend) > 0 {
slog.Info(fmt.Sprintf("rrrrrrrrrrrrrrrrr111111111:%v", atpReq.String())) slog.Info(fmt.Sprintf("rrrrrrrrrrrrrrrrr111111111:%v", atpReq.String()))
//dd, _ := hex.DecodeString(train.BtmState.BaliseTelegramForPcSimResend) //dd, _ := hex.DecodeString(train.BtmState.BaliseTelegramForPcSimResend)
dd, _ := hex.DecodeString(notSendBtm.BaliseTelegramForPcSimResend) dd, _ := hex.DecodeString(balise.BaliseTelegramForPcSimResend)
train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_HAS_DATA, dd) train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_HAS_DATA, dd)
} else { } else {
slog.Info(fmt.Sprintf("rrrrrrrrrrrrrrrrr2222222222222:%v", atpReq.String())) slog.Info(fmt.Sprintf("rrrrrrrrrrrrrrrrr2222222222222:%v", atpReq.String()))
@ -744,31 +741,20 @@ func (s *VerifySimulation) TrainBtmQuery(train *state_proto.TrainState, data []b
train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData) train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData)
} }
} else { } else {
timeSyncF := message.NewBtmTimeSyncCheckFrame(trainAtm.CanId.ID4) timeSyncF := message.NewBtmTimeSyncCheckFrame(trainAtm.CanId.ID4)
timeSyncF.T2 = cl.BtmTk timeSyncF.T2 = cl.BtmTk
timeSyncF.T3 = cl.TkNow() timeSyncF.T3 = cl.TkNow()
//telCount := strings.Count(train.BtmState.Telegram, "00")
telCount := strings.Count(notSendBtm.Telegram, "00") if balise == nil {
//if telCount >= balise_const.UserTelegramByteLen || train.BtmState.IsSend { //无应答器数据
if !ok && (notSendBtm.Telegram == "" || telCount >= balise_const.UserTelegramByteLen) {
//slog.Info(fmt.Sprintf("准备发送无数据应答器id:%v", train.BtmState.BaliseId))
queryData := make([]byte, 0) queryData := make([]byte, 0)
queryData = append(queryData, btmRepFrame.EncodeBtmAtp().Encode()...) queryData = append(queryData, btmRepFrame.EncodeBtmAtp().Encode()...)
queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...) queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...)
train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData) train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData)
//train.BtmState.IsSend = true } else if !balise.IsSend {
} else /*if !train.BtmState.IsSend*/ balise.IsSend = true
if !notSendBtm.IsSend { slog.Info(fmt.Sprintf("准备发送应答id:%v,uuid :%v,接受时间:%v,发送时间:%v , 数据:%v 经过:%v,解报文:%v", balise.BaliseId, uuid, ts, time.Now().UnixMilli(), balise.Telegram, bc, mc))
slog.Info(fmt.Sprintf("准备发送应答id:%v,uuid :%v,接受时间:%v,发送时间:%v , 数据:%v 经过:%v,解报文:%v", notSendBtm.BaliseId, uuid, ts, time.Now().UnixMilli(), notSendBtm.Telegram, notSendBtm.BaliseCount, notSendBtm.MessageCounter)) aliseData, _ := hex.DecodeString(balise.Telegram)
//slog.Info(fmt.Sprintf("准备发送应答id:%v,uuid :%v,消耗时间:%v , 数据:%v", train.BtmState.BaliseId, uuid, ts-time.Now().UnixMilli(), train.BtmState.Telegram))
/* defer func() {
train.BtmState.IsSend = true
}()*/
//有数据
//aliseData, _ := hex.DecodeString(train.BtmState.Telegram)
aliseData, _ := hex.DecodeString(notSendBtm.Telegram)
stateRepFrame := btmRepFrame.EncodeBtmAtp() stateRepFrame := btmRepFrame.EncodeBtmAtp()
statusDataCf, statusDataCfOk := message.CreateBtmAtpDataRspFramesData(stateRepFrame, aliseData, false, cl.BtmTk, cl.BtmTk, cl.BtmTk) statusDataCf, statusDataCfOk := message.CreateBtmAtpDataRspFramesData(stateRepFrame, aliseData, false, cl.BtmTk, cl.BtmTk, cl.BtmTk)
if statusDataCfOk { if statusDataCfOk {
@ -778,7 +764,7 @@ func (s *VerifySimulation) TrainBtmQuery(train *state_proto.TrainState, data []b
queryData = append(queryData, stateRepFrame.Encode()...) queryData = append(queryData, stateRepFrame.Encode()...)
queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...) queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...)
queryData = append(queryData, statusDataCf...) //数据帧包含结束帧 queryData = append(queryData, statusDataCf...) //数据帧包含结束帧
train.BtmState.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf) balise.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf)
train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData) train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData)
} else { } else {
slog.Error("列车pc仿真 BtmCanetClient应答帧、数据帧编码失败") slog.Error("列车pc仿真 BtmCanetClient应答帧、数据帧编码失败")
@ -787,22 +773,22 @@ func (s *VerifySimulation) TrainBtmQuery(train *state_proto.TrainState, data []b
} }
} }
func createBtmStatus(canIdSn byte, btmState *state_proto.BTMState, atpReq *message.AtpRequestFrame, cl can_btm.BtmClock, dsn byte) *message.BtmStatusRspFrame { func createBtmStatus(canIdSn byte, btmState *state_proto.BTMState, atpReq *message.AtpRequestFrame, cl can_btm.BtmClock, dsn, baliseCount, messageCount byte) *message.BtmStatusRspFrame {
statusF := message.NewBtmStatusRspFrame(canIdSn) statusF := message.NewBtmStatusRspFrame(canIdSn)
statusF.PowerAmplifierOn = true statusF.PowerAmplifierOn = true
statusF.PowerAmplifierFailure = false statusF.PowerAmplifierFailure = false
statusF.AtpReqCrcCheckWrong = !atpReq.Crc16CheckOk statusF.AtpReqCrcCheckWrong = !atpReq.Crc16CheckOk
statusF.AntennaFault = false statusF.AntennaFault = false
statusF.BaliseCounter = byte(btmState.BaliseCount) statusF.BaliseCounter = baliseCount
statusF.MessageCounter = byte(btmState.MessageCounter) statusF.MessageCounter = messageCount
//statusF.TkTimeA = cl.TkNow() //statusF.TkTimeA = cl.TkNow()
statusF.TkTimeA = cl.BtmTk statusF.TkTimeA = cl.BtmTk
statusF.DetailedCode = 0 statusF.DetailedCode = 0
if btmState.AboveBalise { if btmState != nil && btmState.AboveBalise {
statusF.DetailedCode = 0x07 statusF.DetailedCode = 0x07
} }
btmState.DataSerialNumber = uint32(dsn) //btmState.DataSerialNumber = uint32(dsn)
statusF.Dsn = dsn statusF.Dsn = dsn
return statusF return statusF
} }