rts-sim-testing-service/third_party/message/rssp_axle_section.go

140 lines
2.9 KiB
Go
Raw Normal View History

2023-10-26 16:03:05 +08:00
package message
import "fmt"
// SectionCmdMsg CI系统发送的区段操作命令
type SectionCmdMsg struct {
//bit5 计轴直接复位
Drst bool
//bit2 计轴预复位
Pdrst bool
}
func (s *SectionCmdMsg) Encode() byte {
buf := 0x00
if s.Drst {
buf = buf | (0x01 << 5)
}
if s.Pdrst {
buf = buf | (0x01 << 2)
}
return byte(buf)
}
func (s *SectionCmdMsg) Decode(buf byte) {
s.Drst = buf&(0x01<<5) != 0
s.Pdrst = buf&(0x01<<2) != 0
}
2023-10-26 17:36:33 +08:00
// SectionCmdMsgPack CI系统发送区段操作命令数据包
type SectionCmdMsgPack struct {
//检查字节固定0x80
Ck byte
//区段命令表,注意顺序要与协商一致
Scs []*SectionCmdMsg
}
2023-10-26 17:58:37 +08:00
func NewSectionCmdMsgPack(scs []*SectionCmdMsg) *SectionCmdMsgPack {
return &SectionCmdMsgPack{Ck: 0x80, Scs: scs}
}
2023-10-26 17:36:33 +08:00
func (s *SectionCmdMsgPack) Encode() []byte {
buf := make([]byte, 0, 1+len(s.Scs))
buf = append(buf, s.Ck)
for _, msg := range s.Scs {
buf = append(buf, msg.Encode())
}
return buf
}
func (s *SectionCmdMsgPack) Decode(buf []byte) error {
if len(buf) < 1 {
return fmt.Errorf("buf 没有足够的数据")
}
s.Ck = buf[0]
var scs []*SectionCmdMsg
for i := 1; i < len(buf); i++ {
msg := &SectionCmdMsg{}
msg.Decode(buf[i])
scs = append(scs, msg)
}
s.Scs = scs
return nil
}
///////////////////////////////////////////////
2023-10-26 16:03:05 +08:00
// SectionStatusMsg 发送给CI系统的区段当前的状态
type SectionStatusMsg struct {
//0-bit7 计轴出清
Clr bool
//0-bit6 计轴占用
Occ bool
//1-bit6 计轴复位反馈
Rac bool
//1-bit5 运营原因拒绝计轴复位
Rjo bool
//1-bit4 技术原因拒绝计轴复位
Rjt bool
}
func (s *SectionStatusMsg) Encode() []byte {
buf := []byte{0x00, 0x00}
if s.Clr {
buf[0] = buf[0] | (0x01 << 7)
}
if s.Occ {
buf[0] = buf[0] | (0x01 << 6)
}
//
if s.Rac {
buf[1] = buf[1] | (0x01 << 6)
}
if s.Rjo {
buf[1] = buf[1] | (0x01 << 5)
}
if s.Rjt {
buf[1] = buf[1] | (0x01 << 4)
}
return buf
}
func (s *SectionStatusMsg) Decode(buf []byte) error {
if len(buf) != 2 {
return fmt.Errorf("buf 长度须为2")
}
s.Clr = buf[0]&(0x01<<7) != 0
s.Occ = buf[0]&(0x01<<6) != 0
s.Rac = buf[1]&(0x01<<6) != 0
s.Rjo = buf[1]&(0x01<<5) != 0
s.Rjt = buf[1]&(0x01<<4) != 0
return nil
}
2023-10-26 17:36:33 +08:00
type SectionStatusMsgPack struct {
//检查字节,CI系统暂时不使用
Ck byte
//区段状态表,注意顺序要与协商一致
Sms []*SectionStatusMsg
}
func (s *SectionStatusMsgPack) Encode() []byte {
buf := make([]byte, 0, 1+2*len(s.Sms))
buf = append(buf, s.Ck)
for _, msg := range s.Sms {
buf = append(buf, msg.Encode()...)
}
return buf
}
func (s *SectionStatusMsgPack) Decode(buf []byte) error {
if len(buf)%2 != 1 {
return fmt.Errorf("buf的长度须为奇数")
}
s.Ck = buf[0]
var sms []*SectionStatusMsg
for i := 1; i < len(buf)-1; i += 2 {
msg := &SectionStatusMsg{}
msg.Decode(buf[i : i+2])
sms = append(sms, msg)
}
s.Sms = sms
return nil
}