package semi_physical_train import ( "fmt" "sync" "joylink.club/bj-rtsts-server/config" "joylink.club/bj-rtsts-server/third_party/message" "joylink.club/bj-rtsts-server/third_party/udp" ) // 半实物仿真列车通信接口 type SemiPhysicalTrain interface { // 启动半实物仿真消息处理 Start(manager SemiPhysicalMessageManager) // 停止半实物仿真消息处理 Stop() // 发送列车控制消息 SendTrainControlMessage(info *message.DynamicsTrainInfo) } type SemiPhysicalMessageManager interface { // 处理半实物仿真列车控制消息 HandleSemiPhysicalTrainControlMsg(b []byte) // 获取半实物启动参数 GetSemiPhysicalRunConfig() *config.VobcConfig } type semiPhysicalTrainImpl struct { trainControlUdpServer udp.UdpServer trainSpeedInfoUdpClient udp.UdpClient manager SemiPhysicalMessageManager runConfig *config.VobcConfig } func (s *semiPhysicalTrainImpl) handleTrainControlMsg(b []byte) { handler := s.manager if handler != nil { handler.HandleSemiPhysicalTrainControlMsg(b) } } func (s *semiPhysicalTrainImpl) Start(manager SemiPhysicalMessageManager) { if manager == nil { panic("启动半实物消息服务错误: SemiPhysicalMessageManager不能为nil") } if s.manager != nil { panic("启动半实物消息服务错误: 存在正在运行的任务") } s.runConfig = manager.GetSemiPhysicalRunConfig() if s.runConfig == nil || s.runConfig.Ip == "" || !s.runConfig.Open { return } // 初始化客户端、服务端 s.initSemiPhysical() s.manager = manager } func (s *semiPhysicalTrainImpl) Stop() { if s.trainControlUdpServer != nil { s.trainControlUdpServer.Close() } if s.trainSpeedInfoUdpClient != nil { s.trainSpeedInfoUdpClient.Close() } s.manager = nil } func (s *semiPhysicalTrainImpl) SendTrainControlMessage(info *message.DynamicsTrainInfo) { sendMsg := &message.TrainSpeedMsg{} sendMsg.DynamicsDecode(info) s.trainSpeedInfoUdpClient.Send(sendMsg.Encode()) } func (s *semiPhysicalTrainImpl) initSemiPhysical() { s.trainSpeedInfoUdpClient = udp.NewClient(fmt.Sprintf("%v:%v", s.runConfig.Ip, s.runConfig.RemotePort)) s.trainControlUdpServer = udp.NewServer(fmt.Sprintf(":%d", s.runConfig.LocalPort), s.handleTrainControlMsg) s.trainControlUdpServer.Listen() } var _default SemiPhysicalTrain var initMutex sync.Mutex func Default() SemiPhysicalTrain { initMutex.Lock() defer initMutex.Unlock() if _default == nil { _default = &semiPhysicalTrainImpl{} } return _default }