#include <unordered_set>
class cDemoRequestableSubStreamGenerator: public cFilter
{
public:
"demo_request_substream_generator.filter.adtf.cid",
"Demo Requestable Substream Generator");
public:
cDemoRequestableSubStreamGenerator()
{
SetDescription("Use this filter to generate data of (requested) multiple substreams whenever a timer triggers");
SetHelpLink("$(ADTF_DIR)/doc/adtf_html/page_demo_requestable_substream_generator.html");
CreateRunner("generate_samples");
SetDescription("generate_samples", "Runner to periodically trigger the function which generates samples for the substreams.");
cSubStreamTypes oSubStreams;
oSubStreams.SetSubStream("stream1", 0, stream_type_plain<uint32_t>());
oSubStreams.SetSubStream("stream2", 1, stream_type_plain<uint32_t>());
oSubStreams.SetSubStream("stream3", 2, stream_type_plain<uint32_t>());
m_pWriter = CreateRequestableOutputPin("output", oSubStreams);
SetDescription("output", "Provides the generated substreams");
}
tResult EnableSubStream(ISampleWriter* ,
uint32_t nSubStreamId,
const IProperties* ) override
{
if (nSubStreamId > 2)
{
RETURN_ERROR_DESC(ERR_INVALID_ARG,
"No substream with id %d available", nSubStreamId);
}
m_oEnabledSubStreams.insert(nSubStreamId);
LOG_INFO(
"Enabled substream %u", nSubStreamId);
}
void DisableSubStream(ISampleWriter* , uint32_t nSubStreamId) override
{
m_oEnabledSubStreams.erase(nSubStreamId);
LOG_INFO(
"Disabled substream %u", nSubStreamId);
}
tResult Process(tNanoSeconds tmTrigger, IRunner* )
override
{
++m_nTriggerCounter;
for (const auto& nSubStreamId: m_oEnabledSubStreams)
{
output_sample_data<uint32_t> oNewData(tmTrigger, m_nTriggerCounter + (nSubStreamId * 1000), nSubStreamId);
m_pWriter->Write(oNewData.Release());
}
}
private:
ISampleWriter* m_pWriter = nullptr;
std::unordered_set<uint32_t> m_oEnabledSubStreams;
uint32_t m_nTriggerCounter = 0;
};
ADTF_PLUGIN(
"Demo Requestable Substream Generator Plugin", cDemoRequestableSubStreamGenerator);
#define ADTF_PLUGIN(__plugin_identifier,...)
The ADTF Plugin Macro will add the code of a adtf::ucom::ant::IPlugin implementation.
Copyright © Audi Electronics Venture GmbH.
#define LOG_INFO(...)
Logs an info message.
#define RETURN_ERROR_DESC(_code,...)
Same as RETURN_ERROR(_error) using a printf like parameter list for detailed error description.
#define RETURN_NOERROR
Return status ERR_NOERROR, which requires the calling function's return type to be tResult.
#define ADTF_CLASS_ID_NAME(_class, _strcid, _strclabel)
Common macro to enable correct treatment of class identifier AND Class Name by IClassInfo.
A common result class usable as return value throughout.
Namespace for the ADTF Base SDK.
Namespace for the ADTF Filter SDK.
Namespace for the ADTF Streaming SDK.
Namespace for the ADTF uCOM3 SDK.