126 lines
4.3 KiB
Go
126 lines
4.3 KiB
Go
package message_server
|
||
|
||
import (
|
||
"fmt"
|
||
"joylink.club/bj-rtsts-server/dto/state_proto"
|
||
"log/slog"
|
||
"time"
|
||
|
||
"joylink.club/bj-rtsts-server/dto/data_proto"
|
||
"joylink.club/bj-rtsts-server/message_server/ms_api"
|
||
"joylink.club/bj-rtsts-server/mqtt"
|
||
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||
"joylink.club/ecs"
|
||
"joylink.club/rtsssimulation/component"
|
||
"joylink.club/rtsssimulation/entity"
|
||
)
|
||
|
||
func NewPSLMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
|
||
mapData := memory.QueryGiData[*data_proto.RtssGraphicStorage](mapId)
|
||
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]PSL按钮状态", mapId), func() error {
|
||
for _, box := range mapData.GateBoxs {
|
||
did := memory.GetMapElementId(box.Common)
|
||
data, err := collectGateBoxPSLState(vs.World, mapId, box)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
sendMsg(vs, mapId, did, data)
|
||
}
|
||
for _, ckm := range mapData.GarageDoors {
|
||
did := memory.GetMapElementId(ckm.Common)
|
||
data, err := collectGarageDoorBoxPSLState(vs.World, mapId, ckm)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
sendMsg(vs, mapId, did, data)
|
||
}
|
||
return nil
|
||
}, 200*time.Millisecond)
|
||
}
|
||
|
||
func sendMsg(vs *memory.VerifySimulation, mapId int32, pslId uint32, data *state_proto.PushedDevicesStatus) {
|
||
err := mqtt.GetMsgClient().PubPSLState(vs.SimulationId, mapId, pslId, data)
|
||
if err != nil {
|
||
slog.Error(fmt.Sprintf("发送PSL状态出错:%s", err.Error()))
|
||
}
|
||
}
|
||
|
||
func collectGateBoxPSLState(world ecs.World, mapId int32, box *data_proto.GatedBox) (*state_proto.PushedDevicesStatus, error) {
|
||
did := memory.GetMapElementId(box.Common)
|
||
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
|
||
boxUid := uidStructure.PslIds[did].Uid
|
||
mkxEntry, ok := entity.GetEntityByUid(world, boxUid)
|
||
if !ok {
|
||
return nil, fmt.Errorf("[id:%s]的门控箱实体找不到", boxUid)
|
||
}
|
||
mkx := component.MkxType.Get(mkxEntry)
|
||
var buttonStateArr []*state_proto.ButtonState
|
||
if ok {
|
||
_, pslStorage := memory.QueryGiDataByName[*data_proto.PslGraphicStorage](box.RefGatedBoxMapCode)
|
||
btnUidMap := make(map[string]uint32, len(pslStorage.PslButtons))
|
||
for _, button := range pslStorage.PslButtons {
|
||
btnUidMap[boxUid+"_"+button.Code] = memory.GetMapElementId(button.Common)
|
||
}
|
||
btnArr := []*ecs.Entry{mkx.PCB, mkx.PCBPL, mkx.POB, mkx.POBPL, mkx.PAB, mkx.PABPL, mkx.WRZF, mkx.WRZFPL,
|
||
mkx.QKQR, mkx.QKQRPL, mkx.MPL, mkx.JXTCPL}
|
||
for _, btn := range btnArr {
|
||
if btn == nil {
|
||
continue
|
||
}
|
||
btnState := component.BitStateType.Get(btn)
|
||
buttonStateArr = append(buttonStateArr, &state_proto.ButtonState{
|
||
Id: btnUidMap[component.UidType.Get(btn).Id],
|
||
Down: btnState.Val,
|
||
Active: btnState.Val,
|
||
//Bypass: btnState.BypassEnable,
|
||
})
|
||
}
|
||
}
|
||
return &state_proto.PushedDevicesStatus{
|
||
All: true,
|
||
AllStatus: &state_proto.AllDevicesStatus{
|
||
ButtonState: buttonStateArr,
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
func collectGarageDoorBoxPSLState(world ecs.World, mapId int32, box *data_proto.GarageDoor) (*state_proto.PushedDevicesStatus, error) {
|
||
return nil, nil
|
||
//did := memory.GetMapElementId(box.Common)
|
||
//uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
|
||
//boxUid := uidStructure.PslIds[did].Uid
|
||
//mkxEntry, ok := entity.GetEntityByUid(world, boxUid)
|
||
//if !ok {
|
||
// return nil, fmt.Errorf("[id:%s]的门控箱实体找不到", boxUid)
|
||
//}
|
||
//mkx := component.MkxType.Get(mkxEntry)
|
||
//var buttonStateArr []*state_proto.ButtonState
|
||
//if ok {
|
||
// _, pslStorage := memory.QueryGiDataByName[*data_proto.PslGraphicStorage](box.RefGatedBoxMapCode)
|
||
// btnUidMap := make(map[string]uint32, len(pslStorage.PslButtons))
|
||
// for _, button := range pslStorage.PslButtons {
|
||
// btnUidMap[boxUid+"_"+button.Code] = memory.GetMapElementId(button.Common)
|
||
// }
|
||
// btnArr := []*ecs.Entry{mkx.PCB, mkx.PCBPL, mkx.POB, mkx.POBPL, mkx.PAB, mkx.PABPL, mkx.WRZF, mkx.WRZFPL,
|
||
// mkx.QKQR, mkx.QKQRPL, mkx.MPL, mkx.JXTCPL}
|
||
// for _, btn := range btnArr {
|
||
// if btn == nil {
|
||
// continue
|
||
// }
|
||
// btnState := component.BitStateType.Get(btn)
|
||
// buttonStateArr = append(buttonStateArr, &state_proto.ButtonState{
|
||
// Id: btnUidMap[component.UidType.Get(btn).Id],
|
||
// Down: btnState.Val,
|
||
// Active: btnState.Val,
|
||
// //Bypass: btnState.BypassEnable,
|
||
// })
|
||
// }
|
||
//}
|
||
//return &state_proto.PushedDevicesStatus{
|
||
// All: true,
|
||
// AllStatus: &state_proto.AllDevicesStatus{
|
||
// ButtonState: buttonStateArr,
|
||
// },
|
||
//}, nil
|
||
}
|