Compare commits
2 Commits
f9ffa1cf10
...
efe1ff69c9
Author | SHA1 | Date | |
---|---|---|---|
|
efe1ff69c9 | ||
3d66efe8f4 |
28
third_party/interlock/beijing11/msg.go
vendored
28
third_party/interlock/beijing11/msg.go
vendored
@ -2,6 +2,7 @@ package beijing11
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"github.com/snksoft/crc"
|
||||||
)
|
)
|
||||||
|
|
||||||
const ( //不知道对不对,问也不回,先瞎写吧
|
const ( //不知道对不对,问也不回,先瞎写吧
|
||||||
@ -10,11 +11,12 @@ const ( //不知道对不对,问也不回,先瞎写吧
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SignalAspect_No = 0x01 //灭灯
|
SignalAspect_No = 0x99 //灭灯,这个值目前未知,先用一个应该没被使用的值占位
|
||||||
SignalAspect_H = 0x02 //红灯
|
SignalAspect_H = 0x01 //红灯
|
||||||
SignalAspect_L = 0x03 //绿灯
|
SignalAspect_L = 0x04 //绿灯
|
||||||
SignalAspect_U = 0x04 //黄灯
|
SignalAspect_U = 0x02 //黄灯
|
||||||
SignalAspect_HU = 0x05 //红黄
|
SignalAspect_HU = 0x03 //红黄
|
||||||
|
SignalAspect_B = 0x08 //白灯
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetStateByte(state bool) byte {
|
func GetStateByte(state bool) byte {
|
||||||
@ -265,10 +267,12 @@ func (t *ToInterlockFrame) encode() []byte {
|
|||||||
for _, state := range t.SPKSStates {
|
for _, state := range t.SPKSStates {
|
||||||
data = state.encode(data)
|
data = state.encode(data)
|
||||||
}
|
}
|
||||||
////车库门,数量0
|
//填充字节
|
||||||
//data = binary.BigEndian.AppendUint16(data, 0)
|
fillSlice := make([]byte, 19)
|
||||||
//CRC32,不校验,随便填
|
fillSlice[2] = 1
|
||||||
data = append(data, 0xff, 0xff, 0xff, 0xff)
|
data = append(data, fillSlice...)
|
||||||
|
//CRC32
|
||||||
|
data = binary.BigEndian.AppendUint32(data, crc32(data[3:]))
|
||||||
//填充报文长度
|
//填充报文长度
|
||||||
binary.BigEndian.PutUint16(data[1:3], uint16(len(data)-7))
|
binary.BigEndian.PutUint16(data[1:3], uint16(len(data)-7))
|
||||||
return data
|
return data
|
||||||
@ -387,3 +391,9 @@ type XcjState struct {
|
|||||||
BackConfirm byte //返回确认状态
|
BackConfirm byte //返回确认状态
|
||||||
BackMode byte //模式
|
BackMode byte //模式
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var crcHash = crc.NewHash(&crc.Parameters{Width: 32, Polynomial: 0x4c11db7, Init: 0x0, ReflectIn: false, ReflectOut: false, FinalXor: 0x0})
|
||||||
|
|
||||||
|
func crc32(data []byte) uint32 {
|
||||||
|
return uint32(crcHash.CalculateCRC(data))
|
||||||
|
}
|
||||||
|
137
third_party/interlock/beijing11/msg_test.go
vendored
137
third_party/interlock/beijing11/msg_test.go
vendored
@ -3,41 +3,25 @@ package beijing11
|
|||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"joylink.club/bj-rtsts-server/util/myreader"
|
"joylink.club/bj-rtsts-server/util/myreader"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestFromInterlockFrame_Decode(t *testing.T) {
|
func TestFromInterlockFrame_Decode(t *testing.T) {
|
||||||
str := "82009a3c0163010006000100000200000300000600000700000800000200010000050000020001aaaa0005aaaa00000008000401000501000601000701001801001901001a01001b010010000480000580000680000780000800000900000a00001d00001e00001f000020000021000022000023000024000025000000000000040001aaaa0002aaaa0003aaaa0004aaaa00000000000000000000000040ace569"
|
str := "58bea4c65e0e583f5bdedc310800450000bd030c0000801100003d0b0a0d3d0b7814413c40d800a9fcf182009a3c016301000600010000020000030000060000070000080000020001000005aa00020001aaaa0005aaaa00000008000401000501000601000701001801001901001a01001b010010000400000500000600000700000800000900000a00001d00001e00001f000020000021000022000023000024000025000000000000040001aaaa0002aaaa0003aaaa0004aaaa0000000000000000000000004c428d88"
|
||||||
data, err := hex.DecodeString(str)
|
data, err := hex.DecodeString(str)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
frame := &FromInterlockFrame{}
|
if data[0] != 0x82 {
|
||||||
err = frame.Decode(data)
|
data = data[42:] //去掉wireshark抓包携带的额外字节
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
marshal, err := json.Marshal(frame)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Println(string(marshal))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestToInterlockFrame_Decode(t *testing.T) {
|
|
||||||
str := "83009663013c0100060001010002010003010006010007010008010002000155ffaaaaaa000555ffaaaaaa00020001aaaa0005aaaa00000008000401000501000601000701001801001901001a01001b010010000440000540000640000740000840000940000a40001d40001e40001f40002040002140002240002340002440002540000000000004000155aa000255aa000355aa000455aaffffffff"
|
|
||||||
data, err := hex.DecodeString(str)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
}
|
||||||
reader := myreader.NewReader(data)
|
reader := myreader.NewReader(data)
|
||||||
fmt.Printf("%x【报文类型】\t\n", reader.ReadByte())
|
fmt.Printf("%x\t【报文类型】\n", reader.ReadByte())
|
||||||
fmt.Printf("%x【报文长度】\t\n", reader.ReadBytes(2))
|
fmt.Printf("%x\t【报文长度】\n", reader.ReadBytes(2))
|
||||||
fmt.Printf("%x【轨旁编号】\t\n", reader.ReadBytes(2))
|
fmt.Printf("%x\t【联锁编号】\n", reader.ReadBytes(2))
|
||||||
fmt.Printf("%x【联锁编号】\t\n", reader.ReadBytes(2))
|
fmt.Printf("%x\t【轨旁编号】\n", reader.ReadBytes(2))
|
||||||
{ //道岔
|
{ //道岔
|
||||||
deviceNum := reader.ReadBytes(2)
|
deviceNum := reader.ReadBytes(2)
|
||||||
fmt.Printf("%x\t", deviceNum)
|
fmt.Printf("%x\t", deviceNum)
|
||||||
@ -50,7 +34,110 @@ func TestToInterlockFrame_Decode(t *testing.T) {
|
|||||||
deviceNum := reader.ReadBytes(2)
|
deviceNum := reader.ReadBytes(2)
|
||||||
fmt.Printf("%x\t", deviceNum)
|
fmt.Printf("%x\t", deviceNum)
|
||||||
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
||||||
fmt.Printf("%x ", reader.ReadBytes(8))
|
fmt.Printf("%x ", reader.ReadBytes(3))
|
||||||
|
}
|
||||||
|
fmt.Println("【屏蔽门】")
|
||||||
|
}
|
||||||
|
{ //紧急停车按钮
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
||||||
|
fmt.Printf("%x ", reader.ReadBytes(4))
|
||||||
|
}
|
||||||
|
fmt.Println("【紧急停车按钮】")
|
||||||
|
}
|
||||||
|
{ //扣车按钮
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
fmt.Println("【扣车按钮】")
|
||||||
|
}
|
||||||
|
{ //信号机
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
||||||
|
fmt.Printf("%x ", reader.ReadBytes(3))
|
||||||
|
}
|
||||||
|
fmt.Println("【信号机】")
|
||||||
|
}
|
||||||
|
{ //计轴区段
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
||||||
|
fmt.Printf("%x ", reader.ReadBytes(3))
|
||||||
|
}
|
||||||
|
fmt.Println("【计轴区段】")
|
||||||
|
}
|
||||||
|
{ //无人折返
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
fmt.Println("【无人折返】")
|
||||||
|
}
|
||||||
|
{ //防淹门
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
fmt.Println("【防淹门】")
|
||||||
|
}
|
||||||
|
{ //SPKS
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
||||||
|
fmt.Printf("%x ", reader.ReadBytes(4))
|
||||||
|
}
|
||||||
|
fmt.Println("【SPKS】")
|
||||||
|
}
|
||||||
|
{ //车库门
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
fmt.Println("【车库门】")
|
||||||
|
}
|
||||||
|
{ //预留
|
||||||
|
deviceNum := reader.ReadBytes(10)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
fmt.Println("【预留】")
|
||||||
|
}
|
||||||
|
//CRC32
|
||||||
|
fmt.Printf("%x【CRC32】\n", reader.ReadBytes(4))
|
||||||
|
//{ //json
|
||||||
|
// frame := &FromInterlockFrame{}
|
||||||
|
// err = frame.Decode(data)
|
||||||
|
// if err != nil {
|
||||||
|
// t.Fatal(err)
|
||||||
|
// }
|
||||||
|
// marshal, err := json.Marshal(frame)
|
||||||
|
// if err != nil {
|
||||||
|
// t.Fatal(err)
|
||||||
|
// }
|
||||||
|
// fmt.Println(string(marshal))
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestToInterlockFrame_Decode(t *testing.T) {
|
||||||
|
str := "583f5bdedc3158bea4c65e0e0800450000f6dfe9400040115dd63d0b78143d0b0a0dd341413c00e2e8c88300d363013c0100060001010002010003010006010007010008010002000102eeaaaaaa000502eeaaaaaa00020001aa000005aa0000000011000101000201000301000401000501000601000701001501001601001701001801001901001a01001b01002901002a01002c010015000100000200000300000400000500000600000700000800000900000a00001b00001c00001d00001e00001f000020000021000022000023000024000025000000000000040001aaff0002aaff0003aaff0004aaff00000100000000000000000000000000000000f38414ee"
|
||||||
|
data, err := hex.DecodeString(str)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if data[0] != 0x83 {
|
||||||
|
data = data[42:] //去掉wireshark抓包携带的额外字节
|
||||||
|
}
|
||||||
|
reader := myreader.NewReader(data)
|
||||||
|
fmt.Printf("%x\t【报文类型】\n", reader.ReadByte())
|
||||||
|
fmt.Printf("%x\t【报文长度】\n", reader.ReadBytes(2))
|
||||||
|
fmt.Printf("%x\t【轨旁编号】\n", reader.ReadBytes(2))
|
||||||
|
fmt.Printf("%x\t【联锁编号】\n", reader.ReadBytes(2))
|
||||||
|
{ //道岔
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
||||||
|
fmt.Printf("%x ", reader.ReadBytes(3))
|
||||||
|
}
|
||||||
|
fmt.Println("【道岔】")
|
||||||
|
}
|
||||||
|
{ //屏蔽门
|
||||||
|
deviceNum := reader.ReadBytes(2)
|
||||||
|
fmt.Printf("%x\t", deviceNum)
|
||||||
|
for i := 0; i < int(binary.BigEndian.Uint16(deviceNum)); i++ {
|
||||||
|
fmt.Printf("%x ", reader.ReadBytes(7))
|
||||||
}
|
}
|
||||||
fmt.Println("【屏蔽门】")
|
fmt.Println("【屏蔽门】")
|
||||||
}
|
}
|
||||||
@ -102,5 +189,5 @@ func TestToInterlockFrame_Decode(t *testing.T) {
|
|||||||
fmt.Println("【SPKS】")
|
fmt.Println("【SPKS】")
|
||||||
}
|
}
|
||||||
//CRC32
|
//CRC32
|
||||||
fmt.Printf("%x【CRC32】", reader.ReadBytes(4))
|
fmt.Printf("%x【CRC32】\n", reader.ReadBytes(reader.Len()))
|
||||||
}
|
}
|
||||||
|
647
third_party/interlock/beijing11/service.go
vendored
647
third_party/interlock/beijing11/service.go
vendored
@ -10,8 +10,10 @@ import (
|
|||||||
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||||||
"joylink.club/rtsssimulation/component"
|
"joylink.club/rtsssimulation/component"
|
||||||
"joylink.club/rtsssimulation/entity"
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
"joylink.club/rtsssimulation/fi"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"math"
|
"math"
|
||||||
|
"net"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
@ -31,13 +33,12 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type serviceContext struct {
|
type serviceContext struct {
|
||||||
cancelFunc context.CancelFunc //用来结束各个协程的函数
|
cancelFunc context.CancelFunc //用来结束各个协程的函数
|
||||||
client udp.UdpClient //向联锁发送数据的客户端
|
ioAddr *net.UDPAddr //向联锁发送数据的客户端
|
||||||
server udp.UdpServer //接收联锁数据的服务端
|
server udp.UdpServer //接收联锁数据的服务端(同时也是向联锁发送数据的udp客户端)
|
||||||
sim *memory.VerifySimulation //启动服务所使用的仿真
|
sim *memory.VerifySimulation //启动服务所使用的仿真
|
||||||
iConfig config.InterlockConfig //启动服务使用的联锁配置
|
iConfig config.InterlockConfig //启动服务使用的联锁配置
|
||||||
deviceTable *StationDeviceIndexTable //联锁站的设备ID表,key-车站名
|
deviceTable *StationDeviceIndexTable //联锁站的设备ID表,key-车站名
|
||||||
driveMsgSlice []*FromInterlockFrame //驱动消息切片
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Start(interlockConfig config.InterlockConfig, simulation *memory.VerifySimulation) {
|
func Start(interlockConfig config.InterlockConfig, simulation *memory.VerifySimulation) {
|
||||||
@ -55,13 +56,16 @@ func Start(interlockConfig config.InterlockConfig, simulation *memory.VerifySimu
|
|||||||
if serviceCtx != nil {
|
if serviceCtx != nil {
|
||||||
panic(fmt.Sprintf("%s重复启动联锁站[%s]通信服务", logTag, interlockConfig.Code))
|
panic(fmt.Sprintf("%s重复启动联锁站[%s]通信服务", logTag, interlockConfig.Code))
|
||||||
}
|
}
|
||||||
//UDP客户端
|
//仿真IO地址
|
||||||
client := udp.NewClient(fmt.Sprintf("%s:%d", interlockConfig.Ip, interlockConfig.RemotePort))
|
ioAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", interlockConfig.Ip, interlockConfig.RemotePort))
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("%s解析IP地址出错:%s", logTag, err))
|
||||||
|
}
|
||||||
|
|
||||||
ctx, cancelFunc := context.WithCancel(context.Background())
|
ctx, cancelFunc := context.WithCancel(context.Background())
|
||||||
serviceCtx = &serviceContext{
|
serviceCtx = &serviceContext{
|
||||||
cancelFunc: cancelFunc,
|
cancelFunc: cancelFunc,
|
||||||
client: client,
|
ioAddr: ioAddr,
|
||||||
sim: simulation,
|
sim: simulation,
|
||||||
iConfig: interlockConfig,
|
iConfig: interlockConfig,
|
||||||
deviceTable: table,
|
deviceTable: table,
|
||||||
@ -69,7 +73,7 @@ func Start(interlockConfig config.InterlockConfig, simulation *memory.VerifySimu
|
|||||||
//UDP服务端
|
//UDP服务端
|
||||||
server := udp.NewServer(fmt.Sprintf(":%d", interlockConfig.LocalPort), serviceCtx.handleDriveMsg)
|
server := udp.NewServer(fmt.Sprintf(":%d", interlockConfig.LocalPort), serviceCtx.handleDriveMsg)
|
||||||
serviceCtx.server = server
|
serviceCtx.server = server
|
||||||
err := server.Listen()
|
err = server.Listen()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("%s启动UDP服务失败:%s", logTag, err))
|
panic(fmt.Sprintf("%s启动UDP服务失败:%s", logTag, err))
|
||||||
}
|
}
|
||||||
@ -86,201 +90,220 @@ func (s *serviceContext) handleDriveMsg(data []byte) {
|
|||||||
logger().Error("解析数据出错", "error", err)
|
logger().Error("解析数据出错", "error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if len(s.driveMsgSlice) < 2 {
|
|
||||||
if frame.InterlockCode == 0x3c01 || frame.InterlockCode == 0x3c02 {
|
wd := entity.GetWorldData(s.sim.World)
|
||||||
s.driveMsgSlice = append(s.driveMsgSlice, frame)
|
for _, cmd := range frame.TurnoutData.CmdList {
|
||||||
|
uid := s.deviceTable.TurnoutMap[cmd.Id].uid
|
||||||
|
if cmd.Cmd == 0x55 {
|
||||||
|
err = fi.DriveTurnoutDCOn(s.sim.World, uid)
|
||||||
|
} else if cmd.Cmd == 0xaa {
|
||||||
|
err = fi.DriveTurnoutFCOn(s.sim.World, uid)
|
||||||
|
} else {
|
||||||
|
err = fi.DriveTurnoutDCOff(s.sim.World, uid)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
logger().Error("驱动道岔出错", "error", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, cmd := range frame.PSDData.CmdList {
|
||||||
|
row := s.deviceTable.PsdMap[cmd.Id]
|
||||||
|
entry := wd.EntityMap[row.uid]
|
||||||
|
circuit := component.PsdCircuitType.Get(entry)
|
||||||
|
logger().Info(fmt.Sprintf("屏蔽门命令:%x", cmd.Cmd))
|
||||||
|
switch cmd.Cmd {
|
||||||
|
case 0xAA: //短编组开门
|
||||||
|
wd.SetQdBit(row.relateDeviceMap[S], true)
|
||||||
|
wd.SetQdBit(row.relateDeviceMap[L], false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(circuit.GMJ).Id, false)
|
||||||
|
case 0xBB: //长编组开门
|
||||||
|
wd.SetQdBit(row.relateDeviceMap[S], false)
|
||||||
|
wd.SetQdBit(row.relateDeviceMap[L], true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(circuit.GMJ).Id, false)
|
||||||
|
case 0x55: //关门
|
||||||
|
wd.SetQdBit(row.relateDeviceMap[S], false)
|
||||||
|
wd.SetQdBit(row.relateDeviceMap[L], false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(circuit.GMJ).Id, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, cmd := range frame.ESBData.CmdList {
|
||||||
|
uid := s.deviceTable.EsbMap[cmd.Id].uid
|
||||||
|
esb := s.sim.Repo.FindEsb(uid)
|
||||||
|
if cmd.JjtcplCmd == 0x55 {
|
||||||
|
err = fi.PressDownButton(s.sim.World, esb.PlaId())
|
||||||
|
if err != nil {
|
||||||
|
logger().Error("驱动ESB出错", "error", err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
err = fi.PressUpButton(s.sim.World, esb.PlaId())
|
||||||
|
if err != nil {
|
||||||
|
logger().Error("驱动ESB出错", "error", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if cmd.JjtcCmd == 0x55 {
|
||||||
|
err := fi.DriveRelayDown(s.sim.World, esb.RelayId())
|
||||||
|
if err != nil {
|
||||||
|
logger().Error("驱动ESB出错", "error", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err := fi.DriveRelayUp(s.sim.World, esb.RelayId())
|
||||||
|
if err != nil {
|
||||||
|
logger().Error("驱动ESB出错", "error", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, cmd := range frame.SignalData.CmdList {
|
||||||
|
uid := s.deviceTable.SignalMap[cmd.Id].uid
|
||||||
|
entry := wd.EntityMap[uid]
|
||||||
|
if entry.HasComponent(component.Signal2XH1ElectronicType) { // 2XH1信号机
|
||||||
|
signal2XH1 := component.Signal2XH1ElectronicType.Get(entry)
|
||||||
|
switch cmd.Cmd {
|
||||||
|
case SignalAspect_No:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal2XH1.Z2XH1_DDJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal2XH1.Z2XH1_LXJ).Id, false)
|
||||||
|
case SignalAspect_H:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal2XH1.Z2XH1_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal2XH1.Z2XH1_LXJ).Id, false)
|
||||||
|
case SignalAspect_L:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal2XH1.Z2XH1_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal2XH1.Z2XH1_LXJ).Id, true)
|
||||||
|
default:
|
||||||
|
logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
||||||
|
}
|
||||||
|
} else if entry.HasComponent(component.Signal3XH1ElectronicType) { // 3XH1信号机
|
||||||
|
signal3XH1 := component.Signal3XH1ElectronicType.Get(entry)
|
||||||
|
switch cmd.Cmd {
|
||||||
|
case SignalAspect_No:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_DDJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_ZXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_YXJ).Id, false)
|
||||||
|
case SignalAspect_H:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_ZXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_YXJ).Id, false)
|
||||||
|
case SignalAspect_L:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_LXJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_ZXJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_YXJ).Id, false)
|
||||||
|
case SignalAspect_U:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_LXJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_ZXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_YXJ).Id, false)
|
||||||
|
case SignalAspect_HU:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_ZXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH1.Z3XH1_YXJ).Id, true)
|
||||||
|
default:
|
||||||
|
logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
||||||
|
}
|
||||||
|
} else if entry.HasComponent(component.Signal3XH2ElectronicType) { // 3XH2信号机
|
||||||
|
signal3XH2 := component.Signal3XH2ElectronicType.Get(entry)
|
||||||
|
switch cmd.Cmd {
|
||||||
|
case SignalAspect_No:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_DDJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_YXJ).Id, false)
|
||||||
|
case SignalAspect_H:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_YXJ).Id, false)
|
||||||
|
case SignalAspect_L:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_LXJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_YXJ).Id, false)
|
||||||
|
case SignalAspect_HU:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH2.Z3XH2_YXJ).Id, true)
|
||||||
|
default:
|
||||||
|
logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
||||||
|
}
|
||||||
|
} else if entry.HasComponent(component.Signal3XH3ElectronicType) { // 3XH3信号机
|
||||||
|
signal3XH3 := component.Signal3XH3ElectronicType.Get(entry)
|
||||||
|
switch cmd.Cmd {
|
||||||
|
case SignalAspect_No:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_DDJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_YXJ).Id, false)
|
||||||
|
case SignalAspect_H:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_YXJ).Id, false)
|
||||||
|
case SignalAspect_U:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_LXJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_YXJ).Id, false)
|
||||||
|
case SignalAspect_HU:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH3.Z3XH3_YXJ).Id, true)
|
||||||
|
default:
|
||||||
|
logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
||||||
|
}
|
||||||
|
} else if entry.HasComponent(component.Signal3XH4ElectronicType) { // 3XH4信号机
|
||||||
|
signal3XH4 := component.Signal3XH4ElectronicType.Get(entry)
|
||||||
|
switch cmd.Cmd {
|
||||||
|
case SignalAspect_No:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_DDJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_ZXJ).Id, false)
|
||||||
|
case SignalAspect_H:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_LXJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_ZXJ).Id, false)
|
||||||
|
case SignalAspect_L:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_LXJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_ZXJ).Id, true)
|
||||||
|
case SignalAspect_U:
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_DDJ).Id, false)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_LXJ).Id, true)
|
||||||
|
wd.SetQdBit(component.UidType.Get(signal3XH4.Z3XH4_ZXJ).Id, false)
|
||||||
|
default:
|
||||||
|
logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger().Error(fmt.Sprintf("信号机[%s]的型号未知", uid))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, cmd := range frame.AxleSectionData.CmdList {
|
||||||
|
if cmd.Cmd == 0x80 {
|
||||||
|
uid := s.deviceTable.AxleSectionMap[cmd.Id].uid
|
||||||
|
physicalSectionUid := s.sim.Repo.FindAxleCountingSection(uid).PhysicalSection().Id()
|
||||||
|
_, err := fi.PhysicalSectionDrstDrive(s.sim.World, physicalSectionUid)
|
||||||
|
if err != nil {
|
||||||
|
logger().Error(fmt.Sprintf("计轴区段[%s]复位出错:%s", uid, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, cmd := range frame.SPKSData.CmdList {
|
||||||
|
uid := s.deviceTable.SpksMap[cmd.Id].uid
|
||||||
|
spks := s.sim.Repo.FindSpks(uid)
|
||||||
|
if cmd.SPKSPLCmd == 0x55 {
|
||||||
|
err = fi.PressDownButton(s.sim.World, spks.PlaId())
|
||||||
|
} else {
|
||||||
|
err = fi.PressUpButton(s.sim.World, spks.PlaId())
|
||||||
|
}
|
||||||
|
if cmd.SPKSCmd == 0x55 {
|
||||||
|
err = fi.DriveRelayDown(s.sim.World, spks.Relay())
|
||||||
|
} else {
|
||||||
|
err = fi.DriveRelayUp(s.sim.World, spks.Relay())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//wd := entity.GetWorldData(s.sim.World)
|
|
||||||
////for _, cmd := range frame.TurnoutData.CmdList {
|
|
||||||
//// uid := s.deviceTable.TurnoutMap[cmd.Id].uid
|
|
||||||
////}
|
|
||||||
//for _, cmd := range frame.PSDData.CmdList {
|
|
||||||
// row := s.deviceTable.PsdMap[cmd.Id]
|
|
||||||
// entry := wd.EntityMap[row.uid]
|
|
||||||
// circuit := component.PsdCircuitType.Get(entry)
|
|
||||||
// switch cmd.Cmd {
|
|
||||||
// case 0xAA: //短编组开门
|
|
||||||
// component.RelayDriveType.Get(wd.EntityMap[row.relateDeviceMap[S]]).Td = true
|
|
||||||
// component.RelayDriveType.Get(wd.EntityMap[row.relateDeviceMap[L]]).Td = false
|
|
||||||
// component.RelayDriveType.Get(circuit.GMJ).Td = false
|
|
||||||
// case 0xBB: //长编组开门
|
|
||||||
// component.RelayDriveType.Get(wd.EntityMap[row.relateDeviceMap[S]]).Td = false
|
|
||||||
// component.RelayDriveType.Get(wd.EntityMap[row.relateDeviceMap[L]]).Td = true
|
|
||||||
// component.RelayDriveType.Get(circuit.GMJ).Td = false
|
|
||||||
// case 0x55:
|
|
||||||
// component.RelayDriveType.Get(wd.EntityMap[row.relateDeviceMap[S]]).Td = false
|
|
||||||
// component.RelayDriveType.Get(wd.EntityMap[row.relateDeviceMap[L]]).Td = false
|
|
||||||
// component.RelayDriveType.Get(circuit.GMJ).Td = true
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//for _, cmd := range frame.ESBData.CmdList {
|
|
||||||
// uid := s.deviceTable.EsbMap[cmd.Id].uid
|
|
||||||
// esb := s.sim.Repo.FindEsb(uid)
|
|
||||||
// if cmd.JjtcplCmd == ON {
|
|
||||||
// err := fi.DriveRelayUp(s.sim.World, esb.RelayId())
|
|
||||||
// if err != nil {
|
|
||||||
// logger().Error("驱动ESB出错", "error", err)
|
|
||||||
// }
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
// if cmd.JjtcCmd == ON {
|
|
||||||
// err := fi.DriveRelayDown(s.sim.World, esb.RelayId())
|
|
||||||
// if err != nil {
|
|
||||||
// logger().Error("驱动ESB出错", "error", err)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// err := fi.DriveRelayUp(s.sim.World, esb.RelayId())
|
|
||||||
// if err != nil {
|
|
||||||
// logger().Error("驱动ESB出错", "error", err)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//for _, cmd := range frame.SignalData.CmdList {
|
|
||||||
// uid := s.deviceTable.SignalMap[cmd.Id].uid
|
|
||||||
// entry := wd.EntityMap[uid]
|
|
||||||
// if entry.HasComponent(component.Signal2XH1ElectronicType) { // 2XH1信号机
|
|
||||||
// signal2XH1 := component.Signal2XH1ElectronicType.Get(entry)
|
|
||||||
// switch cmd.Cmd {
|
|
||||||
// case SignalAspect_No:
|
|
||||||
// component.RelayDriveType.Get(signal2XH1.Z2XH1_DDJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal2XH1.Z2XH1_LXJ).Td = false
|
|
||||||
// case SignalAspect_H:
|
|
||||||
// component.RelayDriveType.Get(signal2XH1.Z2XH1_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal2XH1.Z2XH1_LXJ).Td = false
|
|
||||||
// case SignalAspect_L:
|
|
||||||
// component.RelayDriveType.Get(signal2XH1.Z2XH1_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal2XH1.Z2XH1_LXJ).Td = true
|
|
||||||
// default:
|
|
||||||
// logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
|
||||||
// }
|
|
||||||
// } else if entry.HasComponent(component.Signal3XH1ElectronicType) { // 3XH1信号机
|
|
||||||
// signal3XH1 := component.Signal3XH1ElectronicType.Get(entry)
|
|
||||||
// switch cmd.Cmd {
|
|
||||||
// case SignalAspect_No:
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_DDJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_ZXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_YXJ).Td = false
|
|
||||||
// case SignalAspect_H:
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_ZXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_YXJ).Td = false
|
|
||||||
// case SignalAspect_L:
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_LXJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_ZXJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_YXJ).Td = false
|
|
||||||
// case SignalAspect_U:
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_LXJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_ZXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_YXJ).Td = false
|
|
||||||
// case SignalAspect_HU:
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_ZXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH1.Z3XH1_YXJ).Td = true
|
|
||||||
// default:
|
|
||||||
// logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
|
||||||
// }
|
|
||||||
// } else if entry.HasComponent(component.Signal3XH2ElectronicType) { // 3XH2信号机
|
|
||||||
// signal3XH2 := component.Signal3XH2ElectronicType.Get(entry)
|
|
||||||
// switch cmd.Cmd {
|
|
||||||
// case SignalAspect_No:
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_DDJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_YXJ).Td = false
|
|
||||||
// case SignalAspect_H:
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_YXJ).Td = false
|
|
||||||
// case SignalAspect_L:
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_LXJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_YXJ).Td = false
|
|
||||||
// case SignalAspect_HU:
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH2.Z3XH2_YXJ).Td = true
|
|
||||||
// default:
|
|
||||||
// logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
|
||||||
// }
|
|
||||||
// } else if entry.HasComponent(component.Signal3XH3ElectronicType) { // 3XH3信号机
|
|
||||||
// signal3XH3 := component.Signal3XH3ElectronicType.Get(entry)
|
|
||||||
// switch cmd.Cmd {
|
|
||||||
// case SignalAspect_No:
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_DDJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_YXJ).Td = false
|
|
||||||
// case SignalAspect_H:
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_YXJ).Td = false
|
|
||||||
// case SignalAspect_U:
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_LXJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_YXJ).Td = false
|
|
||||||
// case SignalAspect_HU:
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH3.Z3XH3_YXJ).Td = true
|
|
||||||
// default:
|
|
||||||
// logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
|
||||||
// }
|
|
||||||
// } else if entry.HasComponent(component.Signal3XH4ElectronicType) { // 3XH4信号机
|
|
||||||
// signal3XH4 := component.Signal3XH4ElectronicType.Get(entry)
|
|
||||||
// switch cmd.Cmd {
|
|
||||||
// case SignalAspect_No:
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_DDJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_ZXJ).Td = false
|
|
||||||
// case SignalAspect_H:
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_LXJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_ZXJ).Td = false
|
|
||||||
// case SignalAspect_L:
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_LXJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_ZXJ).Td = true
|
|
||||||
// case SignalAspect_U:
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_DDJ).Td = false
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_LXJ).Td = true
|
|
||||||
// component.RelayDriveType.Get(signal3XH4.Z3XH4_ZXJ).Td = false
|
|
||||||
// default:
|
|
||||||
// logger().Error(fmt.Sprintf("信号机[%s]无法开放[%x]信号", uid, cmd.Cmd))
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// logger().Error(fmt.Sprintf("信号机[%s]的型号未知", uid))
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//for _, cmd := range frame.AxleSectionData.CmdList {
|
|
||||||
// if cmd.Cmd == 0x80 {
|
|
||||||
// uid := s.deviceTable.AxleSectionMap[cmd.Id].uid
|
|
||||||
// physicalSectionUid := s.sim.Repo.FindAxleCountingSection(uid).PhysicalSection().Id()
|
|
||||||
// _, err := fi.PhysicalSectionDrstDrive(s.sim.World, physicalSectionUid)
|
|
||||||
// if err != nil {
|
|
||||||
// logger().Error(fmt.Sprintf("计轴区段[%s]复位出错:%s", uid, err))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
////for _, cmd := range frame.SPKSData.CmdList {
|
|
||||||
//// uid := s.deviceTable.SpksMap[cmd.Id].uid
|
|
||||||
////}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Stop(stationCode string) {
|
func Stop(stationCode string) {
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
defer mu.Unlock()
|
defer mu.Unlock()
|
||||||
context := serviceContextMap[stationCode]
|
serviceContext := serviceContextMap[stationCode]
|
||||||
if context != nil {
|
if serviceContext != nil {
|
||||||
if context.client != nil {
|
if serviceContext.server != nil {
|
||||||
context.client.Close()
|
serviceContext.server.Close()
|
||||||
}
|
|
||||||
if context.server != nil {
|
|
||||||
context.server.Close()
|
|
||||||
}
|
}
|
||||||
delete(serviceContextMap, stationCode)
|
delete(serviceContextMap, stationCode)
|
||||||
}
|
}
|
||||||
@ -459,47 +482,39 @@ func (s *serviceContext) runCollectTask(ctx context.Context) {
|
|||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
for _, driveMsg := range s.driveMsgSlice {
|
frame := s.collectDeviceState()
|
||||||
frame := s.collectDeviceState(driveMsg)
|
data := frame.encode()
|
||||||
data := frame.encode()
|
_, err := s.server.WriteToUdp(data, s.ioAddr)
|
||||||
err := s.client.Send(data)
|
if err != nil {
|
||||||
if err != nil {
|
logger().Error("向联锁发送数据失败", "error", err)
|
||||||
logger().Error("向联锁发送数据失败", "error", err)
|
} else {
|
||||||
} else {
|
logger().Info(fmt.Sprintf("向联锁发送数据:%x", data))
|
||||||
logger().Info(fmt.Sprintf("向联锁发送数据:%x", data))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//frame := s.collectDeviceState()
|
|
||||||
//data := frame.encode()
|
|
||||||
//err := s.client.Send(data)
|
|
||||||
//if err != nil {
|
|
||||||
// logger().Error("向联锁发送数据失败", "error", err)
|
|
||||||
//} else {
|
|
||||||
// logger().Info(fmt.Sprintf("向联锁发送数据:%x", data))
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterlockFrame {
|
func (s *serviceContext) collectDeviceState() *ToInterlockFrame {
|
||||||
wd := entity.GetWorldData(s.sim.World)
|
wd := entity.GetWorldData(s.sim.World)
|
||||||
frame := &ToInterlockFrame{}
|
frame := &ToInterlockFrame{}
|
||||||
frame.WaysideCode = waysideCode
|
frame.WaysideCode = waysideCode
|
||||||
frame.InterlockCode = msg.InterlockCode
|
frame.InterlockCode = s.deviceTable.InterlockCode
|
||||||
//道岔
|
//道岔
|
||||||
for _, cmd := range msg.TurnoutData.CmdList {
|
for _, row := range s.deviceTable.TurnoutMap {
|
||||||
row := s.deviceTable.TurnoutMap[cmd.Id]
|
|
||||||
entry := wd.EntityMap[row.uid]
|
entry := wd.EntityMap[row.uid]
|
||||||
tp := component.TurnoutPositionType.Get(entry)
|
tp := component.TurnoutPositionType.Get(entry)
|
||||||
var stateByte byte
|
var stateByte byte
|
||||||
if tp.Dw {
|
if entry.HasComponent(component.TurnoutFaultCiqdType) {
|
||||||
stateByte = 0x01
|
stateByte = 0xff
|
||||||
} else if tp.Fw {
|
|
||||||
stateByte = 0x02
|
|
||||||
} else {
|
} else {
|
||||||
stateByte = 0x08
|
if tp.Dw {
|
||||||
|
stateByte = 0x01
|
||||||
|
} else if tp.Fw {
|
||||||
|
stateByte = 0x02
|
||||||
|
} else {
|
||||||
|
stateByte = 0x08
|
||||||
|
}
|
||||||
}
|
}
|
||||||
frame.TurnoutStates = append(frame.TurnoutStates, &TurnoutState{
|
frame.TurnoutStates = append(frame.TurnoutStates, &TurnoutState{
|
||||||
Id: row.index,
|
Id: row.index,
|
||||||
@ -510,8 +525,7 @@ func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterloc
|
|||||||
return frame.TurnoutStates[i].Id < frame.TurnoutStates[j].Id
|
return frame.TurnoutStates[i].Id < frame.TurnoutStates[j].Id
|
||||||
})
|
})
|
||||||
//屏蔽门
|
//屏蔽门
|
||||||
for _, cmd := range msg.PSDData.CmdList {
|
for _, row := range s.deviceTable.PsdMap {
|
||||||
row := s.deviceTable.PsdMap[cmd.Id]
|
|
||||||
entry := wd.EntityMap[row.uid]
|
entry := wd.EntityMap[row.uid]
|
||||||
psdState := component.PsdStateType.Get(entry)
|
psdState := component.PsdStateType.Get(entry)
|
||||||
mkxBytes := make([]byte, 0, 3)
|
mkxBytes := make([]byte, 0, 3)
|
||||||
@ -521,10 +535,22 @@ func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterloc
|
|||||||
}
|
}
|
||||||
mkxBytes = append(mkxBytes, GetStateByte(component.BitStateType.Get(wd.EntityMap[mkxRelayUid]).Val))
|
mkxBytes = append(mkxBytes, GetStateByte(component.BitStateType.Get(wd.EntityMap[mkxRelayUid]).Val))
|
||||||
}
|
}
|
||||||
|
var state byte
|
||||||
|
if psdState.Close {
|
||||||
|
state = 0x02
|
||||||
|
} else {
|
||||||
|
state = 0x01
|
||||||
|
}
|
||||||
|
var hsjc byte
|
||||||
|
if psdState.InterlockRelease {
|
||||||
|
hsjc = 0xff
|
||||||
|
} else {
|
||||||
|
hsjc = 0xee
|
||||||
|
}
|
||||||
frame.PsdStates = append(frame.PsdStates, &PSDState{
|
frame.PsdStates = append(frame.PsdStates, &PSDState{
|
||||||
Id: row.index,
|
Id: row.index,
|
||||||
State: GetStateByte(psdState.Close),
|
State: state,
|
||||||
Hsjc: 0xff,
|
Hsjc: hsjc,
|
||||||
PCB: mkxBytes[0],
|
PCB: mkxBytes[0],
|
||||||
POB: mkxBytes[1],
|
POB: mkxBytes[1],
|
||||||
DPB: mkxBytes[2],
|
DPB: mkxBytes[2],
|
||||||
@ -534,8 +560,7 @@ func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterloc
|
|||||||
return frame.PsdStates[i].Id < frame.PsdStates[j].Id
|
return frame.PsdStates[i].Id < frame.PsdStates[j].Id
|
||||||
})
|
})
|
||||||
//紧急停车
|
//紧急停车
|
||||||
for _, cmd := range msg.ESBData.CmdList {
|
for _, row := range s.deviceTable.EsbMap {
|
||||||
row := s.deviceTable.EsbMap[cmd.Id]
|
|
||||||
esb := s.sim.Repo.FindEsb(row.uid)
|
esb := s.sim.Repo.FindEsb(row.uid)
|
||||||
relay := wd.EntityMap[esb.RelayId()]
|
relay := wd.EntityMap[esb.RelayId()]
|
||||||
pla := wd.EntityMap[esb.PlaId()]
|
pla := wd.EntityMap[esb.PlaId()]
|
||||||
@ -543,14 +568,14 @@ func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterloc
|
|||||||
Id: row.index,
|
Id: row.index,
|
||||||
State: GetStateByte(!component.BitStateType.Get(relay).Val),
|
State: GetStateByte(!component.BitStateType.Get(relay).Val),
|
||||||
PlState: GetStateByte(component.BitStateType.Get(pla).Val),
|
PlState: GetStateByte(component.BitStateType.Get(pla).Val),
|
||||||
|
//PlState: 0x00,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
sort.Slice(frame.ESBStates, func(i, j int) bool {
|
sort.Slice(frame.ESBStates, func(i, j int) bool {
|
||||||
return frame.ESBStates[i].Id < frame.ESBStates[j].Id
|
return frame.ESBStates[i].Id < frame.ESBStates[j].Id
|
||||||
})
|
})
|
||||||
//信号机
|
//信号机
|
||||||
for _, cmd := range msg.SignalData.CmdList {
|
for _, row := range s.deviceTable.SignalMap {
|
||||||
row := s.deviceTable.SignalMap[cmd.Id]
|
|
||||||
entry := wd.EntityMap[row.uid]
|
entry := wd.EntityMap[row.uid]
|
||||||
lights := component.SignalLightsType.Get(entry)
|
lights := component.SignalLightsType.Get(entry)
|
||||||
isL := false
|
isL := false
|
||||||
@ -598,11 +623,10 @@ func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterloc
|
|||||||
return frame.SignalStates[i].Id < frame.SignalStates[j].Id
|
return frame.SignalStates[i].Id < frame.SignalStates[j].Id
|
||||||
})
|
})
|
||||||
//计轴区段
|
//计轴区段
|
||||||
for _, cmd := range msg.AxleSectionData.CmdList {
|
for _, row := range s.deviceTable.AxleSectionMap {
|
||||||
row := s.deviceTable.AxleSectionMap[cmd.Id]
|
|
||||||
entry := wd.EntityMap[row.uid]
|
entry := wd.EntityMap[row.uid]
|
||||||
sectionState := component.AxleCountingSectionStateType.Get(entry)
|
sectionState := component.AxleCountingSectionStateType.Get(entry)
|
||||||
var stateByte byte = 0x40
|
var stateByte byte = 0x00
|
||||||
if sectionState.Occupied {
|
if sectionState.Occupied {
|
||||||
stateByte = 0x40
|
stateByte = 0x40
|
||||||
}
|
}
|
||||||
@ -615,15 +639,15 @@ func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterloc
|
|||||||
return frame.AxleSectionStates[i].Id < frame.AxleSectionStates[j].Id
|
return frame.AxleSectionStates[i].Id < frame.AxleSectionStates[j].Id
|
||||||
})
|
})
|
||||||
//SPKS
|
//SPKS
|
||||||
for _, cmd := range msg.SPKSData.CmdList {
|
for _, row := range s.deviceTable.SpksMap {
|
||||||
row := s.deviceTable.SpksMap[cmd.Id]
|
|
||||||
spks := s.sim.Repo.FindSpks(row.uid)
|
spks := s.sim.Repo.FindSpks(row.uid)
|
||||||
relay := wd.EntityMap[spks.Relay()]
|
relay := wd.EntityMap[spks.Relay()]
|
||||||
pla := wd.EntityMap[spks.PlaId()]
|
pla := wd.EntityMap[spks.PlaId()]
|
||||||
frame.SPKSStates = append(frame.SPKSStates, &SPKSState{
|
frame.SPKSStates = append(frame.SPKSStates, &SPKSState{
|
||||||
Id: row.index,
|
Id: row.index,
|
||||||
State: GetStateByte(component.BitStateType.Get(relay).Val),
|
State: GetStateByte(!component.BitStateType.Get(relay).Val),
|
||||||
PlState: GetStateByte(component.BitStateType.Get(pla).Val),
|
PlState: GetStateByte(component.BitStateType.Get(pla).Val),
|
||||||
|
//PlState: 0xff,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
sort.Slice(frame.SPKSStates, func(i, j int) bool {
|
sort.Slice(frame.SPKSStates, func(i, j int) bool {
|
||||||
@ -632,149 +656,6 @@ func (s *serviceContext) collectDeviceState(msg *FromInterlockFrame) *ToInterloc
|
|||||||
return frame
|
return frame
|
||||||
}
|
}
|
||||||
|
|
||||||
//func (s *serviceContext) collectDeviceState() *ToInterlockFrame {
|
|
||||||
// wd := entity.GetWorldData(s.sim.World)
|
|
||||||
// frame := &ToInterlockFrame{}
|
|
||||||
// frame.WaysideCode = waysideCode
|
|
||||||
// frame.InterlockCode = s.deviceTable.InterlockCode
|
|
||||||
// //道岔
|
|
||||||
// for _, row := range s.deviceTable.TurnoutMap {
|
|
||||||
// entry := wd.EntityMap[row.uid]
|
|
||||||
// tp := component.TurnoutPositionType.Get(entry)
|
|
||||||
// var stateByte byte
|
|
||||||
// if tp.Dw {
|
|
||||||
// stateByte = 0x01
|
|
||||||
// } else if tp.Fw {
|
|
||||||
// stateByte = 0x02
|
|
||||||
// } else {
|
|
||||||
// stateByte = 0x08
|
|
||||||
// }
|
|
||||||
// frame.TurnoutStates = append(frame.TurnoutStates, &TurnoutState{
|
|
||||||
// Id: row.index,
|
|
||||||
// State: stateByte,
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// sort.Slice(frame.TurnoutStates, func(i, j int) bool {
|
|
||||||
// return frame.TurnoutStates[i].Id < frame.TurnoutStates[j].Id
|
|
||||||
// })
|
|
||||||
// //屏蔽门
|
|
||||||
// for _, row := range s.deviceTable.PsdMap {
|
|
||||||
// entry := wd.EntityMap[row.uid]
|
|
||||||
// psdState := component.PsdStateType.Get(entry)
|
|
||||||
// mkxBytes := make([]byte, 0, 3)
|
|
||||||
// for _, mkxRelayUid := range []string{row.relateDeviceMap[POB], row.relateDeviceMap[PCB], row.relateDeviceMap[DPB]} {
|
|
||||||
// if mkxRelayUid == "" {
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
// mkxBytes = append(mkxBytes, GetStateByte(component.BitStateType.Get(wd.EntityMap[mkxRelayUid]).Val))
|
|
||||||
// }
|
|
||||||
// frame.PsdStates = append(frame.PsdStates, &PSDState{
|
|
||||||
// Id: row.index,
|
|
||||||
// State: GetStateByte(psdState.Close),
|
|
||||||
// Hsjc: 0xff,
|
|
||||||
// PCB: mkxBytes[0],
|
|
||||||
// POB: mkxBytes[1],
|
|
||||||
// DPB: mkxBytes[2],
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// sort.Slice(frame.PsdStates, func(i, j int) bool {
|
|
||||||
// return frame.PsdStates[i].Id < frame.PsdStates[j].Id
|
|
||||||
// })
|
|
||||||
// //紧急停车
|
|
||||||
// for _, row := range s.deviceTable.EsbMap {
|
|
||||||
// esb := s.sim.Repo.FindEsb(row.uid)
|
|
||||||
// relay := wd.EntityMap[esb.RelayId()]
|
|
||||||
// pla := wd.EntityMap[esb.PlaId()]
|
|
||||||
// frame.ESBStates = append(frame.ESBStates, &ESBState{
|
|
||||||
// Id: row.index,
|
|
||||||
// State: GetStateByte(!component.BitStateType.Get(relay).Val),
|
|
||||||
// PlState: GetStateByte(component.BitStateType.Get(pla).Val),
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// sort.Slice(frame.ESBStates, func(i, j int) bool {
|
|
||||||
// return frame.ESBStates[i].Id < frame.ESBStates[j].Id
|
|
||||||
// })
|
|
||||||
// //信号机
|
|
||||||
// for _, row := range s.deviceTable.SignalMap {
|
|
||||||
// entry := wd.EntityMap[row.uid]
|
|
||||||
// lights := component.SignalLightsType.Get(entry)
|
|
||||||
// isL := false
|
|
||||||
// isH := false
|
|
||||||
// isU := false
|
|
||||||
// isA := false
|
|
||||||
// isB := false
|
|
||||||
// for _, light := range lights.Lights {
|
|
||||||
// switch {
|
|
||||||
// case light.HasComponent(component.LdTag):
|
|
||||||
// isL = component.BitStateType.Get(light).Val
|
|
||||||
// case light.HasComponent(component.HdTag):
|
|
||||||
// isH = component.BitStateType.Get(light).Val
|
|
||||||
// case light.HasComponent(component.UdTag):
|
|
||||||
// isU = component.BitStateType.Get(light).Val
|
|
||||||
// case light.HasComponent(component.BdTag):
|
|
||||||
// isB = component.BitStateType.Get(light).Val
|
|
||||||
// case light.HasComponent(component.AdTag):
|
|
||||||
// isA = component.BitStateType.Get(light).Val
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// var stateByte byte
|
|
||||||
// if isH && isU {
|
|
||||||
// stateByte = 0x03
|
|
||||||
// } else {
|
|
||||||
// switch {
|
|
||||||
// case isL:
|
|
||||||
// stateByte = 0x04
|
|
||||||
// case isH:
|
|
||||||
// stateByte = 0x01
|
|
||||||
// case isU:
|
|
||||||
// stateByte = 0x02
|
|
||||||
// case isB:
|
|
||||||
// stateByte = 0x08
|
|
||||||
// case isA:
|
|
||||||
// stateByte = 0x09
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// frame.SignalStates = append(frame.SignalStates, &SignalState{
|
|
||||||
// Id: row.index,
|
|
||||||
// State: stateByte,
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// sort.Slice(frame.SignalStates, func(i, j int) bool {
|
|
||||||
// return frame.SignalStates[i].Id < frame.SignalStates[j].Id
|
|
||||||
// })
|
|
||||||
// //计轴区段
|
|
||||||
// for _, row := range s.deviceTable.AxleSectionMap {
|
|
||||||
// entry := wd.EntityMap[row.uid]
|
|
||||||
// sectionState := component.AxleCountingSectionStateType.Get(entry)
|
|
||||||
// var stateByte byte = 0x40
|
|
||||||
// if sectionState.Occupied {
|
|
||||||
// stateByte = 0x40
|
|
||||||
// }
|
|
||||||
// frame.AxleSectionStates = append(frame.AxleSectionStates, &AxleSectionState{
|
|
||||||
// Id: row.index,
|
|
||||||
// State: stateByte,
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// sort.Slice(frame.AxleSectionStates, func(i, j int) bool {
|
|
||||||
// return frame.AxleSectionStates[i].Id < frame.AxleSectionStates[j].Id
|
|
||||||
// })
|
|
||||||
// //SPKS
|
|
||||||
// for _, row := range s.deviceTable.SpksMap {
|
|
||||||
// spks := s.sim.Repo.FindSpks(row.uid)
|
|
||||||
// relay := wd.EntityMap[spks.Relay()]
|
|
||||||
// pla := wd.EntityMap[spks.PlaId()]
|
|
||||||
// frame.SPKSStates = append(frame.SPKSStates, &SPKSState{
|
|
||||||
// Id: row.index,
|
|
||||||
// State: GetStateByte(component.BitStateType.Get(relay).Val),
|
|
||||||
// PlState: GetStateByte(component.BitStateType.Get(pla).Val),
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// sort.Slice(frame.SPKSStates, func(i, j int) bool {
|
|
||||||
// return frame.SPKSStates[i].Id < frame.SPKSStates[j].Id
|
|
||||||
// })
|
|
||||||
// return frame
|
|
||||||
//}
|
|
||||||
|
|
||||||
func logger() *slog.Logger {
|
func logger() *slog.Logger {
|
||||||
loggerInit.Do(func() {
|
loggerInit.Do(func() {
|
||||||
privateLogger = slog.Default().With("tag", logTag)
|
privateLogger = slog.Default().With("tag", logTag)
|
||||||
|
5
third_party/udp/udp_server.go
vendored
5
third_party/udp/udp_server.go
vendored
@ -10,6 +10,7 @@ import (
|
|||||||
type UdpServer interface {
|
type UdpServer interface {
|
||||||
Listen() error
|
Listen() error
|
||||||
Close()
|
Close()
|
||||||
|
WriteToUdp(data []byte, addr *net.UDPAddr) (int, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type UdpMsgHandler func(b []byte)
|
type UdpMsgHandler func(b []byte)
|
||||||
@ -53,6 +54,10 @@ func (s *server) Close() {
|
|||||||
<-s.done
|
<-s.done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *server) WriteToUdp(data []byte, addr *net.UDPAddr) (int, error) {
|
||||||
|
return s.conn.WriteToUDP(data, addr)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *server) listenAndHandle(ctx context.Context) {
|
func (s *server) listenAndHandle(ctx context.Context) {
|
||||||
defer close(s.done)
|
defer close(s.done)
|
||||||
defer s.conn.Close()
|
defer s.conn.Close()
|
||||||
|
@ -36,3 +36,7 @@ func (r *Reader) ReadBytes(n int) []byte {
|
|||||||
r.Read(b)
|
r.Read(b)
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Reader) Len() int {
|
||||||
|
return r.r.Len()
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user