/*
 * rgbled.h
 *
 *  Created on: Nov 11, 2021
 *      Author: dooku
 */

#ifndef INC_RGBLED_H_
#define INC_RGBLED_H_

#include "stm32l0xx_ll_tim.h"
#include "stddef.h"

/*
 * Return values for I2C functions
 */

#define RGBLED_OK 0
#define RGBLED_ERROR -1 // generic error
#define RGBLED_WRONG_CHANNEL -2 // channel number not in {1,2,3,4}

/*
 * Defaults used for LL timer (PWM) initialization
 */

#define RGBLED_PRESCALER 0
#define RGBLED_PERIOD 255
#define RGBLED_MAX_INTENSITY 100

/*
 * Shorthands for colors
 */

#define RGBLED_RED     255,0,0
#define RGBLED_GREEN   0,255,0
#define RGBLED_BLUE    0,0,255
#define RGBLED_WHITE   255,255,255
#define RGBLED_YELLOW  255,255,0
#define RGBLED_OFF     0,0,0
#define RGBLED_MAGENTA 255,0,255

/*
 * Type definitions
 */

typedef struct {
	// tim2 ch1 B
	// tim22 ch1 G
	// tim22 ch2 R
	// TODO union, aby se dalo nastavovat LED v cyklu (set_color)
	union {
		struct {
			TIM_TypeDef *R;
			TIM_TypeDef *G;
			TIM_TypeDef *B;
		} timer;
		TIM_TypeDef *timer_array[3];
	};
	union {
		struct {
			uint8_t R;
			uint8_t G;
			uint8_t B;
		} channel;
		uint8_t channel_array[3];
	};

} rgbled_context_t;

/*
 * Function declarations
 */

int8_t rgbled_init(rgbled_context_t *context);
int8_t rgbled_set_color(uint8_t R, uint8_t G, uint8_t B);
int8_t rgbled_set_intensity(uint8_t intensity);
int8_t rgbled_get_intensity(uint8_t *intensity);
int8_t rgbled_off(void);


#endif /* INC_RGBLED_H_ */
