This commit is contained in:
weizhihong 2023-11-08 11:02:57 +08:00
commit 256a9bc4cc
3 changed files with 88 additions and 34 deletions

@ -1 +1 @@
Subproject commit a6dfa6fffb7ecfe6630280a838092d208c0e3c1a
Subproject commit 45b4f4f0fe4eaf1eae6f31cca8d0b14237596bf1

View File

@ -13,12 +13,16 @@ type RsspAxle interface {
type AxleMessageManager interface {
//HandleSectionCmdMsg 计轴设备接收到联锁发送来的控制命令
HandleSectionCmdMsg(centralizedStation string, msg *message.SectionCmdMsgPack)
HandleSectionCmdMsg(city string, lineId string, centralizedStation string, msg *message.SectionCmdMsgPack)
//CollectSectionStatus 收集仿真中计轴区段状态
CollectSectionStatus() []*message.SectionStatusMsg
CollectSectionStatus(city string, lineId string, centralizedStation string) ([]*message.SectionStatusMsg, error)
}
type rsspAxle struct {
//所属城市
city string
//所属线路
lineId string
//所属集中站
centralizedStation string
//主安全通道
@ -37,7 +41,7 @@ func NewRsspAxle(masterRssp *RsspChannel, slaveRssp *RsspChannel) RsspAxle {
func (s *rsspAxle) rcvCmdMsg(data []byte) {
msg := &message.SectionCmdMsgPack{}
msg.Decode(data)
s.messageManager.HandleSectionCmdMsg(s.centralizedStation, msg)
s.messageManager.HandleSectionCmdMsg(s.city, s.lineId, s.centralizedStation, msg)
}
func (s *rsspAxle) Start(amm AxleMessageManager) error {
s.messageManager = amm

View File

@ -148,6 +148,57 @@ func (s *VerifySimulation) GetComIdByUid(uid string) string {
return es[uid].CommonId
}
// CollectSectionStatus 收集仿真中计轴区段状态
func (s *VerifySimulation) CollectSectionStatus(city string, lineId string, centralizedStation string) ([]*message.SectionStatusMsg, error) {
stationUid := GenerateElementUid(city, lineId, nil, centralizedStation)
ref := s.Repo.GetCentralizedStationRef(stationUid)
if ref == nil {
return nil, fmt.Errorf("没有找到GetCentralizedStationRef [%s]", stationUid)
}
//
codePoints := ref.SectionCodePoints
if len(codePoints) <= 0 {
return nil, fmt.Errorf("没有找到GetCentralizedStationRef[%s]的区段码表为空", stationUid)
}
//
var msg []*message.SectionStatusMsg
var axleSectionIds []string
for _, section := range codePoints {
axleSectionIds = append(axleSectionIds, section.SectionId)
}
//
as, e := fi.FindAxleSectionsStatus(s.World, axleSectionIds)
if e != nil { //从仿真中收集计轴区段状态的失败列表
return nil, e
}
//
stateMap := make(map[string]*fi.AxleSectionState)
for _, a := range as {
stateMap[a.Id] = a
}
//
sort.SliceStable(codePoints, func(i, j int) bool {
return codePoints[i].Row < codePoints[j].Row
})
//
for _, codePoint := range codePoints {
sectionState, find := stateMap[codePoint.SectionId]
if find {
state := &message.SectionStatusMsg{}
state.Rac = sectionState.Rac
state.Rjt = sectionState.Rjt
state.Rjo = sectionState.Rjo
state.Occ = sectionState.Occ
state.Clr = sectionState.Clr
msg = append(msg, state)
} else {
return nil, fmt.Errorf("仿真中没有对应区段[%s]的状态", codePoint.SectionId)
}
}
//
return msg, nil
}
// 采集动力学道岔状态
func (s *VerifySimulation) CollectDynamicsTurnoutInfo() []*message.DynamicsTurnoutInfo {
var turnoutStates []*message.DynamicsTurnoutInfo
@ -171,38 +222,37 @@ func (s *VerifySimulation) CollectDynamicsTurnoutInfo() []*message.DynamicsTurno
}
// HandleSectionCmdMsg 计轴设备接收到联锁发送来的控制命令
func (s *VerifySimulation) HandleSectionCmdMsg(centralizedStation string, msg *message.SectionCmdMsgPack) {
func (s *VerifySimulation) HandleSectionCmdMsg(city string, lineId string, centralizedStation string, msg *message.SectionCmdMsgPack) {
stationUid := GenerateElementUid(city, lineId, nil, centralizedStation)
ref := s.Repo.GetCentralizedStationRef(stationUid)
if ref == nil {
slog.Warn(fmt.Sprintf("没有找到GetCentralizedStationRef [%s]", stationUid))
return
}
//
codePoints := ref.SectionCodePoints
if len(codePoints) != len(msg.Scs) {
slog.Warn(fmt.Sprintf("本地配置区段码表个数[%d] != 联锁发送集中站[%s]的区段命令个数[%d]", len(codePoints), stationUid, len(msg.Scs)))
return
}
//
var cpSectionMap = make(map[int]*proto.CiSectionCodePoint)
for _, cp := range codePoints {
cpSectionMap[int(cp.Row)] = cp
}
//
var cmds []*fi.AxleSectionCmd
for index, cmdMsg := range msg.Scs {
cp := cpSectionMap[index]
cmd := &fi.AxleSectionCmd{}
cmd.SectionId = cp.SectionId
cmd.Drst = cmdMsg.Drst
cmd.Pdrst = cmdMsg.Pdrst
cmds = append(cmds, cmd)
}
fi.AxleSectionRstDrive(s.World, cmds)
}
// CollectSectionStatus 收集仿真中计轴区段状态
func (s *VerifySimulation) CollectSectionStatus() []*message.SectionStatusMsg {
var msg []*message.SectionStatusMsg
var axleSectionIds []string
for _, section := range s.Repo.PhysicalSectionList() {
if is, _ := section.IsAxleSection(); is {
axleSectionIds = append(axleSectionIds, section.Id())
}
}
if len(axleSectionIds) <= 0 {
return []*message.SectionStatusMsg{}
} else {
as, e := fi.FindAxleSectionsStatus(s.World, axleSectionIds)
if e != nil { //从仿真中收集计轴区段状态的失败列表
slog.Warn(e.Error())
}
for _, a := range as {
state := &message.SectionStatusMsg{}
state.Rac = a.Rac
state.Rjt = a.Rjt
state.Rjo = a.Rjo
state.Occ = a.Occ
state.Clr = a.Clr
msg = append(msg, state)
}
return msg
}
}
func handlerDynamicsTurnoutState(w ecs.World, uid string) *message.DynamicsTurnoutInfo {
entry, ok := entity.GetEntityByUid(w, uid)
if !ok {