#ifndef INC_LEDS_H
#define INC_LEDS_H

#ifdef __cplusplus
extern "C" {
#endif

#include "stm32h7xx_hal.h"
#include "tx_port.h"

#define N_LEDS 9

#define PWM_CHANNEL_R TIM_CHANNEL_1
#define PWM_CHANNEL_G TIM_CHANNEL_2
#define PWM_CHANNEL_B TIM_CHANNEL_3

void led_init(SPI_HandleTypeDef *spi, TIM_HandleTypeDef *pwmtim);

void led_set(size_t idx, uint8_t r, uint8_t g, uint8_t b);
void led_all_off();

void led_thread_entry(ULONG child_thread_stack_addr);

typedef enum {
  ANIM_TE_STARTUP,
  ANIM_FT_STARTUP,
  ANIM_KNIGHT_RIDER,
  ANIM_RAINBOW,
} LEDAnimation;

void led_start_animation(LEDAnimation anim);
void led_anim_te_startup(ULONG _);
void led_anim_ft_startup(ULONG _);
void led_anim_knight_rider(ULONG _);
void led_anim_rainbow(ULONG _);

void led_anim_blinker(uint8_t r, uint8_t g, uint8_t b,
                      uint32_t brightness_steps, uint32_t next_led_steps,
                      uint32_t delay);

void led_hsv_to_rgb(float h, float s, float v, uint8_t *r, uint8_t *g,
                    uint8_t *b);

#ifdef __cplusplus
}
#endif

#endif // INC_LEDS_H