picoco/breathing_led/led_bar.h
2025-02-25 15:06:27 +01:00

54 lines
1.4 KiB
C

#ifndef LED_BAR_H
#define LED_BAR_H 1
#include <stddef.h>
#define NB_LED_BAR_GPIO 10
#define MAX_DUTY_STEPS NB_LED_BAR_GPIO
#define DUTY_STEP 1
// FORWARD: left to right, BACKWARD: right to left.
enum DIRECTION {FORWARD, BACKWARD};
static const int LED_BAR_GPIO[NB_LED_BAR_GPIO] = {28, 27, 26, 22, 21,
20, 19, 18, 17, 16};
typedef struct led led;
struct led {
size_t gpio;
size_t pos;
size_t level;
led *next_led;
led *previous_led;
};
typedef struct leds leds;
struct leds {
led data[NB_LED_BAR_GPIO];
led *cur;
short direction;
};
// Wrapper around sleep methods (Pico SDK & GCC stdlib).
void _sleep(size_t seconds);
// Wrapper around `set_pwm_gpio_level`func Pico SDK.
void _set_pwm_gpio_level(size_t gpio, size_t level);
void set_led_level(led *l, size_t level);
void print_led_bar_state(leds *l);
// Initialize led bar. The default direction at initialization is `FORWARD`.
void init_leds(leds *l);
// Switch the current direction of the meteor flow by switching the next & previous led nodes.
void switch_direction(leds *l);
// Display a meteor flow like on the LED bar. Play with `delay` argument to increase/reduce flow speed.
void run_meteor(leds *l, size_t delay_ms);
// "Breathing" like for one led in the LED bar.
void breath_led(leds *l, size_t pos, size_t max_level, size_t step);
// Turns on/off the LED bar in a wave flow fashion.
void run_wave(leds *l, size_t delay_ms);
#endif