led_driver: Add support for handle

app_main: Passing this handle to the endpoint as priv_data and using the handle in the driver on attribute_update.
This commit is contained in:
Chirag Atal
2022-08-02 20:06:27 +05:30
parent d719c97b88
commit 2cc98e1de2
16 changed files with 267 additions and 195 deletions
+22 -16
View File
@@ -21,7 +21,7 @@ static const char *TAG = "led_driver_gpio";
static bool current_power = false;
static uint8_t current_brightness = 0;
esp_err_t led_driver_init(led_driver_config_t *config)
led_driver_handle_t led_driver_init(led_driver_config_t *config)
{
ESP_LOGI(TAG, "Initializing light driver");
esp_err_t err = ESP_OK;
@@ -36,7 +36,7 @@ esp_err_t led_driver_init(led_driver_config_t *config)
err = ledc_timer_config(&ledc_timer);
if (err != ESP_OK) {
ESP_LOGE(TAG, "led_timerc_config failed");
return err;
return NULL;
}
ledc_channel_config_t ledc_channel = {
@@ -53,18 +53,24 @@ esp_err_t led_driver_init(led_driver_config_t *config)
ESP_LOGE(TAG, "ledc_channel_config failed");
}
return err;
/* Using (channel + 1) as handle */
return (led_driver_handle_t)(config->channel + 1);
}
esp_err_t led_driver_set_power(bool power)
esp_err_t led_driver_set_power(led_driver_handle_t handle, bool power)
{
current_power = power;
return led_driver_set_brightness(current_brightness);
return led_driver_set_brightness(handle, current_brightness);
}
esp_err_t led_driver_set_brightness(uint8_t brightness)
esp_err_t led_driver_set_brightness(led_driver_handle_t handle, uint8_t brightness)
{
esp_err_t err;
int channel = (int)handle - 1;
if (channel < 0) {
ESP_LOGE(TAG, "Invalid handle");
return ESP_ERR_INVALID_ARG;
}
if (brightness != 0) {
current_brightness = brightness;
@@ -73,54 +79,54 @@ esp_err_t led_driver_set_brightness(uint8_t brightness)
brightness = 0;
}
err = ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, brightness);
err = ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, brightness);
if (err != ESP_OK) {
ESP_LOGE(TAG, "ledc_set_duty failed");
}
err = ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
err = ledc_update_duty(LEDC_LOW_SPEED_MODE, channel);
if (err != ESP_OK) {
ESP_LOGE(TAG, "ledc_update_duty failed");
}
return err;
}
esp_err_t led_driver_set_hue(uint16_t hue)
esp_err_t led_driver_set_hue(led_driver_handle_t handle, uint16_t hue)
{
return ESP_ERR_NOT_SUPPORTED;
}
esp_err_t led_driver_set_saturation(uint8_t saturation)
esp_err_t led_driver_set_saturation(led_driver_handle_t handle, uint8_t saturation)
{
return ESP_ERR_NOT_SUPPORTED;
}
esp_err_t led_driver_set_temperature(uint32_t temperature)
esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temperature)
{
return ESP_ERR_NOT_SUPPORTED;
}
bool led_driver_get_power()
bool led_driver_get_power(led_driver_handle_t handle)
{
return current_power;
}
uint8_t led_driver_get_brightness()
uint8_t led_driver_get_brightness(led_driver_handle_t handle)
{
return current_brightness;
}
uint16_t led_driver_get_hue()
uint16_t led_driver_get_hue(led_driver_handle_t handle)
{
return 0;
}
uint8_t led_driver_get_saturation()
uint8_t led_driver_get_saturation(led_driver_handle_t handle)
{
return 0;
}
uint32_t led_driver_get_temperature()
uint32_t led_driver_get_temperature(led_driver_handle_t handle)
{
return 0;
}
+12 -12
View File
@@ -21,15 +21,15 @@ static uint8_t current_brightness = 0;
static HS_color_t current_HS = {0, 0};
static uint32_t current_temperature = 6600;
esp_err_t led_driver_init(led_driver_config_t *config)
led_driver_handle_t led_driver_init(led_driver_config_t *config)
{
ESP_LOGI(TAG, "Initializing light driver");
/* Initialize the driver here */
return ESP_OK;
return NULL;
}
esp_err_t led_driver_set_power(bool power)
esp_err_t led_driver_set_power(led_driver_handle_t handle, bool power)
{
ESP_LOGI(TAG, "Setting power to: %d", power);
/* Set the power state here */
@@ -37,7 +37,7 @@ esp_err_t led_driver_set_power(bool power)
return ESP_OK;
}
esp_err_t led_driver_set_brightness(uint8_t brightness)
esp_err_t led_driver_set_brightness(led_driver_handle_t handle, uint8_t brightness)
{
ESP_LOGI(TAG, "Setting brightness to: %d", brightness);
/* Set the brightness level here */
@@ -45,7 +45,7 @@ esp_err_t led_driver_set_brightness(uint8_t brightness)
return ESP_OK;
}
esp_err_t led_driver_set_hue(uint16_t hue)
esp_err_t led_driver_set_hue(led_driver_handle_t handle, uint16_t hue)
{
ESP_LOGI(TAG, "Setting hue to: %d", hue);
/* Set the color hue here */
@@ -53,7 +53,7 @@ esp_err_t led_driver_set_hue(uint16_t hue)
return ESP_OK;
}
esp_err_t led_driver_set_saturation(uint8_t saturation)
esp_err_t led_driver_set_saturation(led_driver_handle_t handle, uint8_t saturation)
{
ESP_LOGI(TAG, "Setting saturation to: %d", saturation);
/* Set the color saturation here */
@@ -61,7 +61,7 @@ esp_err_t led_driver_set_saturation(uint8_t saturation)
return ESP_OK;
}
esp_err_t led_driver_set_temperature(uint32_t temperature)
esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temperature)
{
ESP_LOGI(TAG, "Setting temperature to: %d", temperature);
/* Set the color temp here*/
@@ -69,27 +69,27 @@ esp_err_t led_driver_set_temperature(uint32_t temperature)
return ESP_OK;
}
bool led_driver_get_power()
bool led_driver_get_power(led_driver_handle_t handle)
{
return current_power;
}
uint8_t led_driver_get_brightness()
uint8_t led_driver_get_brightness(led_driver_handle_t handle)
{
return current_brightness;
}
uint16_t led_driver_get_hue()
uint16_t led_driver_get_hue(led_driver_handle_t handle)
{
return current_HS.hue;
}
uint8_t led_driver_get_saturation()
uint8_t led_driver_get_saturation(led_driver_handle_t handle)
{
return current_HS.saturation;
}
uint32_t led_driver_get_temperature()
uint32_t led_driver_get_temperature(led_driver_handle_t handle)
{
return current_temperature;
}
+13 -11
View File
@@ -25,18 +25,20 @@ typedef struct {
int channel;
} led_driver_config_t;
esp_err_t led_driver_init(led_driver_config_t *config);
esp_err_t led_driver_set_power(bool power);
esp_err_t led_driver_set_brightness(uint8_t brightness);
esp_err_t led_driver_set_hue(uint16_t hue);
esp_err_t led_driver_set_saturation(uint8_t saturation);
esp_err_t led_driver_set_temperature(uint32_t temperature);
typedef void *led_driver_handle_t;
bool led_driver_get_power(void);
uint8_t led_driver_get_brightness(void);
uint16_t led_driver_get_hue(void);
uint8_t led_driver_get_saturation(void);
uint32_t led_driver_get_temperature(void);
led_driver_handle_t led_driver_init(led_driver_config_t *config);
esp_err_t led_driver_set_power(led_driver_handle_t handle, bool power);
esp_err_t led_driver_set_brightness(led_driver_handle_t handle, uint8_t brightness);
esp_err_t led_driver_set_hue(led_driver_handle_t handle, uint16_t hue);
esp_err_t led_driver_set_saturation(led_driver_handle_t handle, uint8_t saturation);
esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temperature);
bool led_driver_get_power(led_driver_handle_t handle);
uint8_t led_driver_get_brightness(led_driver_handle_t handle);
uint16_t led_driver_get_hue(led_driver_handle_t handle);
uint8_t led_driver_get_saturation(led_driver_handle_t handle);
uint32_t led_driver_get_temperature(led_driver_handle_t handle);
#ifdef __cplusplus
}
+30 -19
View File
@@ -124,32 +124,43 @@ static esp_err_t InitDisplay()
return ESP_OK;
}
esp_err_t led_driver_init(led_driver_config_t *config)
led_driver_handle_t led_driver_init(led_driver_config_t *config)
{
static bool init_done = false;
if (init_done) {
ESP_LOGE(TAG, "This led driver only supports one led initialisation.");
return NULL;
}
ESP_LOGI(TAG, "Initializing led driver");
esp_err_t err = ESP_OK;
err = InitDisplay();
if (err != ESP_OK) {
return err;
return NULL;
}
SetupBrightnessControl(config);
SetDisplayBrightness(BRIGHTNESS_MAX);
return err;
init_done = true;
/* Temporary handle. Not being used anywhere. */
static int handle = 1;
return (led_driver_handle_t)handle;
}
esp_err_t led_driver_set_power(bool power)
esp_err_t led_driver_set_power(led_driver_handle_t handle, bool power)
{
current_power = power;
return led_driver_set_brightness(current_brightness);
return led_driver_set_brightness(handle, current_brightness);
}
esp_err_t led_driver_set_RGB()
esp_err_t led_driver_set_RGB(led_driver_handle_t handle)
{
TFT_fillWindow(TFT_BLACK);
TFT_fillCircle(DisplayWidth / 2, DisplayHeight / 2, DisplayWidth / 4, (color_t){mRGB.red, mRGB.green, mRGB.blue});
TFT_drawCircle(DisplayWidth / 2, DisplayHeight / 2, DisplayWidth / 4, (color_t){255, 255, 255});
return ESP_OK;
}
esp_err_t led_driver_set_brightness(uint8_t brightness)
esp_err_t led_driver_set_brightness(led_driver_handle_t handle, uint8_t brightness)
{
if (brightness != 0) {
current_brightness = brightness;
@@ -158,55 +169,55 @@ esp_err_t led_driver_set_brightness(uint8_t brightness)
brightness = 0;
}
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
esp_err_t led_driver_set_hue(uint16_t hue)
esp_err_t led_driver_set_hue(led_driver_handle_t handle, uint16_t hue)
{
uint8_t brightness = current_power ? current_brightness : 0;
current_HS.hue = hue;
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
esp_err_t led_driver_set_saturation(uint8_t saturation)
esp_err_t led_driver_set_saturation(led_driver_handle_t handle, uint8_t saturation)
{
uint8_t brightness = current_power ? current_brightness : 0;
current_HS.saturation = saturation;
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
esp_err_t led_driver_set_temperature(uint32_t temperature)
esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temperature)
{
uint8_t brightness = current_power ? current_brightness : 0;
current_temperature = temperature;
temp_to_hs(current_temperature, &current_HS);
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
bool led_driver_get_power()
bool led_driver_get_power(led_driver_handle_t handle)
{
return current_power;
}
uint8_t led_driver_get_brightness()
uint8_t led_driver_get_brightness(led_driver_handle_t handle)
{
return current_brightness;
}
uint16_t led_driver_get_hue()
uint16_t led_driver_get_hue(led_driver_handle_t handle)
{
return current_HS.hue;
}
uint8_t led_driver_get_saturation()
uint8_t led_driver_get_saturation(led_driver_handle_t handle)
{
return current_HS.saturation;
}
uint32_t led_driver_get_temperature()
uint32_t led_driver_get_temperature(led_driver_handle_t handle)
{
return current_temperature;
}
+22 -22
View File
@@ -23,9 +23,8 @@ static uint8_t current_brightness = 0;
static uint32_t current_temp = 6600;
static HS_color_t current_HS = {0, 0};
static RGB_color_t mRGB;
static led_strip_t *strip = NULL;
esp_err_t led_driver_init(led_driver_config_t *config)
led_driver_handle_t led_driver_init(led_driver_config_t *config)
{
ESP_LOGI(TAG, "Initializing light driver");
esp_err_t err = ESP_OK;
@@ -42,27 +41,28 @@ esp_err_t led_driver_init(led_driver_config_t *config)
}
led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(1, (led_strip_dev_t)rmt_cfg.channel);
strip = led_strip_new_rmt_ws2812(&strip_config);
led_strip_t *strip = led_strip_new_rmt_ws2812(&strip_config);
if (!strip) {
ESP_LOGE(TAG, "W2812 driver install failed");
err = ESP_FAIL;
}
return err;
return (led_driver_handle_t)strip;
}
esp_err_t led_driver_set_power(bool power)
esp_err_t led_driver_set_power(led_driver_handle_t handle, bool power)
{
current_power = power;
return led_driver_set_brightness(current_brightness);
return led_driver_set_brightness(handle, current_brightness);
}
esp_err_t led_driver_set_RGB()
esp_err_t led_driver_set_RGB(led_driver_handle_t handle)
{
esp_err_t err = ESP_OK;
if (!strip) {
ESP_LOGE(TAG, "can't find w2812 led_strip handle");
if (!handle) {
ESP_LOGE(TAG, "led driver handle cannot be NULL");
err = ESP_FAIL;
} else {
led_strip_t *strip = (led_strip_t *)handle;
err = strip->set_pixel(strip, 0, mRGB.red, mRGB.green, mRGB.blue);
if (err != ESP_OK) {
ESP_LOGE(TAG, "strip_set_pixel failed");
@@ -77,7 +77,7 @@ esp_err_t led_driver_set_RGB()
return err;
}
esp_err_t led_driver_set_brightness(uint8_t brightness)
esp_err_t led_driver_set_brightness(led_driver_handle_t handle, uint8_t brightness)
{
if (brightness != 0) {
current_brightness = brightness;
@@ -86,55 +86,55 @@ esp_err_t led_driver_set_brightness(uint8_t brightness)
brightness = 0;
}
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
esp_err_t led_driver_set_hue(uint16_t hue)
esp_err_t led_driver_set_hue(led_driver_handle_t handle, uint16_t hue)
{
uint8_t brightness = current_power ? current_brightness : 0;
current_HS.hue = hue;
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
esp_err_t led_driver_set_saturation(uint8_t saturation)
esp_err_t led_driver_set_saturation(led_driver_handle_t handle, uint8_t saturation)
{
uint8_t brightness = current_power ? current_brightness : 0;
current_HS.saturation = saturation;
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
esp_err_t led_driver_set_temperature(uint32_t temperature)
esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temperature)
{
uint8_t brightness = current_power ? current_brightness : 0;
current_temp = temperature;
temp_to_hs(current_temp, &current_HS);
hsv_to_rgb(current_HS, brightness, &mRGB);
return led_driver_set_RGB();
return led_driver_set_RGB(handle);
}
bool led_driver_get_power()
bool led_driver_get_power(led_driver_handle_t handle)
{
return current_power;
}
uint8_t led_driver_get_brightness()
uint8_t led_driver_get_brightness(led_driver_handle_t handle)
{
return current_brightness;
}
uint16_t led_driver_get_hue()
uint16_t led_driver_get_hue(led_driver_handle_t handle)
{
return current_HS.hue;
}
uint8_t led_driver_get_saturation()
uint8_t led_driver_get_saturation(led_driver_handle_t handle)
{
return current_HS.saturation;
}
uint32_t led_driver_get_temperature()
uint32_t led_driver_get_temperature(led_driver_handle_t handle)
{
return current_temp;
}