rts-sim-testing-service/third_party/semi_physical_train/semi_physical_train.go

96 lines
2.5 KiB
Go

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() {
initMutex.Lock()
defer initMutex.Unlock()
_default = nil
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
}