/******************************************************************************
版权所有：	
文件名称：	led.c
文件版本：	01.01
创建作者：	xxxxxx
创建日期：	2013-05-29
功能说明：	LED处理程序
其它说明：
修改记录：
*/
/*------------------------------- 头文件 --------------------------------------
*/
#include "head.h"
 

/*------------------------------- 宏定义 --------------------------------------
*/
#define LED_NULL	(-1)
#define QUICK_FLASH	20		// 5Hz, 亮100ms，灭100ms。5ms一次，20次为100ms
#define SLOW_FLASH	200		// 间隔1s闪烁
/*------------------------------ 类型结构 -------------------------------------
*/
// 开出类型灯控制结构体
struct kc_led_st
{
	u8 slow_flag;				// 慢闪总标志
	u8 quick_flag;				// 快闪总标志
	u32 slow_t;					// 慢闪计数
	u32 quick_t;				// 快闪计数
};


/*------------------------------ 全局变量 -------------------------------------
*/
struct kc_led_st g_kc_led;

/*------------------------------ 函数声明 -------------------------------------
*/
static int _led_kc_op(int i);


/*------------------------------ 外部函数 -------------------------------------
外部函数供其它实体文件引用，必须仔细检查传入参数的合法性.
*/

// 通讯灯
static int _led_comm(void)
{
#ifdef CN_AREA_GUANGXI
	if(FUN_YX_SEND_YB)	//检修压板投入，通信灯常亮
		led_set_pub(PUB_LED_COMM, LED_ON);
#else
	if(g_run_stu.bjx)	//检修压板投入，通信灯常亮
		led_set_pub(PUB_LED_COMM, LED_ON);
#endif
		
			
	switch(g_led_stu[0][PUB_LED_COMM])
	{
		case LED_ON:
			GPIO_LED_COMM_ON();
		break;

		case LED_OFF:
			GPIO_LED_COMM_OFF();;
		break;
 	}

	return 0;
}

//动作灯
static int _led_act(void)
{
	switch(g_led_stu[0][PUB_LED_DZ])
	{
		case LED_ON:
			GPIO_LED_ACT_ON();
		break;

		case LED_OFF:
			GPIO_LED_ACT_OFF();;
		break;

		case LED_SLOW:
			if (g_kc_led.slow_t == 0)
			{	
				if(GPIO_LED_ACT_STATUS())
				{
					GPIO_LED_ACT_OFF();;
				}
				else
				{
					GPIO_LED_ACT_ON();
				}
			}
		break;

		case LED_QUICK:
			if (g_kc_led.quick_t == 0)
			{	
				if(GPIO_LED_ACT_STATUS())
				{
					GPIO_LED_ACT_OFF();;
				}
				else
				{
					GPIO_LED_ACT_ON();
				}
			}
		break;
	}

	return 0;
}


static int _led_kc_op(int i)
{
	int channel;
	
	// 先将板卡的索引转换为开出函数的索引
	channel = equ_get_do_channel(i);
	switch(g_led_stu[g_led_slot[EQU_SLOT_KZ].sn[i].sw][g_led_slot[EQU_SLOT_KZ].sn[i].no])
	{
		case LED_ON:
			dido_do_kz(1, channel);
		break;

		case LED_OFF:
			dido_do_kz(0, channel);
		break;

		case LED_SLOW:
			if (g_kc_led.slow_t == SLOW_FLASH)
			{	
				dido_do_kz(!g_kc_led.slow_flag, channel);
			}
		break;

		case LED_QUICK:
			if (g_kc_led.quick_t == QUICK_FLASH)
			{	
				dido_do_kz(!g_kc_led.quick_flag, channel);
			}
		break;
	}

	return 0;
}


/******************************************************************************
函数名称：	led_polling_5ms
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-16
函数说明：	设置开出类型LED灯的状态
参数说明：	led: 灯的序号 
			status: 灯的状态 LED_ON, LED_SLOW, LED_QUICK, LED_OFF
返回值：  	无
修改记录：	
*/
int led_polling_5ms(void)  
{
	int i;
	// 遍历所有灯
	// TODO EWen 开出点控灯的集中式不用此方式
	for (i=0; i<g_led_slot[EQU_SLOT_KZ].num; i++)
	{
		// 如果没有配置，跳过
		if(g_led_slot[EQU_SLOT_KZ].sn[i].no == LED_NULL)
		{
			continue;
		}

		if (!bMaintain_test)
		{
			_led_kc_op(i);
		}
	}

	// 计数到清零,并切换状态
	if (g_kc_led.slow_t == SLOW_FLASH)
	{	
		//慢闪切换
		g_kc_led.slow_flag = !g_kc_led.slow_flag;	
		g_kc_led.slow_t = 0;
		
		// 主板运行错误灯
		_led_run_err();
	}
	
	if (g_kc_led.quick_t == QUICK_FLASH)
	{
		//快闪切换
		g_kc_led.quick_flag = !g_kc_led.quick_flag;	
		g_kc_led.quick_t = 0;

		//通讯灯闪烁控制
		#if 0
		if(g_kc_led.quick_flag)
		{
			if(g_bCommLed)
			{
				if(g_comm_link_status)
				{
					led_set_pub( PUB_LED_COMM, LED_OFF);
				}
				else
				{
					led_set_pub( PUB_LED_COMM, LED_ON);
				}
				g_bCommLed = 0;
			}
		}
		else
		{
			if(g_comm_link_status)
			{
				led_set_pub( PUB_LED_COMM, LED_ON);
			}
			else
			{
				led_set_pub( PUB_LED_COMM, LED_OFF);
			}
		}
		#endif
	}
	
	// 通讯灯、动作灯输出
	// _led_comm();  //临时屏蔽
	// _led_act();
	
	// 计数自加,加1为5ms
	g_kc_led.slow_t++;
	g_kc_led.quick_t++;

	return 0;
}




/*------------------------------ 测试函数 -------------------------------------
一个实体文件必须带一个本模块的测试函数来进行单元测试，如果的确不方便在本模块中
进行单元测试，必须在此注明实际的测试位置（例如在哪个实体文件中使用哪个测试函数）.
*/

/*------------------------------ 文件结束 -------------------------------------
*/


