#include <common.h>
#include <i2c_driver.h>
#include "i2c_led_driver.h"

LED *g_leds = NULL;
int led_nums = 0;

extern int i2c_master_init(int id, int speed, int b_10bit_addr);
extern int diag_i2c_led_detect_driver(int master_id, unsigned char slave_addr, int led_driver_type);
extern int diag_i2c_led_init(int master_id, unsigned char slave_addr, int led_type);
extern int diag_i2c_led_set_frame(int master_id, unsigned char slave_addr, int led_type,
			   unsigned char *frame, size_t size);
static int single_led_init(int index);

int i2c_led_detect_driver(LED *leds, int num, int *led_driver_type) {
	int ret = -1;
	int i;

	for (i = 0; i < num; i++) {
		lgpl_printf("%s: initializing i2c: master_id: %x index: %d\n", __func__, leds[i].master_id, i);
		i2c_master_init(leds[i].master_id, 100 /*Speed*/, 0 /*Use 7 bit address*/);
		ret = diag_i2c_led_detect_driver(leds[i].master_id, leds[i].slave_addr, leds[i].led_driver_type);
		if (0 == ret) {
			*led_driver_type = leds[i].led_driver_type;
			return ret;
		}
	}

	return ret;
}

int i2c_led_init(LED *leds, int nums) {
	if (g_leds) {
		lgpl_printf("led has been inited\n");
		return -1;
	}

	led_nums = nums;

	g_leds = malloc(nums * sizeof(LED));
	memcpy(g_leds, leds, nums * sizeof(LED));

	int i = 0;
	for (i = 0; i < nums; i++) {
		if (0 != single_led_init(i))  {
			lgpl_printf("led_init %d fail\n", i);
			free(g_leds);
			g_leds = NULL;
			return -1;
		}
	}

	return 0;
}

static int single_led_init(int index) {
	int ret;

	if (index < 0 || index > led_nums) {
		lgpl_printf("led_init error index %d out of range [0, %d]\n", index, 0, led_nums - 1);
		return -1;
	}
	if (0 == g_leds[index].inited) {
		lgpl_printf("%s: initializing i2c: master_id: %x index: %d\n", __func__, g_leds[index].master_id, index);
		i2c_master_init(g_leds[index].master_id, 100 /*Speed*/, 0 /*Use 7 bit address*/);
		ret = diag_i2c_led_init(g_leds[index].master_id, g_leds[index].slave_addr, g_leds[index].led_driver_type);
		if (0 == ret) {;
			g_leds[index].inited = 1;
		} else {
			return ret;
		}
	}

	return 0;
}

int i2c_led_show_frame(int index, unsigned char *frame, size_t size) {
	if (index < 0 || index > led_nums) {
		lgpl_printf("led_init error index %d out of range [0, %d]\n", index, 0, led_nums - 1);
		return -1;
	}

	if (0 == g_leds[index].inited) {
		lgpl_printf("led_init error index %d not inited\n", index);
		return -1;
	}

	diag_i2c_led_set_frame(g_leds[index].master_id, g_leds[index].slave_addr, g_leds[index].led_driver_type, frame, size);

	return 0;
}
