Add brightness to the LED mode.

This commit is contained in:
Benoît Allard 2024-09-25 23:20:48 +02:00
parent 7a0b67f3cb
commit 01d1856fcc
7 changed files with 52 additions and 26 deletions

View file

@ -27,7 +27,7 @@
#endif #endif
extern void led_driver_init(); extern void led_driver_init();
extern void led_driver_color(uint8_t); extern void led_driver_color(uint8_t, float);
static uint32_t led_mode = MODE_NOT_MOUNTED; static uint32_t led_mode = MODE_NOT_MOUNTED;
@ -38,35 +38,43 @@ void led_set_mode(uint32_t mode) {
void led_blinking_task() { void led_blinking_task() {
#ifndef ENABLE_EMULATION #ifndef ENABLE_EMULATION
static uint32_t start_ms = 0; static uint32_t start_ms = 0;
static uint32_t stop_ms = 0;
static uint8_t led_state = false; static uint8_t led_state = false;
uint8_t state = led_state; uint8_t state = led_state;
#ifdef PICO_DEFAULT_LED_PIN_INVERTED #ifdef PICO_DEFAULT_LED_PIN_INVERTED
state = !state; state = !state;
#endif #endif
uint32_t led_max_brightness = (led_mode & LED_BTNESS_MASK) >> LED_BTNESS_SHIFT;
uint32_t led_color = (led_mode & LED_COLOR_MASK) >> LED_COLOR_SHIFT; uint32_t led_color = (led_mode & LED_COLOR_MASK) >> LED_COLOR_SHIFT;
uint32_t led_off = (led_mode & LED_OFF_MASK) >> LED_OFF_SHIFT; uint32_t led_off = (led_mode & LED_OFF_MASK) >> LED_OFF_SHIFT;
uint32_t led_on = (led_mode & LED_ON_MASK) >> LED_ON_SHIFT; uint32_t led_on = (led_mode & LED_ON_MASK) >> LED_ON_SHIFT;
uint32_t led_interval = led_state ? led_on : led_off;
// Blink every interval ms // how far in the current state from 0 - 1
if (board_millis() - start_ms < led_interval) { float progress = (board_millis() - start_ms) / (stop_ms - start_ms);
return; // not enough time
}
start_ms += led_interval;
if (state == false) { if (!state){
led_driver_color(LED_COLOR_OFF); // fading down so 1 -> 0
progress = 1 - progress;
} }
else {
led_driver_color(led_color); // maybe quick return if progress didn't changed much ?
// current one from 0 - 1
float led_brightness = (led_max_brightness / MAX_BTNESS) * progress;
led_driver_color(led_color, led_brightness);
if (board_millis() >= stop_ms){
start_ms = stop_ms;
led_state ^= 1; // toggle
stop_ms = start_ms + (led_state ? led_on : led_off);
} }
led_state ^= 1; // toggle
#endif #endif
} }
void led_off_all() { void led_off_all() {
#ifndef ENABLE_EMULATION #ifndef ENABLE_EMULATION
led_driver_color(LED_COLOR_OFF); led_driver_color(LED_COLOR_OFF, 0);
#endif #endif
} }

View file

@ -31,22 +31,31 @@ enum {
LED_COLOR_WHITE LED_COLOR_WHITE
}; };
#define LED_OFF_BITS 14 #define LED_OFF_BITS 12
#define LED_OFF_SHIFT 0 #define LED_OFF_SHIFT 0
#define LED_OFF_MASK (((1 << LED_OFF_BITS) - 1) << LED_OFF_SHIFT) #define LED_OFF_MASK (((1 << LED_OFF_BITS) - 1) << LED_OFF_SHIFT)
#define LED_ON_BITS 14 #define LED_ON_BITS 12
#define LED_ON_SHIFT LED_OFF_BITS #define LED_ON_SHIFT LED_OFF_BITS
#define LED_ON_MASK (((1 << LED_ON_BITS) - 1) << LED_ON_SHIFT) #define LED_ON_MASK (((1 << LED_ON_BITS) - 1) << LED_ON_SHIFT)
#define LED_COLOR_BITS 3 #define LED_COLOR_BITS 3
#define LED_COLOR_SHIFT (LED_ON_BITS + LED_OFF_BITS) #define LED_COLOR_SHIFT (LED_ON_BITS + LED_OFF_BITS)
#define LED_COLOR_MASK (((1 << LED_COLOR_BITS) - 1) << LED_COLOR_SHIFT) #define LED_COLOR_MASK (((1 << LED_COLOR_BITS) - 1) << LED_COLOR_SHIFT)
#define LED_BTNESS_BITS 4
#define LED_BTNESS_SHIFT (LED_ON_BITS + LED_OFF_BITS + LED_COLOR_BITS)
#define LED_BTNESS_MASK (((1 << LED_BTNESS_BITS) - 1 ) << LED_BTNESS_SHIFT)
#define MAX_BTNESS ((1 << LED_BTNESS_BITS) - 1)
#define HALF_BTNESS ((1 << (LED_BTNESS_BITS - 1)) - 1)
// steady on
#define LED_ON_NO_BLINK ((1000 << LED_ON_SHIFT) | (0 << LED_OFF_SHIFT))
enum { enum {
MODE_NOT_MOUNTED = (LED_COLOR_RED << LED_COLOR_SHIFT) | (250 << LED_ON_SHIFT) | (250 << LED_OFF_SHIFT), MODE_NOT_MOUNTED = (HALF_BTNESS << LED_BTNESS_BITS) | (LED_COLOR_CYAN << LED_COLOR_SHIFT) | LED_ON_NO_BLINK,
MODE_MOUNTED = (LED_COLOR_GREEN << LED_COLOR_SHIFT) | (250 << LED_ON_SHIFT) | (250 << LED_OFF_SHIFT), MODE_MOUNTED = (HALF_BTNESS << LED_BTNESS_BITS) | (LED_COLOR_GREEN << LED_COLOR_SHIFT) | LED_ON_NO_BLINK,
MODE_SUSPENDED = (LED_COLOR_BLUE << LED_COLOR_SHIFT) | (500 << LED_ON_SHIFT) | (1000 << LED_OFF_SHIFT), MODE_SUSPENDED = (HALF_BTNESS << LED_BTNESS_BITS) | (LED_COLOR_BLUE << LED_COLOR_SHIFT) | (1000 << LED_ON_SHIFT) | (2000 << LED_OFF_SHIFT),
MODE_PROCESSING = (LED_COLOR_GREEN << LED_COLOR_SHIFT) | (50 << LED_ON_SHIFT) | (50 << LED_OFF_SHIFT), MODE_PROCESSING = (MAX_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_RED << LED_COLOR_SHIFT) | (50 << LED_ON_SHIFT) | (50 << LED_OFF_SHIFT),
MODE_BUTTON = (LED_COLOR_YELLOW << LED_COLOR_SHIFT) | (1000 << LED_ON_SHIFT) | (100 << LED_OFF_SHIFT), MODE_BUTTON = (MAX_BTNESS << LED_BTNESS_SHIFT) | (LED_COLOR_YELLOW << LED_COLOR_SHIFT) | (1000 << LED_ON_SHIFT) | (100 << LED_OFF_SHIFT),
MODE_ALWAYS_ON = UINT32_MAX, MODE_ALWAYS_ON = UINT32_MAX,
MODE_ALWAYS_OFF = 0 MODE_ALWAYS_OFF = 0

View file

@ -25,7 +25,7 @@ void led_driver_init() {
cyw43_arch_init(); cyw43_arch_init();
} }
void led_driver_color(uint8_t color) { void led_driver_color(uint8_t color, float brightness) {
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, color != LED_COLOR_OFF); cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, color != LED_COLOR_OFF);
} }

