Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions include/asam_cmp/tecmp_converter.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,13 @@ class Converter final
static PacketPtr ConvertCaptureModulePayload(CmpHeader& header, const TecmpPayloadPtr& payload);
static PacketPtr ConvertInterfacePayload(CmpHeader& header, const TecmpPayloadPtr& payload);
static PacketPtr ConvertDataPayload(CmpHeader& header, const TecmpPayloadPtr& payload);
static PacketPtr GetPackageFromTecmpHeader(const TECMP::CmpHeader& header);
static PacketPtr GetPacketFromTecmpHeader(const TECMP::CmpHeader& header);

private:
static PacketPtr ConvertCanPayload(CmpHeader& header, const TecmpPayloadPtr& payload);
static PacketPtr ConvertCanFdPayload(TECMP::CanPayload* canPayload, PacketPtr packet);
static PacketPtr convertLinPayload(CmpHeader& header, const TecmpPayloadPtr& payload);
static PacketPtr ConvertLinPayload(CmpHeader& header, const TecmpPayloadPtr& payload);
static PacketPtr ConvertEthernetPayload(CmpHeader& header, const TecmpPayloadPtr& payload);
};

END_NAMESPACE_TECMP
1 change: 1 addition & 0 deletions include/asam_cmp/tecmp_decoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class Decoder final
static TecmpPayloadPtr GetCaptureModulePayload(const uint8_t* payloadData, const std::size_t size);
static TecmpPayloadPtr GetCanPayload(const uint8_t* payloadData, const std::size_t size);
static TecmpPayloadPtr GetLinPayload(const uint8_t* payloadData, const std::size_t size);
static TecmpPayloadPtr GetEthernetPayload(const uint8_t* payloadData, const std::size_t size);
};

END_NAMESPACE_TECMP
17 changes: 17 additions & 0 deletions include/asam_cmp/tecmp_ethernet_payload.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#pragma once

#include <asam_cmp/common.h>
#include <asam_cmp/tecmp_payload.h>

BEGIN_NAMESPACE_TECMP

class EthernetPayload : public Payload
{
public:
EthernetPayload(const uint8_t* data, size_t size);

const uint8_t* getData() const;
std::size_t getDataLength() const;
};

END_NAMESPACE_TECMP
6 changes: 4 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ set(SRC_Headers ../include/${LIB_NAME}/common.h
../include/${LIB_NAME}/tecmp_decoder.h
../include/${LIB_NAME}/tecmp_interface_payload.h
../include/${LIB_NAME}/tecmp_converter.h
../include/${LIB_NAME}/tecmp_ethernet_payload.h
)

