16 pub_ =
nh_.
advertise<pal_statistics_msgs::Statistics>(topic +
"/full", 10000);
44 const boost::function<
double()> &funct,
57 boost::unique_lock<boost::mutex> data_lock(
data_mutex_);
68 boost::unique_lock<boost::mutex> data_lock(
data_mutex_);
75 boost::unique_lock<boost::mutex> data_lock(
data_mutex_);
79 boost::unique_lock<boost::mutex> pub_lock(
pub_mutex_);
93 ROS_WARN_STREAM_ONCE(
"Called publishAsync but publisher thread has not been started, THIS IS NOT RT safe. You should start it yourself.");
98 boost::unique_lock<boost::mutex> data_lock(
data_mutex_, boost::adopt_lock);
116 boost::unique_lock<boost::mutex> data_lock(
data_mutex_);
129 boost::unique_lock<boost::mutex> data_lock(
data_mutex_);
150 if (!data_lock.owns_lock() || data_lock.mutex() != &
data_mutex_)
152 throw ros::Exception(
"Called handlePendingDisables without proper lock");
172 if (publish_names_msg)
184 boost::unique_lock<boost::mutex> data_lock(
data_mutex_);
188 pal_statistics_msgs::StatisticsNames names;
189 pal_statistics_msgs::StatisticsValues values;
192 gen_sts.
update(names, values);
207 pal_statistics_msgs::StatisticsValues &values,
231 boost::unique_lock<boost::mutex> data_lock(
data_mutex_);
237 boost::unique_lock<boost::mutex> pub_lock(
pub_mutex_);
248 const pal_statistics_msgs::StatisticsNames &names,
249 const pal_statistics_msgs::StatisticsValues &values)
251 msg_.header = values.header;
252 if (last_names_version_ == names.names_version && !msg_.statistics.empty())
255 for (
size_t i = 0; i < values.values.size(); ++i)
257 msg_.statistics[i].value = values.values[i];
262 msg_.statistics.clear();
263 for (
size_t i = 0; i < names.names.size(); ++i)
265 pal_statistics_msgs::Statistic
s;
266 s.name = names.names[i];
267 s.value = values.values[i];
268 msg_.statistics.push_back(s);
270 last_names_version_ = names.names_version;
bool publishAsync()
publishAsync Capture data and flag it to be published by the publisher thread. Real-Time safe...
IdType registerInternal(const std::string &name, VariableHolder &&variable, RegistrationsRAII *bookkeeping, bool enabled)
int registerVariable(const std::string &name, VariableHolder &&holder, bool enabled=true)
StatisticsRegistry(const std::string &topic)
pal_statistics_msgs::StatisticsValues values_msg_
ros::Publisher pub_values_
bool remove(const std::string &name)
IdType customRegister(StatisticsRegistry ®istry, const std::string &name, const T *variable, RegistrationsRAII *bookkeeping=NULL, bool enabled=true)
Default implementation that accepts anything variable that can be casted to a double.
void doPublish(bool publish_names_msg=true)
doPublish publishes the subscribed topics, requires mutex
bool updateMsg(pal_statistics_msgs::StatisticsNames &names, pal_statistics_msgs::StatisticsValues &values, bool smart_fill=false)
updateMsg update names and values, optionally using smartfill to minimize copying ...
GeneratedStatistics generated_statistics_
RegistrationList registration_list_
bool enable(const IdType &id)
RegistrationsRAII internal_stats_raii_
void setEnabled(const IdType &id, bool enabled)
void startPublishThread()
startPublishThread creates and starts the publisherThread. The user still has to call publishAsync ea...
void publish()
publish Reads the values of all registered variables and publishes them to the topic associated to th...
unsigned int publish_async_attempts_
bool smartFillMsg(pal_statistics_msgs::StatisticsNames &names, pal_statistics_msgs::StatisticsValues &values)
smartFillMsg Attempts to minimize the amount of string copies
void publish(const boost::shared_ptr< M > &message) const
void update(const pal_statistics_msgs::StatisticsNames &names, const pal_statistics_msgs::StatisticsValues &values)
bool setEnabledmpl(const IdType &id, bool enabled)
void unregisterVariable(const IdType &id)
The Registration class is a handle to a registered variable, when out of scope unregisters the variab...
void fillMsg(pal_statistics_msgs::StatisticsNames &names, pal_statistics_msgs::StatisticsValues &value)
fills message with the last captured values.
boost::shared_ptr< boost::thread > publisher_thread_
pal_statistics_msgs::Statistics msg_
This message is generated using an updated StatiticsNames and StatisticsValues.
ros::Publisher pub_names_
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
double last_async_pub_duration_
pal_statistics_msgs::StatisticsNames names_msg_
LockFreeQueue< EnabledId > enabled_ids_
disabled_ids_ this is used to keep track of enabled/disabled variables in a lock free way ...
virtual ~StatisticsRegistry()
void publisherThreadCycle()
The RegistrationsRAII class holds handles to registered variables and when it is destroyed, unregisters them automatically.
unsigned int publish_async_failures_
#define ROS_INFO_STREAM(args)
unsigned int overwritten_data_count_
#define ROS_WARN_STREAM_ONCE(args)
bool disable(const IdType &id)
void add(Registration &®istration)
uint32_t getNumSubscribers() const
void startPublishThreadImpl()
pal_statistics_msgs::Statistics createMsg()
createMsg creates a Statistics message from the registered variables, useful for debugging ...
bool hasPendingData() const
void unregisterVariable(const std::string &name, RegistrationsRAII *bookkeeping=NULL)
void handlePendingDisables(const boost::unique_lock< boost::mutex > &data_lock)
handlePendingDisables Empties by handling the queue of disabled/enabled ids.
IdType registerFunction(const std::string &name, const boost::function< double()> &funct, RegistrationsRAII *bookkeeping=NULL, bool enabled=true)
registerFunction Adds a function that returns double with the specified name
std::atomic< bool > is_data_ready_