From a816b6f747604c3430faadb66aefba067326f8ed Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 27 Sep 2024 20:55:49 +0200 Subject: [PATCH] Added PHY options to control the brigthness of the LED and its dimming. Signed-off-by: Pol Henarejos --- src/fs/file.h | 7 ++++--- src/led/led.c | 3 +++ src/led/led.h | 9 ++++++--- src/led/led_neopixel.c | 5 ++++- src/led/led_ws2812.c | 5 ++++- src/usb/usb.c | 6 ++++++ 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/fs/file.h b/src/fs/file.h index f381d22..0cd358c 100644 --- a/src/fs/file.h +++ b/src/fs/file.h @@ -72,15 +72,16 @@ #define PHY_VID 0x0 #define PHY_PID 0x2 #define PHY_LED_GPIO 0x4 -#define PHY_LED_MODE 0x5 +#define PHY_LED_BTNESS 0x5 #define PHY_OPTS 0x6 #define PHY_OPT_WCID 0x1 #define PHY_OPT_VPID 0x2 #define PHY_OPT_GPIO 0x4 -#define PHY_OPT_LED 0x8 +#define PHY_OPT_BTNESS 0x8 +#define PHY_OPT_DIMM 0x10 -#define PHY_OPT_MASK (PHY_OPT_WCID) +#define PHY_OPT_MASK (PHY_OPT_DIMM | PHY_OPT_WCID) #define PHY_MAX_SIZE 8 diff --git a/src/led/led.c b/src/led/led.c index f9232af..9505320 100644 --- a/src/led/led.c +++ b/src/led/led.c @@ -31,6 +31,9 @@ extern void led_driver_color(uint8_t, uint32_t, float); static uint32_t led_mode = MODE_NOT_MOUNTED; +uint32_t led_phy_btness = MAX_BTNESS; +bool led_dimmable = false; + void led_set_mode(uint32_t mode) { led_mode = mode; } diff --git a/src/led/led.h b/src/led/led.h index fe66177..fd8a193 100644 --- a/src/led/led.h +++ b/src/led/led.h @@ -51,9 +51,9 @@ enum { #define LED_ON_NO_BLINK ((1000 << LED_ON_SHIFT) | (0 << LED_OFF_SHIFT)) enum { - MODE_NOT_MOUNTED = (HALF_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_RED << LED_COLOR_SHIFT) | (500 << LED_ON_SHIFT) | (500 << LED_OFF_SHIFT), - MODE_MOUNTED = (HALF_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_GREEN << LED_COLOR_SHIFT) | (500 << LED_ON_SHIFT) | (500 << LED_OFF_SHIFT), - MODE_SUSPENDED = (HALF_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_BLUE << LED_COLOR_SHIFT) | (1000 << LED_ON_SHIFT) | (2000 << LED_OFF_SHIFT), + MODE_NOT_MOUNTED = (MAX_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_RED << LED_COLOR_SHIFT) | (500 << LED_ON_SHIFT) | (500 << LED_OFF_SHIFT), + MODE_MOUNTED = (MAX_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_GREEN << LED_COLOR_SHIFT) | (500 << LED_ON_SHIFT) | (500 << LED_OFF_SHIFT), + MODE_SUSPENDED = (MAX_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_BLUE << LED_COLOR_SHIFT) | (1000 << LED_ON_SHIFT) | (2000 << LED_OFF_SHIFT), MODE_PROCESSING = (MAX_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_GREEN << LED_COLOR_SHIFT) | (50 << LED_ON_SHIFT) | (50 << LED_OFF_SHIFT), MODE_BUTTON = (MAX_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_YELLOW << LED_COLOR_SHIFT) | (1000 << LED_ON_SHIFT) | (100 << LED_OFF_SHIFT), @@ -66,4 +66,7 @@ extern void led_blinking_task(); extern void led_off_all(); extern void led_init(); +extern uint32_t led_phy_btness; +extern bool led_dimmable; + #endif // _LED_H_ diff --git a/src/led/led_neopixel.c b/src/led/led_neopixel.c index 5c55be3..9a25111 100644 --- a/src/led/led_neopixel.c +++ b/src/led/led_neopixel.c @@ -47,7 +47,10 @@ void led_driver_init() { void led_driver_color(uint8_t color, uint32_t led_brightness, float progress) { static tNeopixel spx = {.index = 0, .rgb = 0}; - float brightness = ((float)led_brightness / MAX_BTNESS) * progress; + if (!led_dimmable) { + progress = progress >= 0.5 ? 1 : 0; + } + float brightness = ((float)led_brightness / MAX_BTNESS) * ((float)led_phy_btness / MAX_BTNESS) * progress; uint32_t pixel_color = pixel[color].rgb; uint8_t r = (pixel_color >> 16) & 0xFF; uint8_t g = (pixel_color >> 8) & 0xFF; diff --git a/src/led/led_ws2812.c b/src/led/led_ws2812.c index 4a7b324..1647168 100644 --- a/src/led/led_ws2812.c +++ b/src/led/led_ws2812.c @@ -80,7 +80,10 @@ uint32_t pixel[] = { }; void led_driver_color(uint8_t color, uint32_t led_brightness, float progress) { - float brightness = ((float)led_brightness / MAX_BTNESS) * progress; + if (!led_dimmable) { + progress = progress >= 0.5 ? 1 : 0; + } + float brightness = ((float)led_brightness / MAX_BTNESS) * ((float)led_phy_btness / MAX_BTNESS) * progress; uint32_t pixel_color = pixel[color]; uint8_t r = (pixel_color >> 16) & 0xFF; uint8_t g = (pixel_color >> 24) & 0xFF; diff --git a/src/usb/usb.c b/src/usb/usb.c index c60d6ac..4a8c316 100644 --- a/src/usb/usb.c +++ b/src/usb/usb.c @@ -65,11 +65,17 @@ void usb_init() { if (opts & PHY_OPT_WCID) { enable_wcid = true; } + if (opts & PHY_OPT_DIMM) { + led_dimmable = true; + } } if (file_get_size(ef_phy) >= 4 && opts & PHY_OPT_VPID) { desc_device.idVendor = (data[PHY_VID] << 8) | data[PHY_VID+1]; desc_device.idProduct = (data[PHY_PID] << 8) | data[PHY_PID+1]; } + if (opts & PHY_OPT_BTNESS) { + led_phy_btness = data[PHY_LED_BTNESS]; + } } mutex_init(&mutex); #endif