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

#include <zephyr.h>
#include <device.h>
#include <drivers/gpio.h>
#include <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);
}