View file

@ -45,7 +45,7 @@ void led_driver_init() {
neopixel = neopixel_Init(1, gpio); neopixel = neopixel_Init(1, gpio);
} }
void led_driver_color(int color) { void led_driver_color(uint8_t color, float brightness) {
neopixel_SetPixel(neopixel, &pixel[color], 1); neopixel_SetPixel(neopixel, &pixel[color], 1);
} }

View file

@ -24,7 +24,7 @@ void led_driver_init() {
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
} }
void led_driver_color(uint8_t color) { void led_driver_color(uint8_t color, float brightness) {
gpio_put(PICO_DEFAULT_LED_PIN, color != LED_COLOR_OFF); gpio_put(PICO_DEFAULT_LED_PIN, color != LED_COLOR_OFF);
} }

View file

@ -49,7 +49,7 @@ void led_driver_init() {
gpio_set_dir(LED_B_PIN, GPIO_OUT); gpio_set_dir(LED_B_PIN, GPIO_OUT);
} }
void led_driver_color(uint8_t color) { void led_driver_color(uint8_t color, float brightness) {
gpio_put(LED_R_PIN, pixel[color][0]); gpio_put(LED_R_PIN, pixel[color][0]);
gpio_put(LED_G_PIN, pixel[color][1]); gpio_put(LED_G_PIN, pixel[color][1]);
gpio_put(LED_B_PIN, pixel[color][2]); gpio_put(LED_B_PIN, pixel[color][2]);

View file

@ -79,8 +79,17 @@ uint32_t pixel[] = {
0xffffff00 // 7: white 0xffffff00 // 7: white
}; };
void led_driver_color(uint8_t color) { void led_driver_color(uint8_t color, float brightness) {
pio_sm_put_blocking(pio0, 0, pixel[color]); uint32_t pixel_color = pixel[color];
uint8_t r = (pixel_color >> 16) & 0xFF;
uint8_t g = (pixel_color >> 24) & 0xFF;
uint8_t b = (pixel_color >> 8) & 0xFF;
r = (uint8_t)(r * brightness);
g = (uint8_t)(g * brightness);
b = (uint8_t)(b * brightness);
pio_sm_put_blocking(pio0, 0, (g << 24) | (r << 16) | (b << 8));
} }
#endif #endif