ADTF_DEVICE_TOOLBOX  3.12.1 (ADTF 3.18.3)
Source Code for Demo FlexRay Config Decoder Filter
Location
./src/examples/src/flexray_config_decoder/
This example shows:
Header file for the FlexRay Config Decoder Filter Example
#pragma once
#include <adtf_filtersdk.h>
#include <adtf_ucom3.h>
#include <adtf_mediadescription.h>
#include "fc_decoder.h"
//*************************************************************************************************
#define CID_DEMO_FLEXRAY_DECODER_FILTER "demo_flexray_decoder.filter.devicetb.cid"
class cFlexRay2DDLFilter : public adtf::filter::cFilter
{
public:
ADTF_CLASS_ID_NAME(cFlexRay2DDLFilter, CID_DEMO_FLEXRAY_DECODER_FILTER, "Demo FlexRay Config Decoder");
ADTF_CLASS_DEPENDENCIES(REQUIRE_INTERFACE(adtf::services::IReferenceClock),
cFlexRay2DDLFilter();
tResult Init(adtf::filter::cFilter::tInitStage eStage) override;
tResult ProcessInput(adtf::streaming::ISampleReader* pReader,
const adtf::ucom::iobject_ptr<const adtf::streaming::ISample>& pSample) override;
private:
adtf::streaming::ISampleWriter* m_pWriter = nullptr;
// properties
adtf::base::property_variable<tUInt> m_nChannelID = 1;
adtf::ucom::object_ptr<adtf::devicetb::sdk::flexray::IFlexRaySupport> m_pFlexRaySupport;
adtf::ucom::object_ptr<adtf::devicetb::sdk::flexray::IFlexRayDatabase> m_pFlexRayDatabase;
adtf::ucom::object_ptr<adtf::devicetb::sdk::flexray::IFlexRayCoder> m_pFlexRayCoder;
};
The IFlexRaySupport interface provides methods to query FIBEX databases.
Copyright © CARIAD SE.
Copyright © CARIAD SE.
Implementation for the FlexRay Config Decoder Filter Example
#include "demo_flexray_decoder.h"
#include <cstring>
#include <string>
#include <map>
using namespace adtf;
ADTF_PLUGIN_VERSION("Demo FlexRay Decoder",
devicetb,
DEVICETB_VERSION_MAJOR,
DEVICETB_VERSION_MINOR,
DEVICETB_VERSION_PATCH,
cFlexRay2DDLFilter)
cFlexRay2DDLFilter::cFlexRay2DDLFilter()
{
CreateInputPin("input_flexray", stream_meta_type_flexray());
SetDescription("input_flexray", "The FlexRay sample stream to decode.");
m_pWriter = CreateOutputPin("output_ddl", mediadescription::description<output_ddl>());
SetDescription("output_ddl", "The decoded content of the CAN sample stream.");
m_nChannelID.SetDescription("Channel-ID for the desired FlexRay database, made available by FlexRay service");
m_nChannelID.SetValidRange(FLEXRAY_DEVICECHANNEL_MIN, FLEXRAY_DEVICECHANNEL_MAX);
RegisterPropertyVariable("ChannelID", m_nChannelID);
SetDescription("Demo filter for decoding FlexRay samples into previous specified signals.");
SetHelpLink("$(ADTF_DEVICE_TOOLBOX_DIR)/doc/adtf_device_toolbox_html/page_example_source_flexray_config_decoder.html");
}
tResult cFlexRay2DDLFilter::Init(filter::cFilter::tInitStage eStage)
{
if (filter::cFilter::tInitStage::StageNormal == eStage)
{
RETURN_IF_FAILED(_runtime->GetObject(m_pFlexRaySupport));
RETURN_IF_FAILED(m_pFlexRaySupport->GetDatabase(static_cast<tDeviceChannel>(m_nChannelID), m_pFlexRayDatabase));
RETURN_IF_FAILED(m_pFlexRaySupport->CreateCoder(m_pFlexRayDatabase, m_pFlexRayCoder));
}
RETURN_NOERROR;
}
tResult cFlexRay2DDLFilter::ProcessInput(streaming::ISampleReader* /*pReader*/,
const ucom::iobject_ptr<const streaming::ISample>& pSample)
{
ucom::object_ptr_shared_locked<const streaming::ISampleBuffer> pSampleBuffer;
RETURN_IF_FAILED(pSample->Lock(pSampleBuffer));
streaming::output_sample_data<output_ddl> oDDLOutput(pSample->GetTime());
// Initialize FlexRay Coder
RETURN_IF_FAILED(m_pFlexRayCoder->ReceiveData(pSampleBuffer->GetPtr(), static_cast<tInt>(pSampleBuffer->GetSize()), pSample->GetTime()));
tChannelID nChannel = 0;
tECUID nECUID = 0;
tTimeStamp tmTimeStamp = 0;
// Decode the sample via the coder
while (IS_OK(m_pFlexRayCoder->EnumPDUs(&nPDUID, &nChannel, &nECUID, &tmTimeStamp, tTrue)))
{
const tPDUInfo* pPduInfo = nullptr;
RETURN_IF_FAILED(m_pFlexRayDatabase->GetPDUInfo(nPDUID, &pPduInfo));
for (tUInt32 nSigIdx = 0; nSigIdx < pPduInfo->nSignalCount; nSigIdx++)
{
tSignalID nSignalID = pPduInfo->aSignalID[nSigIdx];
const tChar* pstrSignalName = nullptr;
RETURN_IF_FAILED(m_pFlexRayDatabase->GetSignalName(nSignalID, &pstrSignalName));
tSignalValue oSignalValue;
RETURN_IF_FAILED(m_pFlexRayCoder->GetSignalValue(nSignalID, &oSignalValue));
switch (nSignalID)
{
case 2: oDDLOutput->Signal_3 = static_cast<tInt8>(oSignalValue.nf64Value); break;
case 3: oDDLOutput->Signal_4 = static_cast<tInt8>(oSignalValue.nf64Value); break;
case 4: oDDLOutput->Signal_5 = static_cast<tInt8>(oSignalValue.nf64Value); break;
default: break;
}
}
}
m_pFlexRayCoder->ResetModifiedFlag();
m_pWriter->Write(oDDLOutput.Release());
RETURN_NOERROR;
}
@ ENUM_PDU_START
Used in the EnumPDUs() method as start value.
Copyright © CARIAD SE.
Copyright 2024 CARIAD SE.
Namespace for FlexRay in ADTF-Devicetoolbox.
axle::tChannelID tChannelID
FlexRay Cluster and Channel ID (FLEXRAY_CHANNEL_A, FLEXRAY_CHANNEL_B, FLEXRAY_CHANNEL_AB).
axle::tPDUID tPDUID
FlexRay PDU (Protocol Data Unit) ID.
axle::tSignalValue tSignalValue
Signal value structure.
axle::tSignalID tSignalID
FlexRay signal ID.
axle::stream_meta_type_flexray stream_meta_type_flexray
Definition of Stream Meta Type FlexRay Messages.
axle::tECUID tECUID
FlexRay ECU (Electronic Communication Unit) ID.
axle::tPDUInfo tPDUInfo
Structure with information about one PDU (may be a complete frame or part of a frame)
ADTF - Namespace.
Copyright © CARIAD SE.