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

146 lines
5.1 KiB
Go
Raw Normal View History

package message_server
import (
2023-12-26 13:27:09 +08:00
"fmt"
"joylink.club/bj-rtsts-server/dto/data_proto"
"joylink.club/bj-rtsts-server/sys_error"
"time"
"joylink.club/bj-rtsts-server/dto/state_proto"
"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-26 17:16:07 +08:00
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
"joylink.club/ecs"
"joylink.club/rtsssimulation/component"
"joylink.club/rtsssimulation/entity"
)
// 综合后备盘IBP消息服务
2023-12-20 10:37:54 +08:00
func NewIBPMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
mapData := memory.QueryGiData[*data_proto.RtssGraphicStorage](mapId)
2023-12-26 13:27:09 +08:00
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]综合后备盘IBP", mapId), func() error {
for _, ibpBox := range mapData.IbpBoxs {
ibpState, err := collectIbpState(mapId, vs.World, ibpBox)
2023-12-20 10:37:54 +08:00
if err != nil {
return sys_error.New("IBP状态发送异常", err)
2023-12-20 10:37:54 +08:00
}
mqtt.GetMsgClient().PubIBPState(vs.SimulationId, mapId, ibpBox.Common.Id, ibpState)
}
2023-12-20 10:37:54 +08:00
return nil
}, 200*time.Millisecond)
}
func collectIbpState(mapId int32, world ecs.World, ibpBox *data_proto.IbpBox) (*state_proto.PushedDevicesStatus, error) {
ibpBoxUid := memory.QueryUidByMidAndComId(mapId, ibpBox.Common.Id, &data_proto.IbpBox{})
ibpMapId, ibpStorage := memory.QueryGiDataByName[*data_proto.IBPGraphicStorage](ibpBox.RefIbpMapCode)
2023-12-07 10:17:48 +08:00
ibpUidsMap := memory.QueryUidStructure[*memory.IBPUidStructure](ibpMapId)
buttonStates, err := collectIBPButtonState(world, ibpBoxUid, ibpUidsMap, ibpStorage.IbpButtons)
if err != nil {
return nil, err
}
alarmStates, err := collectIBPAlarmState(world, ibpBoxUid, ibpUidsMap, ibpStorage.IbpAlarms)
if err != nil {
return nil, err
}
lightStates, err := collectIBPLightState(world, ibpBoxUid, ibpUidsMap, ibpStorage.IbpLights)
if err != nil {
return nil, err
}
keyStates, err := collectIBPKeyState(world, ibpBoxUid, ibpUidsMap, ibpStorage.IbpKeys)
if err != nil {
return nil, err
}
return &state_proto.PushedDevicesStatus{
All: true,
AllStatus: &state_proto.AllDevicesStatus{
ButtonState: buttonStates,
AlarmState: alarmStates,
LightState: lightStates,
KeyState: keyStates,
},
}, nil
}
// 收集IBP按钮状态
func collectIBPButtonState(world ecs.World, ibpBoxUid string, uidsMap *memory.IBPUidStructure, ibpButtons []*data_proto.IBPButton) ([]*state_proto.ButtonState, error) {
var states []*state_proto.ButtonState
for _, data := range ibpButtons { // 按钮
did := memory.GetMapElementId(data.Common)
uid := ibpBoxUid + "_" + uidsMap.IbpButtonIds[did].Uid
2023-12-20 10:37:54 +08:00
entry, ok := entity.GetEntityByUid(world, uid)
if !ok {
continue
}
if entry.HasComponent(component.ButtonTag) {
states = append(states, getIBPButtonState(did, entry))
}
}
return states, nil
}
// 获取IBP盘按钮状态
func getIBPButtonState(id uint32, entry *ecs.Entry) *state_proto.ButtonState {
status := &state_proto.ButtonState{Id: id}
bit := component.BitStateType.Get(entry)
status.Down = bit.Val
2024-02-06 10:49:46 +08:00
//status.Bypass = bit.BypassEnable
// 如果按钮包含灯
if entry.HasComponent(component.SingleLightType) {
lightComponent := component.SingleLightType.Get(entry)
status.Active = component.BitStateType.Get(lightComponent.Light).Val
}
return status
}
// 收集报警器状态
func collectIBPAlarmState(world ecs.World, ibpBoxUid string, uidsMap *memory.IBPUidStructure, ibpAlarms []*data_proto.IbpAlarm) ([]*state_proto.AlarmState, error) {
var states []*state_proto.AlarmState
for _, data := range ibpAlarms { // 报警器
did := memory.GetMapElementId(data.Common)
uid := ibpBoxUid + "_" + uidsMap.IbpAlarmIds[did].Uid
2023-12-20 10:37:54 +08:00
entry, ok := entity.GetEntityByUid(world, uid)
if !ok {
continue
}
if entry.HasComponent(component.AlarmTag) {
states = append(states, &state_proto.AlarmState{Id: did, Active: component.BitStateType.Get(entry).Val})
}
}
return states, nil
}
// 收集灯状态信息
func collectIBPLightState(world ecs.World, ibpBoxUid string, uidsMap *memory.IBPUidStructure, ibpLights []*data_proto.IbpLight) ([]*state_proto.LightState, error) {
var states []*state_proto.LightState
for _, data := range ibpLights { // 指示灯
did := memory.GetMapElementId(data.Common)
uid := ibpBoxUid + "_" + uidsMap.IbpLightIds[did].Uid
2023-12-20 10:37:54 +08:00
entry, ok := entity.GetEntityByUid(world, uid)
if !ok {
continue
}
if entry.HasComponent(component.LightTag) {
states = append(states, &state_proto.LightState{Id: did, Active: component.BitStateType.Get(entry).Val})
}
}
return states, nil
}
// 收集钥匙状态
func collectIBPKeyState(world ecs.World, ibpBoxUid string, uidsMap *memory.IBPUidStructure, ibpKeys []*data_proto.IbpKey) ([]*state_proto.KeyState, error) {
var states []*state_proto.KeyState
for _, data := range ibpKeys { // 钥匙
did := memory.GetMapElementId(data.Common)
uid := ibpBoxUid + "_" + uidsMap.IbpKeyIds[did].Uid
2023-12-20 10:37:54 +08:00
entry, ok := entity.GetEntityByUid(world, uid)
if !ok {
continue
}
if entry.HasComponent(component.KeyTag) {
gearState := component.GearStateType.Get(entry)
2024-02-06 10:49:46 +08:00
states = append(states, &state_proto.KeyState{ /*Bypass: gearState.BypassEnable,*/ Id: did, Gear: gearState.Val})
}
}
return states, nil
}