mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-07-24 15:27:41 +08:00
refactor(uORB): out-line PublicationMulti methods to save flash
publish(), advertise() and get_instance() were instantiated per topic type and the advertise-check in publish() was additionally inlined at every call site. Move them into a type-independent PublicationMultiBase compiled once. Saves 5.5 kB of flash on px4_fmu-v6x_default.
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
*/
|
||||
|
||||
#include "Publication.hpp"
|
||||
#include "PublicationMulti.hpp"
|
||||
|
||||
namespace uORB
|
||||
{
|
||||
@@ -62,4 +63,33 @@ bool PublicationBase::publish(const void *data)
|
||||
return (Manager::orb_publish(get_topic(), _handle, data) == PX4_OK);
|
||||
}
|
||||
|
||||
bool PublicationMultiBase::advertise()
|
||||
{
|
||||
if (!advertised()) {
|
||||
int instance = 0;
|
||||
_handle = orb_advertise_multi(get_topic(), nullptr, &instance);
|
||||
}
|
||||
|
||||
return advertised();
|
||||
}
|
||||
|
||||
bool PublicationMultiBase::publish(const void *data)
|
||||
{
|
||||
if (!advertised()) {
|
||||
advertise();
|
||||
}
|
||||
|
||||
return (orb_publish(get_topic(), _handle, data) == PX4_OK);
|
||||
}
|
||||
|
||||
int PublicationMultiBase::get_instance()
|
||||
{
|
||||
// advertise if not already advertised
|
||||
if (advertise()) {
|
||||
return Manager::orb_get_instance(_handle);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
} // namespace uORB
|
||||
|
||||
@@ -51,8 +51,27 @@ namespace uORB
|
||||
/**
|
||||
* Base publication multi wrapper class
|
||||
*/
|
||||
class PublicationMultiBase : public PublicationBase
|
||||
{
|
||||
public:
|
||||
bool advertise();
|
||||
|
||||
int get_instance();
|
||||
|
||||
protected:
|
||||
PublicationMultiBase(ORB_ID id) :
|
||||
PublicationBase(id)
|
||||
{}
|
||||
|
||||
// type-independent publish; data points to a message of the topic's type
|
||||
bool publish(const void *data);
|
||||
};
|
||||
|
||||
/**
|
||||
* Publication multi wrapper class
|
||||
*/
|
||||
template<typename T>
|
||||
class PublicationMulti : public PublicationBase
|
||||
class PublicationMulti : public PublicationMultiBase
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -62,45 +81,18 @@ public:
|
||||
* @param meta The uORB metadata (usually from the ORB_ID() macro) for the topic.
|
||||
*/
|
||||
PublicationMulti(ORB_ID id) :
|
||||
PublicationBase(id)
|
||||
PublicationMultiBase(id)
|
||||
{}
|
||||
|
||||
PublicationMulti(const orb_metadata *meta) :
|
||||
PublicationBase(static_cast<ORB_ID>(meta->o_id))
|
||||
PublicationMultiBase(static_cast<ORB_ID>(meta->o_id))
|
||||
{}
|
||||
|
||||
bool advertise()
|
||||
{
|
||||
if (!advertised()) {
|
||||
int instance = 0;
|
||||
_handle = orb_advertise_multi(get_topic(), nullptr, &instance);
|
||||
}
|
||||
|
||||
return advertised();
|
||||
}
|
||||
|
||||
/**
|
||||
* Publish the struct
|
||||
* @param data The uORB message struct we are updating.
|
||||
*/
|
||||
bool publish(const T &data)
|
||||
{
|
||||
if (!advertised()) {
|
||||
advertise();
|
||||
}
|
||||
|
||||
return (orb_publish(get_topic(), _handle, &data) == PX4_OK);
|
||||
}
|
||||
|
||||
int get_instance()
|
||||
{
|
||||
// advertise if not already advertised
|
||||
if (advertise()) {
|
||||
return Manager::orb_get_instance(_handle);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
bool publish(const T &data) { return PublicationMultiBase::publish(&data); }
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user