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