From 737f7df6b8ac85ae32b50a9a14285f805d0ec89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= <beat-kueng@gmx.net> Date: Tue, 28 Nov 2017 08:33:38 +0100 Subject: [PATCH] Subscription & SubscriptionArray: add forcedUpdate() methods Can be used to immediately get & use the data, as needed for the flight tasks. --- src/lib/FlightTasks/FlightTasks.hpp | 2 ++ src/lib/FlightTasks/SubscriptionArray.cpp | 7 +++++++ src/lib/FlightTasks/SubscriptionArray.hpp | 7 ++++++- src/modules/uORB/Subscription.hpp | 16 +++++++++++++--- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/lib/FlightTasks/FlightTasks.hpp b/src/lib/FlightTasks/FlightTasks.hpp index 7b464c21c5..1388b92499 100644 --- a/src/lib/FlightTasks/FlightTasks.hpp +++ b/src/lib/FlightTasks/FlightTasks.hpp @@ -151,6 +151,8 @@ public: return -3; } + _subscription_array.forcedUpdate(); // make sure data is available for all new subscriptions + _current_task_index = task_number; return 0; } diff --git a/src/lib/FlightTasks/SubscriptionArray.cpp b/src/lib/FlightTasks/SubscriptionArray.cpp index 6a42cbde1d..f56e47fb2f 100644 --- a/src/lib/FlightTasks/SubscriptionArray.cpp +++ b/src/lib/FlightTasks/SubscriptionArray.cpp @@ -76,3 +76,10 @@ void SubscriptionArray::update() _subscriptions[i]->update(); } } + +void SubscriptionArray::forcedUpdate() +{ + for (int i = 0; i < _subscriptions_count; ++i) { + _subscriptions[i]->forcedUpdate(); + } +} diff --git a/src/lib/FlightTasks/SubscriptionArray.hpp b/src/lib/FlightTasks/SubscriptionArray.hpp index a5f7121844..86d36ffcb8 100644 --- a/src/lib/FlightTasks/SubscriptionArray.hpp +++ b/src/lib/FlightTasks/SubscriptionArray.hpp @@ -60,10 +60,15 @@ public: bool get(const struct orb_metadata *meta, uORB::Subscription<T> *&subscription, unsigned instance = 0); /** - * update all subscriptions + * update all subscriptions (if new data is available) */ void update(); + /** + * update all subscriptions + */ + void forcedUpdate(); + private: void cleanup(); diff --git a/src/modules/uORB/Subscription.hpp b/src/modules/uORB/Subscription.hpp index 70ffad289f..791695d837 100644 --- a/src/modules/uORB/Subscription.hpp +++ b/src/modules/uORB/Subscription.hpp @@ -125,13 +125,18 @@ public: */ virtual bool update() = 0; + /** + * Like update(), but does not check first if there is data available + */ + virtual bool forcedUpdate() = 0; + }; /** * Subscription wrapper class */ template<class T> -class __EXPORT Subscription final : public SubscriptionNode +class __EXPORT Subscription : public SubscriptionNode { public: /** @@ -150,7 +155,7 @@ public: _data() // initialize data structure to zero {} - ~Subscription() override final = default; + ~Subscription() override = default; // no copy, assignment, move, move assignment Subscription(const Subscription &) = delete; @@ -161,11 +166,16 @@ public: /** * Create an update function that uses the embedded struct. */ - bool update() override final + bool update() override { return SubscriptionBase::update((void *)(&_data)); } + bool forcedUpdate() override + { + return orb_copy(_meta, _handle, &_data) == PX4_OK; + } + /* * This function gets the T struct data * */ -- GitLab