#include #include #include #include "example_interfaces.h" #include "example_reception_interfaces.h" #include "example_transfer_interfaces.h" #include "example_dispatch_service.cpp" sdv::core::CSignal m_signalSpeedRx; sdv::core::CSignal m_signalBrakeForceTx; /** * @brief check if SDV_FRAMEWORK_RUNTIME environment variable exists * @return Return true if environment variable is found otherwise false */ bool IsSDVFrameworkEnvironmentSet() { const char* envVariable = std::getenv("SDV_FRAMEWORK_RUNTIME"); if (envVariable) { return true; } return false; } void UsageOfGeneralComponent() { std::cout << "Running example of General Component use:" << std::endl; auto hello = sdv::core::GetObject("Hello_Component").GetInterface(); auto bye = sdv::core::GetObject("Hello_Component").GetInterface(); if (!hello) std::cout << "Could not get hello interface" << std::endl; else hello->SayHello(); if (!bye) std::cout << "Could not get bye interface" << std::endl; else bye->SayGoodbye(); std::cout << "\n"; } void UsageOfGeneralComponentWithInitialization() { std::cout << "Running example of General Component With Initialization, the number should be 42:" << std::endl; auto hello = sdv::core::GetObject("Hello_Component_With_Initialization").GetInterface(); auto bye = sdv::core::GetObject("Hello_Component_With_Initialization").GetInterface(); if (!hello) std::cout << "Could not get hello interface" << std::endl; else hello->SayHello(); if (!bye) std::cout << "Could not get bye interface" << std::endl; else bye->SayGoodbye(); std::cout << "\n"; } void UsageOfAbstractDeviceAndBasicService() { std::cout << "Running example of Abstract Device Component use:" << std::endl; auto brakeForce = sdv::core::GetObject("BasicService_Component").GetInterface(); if (brakeForce) { brakeForce->SetBrakeForce(123); sdv::core::CDispatchService dispatch; auto transaction = dispatch.CreateTransaction(); auto value = m_signalBrakeForceTx.Read(transaction).get(); transaction.Finish(); std::cout << "Set Brake force 123 and read value: " << std::to_string(value) << std::endl; } else { std::cout << "No interface 'vss::Service::ITransferSignalBrakeForce' of the basic service " << std::endl; } std::cout << "Now a callback function should be called with 12345:" << std::endl; m_signalSpeedRx.Write(12345); auto speed = sdv::core::GetObject("BasicService_Component").GetInterface(); if (speed) { auto value = speed->GetSpeedValue(); std::cout << "Speed value should be 12345: " << std::to_string(value) << std::endl; } else { std::cout << "No interface 'vss::Service::IReceptionSignalSpeed' of the basic service " << std::endl; } std::cout << "Complex service exists? " << std::to_string(sdv::core::GetObject("ComplexService_Component").IsValid()) << std::endl; std::cout << "\n"; } void UsageOfDataDispatchServiceAccess(CExampleDispatchService* exampleDispatchService) { uint32_t value01{ 0 }; uint32_t value02{ 0 }; uint32_t value03{ 0 }; std::cout << "Running example of dispatchservice\n"; std::cout << "Start: " << std::to_string(value01) << " " << std::to_string(value02) << " " << std::to_string(value03) << " " << std::endl; exampleDispatchService->GetTxSignalValue("after creation", value01, value02, value03); exampleDispatchService->WriteToSignalAsPublisher(17, 18, 19); exampleDispatchService->GetTxSignalValue("after 17, 18, 19 written", value01, value02, value03); exampleDispatchService->GetTxSignalValue("after nothing changed", value01, value02, value03); exampleDispatchService->WriteToSignalAsPublisher(456, 455, 454); exampleDispatchService->GetTxSignalValue("after 456, 455, 454 written", value01, value02, value03); std::cout << "Write 77 to RX signal: " << std::endl; exampleDispatchService->DataLinkWriter(77); std::cout << "\n"; } bool InitializeAppControl(sdv::app::CAppControl* appcontrol) { auto bResult = appcontrol->AddModuleSearchDir("../../bin"); bResult &= appcontrol->Startup(""); appcontrol->SetConfigMode(); if (appcontrol->LoadConfig("docu_dispatch.toml") != sdv::core::EConfigProcessResult::successful) { std::cout << "dispatch service could be loaded" << std::endl; } sdv::core::CDispatchService dispatch; m_signalSpeedRx = dispatch.RegisterRxSignal("SPEED_SIGNAL_NAME"); ///< signals for abstract device m_signalBrakeForceTx = dispatch.RegisterTxSignal("BRAKE_FORCE_SIGNAL_NAME", 0); if (!m_signalSpeedRx || !m_signalBrakeForceTx) { std::cout << "Signal for Speed and Brake Force could not be registered" << std::endl; bResult = false; } if (appcontrol->LoadConfig("docu_examples.toml") != sdv::core::EConfigProcessResult::successful) { std::cout << "Not all examples could be loaded" << std::endl; bResult = false; } return bResult; } void AddPuplisherAndSubscriper(CExampleDispatchService* exampleDispatchService) { exampleDispatchService->AddPublisherSignals(); exampleDispatchService->SubscripSignals(); std::cout << "\n"; } #if defined(_WIN32) && defined(_UNICODE) extern "C" int wmain() #else extern "C" int main() #endif { sdv::app::CAppControl appcontrol; if (!IsSDVFrameworkEnvironmentSet()) { // if SDV_FRAMEWORK_RUNTIME environment variable is not set we need to set the Framework Runtime directory appcontrol.SetFrameworkRuntimeDirectory("../../bin"); } std::cout << "Run documentation code examples:\n- Initialization/Configuration mode.\n" << std::endl; InitializeAppControl(&appcontrol); CExampleDispatchService exampleDispatchService; AddPuplisherAndSubscriper(&exampleDispatchService); // for dispatch example, must be done before appcontrol.SetRunningMode(); appcontrol.SetRunningMode(); std::cout << "- Set running mode\n" << std::endl; std::cout << "------------------------------------------------\n---Running UsageOfDataDispatchServiceAccess():" << std::endl; UsageOfDataDispatchServiceAccess(&exampleDispatchService); std::cout << "------------------------------------------------\n---Running UsageOfGeneralComponent():" << std::endl; UsageOfGeneralComponent(); std::cout << "------------------------------------------------\n---Running UsageOfGeneralComponentWithInitialization():" << std::endl; UsageOfGeneralComponentWithInitialization(); std::cout << "------------------------------------------------\n---Running UsageOfAbstractDeviceAndBasicService():" << std::endl; UsageOfAbstractDeviceAndBasicService(); appcontrol.Shutdown(); std::cout << "\n\nTest finished." << std::endl; return 0; }