diff --git a/api/simulation.go b/api/simulation.go index fe4a347..4410776 100644 --- a/api/simulation.go +++ b/api/simulation.go @@ -48,13 +48,13 @@ func InitSimulationRouter(api *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle authed.GET("/:id/getMapKilometerRange", getMapKilometerRange) authed.POST("/psl/operation", pslBtnOperation) //1 authed.POST("/psd/operation", psdOperation) - authed.PUT("/balise/position/modify", balisePositionModify) - authed.PUT("/balise/position/reset", balisePositionReset) - authed.PUT("/balise/telegram/modify", baliseTelegramModify) - authed.PUT("/balise/telegram/reset", baliseTelegramReset) - authed.PUT("/balise/telegram/stop", baliseTelegramStop) - authed.PUT("/balise/telegram/send", baliseTelegramSend) - authed.PUT("/balise/reset", baliseReset) + authed.PUT("/balisecodec/position/modify", balisePositionModify) + authed.PUT("/balisecodec/position/reset", balisePositionReset) + authed.PUT("/balisecodec/telegram/modify", baliseTelegramModify) + authed.PUT("/balisecodec/telegram/reset", baliseTelegramReset) + authed.PUT("/balisecodec/telegram/stop", baliseTelegramStop) + authed.PUT("/balisecodec/telegram/send", baliseTelegramSend) + authed.PUT("/balisecodec/reset", baliseReset) authed.PUT("/ckm/operation", ckmOperation) authed.PUT("/xcj/operation", xcjOperation) //authed.POST("/bypass/operation", bypassBtnOrKeyOperation) @@ -750,7 +750,7 @@ func relayOperation(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/balise/position/modify [put] +// @Router /api/v1/simulation/balisecodec/position/modify [put] func balisePositionModify(c *gin.Context) { req := &dto.BaliseMoveReqDto{} if err := c.ShouldBind(&req); err != nil { @@ -779,7 +779,7 @@ func balisePositionModify(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/balise/position/reset [put] +// @Router /api/v1/simulation/balisecodec/position/reset [put] func balisePositionReset(c *gin.Context) { req := &dto.BaliseReqDto{} if err := c.ShouldBind(&req); err != nil { @@ -808,7 +808,7 @@ func balisePositionReset(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/balise/telegram/modify [put] +// @Router /api/v1/simulation/balisecodec/telegram/modify [put] func baliseTelegramModify(c *gin.Context) { req := &dto.BaliseModifyTelegramReqDto{} if err := c.ShouldBind(&req); err != nil { @@ -837,7 +837,7 @@ func baliseTelegramModify(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/balise/telegram/reset [put] +// @Router /api/v1/simulation/balisecodec/telegram/reset [put] func baliseTelegramReset(c *gin.Context) { req := &dto.BaliseReqDto{} if err := c.ShouldBind(&req); err != nil { @@ -866,7 +866,7 @@ func baliseTelegramReset(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/balise/telegram/stop [put] +// @Router /api/v1/simulation/balisecodec/telegram/stop [put] func baliseTelegramStop(c *gin.Context) { req := &dto.BaliseReqDto{} if err := c.ShouldBind(&req); err != nil { @@ -895,7 +895,7 @@ func baliseTelegramStop(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/balise/telegram/send [put] +// @Router /api/v1/simulation/balisecodec/telegram/send [put] func baliseTelegramSend(c *gin.Context) { req := &dto.BaliseReqDto{} if err := c.ShouldBind(&req); err != nil { @@ -924,7 +924,7 @@ func baliseTelegramSend(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/balise/reset [put] +// @Router /api/v1/simulation/balisecodec/reset [put] func baliseReset(c *gin.Context) { //req := &dto.BaliseReqDto{} //if err := c.ShouldBind(&req); err != nil { diff --git a/docs/docs.go b/docs/docs.go index 34fdcb6..8e9f232 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -3263,7 +3263,7 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/balise/position/modify": { + "/api/v1/simulation/balisecodec/position/modify": { "put": { "security": [ { @@ -3312,7 +3312,7 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/balise/position/reset": { + "/api/v1/simulation/balisecodec/position/reset": { "put": { "security": [ { @@ -3361,7 +3361,7 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/balise/reset": { + "/api/v1/simulation/balisecodec/reset": { "put": { "security": [ { @@ -3408,7 +3408,7 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/balise/telegram/modify": { + "/api/v1/simulation/balisecodec/telegram/modify": { "put": { "security": [ { @@ -3457,7 +3457,7 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/balise/telegram/reset": { + "/api/v1/simulation/balisecodec/telegram/reset": { "put": { "security": [ { @@ -3506,7 +3506,7 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/balise/telegram/send": { + "/api/v1/simulation/balisecodec/telegram/send": { "put": { "security": [ { @@ -3555,7 +3555,7 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/balise/telegram/stop": { + "/api/v1/simulation/balisecodec/telegram/stop": { "put": { "security": [ { diff --git a/example/balise_1023_830/main.go b/example/balise_1023_830/main.go index 90477d5..a0b71cb 100644 --- a/example/balise_1023_830/main.go +++ b/example/balise_1023_830/main.go @@ -5,7 +5,7 @@ import ( "log/slog" "strconv" - "joylink.club/bj-rtsts-server/third_party/balise" + "joylink.club/bj-rtsts-server/third_party/balisecodec" ) type Transponder struct { @@ -34,12 +34,12 @@ func main() { // count := 0 for _, v := range transponderMap { // slog.Info("transponder", "name", v.Name, "code", v.Code, "checksum", v.CheckSum, "msg830", v.Msg830, "msg1023", v.Msg1023) - byte104, err := balise.DecodeByteString(v.Msg1023) + byte104, err := balisecodec.DecodeByteString(v.Msg1023) if err != nil { slog.Error("解码应答器数据失败", "name", v.Name, "code", v.Code, "err", err) continue } - compare104Bytes(byte104, balise.ConvertByteStringToBytes(v.Msg830)) + compare104Bytes(byte104, balisecodec.ConvertByteStringToBytes(v.Msg830)) // b1023 := convertToBalise1023(v.Msg1023) // source830 := convertTo830(v.Msg830) // // replaced830 := replaceFirst10Bits(source830) @@ -197,7 +197,7 @@ func revertFirst10Bits(b []byte) []byte { // 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组 bits := make([]uint16, 83) for i := 0; i < 83; i++ { - bits[i] = uint16(balise.ToValLeftMsb(b[i*10 : i*10+10])) + bits[i] = uint16(balisecodec.ToValLeftMsb(b[i*10 : i*10+10])) // 打印输出 for j := 0; j < 10; j++ { fmt.Printf("%01b", b[i*10+j]) @@ -224,7 +224,7 @@ func revertFirst10Bits(b []byte) []byte { slog.Info("还原第一个10位值", "sum", sum, "bits[0]", bits[0], "bits[0]b", fmt.Sprintf("%010b", bits[0])) rbits := make([]byte, 830) // 将整个10位数组转换为二进制数组,依然是MSB - u0bits := balise.ToBitsLeftMsb(int(bits[0]), 10) + u0bits := balisecodec.ToBitsLeftMsb(int(bits[0]), 10) for i := 0; i < 10; i++ { rbits[i] = u0bits[i] } @@ -243,7 +243,7 @@ func replaceFirst10Bits(b []byte) []byte { // 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组 bits := make([]uint16, 83) for i := 0; i < 83; i++ { - bits[i] = uint16(balise.ToValLeftMsb(b[i*10 : i*10+10])) + bits[i] = uint16(balisecodec.ToValLeftMsb(b[i*10 : i*10+10])) // 打印输出 for j := 0; j < 10; j++ { fmt.Printf("%01b", b[i*10+j]) @@ -264,7 +264,7 @@ func replaceFirst10Bits(b []byte) []byte { slog.Info("替换第一个10位值", "sum", sum, "bits[0]", bits[0], "bits[0]b", fmt.Sprintf("%010b", bits[0])) rbits := make([]byte, 830) // 将整个10位数组转换为二进制数组,依然是MSB - u0bits := balise.ToBitsLeftMsb(int(bits[0]), 10) + u0bits := balisecodec.ToBitsLeftMsb(int(bits[0]), 10) for i := 0; i < 10; i++ { rbits[i] = u0bits[i] } @@ -281,7 +281,7 @@ func calculateS(sb []byte) uint32 { if len(sb) != 12 { panic("invalid length") } - B := balise.ToValLeftMsb(sb) + B := balisecodec.ToValLeftMsb(sb) const A uint64 = 2801775573 S := uint32((A * uint64(B)) % (1 << 32)) slog.Info("由12位加扰位计算得到整数S", "B", B, "S", S, "Sb", fmt.Sprintf("%032b", S)) @@ -338,7 +338,7 @@ func convert830To913(b830 []byte) []byte { } b913 := make([]byte, 913) for i := 0; i < 83; i++ { - b11 := balise.To11(b830[i*10 : i*10+10]) + b11 := balisecodec.To11(b830[i*10 : i*10+10]) for j := 0; j < 11; j++ { b913[i*11+j] = b11[j] } @@ -352,7 +352,7 @@ func convert913To830(b913 []byte) []byte { } b830 := make([]byte, 830) for i := 0; i < 83; i++ { - b10, err := balise.From11(b913[i*11 : i*11+11]) + b10, err := balisecodec.From11(b913[i*11 : i*11+11]) if err != nil { panic(err) } diff --git a/go.mod b/go.mod index 1fc3cd0..aa102d3 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,6 @@ require ( github.com/simonvetter/modbus v1.6.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect - github.com/xuri/excelize/v2 v2.8.1 // indirect github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect github.com/yohamta/donburi v1.3.9 // indirect go.uber.org/atomic v1.9.0 // indirect @@ -107,4 +106,4 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -require github.com/yousifnimah/Cryptx v1.0.1 +require github.com/xuri/excelize/v2 v2.8.1 diff --git a/go.sum b/go.sum index 865c2bd..61c3686 100644 --- a/go.sum +++ b/go.sum @@ -235,8 +235,6 @@ github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4 github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/yohamta/donburi v1.3.9 h1:sYAPaelSnxmoTGjgH9ZlYt4pUKrnwvAv4YGXxLZCK6E= github.com/yohamta/donburi v1.3.9/go.mod h1:5QkyraUjkzbMVTD2b8jaPFy1Uwjm/zdFN1c1lZGaezg= -github.com/yousifnimah/Cryptx v1.0.1 h1:oZbB6CjvqOzkmoghsncb3/4sV2As8nqOJCjZPd08Xdw= -github.com/yousifnimah/Cryptx v1.0.1/go.mod h1:vmpiwqtg+fR+KaAisCdz2+6k30jWb+/X7EyUysDKh0U= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -256,6 +254,8 @@ golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= +golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= diff --git a/rts-sim-module b/rts-sim-module index efa7d16..ae5ee27 160000 --- a/rts-sim-module +++ b/rts-sim-module @@ -1 +1 @@ -Subproject commit efa7d1655ed781512c8b0ce56685954fa3cc9903 +Subproject commit ae5ee2729ef4024e55b1656e82f917f71ab5183f diff --git a/third_party/balise/codec.go b/third_party/balisecodec/codec.go similarity index 93% rename from third_party/balise/codec.go rename to third_party/balisecodec/codec.go index 8b0e548..453f00b 100644 --- a/third_party/balise/codec.go +++ b/third_party/balisecodec/codec.go @@ -1,6 +1,7 @@ -package balise +package balisecodec import ( + "encoding/hex" "fmt" "log/slog" "strconv" @@ -57,15 +58,9 @@ func DecodeByteString(msg string) ([]byte, error) { // 转换字节(16进制)字符串为字节数组 func ConvertByteStringToBytes(msg string) []byte { - length := len(msg) - bytes := make([]byte, length/2) - for i := 0; i < length; i += 2 { - v, err := strconv.ParseUint(msg[i:i+2], 16, 8) - if err != nil { - panic(err) - } - bytes[i/2] = byte(v) - // slog.Info("i", "byteidx", i/2, "byte", fmt.Sprintf("%02x", v)) + bytes, err := hex.DecodeString(msg) + if err != nil { + panic(err) } return bytes } diff --git a/third_party/balise/conv.go b/third_party/balisecodec/conv.go similarity index 99% rename from third_party/balise/conv.go rename to third_party/balisecodec/conv.go index a6c67c1..ff28142 100644 --- a/third_party/balise/conv.go +++ b/third_party/balisecodec/conv.go @@ -1,4 +1,4 @@ -package balise +package balisecodec import ( "fmt" @@ -139,7 +139,7 @@ func init() { } for i, v := range ConvWords { convWordMap[v] = i - fmt.Printf("%04o: %d\n", v, i) + //fmt.Printf("%04o: %d\n", v, i) // slog.Info("构建10位到11位转换置换字", "i", i, "v", v) } // 检查:翻转有效字的所有位能形成另一个有效字 diff --git a/third_party/balise/conv_test.go b/third_party/balisecodec/conv_test.go similarity index 78% rename from third_party/balise/conv_test.go rename to third_party/balisecodec/conv_test.go index ff2a7c4..6921a5e 100644 --- a/third_party/balise/conv_test.go +++ b/third_party/balisecodec/conv_test.go @@ -1,10 +1,10 @@ -package balise_test +package balisecodec_test import ( "testing" "github.com/stretchr/testify/assert" - "joylink.club/bj-rtsts-server/third_party/balise" + "joylink.club/bj-rtsts-server/third_party/balisecodec" ) var by830 = []int{ @@ -18,21 +18,21 @@ var by830 = []int{ func TestConvList(t *testing.T) { // 数量 - assert.Equal(t, 1024, len(balise.ConvWords)) + assert.Equal(t, 1024, len(balisecodec.ConvWords)) // 后面的数比前面大 for i := 0; i < 1023; i++ { - assert.Less(t, balise.ConvWords[i], balise.ConvWords[i+1]) + assert.Less(t, balisecodec.ConvWords[i], balisecodec.ConvWords[i+1]) } // 前512项和 sum_q := 0 for i := 0; i < 512; i++ { - sum_q += int(balise.ConvWords[i]) + sum_q += int(balisecodec.ConvWords[i]) } assert.Equal(t, 267528, sum_q) // 后512项和 sum_b := 0 for i := 512; i < 1024; i++ { - sum_b += int(balise.ConvWords[i]) + sum_b += int(balisecodec.ConvWords[i]) } // 总1024项和 assert.Equal(t, 1048064, sum_q+sum_b) @@ -40,5 +40,5 @@ func TestConvList(t *testing.T) { func TestTo11(t *testing.T) { b10 := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 1} - balise.To11(b10) + balisecodec.To11(b10) } diff --git a/third_party/balise/decode.go b/third_party/balisecodec/decode.go similarity index 99% rename from third_party/balise/decode.go rename to third_party/balisecodec/decode.go index 4e58d1d..e4547bc 100644 --- a/third_party/balise/decode.go +++ b/third_party/balisecodec/decode.go @@ -1,4 +1,4 @@ -package balise +package balisecodec import ( "fmt" diff --git a/third_party/balise/encode.go b/third_party/balisecodec/encode.go similarity index 99% rename from third_party/balise/encode.go rename to third_party/balisecodec/encode.go index 2b0dd19..81056de 100644 --- a/third_party/balise/encode.go +++ b/third_party/balisecodec/encode.go @@ -1,4 +1,4 @@ -package balise +package balisecodec import ( "fmt" diff --git a/third_party/can_btm/balise_detection.go b/third_party/can_btm/balise_detection.go index e0b8c68..373a03e 100644 --- a/third_party/can_btm/balise_detection.go +++ b/third_party/can_btm/balise_detection.go @@ -109,7 +109,7 @@ func (t *BaliseDetector) detect2(wd *component.WorldData, repo *repository.Repos } if !find { balises = append(balises, balise) - //slog.Info(fmt.Sprintf("start baliseId:%v,Distance:%v,up:%v", balise.Id(), balise.LinkPosition(), curAntennaRi.Up)) + //slog.Info(fmt.Sprintf("start baliseId:%v,Distance:%v,up:%v", balisecodec.Id(), balisecodec.LinkPosition(), curAntennaRi.Up)) } } for _, balise := range endBalises { @@ -121,7 +121,7 @@ func (t *BaliseDetector) detect2(wd *component.WorldData, repo *repository.Repos } } if !find { - //slog.Info(fmt.Sprintf("end baliseId:%v,Distance:%v,up:%v", balise.Id(), balise.LinkPosition(), curAntennaRi.Up)) + //slog.Info(fmt.Sprintf("end baliseId:%v,Distance:%v,up:%v", balisecodec.Id(), balisecodec.LinkPosition(), curAntennaRi.Up)) balises = append(balises, balise) } } diff --git a/third_party/example/main.go b/third_party/example/main.go index 04e0059..fca7f06 100644 --- a/third_party/example/main.go +++ b/third_party/example/main.go @@ -4,7 +4,7 @@ import ( "fmt" "log/slog" - "joylink.club/bj-rtsts-server/third_party/balise" + "joylink.club/bj-rtsts-server/third_party/balisecodec" ) type TestMsg struct { @@ -40,19 +40,19 @@ func main() { // } // time.Sleep(time.Second * 60) - // for i, v := range balise.ConvWords { + // for i, v := range balisecodec.ConvWords { // fmt.Printf("0%o,", v) // if i%10 == 9 { // fmt.Println() // } // } - v10 := balise.ToValLeftMsb([]byte{ + v10 := balisecodec.ToValLeftMsb([]byte{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}) fmt.Println(v10) - bs := balise.ToBitsLeftMsb(1982, 11) + bs := balisecodec.ToBitsLeftMsb(1982, 11) fmt.Println(bs) - // fmt.Printf("%o\n", balise.ConvWords[511]) + // fmt.Printf("%o\n", balisecodec.ConvWords[511]) } diff --git a/third_party/interlock/beijing11/service.go b/third_party/interlock/beijing11/service.go index 038ba53..e2554f0 100644 --- a/third_party/interlock/beijing11/service.go +++ b/third_party/interlock/beijing11/service.go @@ -32,12 +32,12 @@ type serviceContext struct { client udp.UdpClient //向联锁发送数据的客户端 server udp.UdpServer //接收联锁数据的服务端 sim *memory.VerifySimulation //启动服务所使用的仿真 - iConfig *config.InterlockConfig //启动服务使用的联锁配置 + iConfig config.InterlockConfig //启动服务使用的联锁配置 deviceTable *StationDeviceIndexTable //联锁站的设备ID表,key-车站名 } -func Start(interlockConfig *config.InterlockConfig, simulation *memory.VerifySimulation) { - if interlockConfig == nil || interlockConfig.Ip == "" || !interlockConfig.Open { +func Start(interlockConfig config.InterlockConfig, simulation *memory.VerifySimulation) { + if interlockConfig.Ip == "" || !interlockConfig.Open { return } mu.Lock() diff --git a/third_party/interlock/beijing12/interlock.go b/third_party/interlock/beijing12/interlock.go index 5a2b1e5..eceb13a 100644 --- a/third_party/interlock/beijing12/interlock.go +++ b/third_party/interlock/beijing12/interlock.go @@ -5,7 +5,9 @@ import ( "bytes" "context" "fmt" + "joylink.club/bj-rtsts-server/dto/data_proto" "joylink.club/bj-rtsts-server/sys_error" + "joylink.club/bj-rtsts-server/third_party/balisecodec" "joylink.club/bj-rtsts-server/third_party/tcp" "joylink.club/bj-rtsts-server/ts/simulation/wayside/memory" "joylink.club/rtsssimulation/fi" @@ -51,7 +53,7 @@ var initMutex sync.Mutex // return interlockMap[c.Code] //} -func Start(c *config.InterlockConfig, simulation *memory.VerifySimulation, baliseList []*repository.Transponder) { +func Start(c config.InterlockConfig, simulation *memory.VerifySimulation, baliseList []*repository.Transponder) { initMutex.Lock() defer initMutex.Unlock() proxy := &interlockProxy{ @@ -59,21 +61,36 @@ func Start(c *config.InterlockConfig, simulation *memory.VerifySimulation, balis indexBalise: make(map[byte]map[byte]*repository.Transponder), fromCIBytes: make([]byte, 0, fromCIBytesLen), } - for _, balise := range simulation.Repo.TransponderList() { - if balise.LeuIndex() == 0 { + //构建应答器的索引映射 + for _, mapId := range simulation.MapIds { + giType := memory.QueryGiType(mapId) + if giType != data_proto.PictureType_StationLayout { continue } - leuIndex := byte(balise.LeuIndex()) - if proxy.indexBalise[leuIndex] == nil { - proxy.indexBalise[leuIndex] = make(map[byte]*repository.Transponder) + uids := memory.QueryUidStructure[*memory.StationUidStructure](mapId) + for _, baliseRelationship := range uids.TransponderIds { + balise := simulation.Repo.FindTransponder(baliseRelationship.Uid) + if balise.LeuIndex() == 0 { + continue + } + for _, station := range baliseRelationship.CentralizedStations { + if station.StationName != c.Code { + continue + } + leuIndex := byte(balise.LeuIndex()) + if proxy.indexBalise[leuIndex] == nil { + proxy.indexBalise[leuIndex] = make(map[byte]*repository.Transponder) + } + proxy.indexBalise[leuIndex][byte(balise.IndexInLeu())] = balise + } } - proxy.indexBalise[leuIndex][byte(balise.IndexInLeu())] = balise } + proxy.Start(simulation) interlockMap[c.Code] = proxy } -func Stop(c *config.InterlockConfig) { +func Stop(c config.InterlockConfig) { proxy := interlockMap[c.Code] if proxy != nil { proxy.Stop() @@ -85,7 +102,7 @@ type interlockProxy struct { simulation *memory.VerifySimulation collectInfoTaskCancel context.CancelFunc - runConfig *config.InterlockConfig + runConfig config.InterlockConfig // 按索引存储的应答器,leu索引-leu内索引 indexBalise map[byte]map[byte]*repository.Transponder @@ -96,7 +113,7 @@ type interlockProxy struct { } func (i *interlockProxy) Start(simulation *memory.VerifySimulation) { - if i.runConfig == nil || i.runConfig.Ip == "" || !i.runConfig.Open { + if i.runConfig.Ip == "" || !i.runConfig.Open { return } if simulation == nil { @@ -112,17 +129,14 @@ func (i *interlockProxy) Start(simulation *memory.VerifySimulation) { i.simulation = simulation } -// 采集电路状态发送间隔,单位ms -const InterlockMessageSendInterval = 300 - // 定时发送采集电路状态任务 func (i *interlockProxy) collectInfoStateTask(ctx context.Context) { defer func() { if err := recover(); err != nil { - logger().Error(logTag+"定时发送道岔状态任务异常", "error", err, "stack", string(debug.Stack())) + logger().Error(logTag+"定时发送采集状态任务异常", "error", err, "stack", string(debug.Stack())) } }() - for { + for range time.Tick(time.Duration(i.runConfig.Period) * time.Millisecond) { select { case <-ctx.Done(): return @@ -139,7 +153,6 @@ func (i *interlockProxy) collectInfoStateTask(ctx context.Context) { logger().Info(fmt.Sprintf("向联锁发送继电器数据成功:%x", collectInfoState.Encode())) } } - time.Sleep(time.Millisecond * InterlockMessageSendInterval) } } @@ -208,9 +221,18 @@ func (i *interlockProxy) handleFromCiData(n int, data []byte) { logger().Error(fmt.Sprintf("没有leuIndex[%d]leu内索引[%d]的应答器", datum.leuIndex, datum.index)) continue } - err := fi.BaliseUpdateVariableTelegram(i.simulation.World, balise.Id(), datum.telegram, false) + userTelegram, err := balisecodec.Decode(datum.telegram) if err != nil { - logger().Error(fmt.Sprintf("更新leuIndex[%d]leu内索引[%d]的应答器数据出错:%s", datum.leuIndex, datum.index, err.Error())) + logger().Error(fmt.Sprintf("解析应答器报文[%x]出错:%s", datum.telegram, err.Error())) + continue + } else { + logger().Info(fmt.Sprintf("解析出应答器[%s]的可变报文", balise.Id())) + } + err = fi.BaliseUpdateVariableTelegram(i.simulation.World, balise.Id(), datum.telegram, userTelegram, false) + if err != nil { + logger().Error(fmt.Sprintf("更新leuIndex[%d]leu内索引[%d]的应答器[%s]数据出错:%s", datum.leuIndex, datum.index, balise.Id(), err.Error())) + } else { + logger().Info(fmt.Sprintf("更新leuIndex[%d]leu内索引[%d]的应答器[%s]数据成功", datum.leuIndex, datum.index, balise.Id())) } } } diff --git a/ts/simulation/wayside/memory/wayside_memory_transponder.go b/ts/simulation/wayside/memory/wayside_memory_transponder.go index c7c3d39..5683c13 100644 --- a/ts/simulation/wayside/memory/wayside_memory_transponder.go +++ b/ts/simulation/wayside/memory/wayside_memory_transponder.go @@ -254,7 +254,7 @@ func baliseTelegramReset(simulation *VerifySimulation, balise *repository.Transp if err != nil { return sys_error.New("重置应答器报文失败", err) } - err = fi.BaliseUpdateVariableTelegram(simulation.World, balise.Id(), []byte{}, false) + err = fi.BaliseUpdateVariableTelegram(simulation.World, balise.Id(), []byte{}, []byte{}, false) if err != nil { return sys_error.New("重置应答器报文失败", err) } diff --git a/ts/simulation/wayside/memory/wayside_simulation.go b/ts/simulation/wayside/memory/wayside_simulation.go index fbbd065..a8f7002 100644 --- a/ts/simulation/wayside/memory/wayside_simulation.go +++ b/ts/simulation/wayside/memory/wayside_simulation.go @@ -399,28 +399,6 @@ func (s *VerifySimulation) GetSemiPhysicalRunConfig() *config.VobcConfig { return &s.runConfig.Vobc } -// 获取所有联锁配置唯一Code -func (s *VerifySimulation) GetInterlockCodes() []*config.InterlockConfig { - stationMap := make(map[string]string) - for _, station := range s.Repo.StationList() { - stationMap[station.GetCode()] = station.Id() - } - var configs []*config.InterlockConfig - for _, c := range s.runConfig.Interlocks { - if stationMap[c.Code] == "" || !c.Open { - continue - } - configs = append(configs, &config.InterlockConfig{ - Code: stationMap[c.Code], - Ip: c.Ip, - RemotePort: c.RemotePort, - Open: c.Open, - Line: c.Line, - }) - } - return configs -} - // 处理接到的联锁消息 func (s *VerifySimulation) HandleInterlockDriverInfo(code string, driveBytes []byte) { wd := entity.GetWorldData(s.World) diff --git a/ts/test_simulation_manage.go b/ts/test_simulation_manage.go index 4f89e4f..1f58bdc 100644 --- a/ts/test_simulation_manage.go +++ b/ts/test_simulation_manage.go @@ -122,7 +122,7 @@ func runThirdParty(s *memory.VerifySimulation) error { // 半实物启动 semi_physical_train.Default().Start(s) // 联锁启动 - for _, c := range s.GetInterlockCodes() { + for _, c := range s.GetRunConfig().Interlocks { switch c.Line { case "11": beijing11.Start(c, s) @@ -154,11 +154,10 @@ func runThirdParty(s *memory.VerifySimulation) error { // 停止仿真 func stopThirdParty(s *memory.VerifySimulation) { - // 停止半实物 semi_physical_train.Default().Stop() // 联锁启动 - for _, c := range s.GetInterlockCodes() { + for _, c := range s.GetRunConfig().Interlocks { switch c.Line { case "11": beijing11.Stop(c.Code)