(example-datadispatchservice)=
Example Data Dispatch Service#
The Data Dispatch Service is supposed to be used by Vehicle Device s and the Bus Abstraction implementations to exchange information without needing to know any recipient of the data or who sent the data; only the ID number and the data type of the information must be known. Also callback functions can be registered to any existing ID in order to be informed when the data behind the ID has been updated. This makes the Data Dispatch Service a possible link between timed and event-driven approaches.
#include <iostream>
#include <support/toml.h>
#include <support/component_impl.h>
#include <support/signal_support.h>
class CExampleDispatchService
{
public:
CExampleDispatchService()
{
sdv::core::CDispatchService dispatch;
m_dataLinkSignalRx = dispatch.RegisterRxSignal("Signal_DataLink_to_AbstractDevice"); ///< signals created by data link
m_dataLinkSignalTx01 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_01", 123);
m_dataLinkSignalTx02 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_02", 123);
m_dataLinkSignalTx03 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_03", 123);
}
~CExampleDispatchService()
{
if (m_dataLinkSignalRx)
m_dataLinkSignalRx.Reset();
if (m_dataLinkSignalTx01)
m_dataLinkSignalTx01.Reset();
if (m_dataLinkSignalTx02)
m_dataLinkSignalTx02.Reset();
if (m_dataLinkSignalTx03)
m_dataLinkSignalTx03.Reset();
}
void SubscripSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDeviceSubscriper = dispatch.Subscribe("Signal_DataLink_to_AbstractDevice", [&](sdv::any_t value) { CallBackFunction(value); });
if (!m_abstractDeviceSubscriper)
{
std::cout << "Could not subscrupe to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
else
{
std::cout << "Subscript to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
}
void AddPublisherSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDevicePublisher01 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_01");
m_abstractDevicePublisher02 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_02");
m_abstractDevicePublisher03 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_03");
if (!m_abstractDevicePublisher01 || !m_abstractDevicePublisher02 || !m_abstractDevicePublisher03 )
{
std::cout << "Could not add publisher to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
else
{
std::cout << "Publisher added to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
}
void DataLinkWriter(const uint32_t value)
{
m_dataLinkSignalRx.Write(value);
}
void WriteToSignalAsPublisher(const uint32_t value01, const uint32_t value02, const uint32_t value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
m_abstractDevicePublisher01.Write(value01, transaction);
m_abstractDevicePublisher02.Write(value02, transaction);
m_abstractDevicePublisher03.Write(value03, transaction);
transaction.Finish();
}
void GetTxSignalValue(const std::string& msg, uint32_t& value01, uint32_t& value02, uint32_t& value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
value01 = m_dataLinkSignalTx01.Read(transaction).get<uint32_t>();
value02 = m_dataLinkSignalTx02.Read(transaction).get<uint32_t>();
value03 = m_dataLinkSignalTx03.Read(transaction).get<uint32_t>();
transaction.Finish();
std::cout << "Read Tx signals (" << msg.c_str() <<"): " << std::to_string(value01) << ", " << std::to_string(value02) << ", " << std::to_string(value03) << std::endl;
}
private:
/**
* @brief CallBackFunction for the subscription
*/
void CallBackFunction(sdv::any_t value)
{
uint32_t sayHello = value.get<uint32_t>();
std::cout << "This CallBackFunction is called on signal change: " << std::to_string(sayHello) << std::endl;
}
sdv::core::CSignal m_dataLinkSignalRx; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx01; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx02; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx03; ///< signals created and used by data link
sdv::core::CSignal m_abstractDeviceSubscriper; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher01; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher02; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher03; ///< signals used by an abstract device
};
#include <iostream>
#include <support/toml.h>
#include <support/component_impl.h>
#include <support/signal_support.h>
class CExampleDispatchService
{
public:
CExampleDispatchService()
{
sdv::core::CDispatchService dispatch;
m_dataLinkSignalRx = dispatch.RegisterRxSignal("Signal_DataLink_to_AbstractDevice"); ///< signals created by data link
m_dataLinkSignalTx01 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_01", 123);
m_dataLinkSignalTx02 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_02", 123);
m_dataLinkSignalTx03 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_03", 123);
}
~CExampleDispatchService()
{
if (m_dataLinkSignalRx)
m_dataLinkSignalRx.Reset();
if (m_dataLinkSignalTx01)
m_dataLinkSignalTx01.Reset();
if (m_dataLinkSignalTx02)
m_dataLinkSignalTx02.Reset();
if (m_dataLinkSignalTx03)
m_dataLinkSignalTx03.Reset();
}
void SubscripSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDeviceSubscriper = dispatch.Subscribe("Signal_DataLink_to_AbstractDevice", [&](sdv::any_t value) { CallBackFunction(value); });
if (!m_abstractDeviceSubscriper)
{
std::cout << "Could not subscrupe to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
else
{
std::cout << "Subscript to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
}
void AddPublisherSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDevicePublisher01 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_01");
m_abstractDevicePublisher02 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_02");
m_abstractDevicePublisher03 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_03");
if (!m_abstractDevicePublisher01 || !m_abstractDevicePublisher02 || !m_abstractDevicePublisher03 )
{
std::cout << "Could not add publisher to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
else
{
std::cout << "Publisher added to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
}
void DataLinkWriter(const uint32_t value)
{
m_dataLinkSignalRx.Write(value);
}
void WriteToSignalAsPublisher(const uint32_t value01, const uint32_t value02, const uint32_t value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
m_abstractDevicePublisher01.Write(value01, transaction);
m_abstractDevicePublisher02.Write(value02, transaction);
m_abstractDevicePublisher03.Write(value03, transaction);
transaction.Finish();
}
void GetTxSignalValue(const std::string& msg, uint32_t& value01, uint32_t& value02, uint32_t& value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
value01 = m_dataLinkSignalTx01.Read(transaction).get<uint32_t>();
value02 = m_dataLinkSignalTx02.Read(transaction).get<uint32_t>();
value03 = m_dataLinkSignalTx03.Read(transaction).get<uint32_t>();
transaction.Finish();
std::cout << "Read Tx signals (" << msg.c_str() <<"): " << std::to_string(value01) << ", " << std::to_string(value02) << ", " << std::to_string(value03) << std::endl;
}
private:
/**
* @brief CallBackFunction for the subscription
*/
void CallBackFunction(sdv::any_t value)
{
uint32_t sayHello = value.get<uint32_t>();
std::cout << "This CallBackFunction is called on signal change: " << std::to_string(sayHello) << std::endl;
}
sdv::core::CSignal m_dataLinkSignalRx; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx01; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx02; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx03; ///< signals created and used by data link
sdv::core::CSignal m_abstractDeviceSubscriper; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher01; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher02; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher03; ///< signals used by an abstract device
};
For sending data over the network a ‘TxSignal’ has to be registered. The data is provided by the publisher. Multiple registration of the same signal are allowed. The signal is identified by the signal name. To guarantee uniqueness, it is preferred to add the group hierarchy to the signal name separated by a dot. E.g. with CAN: MAB.BcmChas1Fr03.SteerReCtrlReqAgReq
#include <iostream>
#include <support/toml.h>
#include <support/component_impl.h>
#include <support/signal_support.h>
class CExampleDispatchService
{
public:
CExampleDispatchService()
{
sdv::core::CDispatchService dispatch;
m_dataLinkSignalRx = dispatch.RegisterRxSignal("Signal_DataLink_to_AbstractDevice"); ///< signals created by data link
m_dataLinkSignalTx01 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_01", 123);
m_dataLinkSignalTx02 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_02", 123);
m_dataLinkSignalTx03 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_03", 123);
}
~CExampleDispatchService()
{
if (m_dataLinkSignalRx)
m_dataLinkSignalRx.Reset();
if (m_dataLinkSignalTx01)
m_dataLinkSignalTx01.Reset();
if (m_dataLinkSignalTx02)
m_dataLinkSignalTx02.Reset();
if (m_dataLinkSignalTx03)
m_dataLinkSignalTx03.Reset();
}
void SubscripSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDeviceSubscriper = dispatch.Subscribe("Signal_DataLink_to_AbstractDevice", [&](sdv::any_t value) { CallBackFunction(value); });
if (!m_abstractDeviceSubscriper)
{
std::cout << "Could not subscrupe to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
else
{
std::cout << "Subscript to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
}
void AddPublisherSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDevicePublisher01 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_01");
m_abstractDevicePublisher02 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_02");
m_abstractDevicePublisher03 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_03");
if (!m_abstractDevicePublisher01 || !m_abstractDevicePublisher02 || !m_abstractDevicePublisher03 )
{
std::cout << "Could not add publisher to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
else
{
std::cout << "Publisher added to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
}
void DataLinkWriter(const uint32_t value)
{
m_dataLinkSignalRx.Write(value);
}
void WriteToSignalAsPublisher(const uint32_t value01, const uint32_t value02, const uint32_t value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
m_abstractDevicePublisher01.Write(value01, transaction);
m_abstractDevicePublisher02.Write(value02, transaction);
m_abstractDevicePublisher03.Write(value03, transaction);
transaction.Finish();
}
void GetTxSignalValue(const std::string& msg, uint32_t& value01, uint32_t& value02, uint32_t& value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
value01 = m_dataLinkSignalTx01.Read(transaction).get<uint32_t>();
value02 = m_dataLinkSignalTx02.Read(transaction).get<uint32_t>();
value03 = m_dataLinkSignalTx03.Read(transaction).get<uint32_t>();
transaction.Finish();
std::cout << "Read Tx signals (" << msg.c_str() <<"): " << std::to_string(value01) << ", " << std::to_string(value02) << ", " << std::to_string(value03) << std::endl;
}
private:
/**
* @brief CallBackFunction for the subscription
*/
void CallBackFunction(sdv::any_t value)
{
uint32_t sayHello = value.get<uint32_t>();
std::cout << "This CallBackFunction is called on signal change: " << std::to_string(sayHello) << std::endl;
}
sdv::core::CSignal m_dataLinkSignalRx; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx01; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx02; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx03; ///< signals created and used by data link
sdv::core::CSignal m_abstractDeviceSubscriper; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher01; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher02; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher03; ///< signals used by an abstract device
};
An Vehicle Device can act as a publisher for the signal. For that it has to add itself as a publisher to the signal.
#include <iostream>
#include <support/toml.h>
#include <support/component_impl.h>
#include <support/signal_support.h>
class CExampleDispatchService
{
public:
CExampleDispatchService()
{
sdv::core::CDispatchService dispatch;
m_dataLinkSignalRx = dispatch.RegisterRxSignal("Signal_DataLink_to_AbstractDevice"); ///< signals created by data link
m_dataLinkSignalTx01 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_01", 123);
m_dataLinkSignalTx02 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_02", 123);
m_dataLinkSignalTx03 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_03", 123);
}
~CExampleDispatchService()
{
if (m_dataLinkSignalRx)
m_dataLinkSignalRx.Reset();
if (m_dataLinkSignalTx01)
m_dataLinkSignalTx01.Reset();
if (m_dataLinkSignalTx02)
m_dataLinkSignalTx02.Reset();
if (m_dataLinkSignalTx03)
m_dataLinkSignalTx03.Reset();
}
void SubscripSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDeviceSubscriper = dispatch.Subscribe("Signal_DataLink_to_AbstractDevice", [&](sdv::any_t value) { CallBackFunction(value); });
if (!m_abstractDeviceSubscriper)
{
std::cout << "Could not subscrupe to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
else
{
std::cout << "Subscript to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
}
void AddPublisherSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDevicePublisher01 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_01");
m_abstractDevicePublisher02 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_02");
m_abstractDevicePublisher03 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_03");
if (!m_abstractDevicePublisher01 || !m_abstractDevicePublisher02 || !m_abstractDevicePublisher03 )
{
std::cout << "Could not add publisher to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
else
{
std::cout << "Publisher added to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
}
void DataLinkWriter(const uint32_t value)
{
m_dataLinkSignalRx.Write(value);
}
void WriteToSignalAsPublisher(const uint32_t value01, const uint32_t value02, const uint32_t value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
m_abstractDevicePublisher01.Write(value01, transaction);
m_abstractDevicePublisher02.Write(value02, transaction);
m_abstractDevicePublisher03.Write(value03, transaction);
transaction.Finish();
}
void GetTxSignalValue(const std::string& msg, uint32_t& value01, uint32_t& value02, uint32_t& value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
value01 = m_dataLinkSignalTx01.Read(transaction).get<uint32_t>();
value02 = m_dataLinkSignalTx02.Read(transaction).get<uint32_t>();
value03 = m_dataLinkSignalTx03.Read(transaction).get<uint32_t>();
transaction.Finish();
std::cout << "Read Tx signals (" << msg.c_str() <<"): " << std::to_string(value01) << ", " << std::to_string(value02) << ", " << std::to_string(value03) << std::endl;
}
private:
/**
* @brief CallBackFunction for the subscription
*/
void CallBackFunction(sdv::any_t value)
{
uint32_t sayHello = value.get<uint32_t>();
std::cout << "This CallBackFunction is called on signal change: " << std::to_string(sayHello) << std::endl;
}
sdv::core::CSignal m_dataLinkSignalRx; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx01; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx02; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx03; ///< signals created and used by data link
sdv::core::CSignal m_abstractDeviceSubscriper; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher01; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher02; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher03; ///< signals used by an abstract device
};
If multiple transacted updates or transacted readings without interference of another update have to be made a transaction can be created before reading/writing.
#include <iostream>
#include <support/toml.h>
#include <support/component_impl.h>
#include <support/signal_support.h>
class CExampleDispatchService
{
public:
CExampleDispatchService()
{
sdv::core::CDispatchService dispatch;
m_dataLinkSignalRx = dispatch.RegisterRxSignal("Signal_DataLink_to_AbstractDevice"); ///< signals created by data link
m_dataLinkSignalTx01 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_01", 123);
m_dataLinkSignalTx02 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_02", 123);
m_dataLinkSignalTx03 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_03", 123);
}
~CExampleDispatchService()
{
if (m_dataLinkSignalRx)
m_dataLinkSignalRx.Reset();
if (m_dataLinkSignalTx01)
m_dataLinkSignalTx01.Reset();
if (m_dataLinkSignalTx02)
m_dataLinkSignalTx02.Reset();
if (m_dataLinkSignalTx03)
m_dataLinkSignalTx03.Reset();
}
void SubscripSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDeviceSubscriper = dispatch.Subscribe("Signal_DataLink_to_AbstractDevice", [&](sdv::any_t value) { CallBackFunction(value); });
if (!m_abstractDeviceSubscriper)
{
std::cout << "Could not subscrupe to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
else
{
std::cout << "Subscript to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
}
void AddPublisherSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDevicePublisher01 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_01");
m_abstractDevicePublisher02 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_02");
m_abstractDevicePublisher03 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_03");
if (!m_abstractDevicePublisher01 || !m_abstractDevicePublisher02 || !m_abstractDevicePublisher03 )
{
std::cout << "Could not add publisher to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
else
{
std::cout << "Publisher added to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
}
void DataLinkWriter(const uint32_t value)
{
m_dataLinkSignalRx.Write(value);
}
void WriteToSignalAsPublisher(const uint32_t value01, const uint32_t value02, const uint32_t value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
m_abstractDevicePublisher01.Write(value01, transaction);
m_abstractDevicePublisher02.Write(value02, transaction);
m_abstractDevicePublisher03.Write(value03, transaction);
transaction.Finish();
}
void GetTxSignalValue(const std::string& msg, uint32_t& value01, uint32_t& value02, uint32_t& value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
value01 = m_dataLinkSignalTx01.Read(transaction).get<uint32_t>();
value02 = m_dataLinkSignalTx02.Read(transaction).get<uint32_t>();
value03 = m_dataLinkSignalTx03.Read(transaction).get<uint32_t>();
transaction.Finish();
std::cout << "Read Tx signals (" << msg.c_str() <<"): " << std::to_string(value01) << ", " << std::to_string(value02) << ", " << std::to_string(value03) << std::endl;
}
private:
/**
* @brief CallBackFunction for the subscription
*/
void CallBackFunction(sdv::any_t value)
{
uint32_t sayHello = value.get<uint32_t>();
std::cout << "This CallBackFunction is called on signal change: " << std::to_string(sayHello) << std::endl;
}
sdv::core::CSignal m_dataLinkSignalRx; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx01; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx02; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx03; ///< signals created and used by data link
sdv::core::CSignal m_abstractDeviceSubscriper; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher01; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher02; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher03; ///< signals used by an abstract device
};
To receipt data over the network a ‘RxSignal’ has to be registered. Multiple registrations of the same signal are allowed. The signal is identified by the signal name. To guarantee uniqueness, it is preferred to add the group hierarchy to the signal name separated by a dot. E.g. with CAN: MAB.BcmChas1Fr03.SteerReCtrlReqAgReq. Every component which wants to receive the data must subscribe.
#include <iostream>
#include <support/toml.h>
#include <support/component_impl.h>
#include <support/signal_support.h>
class CExampleDispatchService
{
public:
CExampleDispatchService()
{
sdv::core::CDispatchService dispatch;
m_dataLinkSignalRx = dispatch.RegisterRxSignal("Signal_DataLink_to_AbstractDevice"); ///< signals created by data link
m_dataLinkSignalTx01 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_01", 123);
m_dataLinkSignalTx02 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_02", 123);
m_dataLinkSignalTx03 = dispatch.RegisterTxSignal("Signal_AbstractDevice_to_DataLink_03", 123);
}
~CExampleDispatchService()
{
if (m_dataLinkSignalRx)
m_dataLinkSignalRx.Reset();
if (m_dataLinkSignalTx01)
m_dataLinkSignalTx01.Reset();
if (m_dataLinkSignalTx02)
m_dataLinkSignalTx02.Reset();
if (m_dataLinkSignalTx03)
m_dataLinkSignalTx03.Reset();
}
void SubscripSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDeviceSubscriper = dispatch.Subscribe("Signal_DataLink_to_AbstractDevice", [&](sdv::any_t value) { CallBackFunction(value); });
if (!m_abstractDeviceSubscriper)
{
std::cout << "Could not subscrupe to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
else
{
std::cout << "Subscript to 'Signal_DataLink_to_AbstractDevice'" << std::endl;
}
}
void AddPublisherSignals()
{
sdv::core::CDispatchService dispatch;
m_abstractDevicePublisher01 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_01");
m_abstractDevicePublisher02 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_02");
m_abstractDevicePublisher03 = dispatch.AddPublisher("Signal_AbstractDevice_to_DataLink_03");
if (!m_abstractDevicePublisher01 || !m_abstractDevicePublisher02 || !m_abstractDevicePublisher03 )
{
std::cout << "Could not add publisher to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
else
{
std::cout << "Publisher added to 'Signal_AbstractDevice_to_DataLink'" << std::endl;
}
}
void DataLinkWriter(const uint32_t value)
{
m_dataLinkSignalRx.Write(value);
}
void WriteToSignalAsPublisher(const uint32_t value01, const uint32_t value02, const uint32_t value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
m_abstractDevicePublisher01.Write(value01, transaction);
m_abstractDevicePublisher02.Write(value02, transaction);
m_abstractDevicePublisher03.Write(value03, transaction);
transaction.Finish();
}
void GetTxSignalValue(const std::string& msg, uint32_t& value01, uint32_t& value02, uint32_t& value03)
{
sdv::core::CDispatchService dispatch;
auto transaction = dispatch.CreateTransaction();
value01 = m_dataLinkSignalTx01.Read(transaction).get<uint32_t>();
value02 = m_dataLinkSignalTx02.Read(transaction).get<uint32_t>();
value03 = m_dataLinkSignalTx03.Read(transaction).get<uint32_t>();
transaction.Finish();
std::cout << "Read Tx signals (" << msg.c_str() <<"): " << std::to_string(value01) << ", " << std::to_string(value02) << ", " << std::to_string(value03) << std::endl;
}
private:
/**
* @brief CallBackFunction for the subscription
*/
void CallBackFunction(sdv::any_t value)
{
uint32_t sayHello = value.get<uint32_t>();
std::cout << "This CallBackFunction is called on signal change: " << std::to_string(sayHello) << std::endl;
}
sdv::core::CSignal m_dataLinkSignalRx; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx01; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx02; ///< signals created and used by data link
sdv::core::CSignal m_dataLinkSignalTx03; ///< signals created and used by data link
sdv::core::CSignal m_abstractDeviceSubscriper; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher01; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher02; ///< signals used by an abstract device
sdv::core::CSignal m_abstractDevicePublisher03; ///< signals used by an abstract device
};
An (or multiple) Vehicle Device or Basic Service can subscribe a callback function to receive the data when the signal is updated.