mirror of
https://github.com/intrepidcs/libicsneo.git
synced 2026-09-20 07:58:39 +02:00
LIN: Add wakeup request
This commit is contained in:
committed by
Kyle Schwarz
parent
3a6501d116
commit
d95a17b360
@@ -471,6 +471,7 @@ icsneoc2_error_t icsneoc2_message_lin_status_flags_get(const icsneoc2_message_t*
|
|||||||
if(lin_msg->statusFlags.HasUpdatedResponderOnce) *status_flags |= ICSNEOC2_LIN_STATUS_HAS_UPDATED_RESPONDER_ONCE;
|
if(lin_msg->statusFlags.HasUpdatedResponderOnce) *status_flags |= ICSNEOC2_LIN_STATUS_HAS_UPDATED_RESPONDER_ONCE;
|
||||||
if(lin_msg->statusFlags.BusRecovered) *status_flags |= ICSNEOC2_LIN_STATUS_BUS_RECOVERED;
|
if(lin_msg->statusFlags.BusRecovered) *status_flags |= ICSNEOC2_LIN_STATUS_BUS_RECOVERED;
|
||||||
if(lin_msg->statusFlags.BreakOnly) *status_flags |= ICSNEOC2_LIN_STATUS_BREAK_ONLY;
|
if(lin_msg->statusFlags.BreakOnly) *status_flags |= ICSNEOC2_LIN_STATUS_BREAK_ONLY;
|
||||||
|
if(lin_msg->statusFlags.WakeupRequest) *status_flags |= ICSNEOC2_LIN_STATUS_WAKEUP_REQUEST;
|
||||||
return icsneoc2_error_success;
|
return icsneoc2_error_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ void init_linmessage(pybind11::module_& m) {
|
|||||||
.def_readwrite("UpdateResponderOnce", &LINStatusFlags::UpdateResponderOnce)
|
.def_readwrite("UpdateResponderOnce", &LINStatusFlags::UpdateResponderOnce)
|
||||||
.def_readwrite("HasUpdatedResponderOnce", &LINStatusFlags::HasUpdatedResponderOnce)
|
.def_readwrite("HasUpdatedResponderOnce", &LINStatusFlags::HasUpdatedResponderOnce)
|
||||||
.def_readwrite("BusRecovered", &LINStatusFlags::BusRecovered)
|
.def_readwrite("BusRecovered", &LINStatusFlags::BusRecovered)
|
||||||
.def_readwrite("BreakOnly", &LINStatusFlags::BreakOnly);
|
.def_readwrite("BreakOnly", &LINStatusFlags::BreakOnly)
|
||||||
|
.def_readwrite("WakeupRequest", &LINStatusFlags::WakeupRequest);
|
||||||
|
|
||||||
pybind11::classh<LINMessage, Frame> linMessage(m, "LINMessage");
|
pybind11::classh<LINMessage, Frame> linMessage(m, "LINMessage");
|
||||||
|
|
||||||
@@ -39,7 +40,8 @@ void init_linmessage(pybind11::module_& m) {
|
|||||||
.value("LIN_BREAK_ONLY", LINMessage::Type::LIN_BREAK_ONLY)
|
.value("LIN_BREAK_ONLY", LINMessage::Type::LIN_BREAK_ONLY)
|
||||||
.value("LIN_SYNC_ONLY", LINMessage::Type::LIN_SYNC_ONLY)
|
.value("LIN_SYNC_ONLY", LINMessage::Type::LIN_SYNC_ONLY)
|
||||||
.value("LIN_UPDATE_RESPONDER", LINMessage::Type::LIN_UPDATE_RESPONDER)
|
.value("LIN_UPDATE_RESPONDER", LINMessage::Type::LIN_UPDATE_RESPONDER)
|
||||||
.value("LIN_ERROR", LINMessage::Type::LIN_ERROR);
|
.value("LIN_ERROR", LINMessage::Type::LIN_ERROR)
|
||||||
|
.value("LIN_WAKEUP_REQUEST", LINMessage::Type::LIN_WAKEUP_REQUEST);
|
||||||
|
|
||||||
linMessage
|
linMessage
|
||||||
.def(pybind11::init<>())
|
.def(pybind11::init<>())
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ static std::vector<uint8_t> EncodeFromMessageLIN(std::shared_ptr<Frame> frame, c
|
|||||||
linpacket->CoreMiniBitsLIN.TXResponder = 1;
|
linpacket->CoreMiniBitsLIN.TXResponder = 1;
|
||||||
break;
|
break;
|
||||||
case LINMessage::Type::LIN_BREAK_ONLY:
|
case LINMessage::Type::LIN_BREAK_ONLY:
|
||||||
|
linpacket->CoreMiniBitsLIN.TXCommander = 1;
|
||||||
linpacket->CoreMiniBitsLIN.BreakOnly = 1;
|
linpacket->CoreMiniBitsLIN.BreakOnly = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -72,18 +72,30 @@ std::shared_ptr<Message> HardwareLINPacket::DecodeToMessage(const std::vector<ui
|
|||||||
static_cast<bool>(packet->CoreMiniBitsLIN.UpdateResponderOnce),
|
static_cast<bool>(packet->CoreMiniBitsLIN.UpdateResponderOnce),
|
||||||
static_cast<bool>(packet->CoreMiniBitsLIN.HasUpdatedResponderOnce),
|
static_cast<bool>(packet->CoreMiniBitsLIN.HasUpdatedResponderOnce),
|
||||||
static_cast<bool>(packet->CoreMiniBitsLIN.BusRecovered),
|
static_cast<bool>(packet->CoreMiniBitsLIN.BusRecovered),
|
||||||
static_cast<bool>(packet->CoreMiniBitsLIN.BreakOnly)
|
static_cast<bool>(packet->CoreMiniBitsLIN.BreakOnly),
|
||||||
|
static_cast<bool>(packet->CoreMiniBitsLIN.WakeupRequest)
|
||||||
};
|
};
|
||||||
if(msg->statusFlags.TxCommander || msg->statusFlags.TxResponder)
|
// Wake type only for a wake-only pulse. A UART/LIN break or a complete
|
||||||
|
// frame may also carry WakeupRequest; those keep their existing type.
|
||||||
|
const bool wakeupPulse = msg->statusFlags.WakeupRequest &&
|
||||||
|
packet->CoreMiniBitsLIN.len == 0 &&
|
||||||
|
packet->CoreMiniBitsLIN.ID == 0 &&
|
||||||
|
!msg->statusFlags.BreakOnly &&
|
||||||
|
!msg->errFlags.ErrRxBreakOnly &&
|
||||||
|
!msg->errFlags.ErrRxBreakSyncOnly;
|
||||||
|
if(wakeupPulse)
|
||||||
|
msg->linMsgType = LINMessage::Type::LIN_WAKEUP_REQUEST;
|
||||||
|
else if(msg->statusFlags.TxCommander || msg->statusFlags.TxResponder)
|
||||||
msg->linMsgType = LINMessage::Type::LIN_COMMANDER_MSG;
|
msg->linMsgType = LINMessage::Type::LIN_COMMANDER_MSG;
|
||||||
else if(msg->statusFlags.BreakOnly)
|
else if(msg->statusFlags.BreakOnly)
|
||||||
msg->linMsgType = LINMessage::Type::LIN_BREAK_ONLY;
|
msg->linMsgType = LINMessage::Type::LIN_BREAK_ONLY;
|
||||||
if( msg->errFlags.ErrRxBreakOnly || msg->errFlags.ErrRxBreakSyncOnly ||
|
if( !wakeupPulse &&
|
||||||
|
(msg->errFlags.ErrRxBreakOnly || msg->errFlags.ErrRxBreakSyncOnly ||
|
||||||
msg->errFlags.ErrTxRxMismatch || msg->errFlags.ErrRxBreakNotZero ||
|
msg->errFlags.ErrTxRxMismatch || msg->errFlags.ErrRxBreakNotZero ||
|
||||||
msg->errFlags.ErrRxBreakTooShort || msg->errFlags.ErrRxSyncNot55 ||
|
msg->errFlags.ErrRxBreakTooShort || msg->errFlags.ErrRxSyncNot55 ||
|
||||||
msg->errFlags.ErrRxDataLenOver8 || msg->errFlags.ErrFrameSync ||
|
msg->errFlags.ErrRxDataLenOver8 || msg->errFlags.ErrFrameSync ||
|
||||||
msg->errFlags.ErrFrameMessageID || msg->errFlags.ErrChecksumMatch ||
|
msg->errFlags.ErrFrameMessageID || msg->errFlags.ErrChecksumMatch ||
|
||||||
msg->errFlags.ErrFrameResponderData )
|
msg->errFlags.ErrFrameResponderData) )
|
||||||
{ msg->linMsgType = LINMessage::Type::LIN_ERROR; }
|
{ msg->linMsgType = LINMessage::Type::LIN_ERROR; }
|
||||||
|
|
||||||
msg->timestamp = packet->timestamp;
|
msg->timestamp = packet->timestamp;
|
||||||
@@ -103,7 +115,7 @@ bool HardwareLINPacket::EncodeFromMessage(LINMessage& message, std::vector<uint8
|
|||||||
}
|
}
|
||||||
case LINMessage::Type::LIN_BREAK_ONLY:
|
case LINMessage::Type::LIN_BREAK_ONLY:
|
||||||
{
|
{
|
||||||
size |= 0x20u;
|
size |= 0x80u | 0x20u;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LINMessage::Type::NOT_SET:
|
case LINMessage::Type::NOT_SET:
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ struct LINStatusFlags {
|
|||||||
bool HasUpdatedResponderOnce = false;
|
bool HasUpdatedResponderOnce = false;
|
||||||
bool BusRecovered = false;
|
bool BusRecovered = false;
|
||||||
bool BreakOnly = false;
|
bool BreakOnly = false;
|
||||||
|
bool WakeupRequest = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
class LINMessage : public Frame {
|
class LINMessage : public Frame {
|
||||||
@@ -45,7 +46,8 @@ public:
|
|||||||
LIN_BREAK_ONLY = icsneoc2_lin_msg_type_break_only,
|
LIN_BREAK_ONLY = icsneoc2_lin_msg_type_break_only,
|
||||||
LIN_SYNC_ONLY = icsneoc2_lin_msg_type_sync_only,
|
LIN_SYNC_ONLY = icsneoc2_lin_msg_type_sync_only,
|
||||||
LIN_UPDATE_RESPONDER = icsneoc2_lin_msg_type_update_responder,
|
LIN_UPDATE_RESPONDER = icsneoc2_lin_msg_type_update_responder,
|
||||||
LIN_ERROR = icsneoc2_lin_msg_type_error
|
LIN_ERROR = icsneoc2_lin_msg_type_error,
|
||||||
|
LIN_WAKEUP_REQUEST = icsneoc2_lin_msg_type_wakeup_request
|
||||||
};
|
};
|
||||||
|
|
||||||
static void calcChecksum(LINMessage& message);
|
static void calcChecksum(LINMessage& message);
|
||||||
|
|||||||
@@ -47,7 +47,8 @@ struct HardwareLINPacket {
|
|||||||
uint16_t ResponderByteFerr : 1; //Framing error in one of our responder bytes.
|
uint16_t ResponderByteFerr : 1; //Framing error in one of our responder bytes.
|
||||||
uint16_t TxAborted : 1;//!< This transmit was aborted.
|
uint16_t TxAborted : 1;//!< This transmit was aborted.
|
||||||
uint16_t BreakOnly : 1;
|
uint16_t BreakOnly : 1;
|
||||||
uint16_t : 2;
|
uint16_t WakeupRequest : 1; //!< LIN wakeup pulse.
|
||||||
|
uint16_t : 1;
|
||||||
} CoreMiniBitsLIN;
|
} CoreMiniBitsLIN;
|
||||||
|
|
||||||
uint8_t data[8];
|
uint8_t data[8];
|
||||||
|
|||||||
@@ -118,6 +118,18 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const LIN_SETTINGS* getLINSettingsFor(Network net) const override {
|
||||||
|
auto cfg = getStructurePointer<radcomet2_settings_t>();
|
||||||
|
if(cfg == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
switch(net.getNetID()) {
|
||||||
|
case Network::NetID::LIN_01:
|
||||||
|
return &(cfg->lin1);
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<bool> isT1SPLCAEnabledFor(Network net) const override {
|
std::optional<bool> isT1SPLCAEnabledFor(Network net) const override {
|
||||||
const ETHERNET10T1S_SETTINGS* t1s = getT1SSettingsFor(net);
|
const ETHERNET10T1S_SETTINGS* t1s = getT1SSettingsFor(net);
|
||||||
if(t1s == nullptr)
|
if(t1s == nullptr)
|
||||||
|
|||||||
@@ -115,6 +115,18 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const LIN_SETTINGS* getLINSettingsFor(Network net) const override {
|
||||||
|
auto cfg = getStructurePointer<radcomet3_settings_t>();
|
||||||
|
if(cfg == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
switch(net.getNetID()) {
|
||||||
|
case Network::NetID::LIN_01:
|
||||||
|
return &(cfg->lin1);
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const ETHERNET_SETTINGS2* getEthernetSettingsFor(Network net) const override {
|
const ETHERNET_SETTINGS2* getEthernetSettingsFor(Network net) const override {
|
||||||
auto cfg = getStructurePointer<radcomet3_settings_t>();
|
auto cfg = getStructurePointer<radcomet3_settings_t>();
|
||||||
if(cfg == nullptr)
|
if(cfg == nullptr)
|
||||||
|
|||||||
@@ -381,6 +381,7 @@ typedef enum _icsneoc2_lin_msg_type_t {
|
|||||||
icsneoc2_lin_msg_type_sync_only = 4,
|
icsneoc2_lin_msg_type_sync_only = 4,
|
||||||
icsneoc2_lin_msg_type_update_responder = 5,
|
icsneoc2_lin_msg_type_update_responder = 5,
|
||||||
icsneoc2_lin_msg_type_error = 6,
|
icsneoc2_lin_msg_type_error = 6,
|
||||||
|
icsneoc2_lin_msg_type_wakeup_request = 7,
|
||||||
} _icsneoc2_lin_msg_type_t;
|
} _icsneoc2_lin_msg_type_t;
|
||||||
|
|
||||||
typedef uint8_t icsneoc2_lin_msg_type_t;
|
typedef uint8_t icsneoc2_lin_msg_type_t;
|
||||||
@@ -409,6 +410,7 @@ typedef uint32_t icsneoc2_lin_err_flags_t;
|
|||||||
#define ICSNEOC2_LIN_STATUS_HAS_UPDATED_RESPONDER_ONCE 0x20
|
#define ICSNEOC2_LIN_STATUS_HAS_UPDATED_RESPONDER_ONCE 0x20
|
||||||
#define ICSNEOC2_LIN_STATUS_BUS_RECOVERED 0x40
|
#define ICSNEOC2_LIN_STATUS_BUS_RECOVERED 0x40
|
||||||
#define ICSNEOC2_LIN_STATUS_BREAK_ONLY 0x80
|
#define ICSNEOC2_LIN_STATUS_BREAK_ONLY 0x80
|
||||||
|
#define ICSNEOC2_LIN_STATUS_WAKEUP_REQUEST 0x100
|
||||||
|
|
||||||
typedef uint32_t icsneoc2_lin_status_flags_t;
|
typedef uint32_t icsneoc2_lin_status_flags_t;
|
||||||
|
|
||||||
|
|||||||
@@ -1862,6 +1862,7 @@ TEST(icsneoc2, test_lin_msg_type_enum_values)
|
|||||||
ASSERT_EQ(icsneoc2_lin_msg_type_sync_only, 4);
|
ASSERT_EQ(icsneoc2_lin_msg_type_sync_only, 4);
|
||||||
ASSERT_EQ(icsneoc2_lin_msg_type_update_responder, 5);
|
ASSERT_EQ(icsneoc2_lin_msg_type_update_responder, 5);
|
||||||
ASSERT_EQ(icsneoc2_lin_msg_type_error, 6);
|
ASSERT_EQ(icsneoc2_lin_msg_type_error, 6);
|
||||||
|
ASSERT_EQ(icsneoc2_lin_msg_type_wakeup_request, 7);
|
||||||
ASSERT_EQ(sizeof(icsneoc2_lin_msg_type_t), sizeof(uint8_t));
|
ASSERT_EQ(sizeof(icsneoc2_lin_msg_type_t), sizeof(uint8_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1875,6 +1876,7 @@ TEST(icsneoc2, test_lin_msg_type_cpp_enum_sync)
|
|||||||
ASSERT_EQ(static_cast<uint8_t>(T::LIN_SYNC_ONLY), icsneoc2_lin_msg_type_sync_only);
|
ASSERT_EQ(static_cast<uint8_t>(T::LIN_SYNC_ONLY), icsneoc2_lin_msg_type_sync_only);
|
||||||
ASSERT_EQ(static_cast<uint8_t>(T::LIN_UPDATE_RESPONDER), icsneoc2_lin_msg_type_update_responder);
|
ASSERT_EQ(static_cast<uint8_t>(T::LIN_UPDATE_RESPONDER), icsneoc2_lin_msg_type_update_responder);
|
||||||
ASSERT_EQ(static_cast<uint8_t>(T::LIN_ERROR), icsneoc2_lin_msg_type_error);
|
ASSERT_EQ(static_cast<uint8_t>(T::LIN_ERROR), icsneoc2_lin_msg_type_error);
|
||||||
|
ASSERT_EQ(static_cast<uint8_t>(T::LIN_WAKEUP_REQUEST), icsneoc2_lin_msg_type_wakeup_request);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(icsneoc2, test_lin_flag_bitmask_values)
|
TEST(icsneoc2, test_lin_flag_bitmask_values)
|
||||||
@@ -1901,6 +1903,7 @@ TEST(icsneoc2, test_lin_flag_bitmask_values)
|
|||||||
ASSERT_EQ(ICSNEOC2_LIN_STATUS_HAS_UPDATED_RESPONDER_ONCE, 0x20);
|
ASSERT_EQ(ICSNEOC2_LIN_STATUS_HAS_UPDATED_RESPONDER_ONCE, 0x20);
|
||||||
ASSERT_EQ(ICSNEOC2_LIN_STATUS_BUS_RECOVERED, 0x40);
|
ASSERT_EQ(ICSNEOC2_LIN_STATUS_BUS_RECOVERED, 0x40);
|
||||||
ASSERT_EQ(ICSNEOC2_LIN_STATUS_BREAK_ONLY, 0x80);
|
ASSERT_EQ(ICSNEOC2_LIN_STATUS_BREAK_ONLY, 0x80);
|
||||||
|
ASSERT_EQ(ICSNEOC2_LIN_STATUS_WAKEUP_REQUEST, 0x100);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(icsneoc2, test_icsneoc2_eth_create)
|
TEST(icsneoc2, test_icsneoc2_eth_create)
|
||||||
|
|||||||
@@ -2,12 +2,14 @@
|
|||||||
#include "icsneo/communication/encoder.h"
|
#include "icsneo/communication/encoder.h"
|
||||||
#include "icsneo/communication/packet/linpacket.h"
|
#include "icsneo/communication/packet/linpacket.h"
|
||||||
#include "icsneo/communication/message/linmessage.h"
|
#include "icsneo/communication/message/linmessage.h"
|
||||||
|
#include "icsneo/communication/message/transmitmessage.h"
|
||||||
#include "icsneo/communication/packetizer.h"
|
#include "icsneo/communication/packetizer.h"
|
||||||
#include "icsneo/core/ringbuffer.h"
|
#include "icsneo/core/ringbuffer.h"
|
||||||
#include "icsneo/api/eventmanager.h"
|
#include "icsneo/api/eventmanager.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
using namespace icsneo;
|
using namespace icsneo;
|
||||||
|
|
||||||
@@ -55,6 +57,16 @@ protected:
|
|||||||
0x00, 0x00,
|
0x00, 0x00,
|
||||||
0xE2, 0x41};
|
0xE2, 0x41};
|
||||||
|
|
||||||
|
// Break-only LIN 1: commander (0x80) | break-only (0x20) | len 3 => 0xa3
|
||||||
|
// ID 0x00 pID 0x80
|
||||||
|
std::vector<uint8_t> testControllerBreakOnly =
|
||||||
|
{0xaa, 0x0c,
|
||||||
|
0x0d, 0x00,
|
||||||
|
0x10, 0x00,
|
||||||
|
0x00, 0xa3,
|
||||||
|
0x00, 0x00,
|
||||||
|
0x80, 0x41};
|
||||||
|
|
||||||
std::vector<uint8_t> recvBytes =
|
std::vector<uint8_t> recvBytes =
|
||||||
{0xaa, 0x0c, 0x22, 0x00,
|
{0xaa, 0x0c, 0x22, 0x00,
|
||||||
0x10, 0x00, 0x88, 0x03,
|
0x10, 0x00, 0x88, 0x03,
|
||||||
@@ -139,6 +151,29 @@ TEST_F(LINEncoderDecoderTest, PacketEncoderControllerHeaderTest) {
|
|||||||
EXPECT_EQ(bytestream, testControllerHeaderOnly);
|
EXPECT_EQ(bytestream, testControllerHeaderOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(LINEncoderDecoderTest, PacketEncoderControllerBreakOnlyTest) {
|
||||||
|
std::vector<uint8_t> bytestream;
|
||||||
|
auto message = std::make_shared<icsneo::LINMessage>(static_cast<uint8_t>(0x00u));
|
||||||
|
message->network = icsneo::Network::NetID::LIN_01;
|
||||||
|
message->linMsgType = icsneo::LINMessage::Type::LIN_BREAK_ONLY;
|
||||||
|
message->isEnhancedChecksum = false;
|
||||||
|
packetEncoder->encode(*packetizer, bytestream, message);
|
||||||
|
EXPECT_EQ(bytestream, testControllerBreakOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LINEncoderDecoderTest, TransmitMessageBreakOnlySetsCommander) {
|
||||||
|
auto message = std::make_shared<icsneo::LINMessage>(static_cast<uint8_t>(0x00u));
|
||||||
|
message->network = icsneo::Network::NetID::LIN_01;
|
||||||
|
message->linMsgType = icsneo::LINMessage::Type::LIN_BREAK_ONLY;
|
||||||
|
auto bytes = TransmitMessage::EncodeFromMessage(message, 1, report);
|
||||||
|
ASSERT_FALSE(bytes.empty());
|
||||||
|
ASSERT_GE(bytes.size(), sizeof(TransmitMessage));
|
||||||
|
auto* tx = reinterpret_cast<TransmitMessage*>(bytes.data());
|
||||||
|
auto* lin = reinterpret_cast<HardwareLINPacket*>(tx->commonHeader);
|
||||||
|
EXPECT_EQ(lin->CoreMiniBitsLIN.TXCommander, 1);
|
||||||
|
EXPECT_EQ(lin->CoreMiniBitsLIN.BreakOnly, 1);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(LINEncoderDecoderTest, PacketEncoderControllerWithDataTest) {
|
TEST_F(LINEncoderDecoderTest, PacketEncoderControllerWithDataTest) {
|
||||||
std::vector<uint8_t> bytestream;
|
std::vector<uint8_t> bytestream;
|
||||||
auto message = std::make_shared<icsneo::LINMessage>(static_cast<uint8_t>(0x11u));
|
auto message = std::make_shared<icsneo::LINMessage>(static_cast<uint8_t>(0x11u));
|
||||||
@@ -193,3 +228,45 @@ TEST_F(LINEncoderDecoderTest, PacketDecoderTest) {
|
|||||||
EXPECT_EQ(msg2->data, testMessage2->data);
|
EXPECT_EQ(msg2->data, testMessage2->data);
|
||||||
EXPECT_EQ(msg2->checksum, testMessage2->checksum);
|
EXPECT_EQ(msg2->checksum, testMessage2->checksum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::shared_ptr<LINMessage> decodeLinPacket(const HardwareLINPacket& pkt) {
|
||||||
|
std::vector<uint8_t> bytes(sizeof(pkt));
|
||||||
|
std::memcpy(bytes.data(), &pkt, sizeof(pkt));
|
||||||
|
return std::dynamic_pointer_cast<LINMessage>(HardwareLINPacket::DecodeToMessage(bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LINEncoderDecoderTest, WakeupPulseDecodeTest) {
|
||||||
|
HardwareLINPacket pkt{};
|
||||||
|
pkt.CoreMiniBitsLIN.WakeupRequest = 1;
|
||||||
|
auto msg = decodeLinPacket(pkt);
|
||||||
|
ASSERT_NE(msg, nullptr);
|
||||||
|
EXPECT_EQ(msg->linMsgType, LINMessage::Type::LIN_WAKEUP_REQUEST);
|
||||||
|
EXPECT_TRUE(msg->statusFlags.WakeupRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LINEncoderDecoderTest, WakeupFlagOnUartBreakStaysError) {
|
||||||
|
HardwareLINPacket pkt{};
|
||||||
|
pkt.CoreMiniBitsLIN.WakeupRequest = 1;
|
||||||
|
pkt.CoreMiniBitsLIN.ErrRxOnlyBreak = 1;
|
||||||
|
auto msg = decodeLinPacket(pkt);
|
||||||
|
ASSERT_NE(msg, nullptr);
|
||||||
|
EXPECT_EQ(msg->linMsgType, LINMessage::Type::LIN_ERROR);
|
||||||
|
EXPECT_TRUE(msg->statusFlags.WakeupRequest);
|
||||||
|
EXPECT_TRUE(msg->errFlags.ErrRxBreakOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LINEncoderDecoderTest, WakeupFlagOnCompleteFrameKeepsCommander) {
|
||||||
|
HardwareLINPacket pkt{};
|
||||||
|
pkt.CoreMiniBitsLIN.WakeupRequest = 1;
|
||||||
|
pkt.CoreMiniBitsLIN.TXCommander = 1;
|
||||||
|
pkt.CoreMiniBitsLIN.ID = 0x10;
|
||||||
|
pkt.CoreMiniBitsLIN.len = 3; // two responder bytes plus the checksum
|
||||||
|
pkt.data[0] = 0xaa;
|
||||||
|
pkt.data[1] = 0xbb;
|
||||||
|
pkt.data[2] = 0x99; // classic checksum, otherwise the frame decodes as LIN_ERROR
|
||||||
|
auto msg = decodeLinPacket(pkt);
|
||||||
|
ASSERT_NE(msg, nullptr);
|
||||||
|
EXPECT_EQ(msg->linMsgType, LINMessage::Type::LIN_COMMANDER_MSG);
|
||||||
|
EXPECT_TRUE(msg->statusFlags.WakeupRequest);
|
||||||
|
EXPECT_EQ(msg->ID, 0x10);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user