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

95 lines
2.4 KiB
Go
Raw Normal View History

2024-07-25 14:55:46 +08:00
package message
import "encoding/binary"
//数据帧0x80+扩展类型),一个CAN帧只能存储8个字节对于一个应答器报文分片到多个CAN数据帧中
// BtmDataMessageFrame 数据帧-应答器报文
// offset = [0x00,0x0c] 共13个即可用于存储应答器报文的共104个字节
// BtmDataMessageTimeAFrame 数据帧-时间戳A
// offset = 0x0d
// BtmDataMessageTimeBFrame 数据帧-时间戳B
// offset = 0x0e
// BtmDataMessageEndFrame 数据帧-结束
// offset = 0x7f
const (
DATA_TIME_A_OFFSET = 0x0d
DATA_TIME_B_OFFSET = 0x0e
DATA_END_OFFSET = 0x7f
)
type BtmDataMessageAtpFrame struct {
//帧ID
FId CanFrameId
//8字节,应答器报文片段
Message []byte
}
type BtmDataMessageAtpTimeAndEndFrame struct {
//帧ID
FId CanFrameId
//时间戳A
Time uint32
//CRC
Crc32 uint32
}
func CreateBtmDataMessageDataAtpFrame(sn byte, offset byte) *BtmDataMessageAtpFrame {
return &BtmDataMessageAtpFrame{
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0x80+offset, sn),
}
}
func (f *BtmDataMessageAtpFrame) Encode() *BtmHeadFrame {
cf := &BtmHeadFrame{}
cf.CanId = f.FId
cf.CanLen = 8
dataBuf := make([]byte, 0, 8)
for _, data := range f.Message {
dataBuf = append(dataBuf, data)
}
cf.CanData = dataBuf
return cf
}
func (f *BtmDataMessageAtpFrame) Decode(cf *BtmHeadFrame) bool {
f.FId = cf.CanId
//
reader := NewCanBitsReader(cf.CanData, 8)
//
f.Message = make([]byte, 0, 8)
for c := 0; c < 8; c++ {
data, ok := reader.ReadByte()
if !ok {
return false
}
f.Message = append(f.Message, data)
}
//
return true
}
/////////////////////////////////////////////////////
func (atp *BtmDataMessageAtpTimeAndEndFrame) Encode() *BtmHeadFrame {
cf := &BtmHeadFrame{}
cf.CanId = atp.FId
cf.CanLen = 8
data := make([]byte, 0)
data = binary.BigEndian.AppendUint32(data, atp.Time)
data = binary.BigEndian.AppendUint32(data, atp.Crc32)
cf.CanData = data
return cf
}
func CreateBtmDataMessageTimeAtpFrame(sn byte, offset byte) *BtmDataMessageAtpTimeAndEndFrame {
return &BtmDataMessageAtpTimeAndEndFrame{FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0x80+offset, sn)}
}
////////////////////////////////////////////////////////////
func BtmDataMessageEndAtpFrame(sn byte) *BtmDataMessageAtpTimeAndEndFrame {
return &BtmDataMessageAtpTimeAndEndFrame{
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0xff, sn),
}
}