Merge remote-tracking branch 'upstream/pr/1040' into uorbtinymerge

Conflicts:
	mavlink/include/mavlink/v1.0
	src/modules/mc_att_control/mc_att_control_main.cpp
This commit is contained in:
Thomas Gubler
2014-11-25 10:49:29 +01:00
8 changed files with 199 additions and 73 deletions
+3 -3
View File
@@ -53,10 +53,10 @@ namespace uORB {
template<class T>
Publication<T>::Publication(
List<PublicationBase *> * list,
const struct orb_metadata *meta) :
const struct orb_metadata *meta,
List<PublicationNode *> * list) :
T(), // initialize data structure to zero
PublicationBase(list, meta) {
PublicationNode(meta, list) {
}
template<class T>
+81 -15
View File
@@ -38,6 +38,8 @@
#pragma once
#include <assert.h>
#include <uORB/uORB.h>
#include <containers/List.hpp>
@@ -49,55 +51,112 @@ namespace uORB
* Base publication warapper class, used in list traversal
* of various publications.
*/
class __EXPORT PublicationBase : public ListNode<uORB::PublicationBase *>
class __EXPORT PublicationBase
{
public:
PublicationBase(
List<PublicationBase *> * list,
const struct orb_metadata *meta) :
/**
* Constructor
*
*
* @param meta The uORB metadata (usually from the ORB_ID()
* macro) for the topic.
*/
PublicationBase(const struct orb_metadata *meta) :
_meta(meta),
_handle(-1) {
if (list != NULL) list->add(this);
}
void update() {
/**
* Update the struct
* @param data The uORB message struct we are updating.
*/
void update(void * data) {
if (_handle > 0) {
orb_publish(getMeta(), getHandle(), getDataVoidPtr());
orb_publish(getMeta(), getHandle(), data);
} else {
setHandle(orb_advertise(getMeta(), getDataVoidPtr()));
setHandle(orb_advertise(getMeta(), data));
}
}
virtual void *getDataVoidPtr() = 0;
/**
* Deconstructor
*/
virtual ~PublicationBase() {
orb_unsubscribe(getHandle());
}
// accessors
const struct orb_metadata *getMeta() { return _meta; }
int getHandle() { return _handle; }
protected:
// accessors
void setHandle(orb_advert_t handle) { _handle = handle; }
// attributes
const struct orb_metadata *_meta;
orb_advert_t _handle;
};
/**
* alias class name so it is clear that the base class
* can be used by itself if desired
*/
typedef PublicationBase PublicationTiny;
/**
* The publication base class as a list node.
*/
class __EXPORT PublicationNode :
public PublicationBase,
public ListNode<PublicationNode *>
{
public:
/**
* Constructor
*
*
* @param meta The uORB metadata (usually from the ORB_ID()
* macro) for the topic.
* @param list A pointer to a list of subscriptions
* that this should be appended to.
*/
PublicationNode(const struct orb_metadata *meta,
List<PublicationNode *> * list=nullptr) :
PublicationBase(meta) {
if (list != nullptr) list->add(this);
}
/**
* This function is the callback for list traversal
* updates, a child class must implement it.
*/
virtual void update() = 0;
};
/**
* Publication wrapper class
*/
template<class T>
class Publication :
public T, // this must be first!
public PublicationBase
public PublicationNode
{
public:
/**
* Constructor
*
* @param list A list interface for adding to list during construction
* @param meta The uORB metadata (usually from the ORB_ID() macro)
* for the topic.
* @param meta The uORB metadata (usually from
* the ORB_ID() macro) for the topic.
* @param list A list interface for adding to
* list during construction
*/
Publication(List<PublicationBase *> * list,
const struct orb_metadata *meta);
Publication(const struct orb_metadata *meta,
List<PublicationNode *> * list=nullptr);
/**
* Deconstructor
**/
virtual ~Publication();
/*
* XXX
* This function gets the T struct, assuming
@@ -106,6 +165,13 @@ public:
* seem to be available
*/
void *getDataVoidPtr();
/**
* Create an update function that uses the embedded struct.
*/
void update() {
PublicationBase::update(getDataVoidPtr());
}
};
} // namespace uORB
+4 -12
View File
@@ -56,21 +56,13 @@
namespace uORB
{
bool __EXPORT SubscriptionBase::updated()
{
bool isUpdated = false;
orb_check(_handle, &isUpdated);
return isUpdated;
}
template<class T>
Subscription<T>::Subscription(
List<SubscriptionBase *> * list,
const struct orb_metadata *meta, unsigned interval) :
const struct orb_metadata *meta,
unsigned interval,
List<SubscriptionNode *> * list) :
T(), // initialize data structure to zero
SubscriptionBase(list, meta) {
setHandle(orb_subscribe(getMeta()));
orb_set_interval(getHandle(), interval);
SubscriptionNode(meta, interval, list) {
}
template<class T>
+93 -25
View File
@@ -38,10 +38,11 @@
#pragma once
#include <assert.h>
#include <uORB/uORB.h>
#include <containers/List.hpp>
namespace uORB
{
@@ -49,8 +50,7 @@ namespace uORB
* Base subscription warapper class, used in list traversal
* of various subscriptions.
*/
class __EXPORT SubscriptionBase :
public ListNode<SubscriptionBase *>
class __EXPORT SubscriptionBase
{
public:
// methods
@@ -58,23 +58,42 @@ public:
/**
* Constructor
*
* @param meta The uORB metadata (usually from the ORB_ID() macro)
* for the topic.
* @param meta The uORB metadata (usually from the ORB_ID()
* macro) for the topic.
*
* @param interval The minimum interval in milliseconds
* between updates
*/
SubscriptionBase(
List<SubscriptionBase *> * list,
const struct orb_metadata *meta) :
SubscriptionBase(const struct orb_metadata *meta,
unsigned interval=0) :
_meta(meta),
_handle() {
if (list != NULL) list->add(this);
setHandle(orb_subscribe(getMeta()));
orb_set_interval(getHandle(), interval);
}
bool updated();
void update() {
/**
* Check if there is a new update.
* */
bool updated() {
bool isUpdated = false;
orb_check(_handle, &isUpdated);
return isUpdated;
}
/**
* Update the struct
* @param data The uORB message struct we are updating.
*/
void update(void * data) {
if (updated()) {
orb_copy(_meta, _handle, getDataVoidPtr());
orb_copy(_meta, _handle, data);
}
}
virtual void *getDataVoidPtr() = 0;
/**
* Deconstructor
*/
virtual ~SubscriptionBase() {
orb_unsubscribe(_handle);
}
@@ -90,30 +109,79 @@ protected:
};
/**
* Subscription wrapper class
* alias class name so it is clear that the base class
*/
template<class T>
class __EXPORT Subscription :
public T, // this must be first!
public SubscriptionBase
typedef SubscriptionBase SubscriptionTiny;
/**
* The publication base class as a list node.
*/
class __EXPORT SubscriptionNode :
public SubscriptionBase,
public ListNode<SubscriptionNode *>
{
public:
/**
* Constructor
*
* @param list A list interface for adding to list during construction
* @param meta The uORB metadata (usually from the ORB_ID() macro)
* for the topic.
* @param interval The minimum interval in milliseconds between updates
*
* @param meta The uORB metadata (usually from the ORB_ID()
* macro) for the topic.
* @param interval The minimum interval in milliseconds
* between updates
* @param list A pointer to a list of subscriptions
* that this should be appended to.
*/
Subscription(
List<SubscriptionBase *> * list,
const struct orb_metadata *meta, unsigned interval);
SubscriptionNode(const struct orb_metadata *meta,
unsigned interval=0,
List<SubscriptionNode *> * list=nullptr) :
SubscriptionBase(meta, interval) {
if (list != nullptr) list->add(this);
}
/**
* This function is the callback for list traversal
* updates, a child class must implement it.
*/
virtual void update() = 0;
};
/**
* Subscription wrapper class
*/
template<class T>
class __EXPORT Subscription :
public T, // this must be first!
public SubscriptionNode
{
public:
/**
* Constructor
*
* @param meta The uORB metadata (usually from
* the ORB_ID() macro) for the topic.
* @param interval The minimum interval in milliseconds
* between updates
* @param list A list interface for adding to
* list during construction
*/
Subscription(const struct orb_metadata *meta,
unsigned interval=0,
List<SubscriptionNode *> * list=nullptr);
/**
* Deconstructor
*/
virtual ~Subscription();
/**
* Create an update function that uses the embedded struct.
*/
void update() {
SubscriptionBase::update(getDataVoidPtr());
}
/*
* XXX
* This function gets the T struct, assuming