set(SRC_Sources cmp_header.cpp
Expand Down Expand Up @@ -55,13 +56,14 @@ set(SRC_Sources cmp_header.cpp
tecmp_decoder.cpp
tecmp_interface_payload.cpp
tecmp_converter.cpp
tecmp_ethernet_payload.cpp
)

add_library(${LIB_NAME} STATIC ${SRC_Headers} ${SRC_Sources})

if(UNIX)
if (UNIX)
target_compile_options(${LIB_NAME} PRIVATE -fPIC)
endif()
endif ()

target_include_directories(${LIB_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
Expand Down
32 changes: 24 additions & 8 deletions src/tecmp_converter.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#include <asam_cmp/can_fd_payload.h>
#include <asam_cmp/can_payload.h>
#include <asam_cmp/capture_module_payload.h>
#include <asam_cmp/ethernet_payload.h>
#include <asam_cmp/interface_payload.h>
#include <asam_cmp/lin_payload.h>
#include <asam_cmp/tecmp_can_payload.h>
#include <asam_cmp/tecmp_capture_module_payload.h>
#include <asam_cmp/tecmp_converter.h>
#include <asam_cmp/tecmp_ethernet_payload.h>
#include <asam_cmp/tecmp_interface_payload.h>
#include <asam_cmp/tecmp_lin_payload.h>

Expand Down Expand Up @@ -54,7 +56,7 @@ PacketPtr TECMP::Converter::ConvertPacket(CmpHeader& header, const TecmpPayloadP
PacketPtr TECMP::Converter::ConvertCanPayload(CmpHeader& header, const TecmpPayloadPtr& payload)
{
auto tecmpCanPayload = reinterpret_cast<TECMP::CanPayload*>(payload.get());
auto packet = GetPackageFromTecmpHeader(header);
auto packet = GetPacketFromTecmpHeader(header);
if (tecmpCanPayload->getDlc() > 8)
{
return ConvertCanFdPayload(tecmpCanPayload, packet);
Expand All @@ -73,7 +75,7 @@ PacketPtr TECMP::Converter::ConvertCanPayload(CmpHeader& header, const TecmpPayl
PacketPtr TECMP::Converter::ConvertCaptureModulePayload(CmpHeader& header, const TecmpPayloadPtr& payload)
{
auto tecmpCmPayload = reinterpret_cast<TECMP::CaptureModulePayload*>(payload.get());
auto packet = GetPackageFromTecmpHeader(header);
auto packet = GetPacketFromTecmpHeader(header);
ASAM::CMP::CaptureModulePayload cmPayload;
cmPayload.setData(
"", std::to_string(tecmpCmPayload->getSerialNumber()), tecmpCmPayload->getHwVersion(), tecmpCmPayload->getSwVersion(), {});
Expand All @@ -86,7 +88,7 @@ PacketPtr TECMP::Converter::ConvertCaptureModulePayload(CmpHeader& header, const
PacketPtr TECMP::Converter::ConvertInterfacePayload(CmpHeader& header, const TecmpPayloadPtr& payload)
{
auto tecmpInterfacePayload = reinterpret_cast<TECMP::InterfacePayload*>(payload.get());
auto packet = GetPackageFromTecmpHeader(header);
auto packet = GetPacketFromTecmpHeader(header);
ASAM::CMP::InterfacePayload interfacePayload;

interfacePayload.setInterfaceId(tecmpInterfacePayload->getInterfaceId());
Expand All @@ -107,12 +109,14 @@ PacketPtr TECMP::Converter::ConvertDataPayload(CmpHeader& header, const TecmpPay
return ConvertCanPayload(header, payload);
break;
case CmpHeader::DataType::lin:
return convertLinPayload(header, payload);
return ConvertLinPayload(header, payload);
break;
case CmpHeader::DataType::ethernet:
return ConvertEthernetPayload(header, payload);
break;
case CmpHeader::DataType::flexRay:
case CmpHeader::DataType::uartRs232:
case CmpHeader::DataType::analog:
case CmpHeader::DataType::ethernet:
case CmpHeader::DataType::invalid:
break;
}
Expand All @@ -133,10 +137,10 @@ PacketPtr TECMP::Converter::ConvertCanFdPayload(TECMP::CanPayload* canPayload, P
return packet;
}

PacketPtr TECMP::Converter::convertLinPayload(TECMP::CmpHeader& header, const TecmpPayloadPtr& payload)
PacketPtr TECMP::Converter::ConvertLinPayload(TECMP::CmpHeader& header, const TecmpPayloadPtr& payload)
{
auto tecmpLinPayload = reinterpret_cast<TECMP::LinPayload*>(payload.get());
auto packet = GetPackageFromTecmpHeader(header);
auto packet = GetPacketFromTecmpHeader(header);

ASAM::CMP::LinPayload linPayload;

Expand All @@ -148,8 +152,20 @@ PacketPtr TECMP::Converter::convertLinPayload(TECMP::CmpHeader& header, const Te

return packet;
}
PacketPtr TECMP::Converter::ConvertEthernetPayload(CmpHeader& header, const TecmpPayloadPtr& payload)
{
auto tecmpEthPayload = reinterpret_cast<TECMP::EthernetPayload*>(payload.get());
auto packet = GetPacketFromTecmpHeader(header);

ASAM::CMP::EthernetPayload ethPayload;

ethPayload.setData(tecmpEthPayload->getData(), static_cast<uint16_t>(tecmpEthPayload->getDataLength()));

packet->setPayload(ethPayload);
return packet;
}

PacketPtr TECMP::Converter::GetPackageFromTecmpHeader(const TECMP::CmpHeader& header)
PacketPtr TECMP::Converter::GetPacketFromTecmpHeader(const TECMP::CmpHeader& header)
{
PacketPtr packet = std::make_shared<Packet>();
packet->setDeviceId(header.getDeviceId());
Expand Down
17 changes: 16 additions & 1 deletion src/tecmp_decoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <asam_cmp/tecmp_capture_module_payload.h>
#include <asam_cmp/tecmp_converter.h>
#include <asam_cmp/tecmp_decoder.h>
#include <asam_cmp/tecmp_ethernet_payload.h>
#include <asam_cmp/tecmp_interface_payload.h>
#include <asam_cmp/tecmp_lin_payload.h>

Expand Down Expand Up @@ -111,10 +112,16 @@ TecmpPayloadPtr TECMP::Decoder::GetDataPayload(const uint8_t* payloadData, const
return payload;
break;
}
case CmpHeader::DataType::ethernet:
{
auto payload = GetEthernetPayload(payloadData, size);
if (payload->getMessageType() == CmpHeader::MessageType::data && payload->getType() == PayloadType::ethernet)
return payload;
break;
}
case CmpHeader::DataType::flexRay:
case CmpHeader::DataType::uartRs232:
case CmpHeader::DataType::analog:
case CmpHeader::DataType::ethernet:
case CmpHeader::DataType::invalid:
break; // Not implimented
}
Expand Down Expand Up @@ -160,6 +167,14 @@ TecmpPayloadPtr TECMP::Decoder::GetLinPayload(const uint8_t* payloadData, const

return {};
}
TecmpPayloadPtr TECMP::Decoder::GetEthernetPayload(const uint8_t* payloadData, const std::size_t size)
{
EthernetPayload payload(payloadData, size);
if (payload.isValid())
return std::make_shared<Payload>(payload);

return {};
}
std::vector<PacketPtr> TECMP::Decoder::ConvertPacketsToAsam(std::vector<TecmpPayloadPtr> payloads, TECMP::CmpHeader& header)
{
std::vector<PacketPtr> packets;
Expand Down
20 changes: 20 additions & 0 deletions src/tecmp_ethernet_payload.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include <asam_cmp/tecmp_ethernet_payload.h>

BEGIN_NAMESPACE_TECMP

EthernetPayload::EthernetPayload(const uint8_t* data, size_t size)
: Payload(TECMP::PayloadType::ethernet, data, size)
{
}

const uint8_t* EthernetPayload::getData() const
{
return payloadData.data();
}

std::size_t EthernetPayload::getDataLength() const
{
return payloadData.size();
}

END_NAMESPACE_TECMP
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ set(SRC_Cpp testapp.cpp
test_tecmp_can_payload.cpp
test_tecmp_interface_payload.cpp
test_tecmp_decoder.cpp
test_tecmp_ethernet_payload.cpp
)

add_executable(${TEST_APP} ${SRC_Cpp}
Expand Down
56 changes: 56 additions & 0 deletions tests/test_tecmp_decoder.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <asam_cmp/can_fd_payload.h>
#include <asam_cmp/can_payload.h>
#include <asam_cmp/capture_module_payload.h>
#include <asam_cmp/ethernet_payload.h>
#include <asam_cmp/interface_payload.h>
#include <asam_cmp/tecmp_decoder.h>
#include <gtest/gtest.h>
Expand All @@ -9,6 +10,40 @@ using TECMP::Decoder;

class TecmpDecoderFixture : public ::testing::Test
{
public:
TecmpDecoderFixture()
{
tecmpEthernetPayloadFrame = {
0x00, // IsTecmp
0x7B, // deviceId
0x00, 0x00, // sequenceCounter
0x00, // version
0x03, // messageType
0x00, 0x80, // dataType (big-endian)
0x00, 0x00, // reserved
0x00, 0x00, // deviceFlags
0x00, 0x00, 0x00, 0x7B, // interfaceId
0x00, 0x00, 0x00, 0x61, 0x14, 0xB5, 0x3D, 0xE0, // timestamp
0x00, 0x90, // payloadLength
0x00, 0x00 // dataFlags
};

rawEthFrame = {0x0, 0xe0, 0x4c, 0x68, 0x6, 0x5c, 0x38, 0x2a, 0x19, 0x80, 0x40, 0x5e, 0x99, 0xfe, 0x0, 0x43, 0x0, 0x38,
0x3, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0x4, 0xc5,
0xd0, 0x8, 0x0, 0x78, 0x0, 0x0, 0xc, 0x1, 0x4, 0x0, 0x0, 0x0, 0x0, 0x43, 0x1, 0x61, 0x16, 0xe1,
0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};

tecmpEthernetPayloadFrame.insert(tecmpEthernetPayloadFrame.end(), rawEthFrame.begin(), rawEthFrame.end());
}

protected:
std::vector<uint8_t> tecmpEthernetPayloadFrame;
std::vector<uint8_t> rawEthFrame;
};

TEST_F(TecmpDecoderFixture, FailsWithASAMCMP)
Expand Down Expand Up @@ -101,3 +136,24 @@ TEST_F(TecmpDecoderFixture, DecodeCanFdPayload)
auto data2 = *(reinterpret_cast<const double*>(payload.getData() + sizeof(double)));
ASSERT_EQ(data2, 321.321);
}

TEST_F(TecmpDecoderFixture, DecodeEthernetPayload)
{
auto packets = Decoder::Decode(tecmpEthernetPayloadFrame.data(), tecmpEthernetPayloadFrame.size());
ASSERT_FALSE(packets.empty());
ASSERT_EQ(packets.size(), 1u);

ASSERT_EQ(packets[0]->getInterfaceId(), 123);
ASSERT_EQ(packets[0]->getDeviceId(), 123);
ASSERT_EQ(packets[0]->getTimestamp(), 0x0000006114b53de0u);

auto payload = packets[0]->getPayload();
ASSERT_EQ(payload.getMessageType(), ASAM::CMP::CmpHeader::MessageType::data);
ASSERT_EQ(payload.getType(), ASAM::CMP::PayloadType::ethernet);

auto ethPayload = reinterpret_cast<ASAM::CMP::EthernetPayload&>(payload);
std::vector<uint8_t> frameBytes(ethPayload.getData(), ethPayload.getData() + ethPayload.getDataLength());

ASSERT_EQ(frameBytes.size(), rawEthFrame.size());
ASSERT_EQ(frameBytes, rawEthFrame);
}
37 changes: 37 additions & 0 deletions tests/test_tecmp_ethernet_payload.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include <gtest/gtest.h>

#include <asam_cmp/tecmp_ethernet_payload.h>
#include <vector>

class TecmpEthernetPayloadTest : public ::testing::Test
{
public:
TecmpEthernetPayloadTest()
{
data = {0x0, 0xe0, 0x4c, 0x68, 0x6, 0x5c, 0x38, 0x2a, 0x19, 0x80, 0x40, 0x5e, 0x99, 0xfe, 0x0, 0x43, 0x0, 0x38, 0x3, 0x2, 0x0,
0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0x4, 0xc5, 0xd0, 0x8, 0x0, 0x78, 0x0, 0x0,
0xc, 0x1, 0x4, 0x0, 0x0, 0x0, 0x0, 0x43, 0x1, 0x61, 0x16, 0xe1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
payload = std::make_unique<TECMP::EthernetPayload>(data.data(), data.size());
}

protected:
std::vector<uint8_t> data;
std::unique_ptr<TECMP::EthernetPayload> payload;
};

TEST_F(TecmpEthernetPayloadTest, IsValid)
{
ASSERT_TRUE(payload->isValid());
}

TEST_F(TecmpEthernetPayloadTest, DataIntegrity)
{
std::vector<uint8_t> payloadData(payload->getData(), payload->getData() + payload->getDataLength());
ASSERT_EQ(payloadData.size(), data.size());
ASSERT_EQ(payloadData, data);
}