diff --git a/communication/message/transmitmessage.cpp b/communication/message/transmitmessage.cpp index 3c7104ce..d638abe1 100644 --- a/communication/message/transmitmessage.cpp +++ b/communication/message/transmitmessage.cpp @@ -152,6 +152,7 @@ static std::vector EncodeFromMessageLIN(std::shared_ptr frame, c linmsg->linMsgType == LINMessage::Type::LIN_UPDATE_RESPONDER) && dataLen > 0; if(hasData) { + LINMessage::calcChecksum(*linmsg); // len includes data bytes + 1 checksum byte linpacket->CoreMiniBitsLIN.len = static_cast(dataLen + 1); std::copy(linmsg->data.begin(), linmsg->data.begin() + dataLen, linpacket->data); diff --git a/test/unit/linencoderdecodertest.cpp b/test/unit/linencoderdecodertest.cpp index ca9d7bf6..42dadbf8 100644 --- a/test/unit/linencoderdecodertest.cpp +++ b/test/unit/linencoderdecodertest.cpp @@ -174,6 +174,19 @@ TEST_F(LINEncoderDecoderTest, TransmitMessageBreakOnlySetsCommander) { EXPECT_EQ(lin->CoreMiniBitsLIN.BreakOnly, 1); } +TEST_F(LINEncoderDecoderTest, TransmitMessageCalculatesChecksum) { + auto message = std::make_shared(static_cast(0x22u)); + message->network = icsneo::Network::NetID::LIN_02; + message->linMsgType = icsneo::LINMessage::Type::LIN_UPDATE_RESPONDER; + message->isEnhancedChecksum = true; + message->data = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; + auto bytes = TransmitMessage::EncodeFromMessage(message, 1, report); + ASSERT_GE(bytes.size(), sizeof(TransmitMessage)); + auto* tx = reinterpret_cast(bytes.data()); + auto* lin = reinterpret_cast(tx->commonHeader); + EXPECT_EQ(lin->CoreMiniBitsLIN.LINByte9, 0xB6); +} + TEST_F(LINEncoderDecoderTest, PacketEncoderControllerWithDataTest) { std::vector bytestream; auto message = std::make_shared(static_cast(0x11u));