From b0b3b071d3fdad0cff464f17f74e60804e647da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikolai=20G=C3=BCtschow?= Date: Thu, 11 Jul 2024 14:48:16 +0200 Subject: [PATCH] drivers/led: add LED_NUMOF and convenience inline functions --- drivers/include/led.h | 99 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 6 deletions(-) diff --git a/drivers/include/led.h b/drivers/include/led.h index 40277f3c30..73caeb741e 100644 --- a/drivers/include/led.h +++ b/drivers/include/led.h @@ -9,7 +9,7 @@ /** * @defgroup drivers_led Control on-board LEDs * @ingroup drivers_actuators - * @brief Access macros to control the on-board LEDs + * @brief Access macros and functions to control the on-board LEDs * * This header contains a set of macros for controlling the on-board LEDs of * a board. The LEDs are enumerated, starting from LED0 to LED7. As most @@ -24,7 +24,7 @@ * @{ * * @file - * @brief Macros for controlling the on-board LEDs + * @brief Macros and inline functions for controlling the on-board LEDs * * @author Hauke Petersen */ @@ -106,15 +106,102 @@ extern "C" { #define LED7_IS_PRESENT /**< indicate that LED7 is present */ #endif +/** + * Number of LEDs available on the current board. + */ +#if defined(LED7_IS_PRESENT) +#define LED_NUMOF 8 +#elif defined(LED6_IS_PRESENT) +#define LED_NUMOF 7 +#elif defined(LED5_IS_PRESENT) +#define LED_NUMOF 6 +#elif defined(LED4_IS_PRESENT) +#define LED_NUMOF 5 +#elif defined(LED3_IS_PRESENT) +#define LED_NUMOF 4 +#elif defined(LED2_IS_PRESENT) +#define LED_NUMOF 3 +#elif defined(LED1_IS_PRESENT) +#define LED_NUMOF 2 +#elif defined(LED0_IS_PRESENT) +#define LED_NUMOF 1 +#else +#define LED_NUMOF 0 +#endif + /** @} */ /** - * @name Convenience LED control macros + * @name Convenience LED control functions and macros * @{ */ -#define LED_ON(x) LED ## x ##_ON /**< Turn on led x */ -#define LED_OFF(x) LED ## x ## _OFF /**< Turn off led x */ -#define LED_TOGGLE(x) LED ## x ##_TOGGLE /**< Toggle led x */ +#define LED_ON(id) LED ## id ##_ON /**< Turn on an LED */ +#define LED_OFF(id) LED ## id ## _OFF /**< Turn off an LED */ +#define LED_TOGGLE(id) LED ## id ##_TOGGLE /**< Toggle an LED */ + +/** + * Turn on an LED. + * + * @note If id is a compile-time constant, consider using @ref LED_ON(id) instead. + * + * @param id id of LED between 0 and 7 + */ +static inline void led_on(unsigned id) +{ + switch (id) { + case 0: LED0_ON; break; + case 1: LED1_ON; break; + case 2: LED2_ON; break; + case 3: LED3_ON; break; + case 4: LED4_ON; break; + case 5: LED5_ON; break; + case 6: LED6_ON; break; + case 7: LED7_ON; break; + } +} + +/** + * Turn off an LED. + * + * @note If id is a compile-time constant, consider using @ref LED_OFF(id) instead. + * + * @param id id of LED between 0 and 7 + */ +static inline void led_off(unsigned id) +{ + switch (id) { + case 0: LED0_OFF; break; + case 1: LED1_OFF; break; + case 2: LED2_OFF; break; + case 3: LED3_OFF; break; + case 4: LED4_OFF; break; + case 5: LED5_OFF; break; + case 6: LED6_OFF; break; + case 7: LED7_OFF; break; + } +} + +/** + * Toggle an LED. + * + * @note If id is a compile-time constant, consider using @ref LED_TOGGLE(id) instead. + * + * @param id id of LED between 0 and 7 + */ +static inline void led_toggle(unsigned id) +{ + switch (id) { + case 0: LED0_TOGGLE; break; + case 1: LED1_TOGGLE; break; + case 2: LED2_TOGGLE; break; + case 3: LED3_TOGGLE; break; + case 4: LED4_TOGGLE; break; + case 5: LED5_TOGGLE; break; + case 6: LED6_TOGGLE; break; + case 7: LED7_TOGGLE; break; + } +} + /** @} */ #ifdef __cplusplus