rts-sim-testing-service/message_server/psl_ms.go
thesai a24ae0a14e
All checks were successful
local-test分支打包构建docker并发布运行 / Docker-Build (push) Successful in 1m32s
【bug】mqtt没有正确发送PSL状态
2024-04-08 09:25:06 +08:00

79 lines
2.6 KiB
Go
Raw 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
}