#include <vsomeip/vsomeip.hpp>
#include <atomic>
#include <chrono>
#include <csignal>
#include <iostream>
#include <thread>
namespace {
constexpr vsomeip::service_t kServiceId = 0x1234;
constexpr vsomeip::instance_t kInstanceId = 0x0001;
std::atomic<bool> g_shutdown{false};
void on_signal(int ) {
g_shutdown.store(true, std::memory_order_release);
}
}
int main() {
std::signal(SIGINT, on_signal);
std::signal(SIGTERM, on_signal);
auto runtime = vsomeip::runtime::get();
if (!runtime) {
std::cerr << "[subscriber] vsomeip::runtime::get() returned null" << std::endl;
return 1;
}
auto app = runtime->create_application("subscriber");
if (!app) {
std::cerr << "[subscriber] runtime->create_application() returned null" << std::endl;
return 1;
}
if (!app->init()) {
std::cerr << "[subscriber] application->init() failed; "
<< "check VSOMEIP_CONFIGURATION and JSON validity" << std::endl;
return 1;
}
app->register_availability_handler(
kServiceId, kInstanceId,
[](vsomeip::service_t srv, vsomeip::instance_t inst, bool available) {
std::cout << "[subscriber] "
<< (available ? "AVAILABLE" : "UNAVAILABLE")
<< " service=0x" << std::hex << srv
<< " instance=0x" << inst
<< std::dec << std::endl
<< std::flush;
});
std::thread vsomeip_thread([&app]() { app->start(); });
std::this_thread::sleep_for(std::chrono::milliseconds(200));
std::cout << "[subscriber] requesting service 0x" << std::hex << kServiceId
<< " instance 0x" << kInstanceId << std::dec << std::endl;
app->request_service(kServiceId, kInstanceId);
while (!g_shutdown.load(std::memory_order_acquire)) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
std::cout << "[subscriber] shutdown requested; stopping vsomeip" << std::endl;
app->release_service(kServiceId, kInstanceId);
app->stop();
vsomeip_thread.join();
return 0;
}