15 #include <boost/algorithm/string.hpp> 17 #include <clover/SetLEDEffect.h> 18 #include <led_msgs/SetLEDs.h> 19 #include <led_msgs/LEDState.h> 20 #include <led_msgs/LEDStateArray.h> 22 #include <sensor_msgs/BatteryState.h> 23 #include <mavros_msgs/State.h> 24 #include <rosgraph_msgs/Log.h> 44 }
else if (!
set_leds.response.success) {
49 void rainbow(uint8_t n, uint8_t&
r, uint8_t& g, uint8_t& b)
55 }
else if (n < 255 / 3 * 2) {
68 void fill(uint8_t
r, uint8_t g, uint8_t b)
99 double one_minus_passed = 1 - passed;
136 int pos = (
int)round(
counter + (255.0 * i / led_count)) % 255;
147 bool setEffect(clover::SetLEDEffect::Request& req, clover::SetLEDEffect::Response& res)
151 if (req.effect ==
"") {
155 if (req.effect !=
"flash" && req.effect !=
"fill" &&
current_effect.effect == req.effect &&
157 res.message =
"Effect already set, skip";
161 if (req.effect ==
"fill") {
162 fill(req.r, req.g, req.b);
164 }
else if (req.effect ==
"blink") {
168 }
else if (req.effect ==
"blink_fast") {
172 }
else if (req.effect ==
"fade") {
176 }
else if (req.effect ==
"wipe") {
180 }
else if (req.effect ==
"flash") {
184 fill(req.r, req.g, req.b);
188 fill(req.r, req.g, req.b);
203 }
else if (req.effect ==
"rainbow_fill") {
207 }
else if (req.effect ==
"rainbow") {
212 res.message =
"Unknown effect: " + req.effect +
". Available effects are fill, fade, wipe, blink, blink_fast, flash, rainbow, rainbow_fill.";
240 clover::SetLEDEffect effect;
241 effect.request.effect =
ros::param::param(
"~notify/" + event +
"/effect", std::string(
""));
245 setEffect(effect.request, effect.response);
261 std::string
mode = boost::algorithm::to_lower_copy(msg.mode);
262 if (mode.find(
".") != std::string::npos) {
264 mode = mode.substr(mode.find(
".") + 1);
276 if (log.level >= rosgraph_msgs::Log::ERROR) {
283 for (
auto const&
voltage : msg.cell_voltage) {
292 int main(
int argc,
char **argv)
307 set_leds_srv = nh.
serviceClient<led_msgs::SetLEDs>(
"set_leds",
true);
310 handleState(*ros::topic::waitForMessage<led_msgs::LEDStateArray>(
"state", nh));
312 auto state_sub = nh.
subscribe(
"state", 1, &handleState);
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
led_msgs::LEDStateArray start_state
double low_battery_threshold
led_msgs::LEDStateArray state
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val)
void rainbow(uint8_t n, uint8_t &r, uint8_t &g, uint8_t &b)
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
int main(int argc, char **argv)
void setPeriod(const Duration &period, bool reset=true)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
bool call(MReq &req, MRes &res)
ROSCPP_DECL bool validate(const std::string &name, std::string &error)
void notify(const std::string &event)
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
led_msgs::SetLEDs set_leds
mavros_msgs::State mavros_state
void fill(uint8_t r, uint8_t g, uint8_t b)
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
#define ROS_INFO_THROTTLE(period,...)
void handleMavrosState(const mavros_msgs::State &msg)
#define ROS_WARN_THROTTLE(period,...)
ROSCPP_DECL bool has(const std::string &key)
bool setEffect(clover::SetLEDEffect::Request &req, clover::SetLEDEffect::Response &res)
void handleLog(const rosgraph_msgs::Log &log)
void proceed(const ros::TimerEvent &event)
void handleState(const led_msgs::LEDStateArray &msg)
clover::SetLEDEffect::Request current_effect
void handleBattery(const sensor_msgs::BatteryState &msg)
ros::ServiceClient set_leds_srv
ROSCPP_DECL bool waitForService(const std::string &service_name, int32_t timeout)