12
14
struct culss::Implementation::Private
14
Private(const Provider::Ptr& provider) : provider(provider)
16
Provider::Ptr provider;
19
core::ScopedConnection position_updates;
20
core::ScopedConnection velocity_updates;
21
core::ScopedConnection heading_updates;
18
Provider::Ptr provider;
19
ScopedChannelConnection position_updates_connection;
20
ScopedChannelConnection velocity_updates_connection;
21
ScopedChannelConnection heading_updates_connection;
23
core::ScopedConnection position_status_updates;
24
core::ScopedConnection heading_status_updates;
25
core::ScopedConnection velocity_status_updates;
24
culss::Implementation::Implementation(
25
const dbus::Bus::Ptr& bus,
26
const dbus::types::ObjectPath& session_path,
27
const cul::Provider::Ptr& provider)
28
: Skeleton(bus, session_path),
29
d(new Private{provider})
29
culss::Implementation::Implementation(const cul::Provider::Ptr& provider)
35
provider->updates().position.connect(
36
[this](const Update<Position>& update)
38
updates().position = update;
40
provider->updates().heading.connect(
41
[this](const Update<Heading>& update)
43
updates().heading = update;
45
provider->updates().velocity.connect(
46
[this](const Update<Velocity>& update)
48
updates().velocity = update;
50
updates().position_status.changed().connect(
51
[this](const Interface::Updates::Status& status)
55
case Interface::Updates::Status::enabled:
56
start_position_updates(); break;
57
case Interface::Updates::Status::disabled:
58
stop_position_updates(); break;
61
updates().velocity_status.changed().connect(
62
[this](const Interface::Updates::Status& status)
66
case Interface::Updates::Status::enabled:
67
start_velocity_updates(); break;
68
case Interface::Updates::Status::disabled:
69
stop_velocity_updates(); break;
72
updates().heading_status.changed().connect(
73
[this](const Interface::Updates::Status& status)
77
case Interface::Updates::Status::enabled:
78
start_heading_updates(); break;
79
case Interface::Updates::Status::disabled:
80
stop_heading_updates(); break;
32
throw std::runtime_error("Cannot create implementation for null provider.");
34
d->position_updates_connection =
35
provider->subscribe_to_position_updates([this](const Update<Position>& update)
37
access_position_updates_channel()(update);
39
d->heading_updates_connection =
40
provider->subscribe_to_heading_updates([this](const Update<Heading>& update)
42
access_heading_updates_channel()(update);
44
d->velocity_updates_connection =
45
provider->subscribe_to_velocity_updates([this](const Update<Velocity>& update)
47
access_velocity_updates_channel()(update);
51
88
culss::Implementation::~Implementation() noexcept
90
stop_position_updates();
91
stop_heading_updates();
92
stop_velocity_updates();
55
95
void culss::Implementation::start_position_updates()
97
VLOG(10) << __PRETTY_FUNCTION__;
57
98
d->provider->state_controller()->start_position_updates();
60
101
void culss::Implementation::stop_position_updates() noexcept
103
VLOG(10) << __PRETTY_FUNCTION__;
62
104
d->provider->state_controller()->stop_position_updates();
65
107
void culss::Implementation::start_velocity_updates()
109
VLOG(10) << __PRETTY_FUNCTION__;
67
110
d->provider->state_controller()->start_velocity_updates();
70
113
void culss::Implementation::stop_velocity_updates() noexcept
115
VLOG(10) << __PRETTY_FUNCTION__;
72
116
d->provider->state_controller()->stop_velocity_updates();
75
119
void culss::Implementation::start_heading_updates()
121
VLOG(10) << __PRETTY_FUNCTION__;
77
122
d->provider->state_controller()->start_heading_updates();
80
125
void culss::Implementation::stop_heading_updates() noexcept
127
VLOG(10) << __PRETTY_FUNCTION__;
82
128
d->provider->state_controller()->stop_heading_updates();