/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/zephyr.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/gpio/gpio_sx1509b.h>

#define NUMBER_OF_LEDS 3
#define GREEN_LED DT_GPIO_PIN(DT_NODELABEL(led0), gpios)
#define BLUE_LED DT_GPIO_PIN(DT_NODELABEL(led1), gpios)
#define RED_LED DT_GPIO_PIN(DT_NODELABEL(led2), gpios)

enum sx1509b_color { sx1509b_red = 0, sx1509b_green, sx1509b_blue };

const struct device *sx1509b_dev;
static struct k_work_delayable rgb_work;
static uint8_t which_color = sx1509b_red;
static uint8_t iterator;

static const gpio_pin_t rgb_pins[] = {
	RED_LED,
	GREEN_LED,
	BLUE_LED,
};

static void rgb_work_handler(struct k_work *work)
{
	if (which_color == sx1509b_red) {
		sx1509b_led_intensity_pin_set(sx1509b_dev, RED_LED, iterator);

		iterator++;

		if (iterator >= 255) {
			sx1509b_led_intensity_pin_set(sx1509b_dev, RED_LED, 0);
			which_color = sx1509b_green;
			iterator = 0;
		}
	} else if (which_color == sx1509b_green) {
		sx1509b_led_intensity_pin_set(sx1509b_dev, GREEN_LED, iterator);

		iterator++;

		if (iterator >= 255) {
			sx1509b_led_intensity_pin_set(sx1509b_dev, GREEN_LED,
						      0);
			which_color = sx1509b_blue;
			iterator = 0;
		}
	} else if (which_color == sx1509b_blue) {
		sx1509b_led_intensity_pin_set(sx1509b_dev, BLUE_LED, iterator);

		iterator++;

		if (iterator >= 255) {
			sx1509b_led_intensity_pin_set(sx1509b_dev, BLUE_LED, 0);
			which_color = sx1509b_red;
			iterator = 0;
		}
	}

	k_work_schedule(k_work_delayable_from_work(work), K_MSEC(10));
}

void main(void)
{
	int err;

	printk("SX1509B intensity sample\n");

	sx1509b_dev = device_get_binding(DT_PROP(DT_NODELABEL(sx1509b), label));

	if (sx1509b_dev == NULL) {
		printk("Error binding SX1509B device\n");

		return;
	}

	for (int i = 0; i < NUMBER_OF_LEDS; i++) {
		err = sx1509b_led_intensity_pin_configure(sx1509b_dev,
							  rgb_pins[i]);

		if (err) {
			printk("Error configuring pin for LED intensity\n");
		}
	}

	k_work_init_delayable(&rgb_work, rgb_work_handler);
	k_work_schedule(&rgb_work, K_NO_WAIT);
}
