summaryrefslogtreecommitdiff
path: root/examples/notify-sample.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/notify-sample.cpp')
-rw-r--r--examples/notify-sample.cpp260
1 files changed, 0 insertions, 260 deletions
diff --git a/examples/notify-sample.cpp b/examples/notify-sample.cpp
deleted file mode 100644
index 1bcd219..0000000
--- a/examples/notify-sample.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this
-// file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
-#include <csignal>
-#endif
-#include <chrono>
-#include <condition_variable>
-#include <iomanip>
-#include <iostream>
-#include <sstream>
-#include <thread>
-
-#include <vsomeip/vsomeip.hpp>
-
-#include "sample-ids.hpp"
-
-class service_sample {
-public:
- service_sample(bool _use_tcp, uint32_t _cycle) :
- app_(vsomeip::runtime::get()->create_application()),
- is_registered_(false),
- use_tcp_(_use_tcp),
- cycle_(_cycle),
- blocked_(false),
- running_(true),
- is_offered_(false),
- offer_thread_(std::bind(&service_sample::run, this)),
- notify_thread_(std::bind(&service_sample::notify, this)) {
- }
-
- bool init() {
- std::lock_guard<std::mutex> its_lock(mutex_);
-
- if (!app_->init()) {
- std::cerr << "Couldn't initialize application" << std::endl;
- return false;
- }
- app_->register_state_handler(
- std::bind(&service_sample::on_state, this,
- std::placeholders::_1));
-
- app_->register_message_handler(
- SAMPLE_SERVICE_ID,
- SAMPLE_INSTANCE_ID,
- SAMPLE_GET_METHOD_ID,
- std::bind(&service_sample::on_get, this,
- std::placeholders::_1));
-
- app_->register_message_handler(
- SAMPLE_SERVICE_ID,
- SAMPLE_INSTANCE_ID,
- SAMPLE_SET_METHOD_ID,
- std::bind(&service_sample::on_set, this,
- std::placeholders::_1));
-
- std::set<vsomeip::eventgroup_t> its_groups;
- its_groups.insert(SAMPLE_EVENTGROUP_ID);
- app_->offer_event(
- SAMPLE_SERVICE_ID,
- SAMPLE_INSTANCE_ID,
- SAMPLE_EVENT_ID,
- its_groups,
- true);
- payload_ = vsomeip::runtime::get()->create_payload();
-
- blocked_ = true;
- condition_.notify_one();
- return true;
- }
-
- void start() {
- app_->start();
- }
-
-#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
- /*
- * Handle signal to shutdown
- */
- void stop() {
- running_ = false;
- blocked_ = true;
- condition_.notify_one();
- notify_condition_.notify_one();
- app_->clear_all_handler();
- stop_offer();
- offer_thread_.join();
- notify_thread_.join();
- app_->stop();
- }
-#endif
-
- void offer() {
- std::lock_guard<std::mutex> its_lock(notify_mutex_);
- app_->offer_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
- is_offered_ = true;
- notify_condition_.notify_one();
- }
-
- void stop_offer() {
- app_->stop_offer_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
- is_offered_ = false;
- }
-
- void on_state(vsomeip::state_type_e _state) {
- std::cout << "Application " << app_->get_name() << " is "
- << (_state == vsomeip::state_type_e::ST_REGISTERED ?
- "registered." : "deregistered.") << std::endl;
-
- if (_state == vsomeip::state_type_e::ST_REGISTERED) {
- if (!is_registered_) {
- is_registered_ = true;
- }
- } else {
- is_registered_ = false;
- }
- }
-
- void on_get(const std::shared_ptr<vsomeip::message> &_message) {
- std::shared_ptr<vsomeip::message> its_response
- = vsomeip::runtime::get()->create_response(_message);
- its_response->set_payload(payload_);
- app_->send(its_response, true);
- }
-
- void on_set(const std::shared_ptr<vsomeip::message> &_message) {
- payload_ = _message->get_payload();
-
- std::shared_ptr<vsomeip::message> its_response
- = vsomeip::runtime::get()->create_response(_message);
- its_response->set_payload(payload_);
- app_->send(its_response, true);
- app_->notify(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID,
- SAMPLE_EVENT_ID, payload_);
- }
-
- void run() {
- std::unique_lock<std::mutex> its_lock(mutex_);
- while (!blocked_)
- condition_.wait(its_lock);
-
- bool is_offer(true);
- while (running_) {
- if (is_offer)
- offer();
- else
- stop_offer();
-
- for (int i = 0; i < 10 && running_; i++)
- std::this_thread::sleep_for(std::chrono::milliseconds(1000));
-
- is_offer = !is_offer;
- }
- }
-
- void notify() {
- std::shared_ptr<vsomeip::message> its_message
- = vsomeip::runtime::get()->create_request(use_tcp_);
-
- its_message->set_service(SAMPLE_SERVICE_ID);
- its_message->set_instance(SAMPLE_INSTANCE_ID);
- its_message->set_method(SAMPLE_SET_METHOD_ID);
-
- vsomeip::byte_t its_data[10];
- uint32_t its_size = 1;
-
- while (running_) {
- std::unique_lock<std::mutex> its_lock(notify_mutex_);
- while (!is_offered_ && running_)
- notify_condition_.wait(its_lock);
- while (is_offered_ && running_) {
- if (its_size == sizeof(its_data))
- its_size = 1;
-
- for (uint32_t i = 0; i < its_size; ++i)
- its_data[i] = static_cast<uint8_t>(i);
-
- payload_->set_data(its_data, its_size);
-
- std::cout << "Setting event (Length=" << std::dec << its_size << ")." << std::endl;
- app_->notify(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, SAMPLE_EVENT_ID, payload_);
-
- its_size++;
-
- std::this_thread::sleep_for(std::chrono::milliseconds(cycle_));
- }
- }
- }
-
-private:
- std::shared_ptr<vsomeip::application> app_;
- bool is_registered_;
- bool use_tcp_;
- uint32_t cycle_;
-
- std::mutex mutex_;
- std::condition_variable condition_;
- bool blocked_;
- bool running_;
-
- std::mutex notify_mutex_;
- std::condition_variable notify_condition_;
- bool is_offered_;
-
- std::shared_ptr<vsomeip::payload> payload_;
-
- // blocked_ / is_offered_ must be initialized before starting the threads!
- std::thread offer_thread_;
- std::thread notify_thread_;
-};
-
-#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
- service_sample *its_sample_ptr(nullptr);
- void handle_signal(int _signal) {
- if (its_sample_ptr != nullptr &&
- (_signal == SIGINT || _signal == SIGTERM))
- its_sample_ptr->stop();
- }
-#endif
-
-int main(int argc, char **argv) {
- bool use_tcp = false;
- uint32_t cycle = 1000; // default 1s
-
- std::string tcp_enable("--tcp");
- std::string udp_enable("--udp");
- std::string cycle_arg("--cycle");
-
- for (int i = 1; i < argc; i++) {
- if (tcp_enable == argv[i]) {
- use_tcp = true;
- break;
- }
- if (udp_enable == argv[i]) {
- use_tcp = false;
- break;
- }
-
- if (cycle_arg == argv[i] && i + 1 < argc) {
- i++;
- std::stringstream converter;
- converter << argv[i];
- converter >> cycle;
- }
- }
-
- service_sample its_sample(use_tcp, cycle);
-#ifndef VSOMEIP_ENABLE_SIGNAL_HANDLING
- its_sample_ptr = &its_sample;
- signal(SIGINT, handle_signal);
- signal(SIGTERM, handle_signal);
-#endif
- if (its_sample.init()) {
- its_sample.start();
- return 0;
- } else {
- return 1;
- }
-}