rts-sim-testing-service/message_server/psl_ms.go

79 lines
2.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]PSL按钮状态", mapId), func() error {
for _, psl := range mapData.PslBoxs {
data, err := collectPslStates(vs.World, psl.RefPslMapCode, uidStructure.PslIds[psl.Common.Id].Uid)
if err != nil {
slog.Error(err.Error())
continue
}
sendMsg(vs, mapId, psl.Common.Id, data)
}
for _, psl := range mapData.GarageDoors {
data, err := collectPslStates(vs.World, psl.RefPslMapCode, uidStructure.PslIds[psl.Common.Id].Uid)
if err != nil {
slog.Error(err.Error())
continue
}
sendMsg(vs, mapId, psl.Common.Id, data)
}
for _, psl := range mapData.FloodGates {
data, err := collectPslStates(vs.World, psl.RefPslMapCode, uidStructure.PslIds[psl.Common.Id].Uid)
if err != nil {
slog.Error(err.Error())
continue
}
sendMsg(vs, mapId, psl.Common.Id, 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 collectPslStates(world ecs.World, pslMapCode string, pslUid string) (*state_proto.PushedDevicesStatus, error) {
var btnStates []*state_proto.ButtonState
_, pslStorage := memory.QueryGiDataByName[*data_proto.PslGraphicStorage](pslMapCode)
for _, button := range pslStorage.PslButtons {
btnEntry, ok := entity.GetEntityByUid(world, memory.BuildUid(pslUid, button.Code))
if !ok {
slog.Error(fmt.Sprintf("[id:%s]的PSL的按钮[code:%s]对应的实体找不到", pslUid, button.Code))
continue
}
btnStates = append(btnStates, &state_proto.ButtonState{
Id: button.Common.Id,
Down: component.BitStateType.Get(btnEntry).Val,
Active: component.BitStateType.Get(btnEntry).Val,
})
}
return &state_proto.PushedDevicesStatus{
All: true,
AllStatus: &state_proto.AllDevicesStatus{
ButtonState: btnStates,
},
}, nil
}