summaryrefslogtreecommitdiff
path: root/implementation/routing/src/event.cpp
diff options
context:
space:
mode:
authorJürgen Gehring <juergen.gehring@bmw.de>2015-07-29 00:39:43 -0700
committerJürgen Gehring <juergen.gehring@bmw.de>2015-07-29 00:39:43 -0700
commit4792b52c653ab8cdba740a141ae808226b3ed2c1 (patch)
tree47ba024655b6491de0f8e3033ec99fc35080d5f4 /implementation/routing/src/event.cpp
parenta1082eaf77850fe213e30e9abc4ea709d0499681 (diff)
downloadvSomeIP-4792b52c653ab8cdba740a141ae808226b3ed2c1.tar.gz
vSomeIP 1.3.01.3.0
Diffstat (limited to 'implementation/routing/src/event.cpp')
-rw-r--r--implementation/routing/src/event.cpp155
1 files changed, 101 insertions, 54 deletions
diff --git a/implementation/routing/src/event.cpp b/implementation/routing/src/event.cpp
index ffaec8a..c3dc258 100644
--- a/implementation/routing/src/event.cpp
+++ b/implementation/routing/src/event.cpp
@@ -1,11 +1,8 @@
-// Copyright (C) 2014 BMW Group
-// Author: Lutz Bichler (lutz.bichler@bmw.de)
+// Copyright (C) 2014-2015 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/.
-#include <iomanip>
-
#include <vsomeip/defines.hpp>
#include <vsomeip/logger.hpp>
#include <vsomeip/message.hpp>
@@ -15,75 +12,68 @@
#include "../include/event.hpp"
#include "../include/routing_manager.hpp"
#include "../../configuration/include/internal.hpp"
+#include "../../message/include/payload_impl.hpp"
namespace vsomeip {
event::event(routing_manager *_routing) :
- routing_(_routing), message_(runtime::get()->create_notification()), cycle_timer_(
- _routing->get_io()), is_updating_on_change_(true) {
+ routing_(_routing),
+ message_(runtime::get()->create_notification()),
+ cycle_timer_(_routing->get_io()),
+ is_updating_on_change_(true),
+ is_set_(false) {
}
service_t event::get_service() const {
- return (message_->get_service());
+ return (message_->get_service());
}
void event::set_service(service_t _service) {
- message_->set_service(_service);
+ message_->set_service(_service);
}
instance_t event::get_instance() const {
- return (message_->get_instance());
+ return (message_->get_instance());
}
void event::set_instance(instance_t _instance) {
- message_->set_instance(_instance);
+ message_->set_instance(_instance);
}
event_t event::get_event() const {
- return (message_->get_method());
+ return (message_->get_method());
}
void event::set_event(event_t _event) {
- message_->set_method(_event); // TODO: maybe we should check for the leading 0-bit
+ message_->set_method(_event); // TODO: maybe we should check for the leading 0-bit
}
bool event::is_field() const {
- return (is_field_);
+ return (is_field_);
}
void event::set_field(bool _is_field) {
- is_field_ = _is_field;
+ is_field_ = _is_field;
}
bool event::is_reliable() const {
- return is_reliable_;
+ return message_->is_reliable();
}
void event::set_reliable(bool _is_reliable) {
- is_reliable_ = _is_reliable;
+ message_->set_reliable(_is_reliable);
}
const std::shared_ptr<payload> event::get_payload() const {
- return (message_->get_payload());
+ return (message_->get_payload());
}
void event::set_payload(std::shared_ptr<payload> _payload) {
- std::shared_ptr<payload> its_payload = message_->get_payload();
- bool is_change = (its_payload->get_length() != _payload->get_length());
- if (!is_change) {
- std::size_t its_pos = 0;
- const byte_t *its_old_data = its_payload->get_data();
- const byte_t *its_new_data = _payload->get_data();
- while (!is_change && its_pos < its_payload->get_length()) {
- is_change = (*its_old_data++ != *its_new_data++);
- its_pos++;
- }
- }
-
- if (is_change) {
+ if (set_payload_helper(_payload)) {
std::shared_ptr<payload> its_new_payload
= runtime::get()->create_payload(
_payload->get_data(), _payload->get_length());
+
message_->set_payload(its_new_payload);
if (is_updating_on_change_) {
notify();
@@ -91,52 +81,109 @@ void event::set_payload(std::shared_ptr<payload> _payload) {
}
}
+void event::set_payload(std::shared_ptr<payload> _payload, client_t _client) {
+ set_payload_helper(_payload);
+ std::shared_ptr<payload> its_new_payload
+ = runtime::get()->create_payload(
+ _payload->get_data(), _payload->get_length());
+
+ message_->set_payload(its_new_payload);
+ if (is_updating_on_change_) {
+ notify_one(_client);
+ }
+}
+
+void event::set_payload(std::shared_ptr<payload> _payload,
+ const std::shared_ptr<endpoint_definition> _target) {
+
+ set_payload_helper(_payload);
+ std::shared_ptr<payload> its_new_payload
+ = runtime::get()->create_payload(
+ _payload->get_data(), _payload->get_length());
+
+ message_->set_payload(its_new_payload);
+ if (is_updating_on_change_) {
+ notify_one(_target);
+ }
+}
+
+void event::unset_payload() {
+ is_set_ = false;
+ message_->set_payload(std::make_shared<payload_impl>());
+}
+
void event::set_update_on_change(bool _is_active) {
- is_updating_on_change_ = _is_active;
+ is_updating_on_change_ = _is_active;
}
void event::set_update_cycle(std::chrono::milliseconds &_cycle) {
- cycle_ = _cycle;
- cycle_timer_.cancel();
-
- if (std::chrono::milliseconds::zero() != _cycle) {
- cycle_timer_.expires_from_now(cycle_);
- std::function<void(boost::system::error_code const &)> its_handler =
- std::bind(&event::update_cbk, shared_from_this(),
- std::placeholders::_1);
- cycle_timer_.async_wait(its_handler);
- }
+ cycle_ = _cycle;
+
+ cycle_timer_.cancel();
+
+ if (std::chrono::milliseconds::zero() != _cycle) {
+ cycle_timer_.expires_from_now(cycle_);
+ std::function<void(boost::system::error_code const &)> its_handler =
+ std::bind(&event::update_cbk, shared_from_this(),
+ std::placeholders::_1);
+ cycle_timer_.async_wait(its_handler);
+ }
}
const std::set<eventgroup_t> & event::get_eventgroups() const {
- return (eventgroups_);
+ return (eventgroups_);
}
void event::add_eventgroup(eventgroup_t _eventgroup) {
- eventgroups_.insert(_eventgroup);
+ eventgroups_.insert(_eventgroup);
}
void event::set_eventgroups(const std::set<eventgroup_t> &_eventgroups) {
- eventgroups_ = _eventgroups;
+ eventgroups_ = _eventgroups;
}
void event::update_cbk(boost::system::error_code const &_error) {
- if (!_error) {
- cycle_timer_.expires_from_now(cycle_);
- notify();
- std::function<void(boost::system::error_code const &)> its_handler =
- std::bind(&event::update_cbk, shared_from_this(),
- std::placeholders::_1);
- cycle_timer_.async_wait(its_handler);
- }
+ if (!_error) {
+ cycle_timer_.expires_from_now(cycle_);
+ notify();
+ std::function<void(boost::system::error_code const &)> its_handler =
+ std::bind(&event::update_cbk, shared_from_this(),
+ std::placeholders::_1);
+ cycle_timer_.async_wait(its_handler);
+ }
}
void event::notify() {
- routing_->send(VSOMEIP_ROUTING_CLIENT, message_, true, is_reliable_);
+ if (is_set_) {
+ routing_->send(VSOMEIP_ROUTING_CLIENT, message_, true);
+ }
}
void event::notify_one(const std::shared_ptr<endpoint_definition> &_target) {
- routing_->send_to(_target, message_);
+ if (is_set_)
+ routing_->send_to(_target, message_);
+}
+
+void event::notify_one(client_t _client) {
+ if (is_set_)
+ routing_->send(_client, message_, true);
+}
+
+bool event::set_payload_helper(std::shared_ptr<payload> _payload) {
+ std::shared_ptr<payload> its_payload = message_->get_payload();
+ bool is_change = (its_payload->get_length() != _payload->get_length());
+ if (!is_change) {
+ std::size_t its_pos = 0;
+ const byte_t *its_old_data = its_payload->get_data();
+ const byte_t *its_new_data = _payload->get_data();
+ while (!is_change && its_pos < its_payload->get_length()) {
+ is_change = (*its_old_data++ != *its_new_data++);
+ its_pos++;
+ }
+ }
+ is_set_ = true;
+
+ return is_change;
}
} // namespace vsomeip