From c8a1050323c89f8e776c1ad5f3689505d7130710 Mon Sep 17 00:00:00 2001
From: Simone Guscetti <simone@px4.io>
Date: Tue, 16 Jan 2018 17:54:43 +0100
Subject: [PATCH] libled: allow infinite flashing mode

---
 msg/led_control.msg | 2 +-
 src/lib/led/led.cpp | 9 ++++-----
 src/lib/led/led.h   | 2 +-
 3 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/msg/led_control.msg b/msg/led_control.msg
index 6189d22c15..1a0bb6f06b 100644
--- a/msg/led_control.msg
+++ b/msg/led_control.msg
@@ -29,5 +29,5 @@ uint8 led_mask # bitmask which LED(s) to control, set to 0xff for all
 uint8 color # see COLOR_*
 uint8 mode # see MODE_*
 uint8 num_blinks # how many times to blink (number of on-off cycles if mode is one of MODE_BLINK_*) . Set to 0 for infinite
-                 # in MODE_FLASH it is the number of cycles (infinite is not possible)
+                 # in MODE_FLASH it is the number of cycles. Max number of blinks: 122 and max number of flash cycles: 20
 uint8 priority # priority: higher priority events will override current lower priority events (see MAX_PRIORITY)
diff --git a/src/lib/led/led.cpp b/src/lib/led/led.cpp
index 1791e7409d..120a8eb4f9 100644
--- a/src/lib/led/led.cpp
+++ b/src/lib/led/led.cpp
@@ -140,14 +140,13 @@ int LedController::update(LedControlData &control_data)
 				if ((_states[i].current_blinking_time += blink_delta_t) > current_blink_duration) {
 					_states[i].current_blinking_time -= current_blink_duration;
 
-					if (cur_data.blink_times_left == 254) {
-						// handle toggling for infinite case: toggle between 254 and 255
+					if (cur_data.blink_times_left == 246) {
+						// handle toggling for infinite case: decrease between 255 and 246
+						// In order to handle the flash mode infinite case it needs a
+						// total of 10 steps.
 						cur_data.blink_times_left = 255;
 						++num_blinking_do_not_change_state;
 
-					} else if (cur_data.blink_times_left == 255) {
-						cur_data.blink_times_left = 254;
-
 					} else if (--cur_data.blink_times_left == 0) {
 						cur_data.mode = led_control_s::MODE_DISABLED;
 						_states[i].current_blinking_time = 0;
diff --git a/src/lib/led/led.h b/src/lib/led/led.h
index 001d421d35..e6cc84482b 100644
--- a/src/lib/led/led.h
+++ b/src/lib/led/led.h
@@ -158,7 +158,7 @@ private:
 
 			if (priority[next_priority].blink_times_left == 0) {
 				// handle infinite case
-				priority[next_priority].blink_times_left = 254;
+				priority[next_priority].blink_times_left = 246;
 			}
 
 
-- 
GitLab