package message // BtmTimeSyncCheckFrame BTM发往ATP的时间校验帧 type BtmTimeSyncCheckFrame struct { //帧ID FId CanFrameId //T2时刻 //当收到某一流水号的ATP查询帧后,BTM将记录接收到该查询帧的时间值做为T2时刻。 T2 uint32 //T3时刻 //BTM将在T3时刻发送回复帧给ATP,并保持流水号与ATP查询帧一致。 T3 uint32 } func NewBtmTimeSyncCheckFrame(sn byte) *BtmTimeSyncCheckFrame { return &BtmTimeSyncCheckFrame{ FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, CAN_FRAME_TIME_SYNC_RSP, sn), } } func (f *BtmTimeSyncCheckFrame) Decode(reader CanBitsReader) bool { // if !f.FId.Decode(reader) { return false } //T2 t21, t21Ok := reader.ReadByte() if !t21Ok { return false } t22, t22Ok := reader.ReadByte() if !t22Ok { return false } t23, t23Ok := reader.ReadByte() if !t23Ok { return false } t24, t24Ok := reader.ReadByte() if !t24Ok { return false } f.T2 = 0 f.T2 |= uint32(t21) << 24 f.T2 |= uint32(t22) << 16 f.T2 |= uint32(t23) << 8 f.T2 |= uint32(t24) //T3 t31, t31Ok := reader.ReadByte() if !t31Ok { return false } t32, t32Ok := reader.ReadByte() if !t32Ok { return false } t33, t33Ok := reader.ReadByte() if !t33Ok { return false } t34, t34Ok := reader.ReadByte() if !t34Ok { return false } f.T3 = 0 f.T3 |= uint32(t31) << 24 f.T3 |= uint32(t32) << 16 f.T3 |= uint32(t33) << 8 f.T3 |= uint32(t34) // return true } func (f *BtmTimeSyncCheckFrame) Encode() CanBusData { writer := NewCanBitsWriter(12) f.FId.Encode(writer) // timeByteMsk := uint32(0x00_00_00_ff) //t2 t21 := byte((f.T2 >> 24) & timeByteMsk) t22 := byte((f.T2 >> 16) & timeByteMsk) t23 := byte((f.T2 >> 8) & timeByteMsk) t24 := byte(f.T2 & timeByteMsk) writer.AddByte(t21) writer.AddByte(t22) writer.AddByte(t23) writer.AddByte(t24) //t3 t31 := byte((f.T3 >> 24) & timeByteMsk) t32 := byte((f.T3 >> 16) & timeByteMsk) t33 := byte((f.T3 >> 8) & timeByteMsk) t34 := byte(f.T3 & timeByteMsk) writer.AddByte(t31) writer.AddByte(t32) writer.AddByte(t33) writer.AddByte(t34) // return writer.(CanBusData) }