diff --git a/third_party/message/can_btm_time_sync_rsp.go b/third_party/message/can_btm_time_sync_rsp.go new file mode 100644 index 0000000..77afddd --- /dev/null +++ b/third_party/message/can_btm_time_sync_rsp.go @@ -0,0 +1,97 @@ +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) +}