#include <stdio.h>
#include "cola_init.h"
#include "cola_device.h"
#include "cola_os.h"
#include "fml_gpio.h"
#include "fml_pwm.h"
#include "fml_PMIC.h"
#include "bsp_register_map.h"

static task_t gpioTask1;
static task_t gpioTask2;
static task_t gpioTask3;

bool wakeup = false;
bool lock = false;
extern ST_DIAGNOSE1_DATA Err_status1;
extern bool bist_mode;

void lock_detect(void *arg, uint32_t event)
{
	lock = fml_gpio_read(IN_LVDS_UNLOCK);

	if((lock == true)||(bist_mode == true))
		{
			cola_delay_ms(200);
			lock = fml_gpio_read(IN_LVDS_UNLOCK);
			if((lock == true)||(bist_mode == true))
			{
				cola_task_delete(&gpioTask2);
				fml_gpio_write(OUT_TFT_SHLR,true);
				fml_gpio_write(OUT_TFT_RST,false);
				cola_delay_ms(100);
				fml_gpio_write(OUT_TFT_RST,true);
				fml_gpio_write(OUT_TFT_SYBYB,true);
				fml_gpio_write(OUT_TFT_DISP,true);
				//fml_gpio_write(OUT_TFT_BIST,true);
				fml_gpio_write(OUT_BL_EN,true);
				fml_gpio_write(OUT_PMIC_EN,true);
				fml_pwm_init();
				cola_delay_ms(10);
				fml_tft_init();
				cola_delay_ms(10);
				fml_pmic_init();
				fml_max25512_init();
				power_up_manage();
			}
		}
}

void power_on_detect(void *arg, uint32_t event)
{

	wakeup = fml_gpio_read(IN_WAKEUP);
	if((wakeup == true)&&(Err_status1.HIGH_VOL_FAIL == 0)&&(Err_status1.LOW_VOL_FAIL==0))
	{
		cola_task_delete(&gpioTask1);
		fml_gpio_write(OUT_TP_RST,true);
		fml_gpio_write(OUT_PON_HOLD,true);
		fml_gpio_write(OUT_LDO_1V2_EN,true);
		fml_gpio_write(OUT_3V3_TFT_EN,true);
		fml_gpio_write(OUT_LVDS_PDB,true);
		cola_task_create(&gpioTask2, lock_detect, NULL);
	}
}
//start
void power_on_manage(void)
{
//	fml_gpio_write(OUT_TP_RST,true);
//	fml_gpio_write(OUT_PON_HOLD,true);
//	fml_gpio_write(OUT_LDO_1V2_EN,true);
//
//	fml_gpio_write(OUT_3V3_TFT_EN,true);
//	cola_delay_ms(200);
//	fml_gpio_write(OUT_LVDS_PDB,true);
//
//
//	fml_gpio_write(OUT_TFT_SHLR,true);
//	fml_gpio_write(OUT_TFT_RST,false);
//	cola_delay_ms(200);
//	fml_gpio_write(OUT_TFT_RST,true);
//
//	fml_gpio_write(OUT_TFT_SYBYB,true);
//	fml_gpio_write(OUT_TFT_DISP,true);
//	fml_gpio_write(OUT_BL_EN,true);
//	fml_pwm_init();
//	//fml_gpio_write(OUT_TFT_BIST,true);
//	fml_gpio_write(OUT_PMIC_EN,true);
//	cola_delay_ms(10);
//	fml_tft_init();
//	cola_delay_ms(10);
//	fml_pmic_init();
//	fml_max25512_init();
	//fml_tft_write_BIST_mode(0);
	cola_task_create(&gpioTask1, power_on_detect, NULL);
}

void power_up_detect(void)
{
	wakeup = fml_gpio_read(IN_WAKEUP);

	if((wakeup == false)||(Err_status1.HIGH_VOL_FAIL == 1)||(Err_status1.LOW_VOL_FAIL==1))
		{

			cola_delay_ms(200);
			wakeup = fml_gpio_read(IN_WAKEUP);
			if((wakeup == false)||(Err_status1.HIGH_VOL_FAIL == 1)||(Err_status1.LOW_VOL_FAIL==1))
			{
				cola_task_delete(&gpioTask3);
				fml_gpio_write(OUT_BL_EN,false);
				fml_gpio_write(OUT_PMIC_EN,false);
				fml_gpio_write(OUT_TFT_SYBYB,false);
				fml_gpio_write(OUT_TFT_DISP,false);
				fml_gpio_write(OUT_LVDS_PDB,false);
				fml_gpio_write(OUT_3V3_TFT_EN,false);
				fml_gpio_write(OUT_LDO_1V2_EN,false);
				fml_gpio_write(OUT_PON_HOLD,false);
				power_on_manage();

			}
		}
}
void power_up_manage(void)
{
	 cola_task_create(&gpioTask3, power_up_detect, NULL);
}
