140 lines
2.9 KiB
Go
140 lines
2.9 KiB
Go
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
|
||
}
|
||
|
||
// SectionCmdMsgPack CI系统发送区段操作命令数据包
|
||
type SectionCmdMsgPack struct {
|
||
//检查字节,固定0x80
|
||
Ck byte
|
||
//区段命令表,注意顺序要与协商一致
|
||
Scs []*SectionCmdMsg
|
||
}
|
||
|
||
func NewSectionCmdMsgPack(scs []*SectionCmdMsg) *SectionCmdMsgPack {
|
||
return &SectionCmdMsgPack{Ck: 0x80, Scs: scs}
|
||
}
|
||
|
||
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
|
||
}
|
||
|
||
///////////////////////////////////////////////
|
||
|
||
// 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
|
||
}
|
||
|
||
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
|
||
}
|