/*
 * ****************************************************
 * @file    : led.h
 * @brief   : Addressable-LED Header
 * @author  : sohee kim / Something by People
 * @data    : 2023. 10. 23
 * ****************************************************
 */

#ifndef __LED_H_
#define __LED_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "main.h"

#define LED_NUMBER                60
#define LED_HALF_NUMBER           (LED_NUMBER/2)
#define LED_COMMAND_STEP          0x40                                  //=64
#define LED_PORT                  (&huart2)
#define LED_PACKET_SIZE           7

#define LED_1(n)                  ((uint8_t)(n))                        //1~60
#define LED_All(n)                ((uint8_t)((n)+LED_COMMAND_STEP))     //0~60 ==>  64~124(0x40~0x7C)
#define LED_A(n)                  LED_All(n)
#define LED_Left(n)               ((uint8_t)((n)+LED_COMMAND_STEP*2))   //0~30 ==> 128~158(0x80~0x9E)
#define LED_L(n)                  LED_Left(n)
#define LED_Right(n)              ((uint8_t)((n)+LED_COMMAND_STEP*3))   //0~30 ==> 192~222(0xC0~0xDE)
#define LED_R(n)                  LED_Right(n)

#define LED_Send_Now(  n, red, green, blue)           LED_Send(LED_1((n)&0x3F), red, green, blue,    0,    0,    0)
#define LED_Send_Wait( n, red, green, blue)           LED_Send(LED_1((n)&0x3F), red, green, blue, 0xFF, 0xFF, 0xFF)
#define LED_Send_All(  n, r1,g1,b1, r2,g2,b2)         LED_Send(LED_A((n)&0x3F), r1,g1,b1, r2,g2,b2)
#define LED_Send_Left( n, r1,g1,b1, r2,g2,b2)         LED_Send(LED_L((n)&0x3F), r1,g1,b1, r2,g2,b2)
#define LED_Send_Right(n, r1,g1,b1, r2,g2,b2)         LED_Send(LED_R((n)&0x3F), r1,g1,b1, r2,g2,b2)

void    LED_Send(uint8_t n, uint8_t red, uint8_t green, uint8_t blue, uint8_t red2, uint8_t green2, uint8_t blue2);

void    LED_Task(void);
#define Start_LED_Task(n)                             Start_LED_Task_Base(LED_Stream[n])
void    Stop_LED_Task(void);
uint8_t is_Playing_LED_Task(void);

void    Start_LED_Task_Base(uint8_t* led_stream);
extern  uint8_t *LED_Stream[];

#define LED_MODE_FULL_LEFT        0
#define LED_MODE_FULL_RIGHT       1
#define LED_MODE_HALF_SIDE        2
#define LED_MODE_HALF_CENTER      3

#define LED_DISPLAY_INTERVAL      100

#define POSITION_MAX              1800
#define POSITION_MIN              2

void    LED_Display_Level(int8_t  mode, int16_t position_left, int16_t position_right, uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2, uint8_t b2);
void    LED_Blink_ALL(int R, int G, int B, int period_msec);
extern void LED_Welcome(void);
extern void LED_On_ALL(int R, int G, int B);
void LED_Controller(void);


extern uint8_t status_LED_Welcome;
extern uint8_t cnt_LED_Welcome;

/* LED 큐 시스템 -> 쓰레기임. 폐기!! */
//#define LED_QUEUE_SIZE 5
//
//typedef enum {
//  OVERRIDE = 0,
//  SKIP = 1,
//  QUEUE = 2
//} LED_Policy;
//
//typedef struct {
//  void (*func)();
//  LED_Policy policy;
//} LED_Command;
//
//typedef struct {
//  LED_Command commands[LED_QUEUE_SIZE];
//  volatile uint8_t write_idx;
//  volatile uint8_t read_idx;
//  volatile uint8_t count;
//  volatile uint8_t busy;
//} LED_Queue_Manager;
//
//extern LED_Queue_Manager led_mgr;
//
//// 함수 선언
//void LED_Queue_Init(void);
//void LED_Queue_Add(void (*func)(), LED_Policy policy);
//void LED_Queue_Process(void);
//
//static inline void LED_QUEUE_All_Coral(void){
//  LED_On_ALL(26, 13, 8, 20);
//}
//static inline void LED_QUEUE_Blink_All_Coral(void){
//  LED_Blink_ALL(26, 13, 8, 20);
//}
//static inline void LED_QUEUE_All_Lawgreen(void){
//  LED_On_ALL(12, 25, 0, 20);
//}
//static inline void LED_QUEUE_Blink_All_Lawgreen(void){
//  LED_Blink_ALL(12, 25, 0, 20);
//}

#ifdef __cplusplus
}
#endif

#endif /* __LED_H_ */
