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

68 lines
1.7 KiB
Go
Raw Normal View History

2024-07-25 14:55:46 +08:00
package message
import (
"bytes"
"encoding/binary"
"fmt"
"strings"
)
// CanetFrame USR-CANET200_V1.0.7 设备 以太网-CAN 透传协议帧(12字节)
type BtmHeadFrame struct {
CanLen byte //CAN帧数据长度[0,8]CanData中有效数据字节数
CanId CanFrameId //CAN帧ID
CanData []byte //CAN帧数据8字节
}
func NewBtmHeadFrame(buf []byte) *BtmHeadFrame {
cf := &BtmHeadFrame{}
cf.Decode(buf)
return cf
}
func (p *BtmHeadFrame) Encode() []byte {
buf := make([]byte, 0)
//CAN 帧ID
frameId := uint32(p.CanId.ID1)<<21 | uint32(p.CanId.ID2)<<13 | uint32(p.CanId.ID3)<<5 | uint32(p.CanId.ID4)
buf = binary.BigEndian.AppendUint32(buf, frameId)
//CAN 帧数据
if len(p.CanData) != 8 {
panic(fmt.Sprintf("len(p.CanData)!=8 datalen:%v", len(p.CanData)))
}
buf = append(buf, p.CanData...)
return buf
}
func (p *BtmHeadFrame) Decode(buf []byte) {
bb := bytes.NewBuffer(buf)
var idSource uint32
binary.Read(bb, binary.BigEndian, &idSource)
data := make([]byte, bb.Len())
_, err := bb.Read(data)
if err != nil {
fmt.Println(err)
return
}
b1 := byte((idSource >> 21) & 0xFF)
b2 := byte((idSource >> 13) & 0xFF)
b3 := byte((idSource >> 5) & 0xFF)
b4 := byte(idSource & 0x1F)
p.CanId.ID1 = b1
p.CanId.ID2 = b2
p.CanId.ID3 = b3
p.CanId.ID4 = b4
p.CanData = data
}
func (p *BtmHeadFrame) String() string {
sb := strings.Builder{}
sb.WriteString(fmt.Sprintf("CanetFrame CanLen = %d, ID1 = 0x%0x, ID2 = 0x%0x, ID3 = 0x%0x, ID4 = 0x%0x", p.CanLen,
p.CanId.ID1, p.CanId.ID2, p.CanId.ID3, p.CanId.ID4))
sb.WriteString("CanData = ")
for _, d := range p.CanData {
sb.WriteString(fmt.Sprintf(" 0x%0x ", d))
}
return sb.String()
}