Description
Shows how to implement a filter which is triggered by input pins.
Prebuilt Binaries
Source Code
./examples/demo_adtfplugins/demo_data_trigger/
Filter
demo_data_trigger_function.h
#pragma once
#ifndef ADTF_EXAMPLES_CID
#define ADTF_EXAMPLES_CID ".local.cid"
#endif
{
public:
"demo_data_trigger.filter" ADTF_EXAMPLES_CID,
"Demo Data Trigger");
public:
enum tOperator : uint32_t
{
ePLUS = 0,
eMINUS = 1,
eMULTI = 2,
eDIVIDE = 3
};
public:
cSimpleDataCalculator();
~cSimpleDataCalculator() override;
private:
std::function<float(float, float)> m_fnCalculator;
};
A_UTILS_NS::cResult tResult
For backwards compatibility and to bring latest version into scope.
Definition result.h:736
#define ADTF_CLASS_ID_NAME(_class, _strcid, _strclabel)
Definition class_id.h:33
Property Variable template for the given T. A Property Variable will store a copy of a property value...
Definition configuration.h:808
tResult Init(tInitStage eStage) override
virtual tResult ProcessInput(base::flash::tNanoSeconds tmTrigger, streaming::flash::ISampleReader *pReader)
Definition samplestreamer_intf.h:188
Definition samplestreamer_intf.h:234
A timestamp with nanosecond precision.
Definition chrono.h:23
demo_data_trigger_function.cpp
#include "demo_data_trigger_function.h"
#include <functional>
using namespace adtf::util;
ADTF_PLUGIN(
"Demo Data Trigger Plugin", cSimpleDataCalculator);
cSimpleDataCalculator::cSimpleDataCalculator()
{
SetDescription("in1", "First input value for calculation (in1 <operator> in2)");
SetDescription("in2", "Second input value for calculation (in1 <operator> in2)");
SetDescription("out", "Provides the calculated output (in1 <operator> in2)");
m_eOperator.SetValueList({{ePLUS, "PLUS"},
{eMINUS, "MINUS"},
{eMULTI, "MULTI"},
{eDIVIDE, "DIVIDE"}});
m_eOperator.SetDescription("Chooses the arithmetic operation used to calculate the output values.");
RegisterPropertyVariable("calculator_function/operator", m_eOperator);
SetDescription("Use this filter to calculate two input values while choosing the arithmetic operation with the property 'operator'.");
SetHelpLink("$(ADTF_DIR)/doc/html/page_demo_data_trigger.html");
}
cSimpleDataCalculator::~cSimpleDataCalculator() = default;
tResult cSimpleDataCalculator::Init(tInitStage eStage)
{
if (eStage == StageNormal)
{
switch (m_eOperator)
{
case ePLUS:
{
LOG_INFO(
"Current operation is Addition");
m_fnCalculator = std::plus<float>();
break;
}
case eMINUS:
{
LOG_INFO(
"Current operation is Subtraction");
m_fnCalculator = std::minus<float>();
break;
}
case eMULTI:
{
LOG_INFO(
"Current operation is Multiplication");
m_fnCalculator = std::multiplies<float>();
break;
}
case eDIVIDE:
{
LOG_INFO(
"Current operation is Division");
m_fnCalculator = std::divides<float>();
break;
}
default:
{
}
}
}
}
{
if (
IS_OK(m_pReader1->GetLastSample(pSample1)) &&
IS_OK(m_pReader2->GetLastSample(pSample2)))
{
m_pWriter->Write(oOutput.Release());
}
}
#define ADTF_PLUGIN(__plugin_identifier,...)
Definition adtf_plugin.h:29
#define LOG_INFO(...)
Logs an info message.
Definition log.h:388
#define RETURN_ERROR_DESC(_code,...)
Same as RETURN_ERROR(_error) using a printf like parameter list for detailed error description.
Definition result.h:44
#define RETURN_NOERROR
Return status ERR_NOERROR, which requires the calling function's return type to be tResult.
Definition result.h:29
#define IS_OK(s)
Check if result is OK.
Definition result.h:17
Definition sample_data.h:429
Generator template to create an instance of a ant::IStreamType class for penguin::stream_meta_type_pl...
Definition streammetatypeplain.h:315
Definition object_ptr.h:384
Namespace for the ADTF Base SDK.
Definition adtf_base_type_traits.h:13
Namespace for the ADTF Filter SDK.
Definition configurable_runner.h:18
Namespace for the ADTF Streaming SDK.
Definition bindingproxyinport.h:14
base::flash::tNanoSeconds get_sample_time(const ucom::ant::iobject_ptr< const ant::ISample > &pSample)
Namespace for the ADTF uCOM SDK.
Definition adtf_system.h:324
definition of the ddl namespace
Definition codec.h:21
Test
test_demo_data_triggered_filter.cpp
#include "../demo_data_trigger_function.h"
{
cMyTestSystem()
{
LoadPlugin(
"demo_data_triggered_filter.adtfplugin");
}
};
{
REQUIRE_OK(_runtime->CreateInstance(
"demo_data_trigger.filter" ADTF_EXAMPLES_CID, pFilter));
adtf::base::set_property_by_path<uint32_t>(*pConfiguration, "calculator_function/operator", eOperator);
return pFilter;
}
void test_calculation(cSimpleDataCalculator::tOperator eOperator, float fExpectedResult)
{
auto pFilter = create_filter(eOperator);
REQUIRE_OK(pFilter->SetState(adtf::streaming::IFilter::tFilterState::State_Running));
oWriter1.Write<float>(4.0, true);
oWriter2.Write<float>(2.0, true);
auto oOutputSamples = oOutput.GetCurrentOutput().GetSamples();
REQUIRE(oOutputSamples.size() == 1);
}
TEST_CASE_METHOD(cMyTestSystem, "Test Addition")
{
test_calculation(cSimpleDataCalculator::tOperator::ePLUS, 6.0);
}
TEST_CASE_METHOD(cMyTestSystem, "Test Substraction")
{
test_calculation(cSimpleDataCalculator::tOperator::eMINUS, 2.0);
}
TEST_CASE_METHOD(cMyTestSystem, "Test Multiplication")
{
test_calculation(cSimpleDataCalculator::tOperator::eMULTI, 8.0);
}
TEST_CASE_METHOD(cMyTestSystem, "Test Division")
{
test_calculation(cSimpleDataCalculator::tOperator::eDIVIDE, 2.0);
}
TEST_CASE_METHOD(cMyTestSystem, "Test Invalid Operator")
{
auto pFilter = create_filter(static_cast<cSimpleDataCalculator::tOperator>(cSimpleDataCalculator::tOperator::eDIVIDE + 1));
REQUIRE(ERR_INVALID_ARG == pFilter->SetState(adtf::streaming::IFilter::tFilterState::State_Running));
}
#define REQUIRE_OK(...)
Macro for a mandatory check if a function call returned with ERR_NOERROR. If not the test will fail a...
Definition catch_integration.h:75
Definition output_recorder.h:36
Definition test_writer.h:40
Definition test_system.h:110
void LoadPlugin(const std::string &strPluginFileName, bool bCreateServices=true, base::ant::tADTFRunLevel nServicesRunlevel=base::tADTFRunLevel::RL_System)
InterfacePointerType ucom_cast(ObjectPointerType i_pObject) noexcept
Alias always bringing the latest version of ant::ucom_cast() into scope.
Definition ucom_cast.h:157