2023-10-26 16:41:18 +08:00
|
|
|
package message_server
|
|
|
|
|
2023-10-27 14:57:37 +08:00
|
|
|
import (
|
|
|
|
"fmt"
|
2023-11-17 17:01:12 +08:00
|
|
|
"time"
|
|
|
|
|
2023-10-27 14:57:37 +08:00
|
|
|
"joylink.club/bj-rtsts-server/message_server/ms_api"
|
2023-12-20 10:37:54 +08:00
|
|
|
"joylink.club/bj-rtsts-server/mqtt"
|
2023-10-27 14:57:37 +08:00
|
|
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
|
|
|
"joylink.club/bj-rtsts-server/ts/protos/state"
|
|
|
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
2023-12-20 10:37:54 +08:00
|
|
|
"joylink.club/ecs"
|
|
|
|
"joylink.club/rtsssimulation/component"
|
|
|
|
"joylink.club/rtsssimulation/entity"
|
2023-10-27 14:57:37 +08:00
|
|
|
)
|
|
|
|
|
2023-12-20 10:37:54 +08:00
|
|
|
func NewPSLMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
|
|
|
|
mapData := memory.QueryGiData[*graphicData.RtssGraphicStorage](mapId)
|
2023-12-26 13:27:09 +08:00
|
|
|
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]综合门控箱按钮状态", mapId), func() error {
|
2023-12-20 10:37:54 +08:00
|
|
|
for _, box := range mapData.GateBoxs {
|
|
|
|
did := memory.GetMapElementId(box.Common)
|
|
|
|
state, err := collectGateBoxPSLState(vs.World, mapId, box)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2023-12-25 14:15:22 +08:00
|
|
|
mqtt.GetMsgClient().PubPSLState(vs.SimulationId, mapId, did, state)
|
2023-10-27 14:57:37 +08:00
|
|
|
}
|
2023-12-20 10:37:54 +08:00
|
|
|
return nil
|
|
|
|
}, 200*time.Millisecond)
|
2023-10-27 14:57:37 +08:00
|
|
|
}
|
|
|
|
|
2023-12-20 10:37:54 +08:00
|
|
|
func collectGateBoxPSLState(world ecs.World, mapId int32, box *graphicData.GatedBox) (*state.PushedDevicesStatus, error) {
|
2023-12-13 15:05:42 +08:00
|
|
|
did := memory.GetMapElementId(box.Common)
|
2023-12-20 10:37:54 +08:00
|
|
|
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
|
2023-12-13 15:05:42 +08:00
|
|
|
boxUid := uidStructure.GateBoxIds[did].Uid
|
2023-11-01 16:52:08 +08:00
|
|
|
mkxEntry, ok := entity.GetEntityByUid(world, boxUid)
|
|
|
|
if !ok {
|
|
|
|
return nil, fmt.Errorf("[id:%s]的门控箱实体找不到", boxUid)
|
|
|
|
}
|
|
|
|
mkx := component.MkxType.Get(mkxEntry)
|
|
|
|
var buttonStateArr []*state.ButtonState
|
|
|
|
if ok {
|
2023-12-15 17:02:42 +08:00
|
|
|
_, pslStorage := memory.QueryGiDataByName[*graphicData.PslGraphicStorage](box.RefGatedBoxMapCode)
|
2023-12-14 13:04:48 +08:00
|
|
|
btnUidMap := make(map[string]uint32, len(pslStorage.PslButtons))
|
|
|
|
for _, button := range pslStorage.PslButtons {
|
|
|
|
btnUidMap[boxUid+"_"+button.Code] = memory.GetMapElementId(button.Common)
|
|
|
|
}
|
2023-11-01 16:52:08 +08:00
|
|
|
btnArr := []*ecs.Entry{mkx.PCB, mkx.POB, mkx.PAB}
|
|
|
|
for _, btn := range btnArr {
|
|
|
|
if btn == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
buttonStateArr = append(buttonStateArr, &state.ButtonState{
|
2023-12-14 13:04:48 +08:00
|
|
|
Id: btnUidMap[component.UidType.Get(btn).Id],
|
2023-11-01 16:52:08 +08:00
|
|
|
Down: component.BitStateType.Get(btn).Val,
|
|
|
|
Active: component.BitStateType.Get(btn).Val,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return &state.PushedDevicesStatus{
|
|
|
|
All: true,
|
|
|
|
AllStatus: &state.AllDevicesStatus{
|
|
|
|
ButtonState: buttonStateArr,
|
|
|
|
},
|
|
|
|
}, nil
|
2023-10-26 16:41:18 +08:00
|
|
|
}
|