00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00037 #include <diagnostic_aggregator/status_item.h>
00038
00039 using namespace diagnostic_aggregator;
00040 using namespace std;
00041
00042 StatusItem::StatusItem(const diagnostic_msgs::DiagnosticStatus *status)
00043 {
00044 level_ = valToLevel(status->level);
00045 name_ = status->name;
00046 message_ = status->message;
00047 hw_id_ = status->hardware_id;
00048 values_ = status->values;
00049
00050 output_name_ = getOutputName(name_);
00051
00052 update_time_ = ros::Time::now();
00053 }
00054
00055 StatusItem::StatusItem(const string item_name, const string message, const DiagnosticLevel level)
00056 {
00057 name_ = item_name;
00058 message_ = message;
00059 level_ = level;
00060 hw_id_ = "";
00061
00062 output_name_ = getOutputName(name_);
00063
00064 update_time_ = ros::Time::now();
00065 }
00066
00067 StatusItem::~StatusItem() {}
00068
00069 bool StatusItem::update(const diagnostic_msgs::DiagnosticStatus *status)
00070 {
00071 if (name_ != status->name)
00072 {
00073 ROS_ERROR("Incorrect name when updating StatusItem. Expected %s, got %s", name_.c_str(), status->name.c_str());
00074 return false;
00075 }
00076
00077 double update_interval = (ros::Time::now() - update_time_).toSec();
00078 if (update_interval < 0)
00079 ROS_WARN("StatusItem is being updated with older data. Negative update time: %f", update_interval);
00080
00081 level_ = valToLevel(status->level);
00082 message_ = status->message;
00083 hw_id_ = status->hardware_id;
00084 values_ = status->values;
00085
00086 update_time_ = ros::Time::now();
00087
00088 return true;
00089 }
00090
00091 boost::shared_ptr<diagnostic_msgs::DiagnosticStatus> StatusItem::toStatusMsg(const std::string &path, bool stale) const
00092 {
00093 boost::shared_ptr<diagnostic_msgs::DiagnosticStatus> status(new diagnostic_msgs::DiagnosticStatus());
00094
00095 if (path == "/")
00096 status->name = "/" + output_name_;
00097 else
00098 status->name = path + "/" + output_name_;
00099
00100 status->level = level_;
00101 status->message = message_;
00102 status->hardware_id = hw_id_;
00103 status->values = values_;
00104
00105 if (stale)
00106 status->level = Level_Stale;
00107
00108 return status;
00109 }
00110