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
|
|
|
|
|
}
|