From 518c3d3f6e96b956b35ca099cf3178d92cf21520 Mon Sep 17 00:00:00 2001 From: thesai <1021828630@qq.com> Date: Wed, 12 Jun 2024 17:49:02 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E5=A2=9E]11=E5=8F=B7=E7=BA=BF?= =?UTF-8?q?=E8=81=94=E9=94=81=E9=80=9A=E4=BF=A1=E9=80=BB=E8=BE=91=EF=BC=88?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=EF=BC=89=EF=BC=9B=20[=E4=BF=AE=E6=94=B9]prot?= =?UTF-8?q?o=E7=BC=96=E8=AF=91=E6=8F=92=E4=BB=B6=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dto/data_proto/stationLayoutGraphics.pb.go | 12 +- protobuf/main.go | 2 +- third_party/interlock/beijing11/interlock.go | 63 ----------- third_party/interlock/beijing11/repo.go | 34 ++++++ third_party/interlock/beijing11/service.go | 107 ++++++++++++++++++ .../wayside/memory/wayside_memory_map_init.go | 13 +++ ts/test_simulation_manage.go | 2 +- 7 files changed, 162 insertions(+), 71 deletions(-) delete mode 100644 third_party/interlock/beijing11/interlock.go create mode 100644 third_party/interlock/beijing11/repo.go create mode 100644 third_party/interlock/beijing11/service.go diff --git a/dto/data_proto/stationLayoutGraphics.pb.go b/dto/data_proto/stationLayoutGraphics.pb.go index 0de0aa6..15b7197 100644 --- a/dto/data_proto/stationLayoutGraphics.pb.go +++ b/dto/data_proto/stationLayoutGraphics.pb.go @@ -5403,8 +5403,8 @@ type LianSuoIndexData struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // 设备id - Index int32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` //设备联锁编号 + Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // 设备id + Index uint32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` //设备联锁编号 } func (x *LianSuoIndexData) Reset() { @@ -5439,14 +5439,14 @@ func (*LianSuoIndexData) Descriptor() ([]byte, []int) { return file_stationLayoutGraphics_proto_rawDescGZIP(), []int{54} } -func (x *LianSuoIndexData) GetId() int32 { +func (x *LianSuoIndexData) GetId() uint32 { if x != nil { return x.Id } return 0 } -func (x *LianSuoIndexData) GetIndex() int32 { +func (x *LianSuoIndexData) GetIndex() uint32 { if x != nil { return x.Index } @@ -6661,8 +6661,8 @@ var file_stationLayoutGraphics_proto_rawDesc = []byte{ 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x38, 0x0a, 0x10, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x83, 0x06, 0x0a, + 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x83, 0x06, 0x0a, 0x0b, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x44, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, diff --git a/protobuf/main.go b/protobuf/main.go index 3f78414..4295649 100644 --- a/protobuf/main.go +++ b/protobuf/main.go @@ -20,7 +20,7 @@ var ( func main() { //先安装以下插件 - //go install google.golang.org/protobuf/cmd/protoc-gen-go@latest + //go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.33.0 protoFiles := getProtoFiles() // 编译proto文件为Go文件 diff --git a/third_party/interlock/beijing11/interlock.go b/third_party/interlock/beijing11/interlock.go deleted file mode 100644 index f0c6963..0000000 --- a/third_party/interlock/beijing11/interlock.go +++ /dev/null @@ -1,63 +0,0 @@ -// Package beijing11 北京11号线联锁通信 -package beijing11 - -import ( - "encoding/json" - "fmt" - "joylink.club/bj-rtsts-server/config" - "joylink.club/bj-rtsts-server/third_party/udp" - "log/slog" - "sync" -) - -var ( - initMutex = sync.Mutex{} - logTag = "[北京11号线联锁通信]" - running = false - server udp.UdpServer -) - -func Start(interlockConfig *config.InterlockConfig) { - if interlockConfig == nil || interlockConfig.Ip == "" || !interlockConfig.Open { - return - } - if running { - return - } - initMutex.Lock() - defer initMutex.Unlock() - if running { - return - } - //UDP通信设施 - server = udp.NewServer(fmt.Sprintf(":%d", interlockConfig.LocalPort), func(b []byte) { - slog.Info(fmt.Sprintf("%s收到消息:%x", logTag, b)) - frame := &FromInterlockFrame{} - err := frame.Decode(b) - if err != nil { - slog.Error(fmt.Sprintf("%s解析数据出错:%s", logTag, err)) - } else { - marshal, err := json.Marshal(frame) - if err != nil { - slog.Error(fmt.Sprintf("%s解析为json出错:%s", logTag, err)) - } else { - slog.Info(fmt.Sprintf("%s解析为json:%s", logTag, string(marshal))) - } - } - }) - err := server.Listen() - if err != nil { - panic(fmt.Sprintf("%s启动UDP服务失败:%s", logTag, err)) - } - running = true -} - -func Stop() { - initMutex.Lock() - defer initMutex.Unlock() - running = false - if server != nil { - server.Close() - server = nil - } -} diff --git a/third_party/interlock/beijing11/repo.go b/third_party/interlock/beijing11/repo.go new file mode 100644 index 0000000..93bbb6a --- /dev/null +++ b/third_party/interlock/beijing11/repo.go @@ -0,0 +1,34 @@ +package beijing11 + +// StationDeviceIndexRepo 联锁站设备索引映射 +type StationDeviceIndexRepo struct { + StationName string + TurnoutMap map[uint32]string + PsdMap map[uint32]string + EsbMap map[uint32]string + HoldTrainMap map[uint32]string + SignalMap map[uint32]string + AxleSectionMap map[uint32]string + WrzfMap map[uint32]string + FymMap map[uint32]string + SpksMap map[uint32]string + CkmMap map[uint32]string + XcjMap map[uint32]string +} + +func NewStationDeviceIndexRepo() *StationDeviceIndexRepo { + return &StationDeviceIndexRepo{ + StationName: "", + TurnoutMap: make(map[uint32]string), + PsdMap: make(map[uint32]string), + EsbMap: make(map[uint32]string), + HoldTrainMap: make(map[uint32]string), + SignalMap: make(map[uint32]string), + AxleSectionMap: make(map[uint32]string), + WrzfMap: make(map[uint32]string), + FymMap: make(map[uint32]string), + SpksMap: make(map[uint32]string), + CkmMap: make(map[uint32]string), + XcjMap: make(map[uint32]string), + } +} diff --git a/third_party/interlock/beijing11/service.go b/third_party/interlock/beijing11/service.go new file mode 100644 index 0000000..24eb842 --- /dev/null +++ b/third_party/interlock/beijing11/service.go @@ -0,0 +1,107 @@ +// Package beijing11 北京11号线联锁通信 +package beijing11 + +import ( + "encoding/json" + "fmt" + "joylink.club/bj-rtsts-server/config" + "joylink.club/bj-rtsts-server/dto/data_proto" + "joylink.club/bj-rtsts-server/third_party/udp" + "joylink.club/bj-rtsts-server/ts/simulation/wayside/memory" + "log/slog" + "sync" +) + +const logTag = "[北京11号线联锁通信]" + +var ( + initMutex = sync.Mutex{} + running = false + server udp.UdpServer + sim *memory.VerifySimulation //启动服务所使用的仿真 + iConfig *config.InterlockConfig //启动服务使用的联锁配置 + //联锁区设备的联锁编号与uid的映射 + stationMap map[string]*StationDeviceIndexRepo +) + +func init() { + memory.RegisterListener(func(uidStructure *memory.StationUidStructure, data *data_proto.RtssGraphicStorage) { + //if data.LianSuoData == nil { + // return + //} + ////初始化所有集中站设备映射结构体 + //for _, station := range data.Stations { + // stationMap[station.StationName] = NewStationDeviceIndexRepo() + //} + ////填充 + //stationIdMap := uidStructure.StationIds + ////道岔 + //turnoutUidMap := uidStructure.TurnoutIds + //turnoutIndexMap := make(map[uint32]uint32) + //for _, turnout := range data.LianSuoData.Switchs { + // turnoutIndexMap[turnout.Id] = + //} + //for _, turnout := range data.Turnouts { + // for _, stationCid := range turnout.CentralizedStations { + // stationIdStruct := stationIdMap[stationCid] + // stationDeviceIndexRepo := stationMap[stationIdStruct.Code] + // stationDeviceIndexRepo.TurnoutMap[] + // } + //} + }) +} + +func Start(interlockConfig *config.InterlockConfig, simulation *memory.VerifySimulation) { + if interlockConfig == nil || interlockConfig.Ip == "" || !interlockConfig.Open { + return + } + if running { + return + } + initMutex.Lock() + defer initMutex.Unlock() + if running { + return + } + //UDP通信设施 + server = udp.NewServer(fmt.Sprintf(":%d", interlockConfig.LocalPort), func(b []byte) { + slog.Info(fmt.Sprintf("%s收到消息:%x", logTag, b)) + frame := &FromInterlockFrame{} + err := frame.Decode(b) + if err != nil { + slog.Error(fmt.Sprintf("%s解析数据出错:%s", logTag, err)) + } else { + marshal, err := json.Marshal(frame) + if err != nil { + slog.Error(fmt.Sprintf("%s解析为json出错:%s", logTag, err)) + } else { + slog.Info(fmt.Sprintf("%s解析为json:%s", logTag, string(marshal))) + } + } + }) + err := server.Listen() + if err != nil { + panic(fmt.Sprintf("%s启动UDP服务失败:%s", logTag, err)) + } + running = true + sim = simulation + iConfig = interlockConfig +} + +func Stop() { + initMutex.Lock() + defer initMutex.Unlock() + running = false + if server != nil { + server.Close() + server = nil + } +} + +//func CollectRelayInfo() *FromInterlockFrame { +// sim.World +//} +// +//func HandleDriveInfo(frame *FromInterlockFrame) { +// +//} diff --git a/ts/simulation/wayside/memory/wayside_memory_map_init.go b/ts/simulation/wayside/memory/wayside_memory_map_init.go index 4947a52..ab7efa6 100644 --- a/ts/simulation/wayside/memory/wayside_memory_map_init.go +++ b/ts/simulation/wayside/memory/wayside_memory_map_init.go @@ -13,6 +13,15 @@ import ( "joylink.club/rtsssimulation/repository" ) +// 地图数据处理方法。目前用于不同通信协议所需数据的预处理 +type MapDataHandler func(uidStructure *StationUidStructure, data *data_proto.RtssGraphicStorage) + +var mapDataHandlerList = make([]MapDataHandler, 0) + +func RegisterListener(handler MapDataHandler) { + mapDataHandlerList = append(mapDataHandlerList, handler) +} + var giUidMap sync.Map type elementIdStructure struct { @@ -426,6 +435,10 @@ func initStationUid(data *data_proto.RtssGraphicStorage) *StationUidStructure { Uid: GenerateElementUid(city, lineId, nil, xcj.Code), } } + //通信协议预处理所需数据 + for _, handler := range mapDataHandlerList { + handler(gus, data) + } return gus } diff --git a/ts/test_simulation_manage.go b/ts/test_simulation_manage.go index 076dde9..cd2d704 100644 --- a/ts/test_simulation_manage.go +++ b/ts/test_simulation_manage.go @@ -124,7 +124,7 @@ func runThirdParty(s *memory.VerifySimulation) error { for _, c := range s.GetInterlockCodes() { switch c.Line { case "11": - beijing11.Start(c) + beijing11.Start(c, s) default: beijing12.Default(c).Start(s) }