/*
*********************************************************************************************************
*
*	模块名称 : LED指示灯驱动模块
*	文件名称 : bsp_led.c
*	版    本 : V1.0
*	说    明 : 驱动LED指示灯
*
*	修改记录 :
*		版本号  日期        作者     说明
*		V1.0    2013-02-01 armfly  正式发布
*
*	Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#include "bsp.h"

/*
	该程序适用于安富莱STM32-V4 开发板

	如果用于其它硬件，请修改GPIO定义
	
	如果用户的LED指示灯个数小于4个，可以将多余的LED全部定义为和第1个LED一样，并不影响程序功能
*/


/* 按键口对应的RCC时钟 */
#define RCC_ALL_LED 	(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF)

#define GPIO_PORT_LED1  GPIOA
#define GPIO_PIN_LED1	GPIO_Pin_15

#define GPIO_PORT_LED2  GPIOC
#define GPIO_PIN_LED2	GPIO_Pin_10

#define GPIO_PORT_LED3  GPIOC
#define GPIO_PIN_LED3	GPIO_Pin_11

#define GPIO_PORT_LED4  GPIOC
#define GPIO_PIN_LED4	GPIO_Pin_12

#define GPIO_PORT_LED5  GPIOD
#define GPIO_PIN_LED5	GPIO_Pin_0

#define GPIO_PORT_LED6  GPIOD
#define GPIO_PIN_LED6	GPIO_Pin_1

#define GPIO_PORT_LED7  GPIOF
#define GPIO_PIN_LED7	GPIO_Pin_5

#define GPIO_PORT_LED8  GPIOF
#define GPIO_PIN_LED8	GPIO_Pin_4

#define GPIO_PORT_LED9  GPIOF
#define GPIO_PIN_LED9	GPIO_Pin_3

#define GPIO_PORT_LED10  GPIOF
#define GPIO_PIN_LED10	GPIO_Pin_2

#define GPIO_PORT_LED11  GPIOF
#define GPIO_PIN_LED11	GPIO_Pin_1

#define GPIO_PORT_LED12  GPIOF
#define GPIO_PIN_LED12	GPIO_Pin_0

#define GPIO_PORT_LED13  GPIOE
#define GPIO_PIN_LED13	GPIO_Pin_5

#define GPIO_PORT_LED14  GPIOE
#define GPIO_PIN_LED14	GPIO_Pin_4

/*
*********************************************************************************************************
*	函 数 名: bsp_InitLed
*	功能说明: 配置LED指示灯相关的GPIO,  该函数被 bsp_Init() 调用。
*	形    参:  无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitLed(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	/* 打开GPIO时钟 */
	RCC_APB2PeriphClockCmd(RCC_ALL_LED, ENABLE);

	/*
		配置所有的LED指示灯GPIO为推挽输出模式
		由于将GPIO设置为输出时，GPIO输出寄存器的值缺省是0，因此会驱动LED点亮.
		这是我不希望的，因此在改变GPIO为输出前，先关闭LED指示灯
	*/
	bsp_LedOff(1);
	bsp_LedOff(2);
	bsp_LedOff(3);
	bsp_LedOff(4);
	bsp_LedOff(5);
	bsp_LedOff(6);
	bsp_LedOn(7);
	bsp_LedOff(8);
	bsp_LedOff(9);
	bsp_LedOff(10);
	bsp_LedOff(11);
	bsp_LedOff(12);
	bsp_LedOff(13);
	bsp_LedOff(14);

	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	/* 推挽输出模式 */
	  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED1;
	GPIO_Init(GPIO_PORT_LED1, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED2;
	GPIO_Init(GPIO_PORT_LED2, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED3;
	GPIO_Init(GPIO_PORT_LED3, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED4;
	GPIO_Init(GPIO_PORT_LED4, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED5;
	GPIO_Init(GPIO_PORT_LED5, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED6;
	GPIO_Init(GPIO_PORT_LED6, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED7;
	GPIO_Init(GPIO_PORT_LED7, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED8;
	GPIO_Init(GPIO_PORT_LED8, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED9;
	GPIO_Init(GPIO_PORT_LED9, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED10;
	GPIO_Init(GPIO_PORT_LED10, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED11;
	GPIO_Init(GPIO_PORT_LED11, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED12;
	GPIO_Init(GPIO_PORT_LED12, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED13;
	GPIO_Init(GPIO_PORT_LED13, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED14;
	GPIO_Init(GPIO_PORT_LED14, &GPIO_InitStructure);
	
}

/*
*********************************************************************************************************
*	函 数 名: bsp_LedOn
*	功能说明: 点亮指定的LED指示灯。
*	形    参:  _no : 指示灯序号，范围 1 - 4
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_LedOff(uint8_t _no)
{
	_no--;

	if (_no == 0)
	{
		GPIO_PORT_LED1->BRR = GPIO_PIN_LED1;
	}
	else if (_no == 1)
	{
		GPIO_PORT_LED2->BRR = GPIO_PIN_LED2;
	}
	else if (_no == 2)
	{
		GPIO_PORT_LED3->BRR = GPIO_PIN_LED3;
	}
	else if (_no == 3)
	{
		GPIO_PORT_LED4->BRR = GPIO_PIN_LED4;
	}
	else if (_no == 4)
	{
		GPIO_PORT_LED5->BRR = GPIO_PIN_LED5;
	}
	else if (_no == 5)
	{
		GPIO_PORT_LED6->BRR = GPIO_PIN_LED6;
	}
	else if (_no == 6)
	{
		GPIO_PORT_LED7->BRR = GPIO_PIN_LED7;
	}
	else if (_no == 7)
	{
		GPIO_PORT_LED8->BRR = GPIO_PIN_LED8;
	}
	else if (_no == 8)
	{
		GPIO_PORT_LED9->BRR = GPIO_PIN_LED9;
	}
	else if (_no == 9)
	{
		GPIO_PORT_LED10->BRR = GPIO_PIN_LED10;
	}
	else if (_no == 10)
	{
		GPIO_PORT_LED11->BRR = GPIO_PIN_LED11;
	}
	else if (_no == 11)
	{
		GPIO_PORT_LED12->BRR = GPIO_PIN_LED12;
	}
	else if (_no == 12)
	{
		GPIO_PORT_LED13->BRR = GPIO_PIN_LED13;
	}
	else if (_no == 13)
	{
		GPIO_PORT_LED14->BRR = GPIO_PIN_LED14;
	}
}

/*
*********************************************************************************************************
*	函 数 名: bsp_LedOff
*	功能说明: 熄灭指定的LED指示灯。
*	形    参:  _no : 指示灯序号，范围 1 - 4
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_LedOn(uint8_t _no)
{
	_no--;

	if (_no == 0)
	{
		GPIO_PORT_LED1->BSRR = GPIO_PIN_LED1;
	}
	else if (_no == 1)
	{
		GPIO_PORT_LED2->BSRR = GPIO_PIN_LED2;
	}
	else if (_no == 2)
	{
		GPIO_PORT_LED3->BSRR = GPIO_PIN_LED3;
	}
	else if (_no == 3)
	{
		GPIO_PORT_LED4->BSRR = GPIO_PIN_LED4;
	}
	else if (_no == 4)
	{
		GPIO_PORT_LED5->BSRR = GPIO_PIN_LED5;
	}
	else if (_no == 5)
	{
		GPIO_PORT_LED6->BSRR = GPIO_PIN_LED6;
	}
	else if (_no == 6)
	{
		GPIO_PORT_LED7->BSRR = GPIO_PIN_LED7;
	}
	else if (_no == 7)
	{
		GPIO_PORT_LED8->BSRR = GPIO_PIN_LED8;
	}
	else if (_no == 8)
	{
		GPIO_PORT_LED9->BSRR = GPIO_PIN_LED9;
	}
	else if (_no == 9)
	{
		GPIO_PORT_LED10->BSRR = GPIO_PIN_LED10;
	}
	else if (_no == 10)
	{
		GPIO_PORT_LED11->BSRR = GPIO_PIN_LED11;
	}
	else if (_no == 11)
	{
		GPIO_PORT_LED12->BSRR = GPIO_PIN_LED12;
	}
	else if (_no == 12)
	{
		GPIO_PORT_LED13->BSRR = GPIO_PIN_LED13;
	}
	else if (_no == 13)
	{
		GPIO_PORT_LED14->BSRR = GPIO_PIN_LED14;
	}
	
}

/*
*********************************************************************************************************
*	函 数 名: bsp_LedToggle
*	功能说明: 翻转指定的LED指示灯。
*	形    参:  _no : 指示灯序号，范围 1 - 4
*	返 回 值: 按键代码
*********************************************************************************************************
*/
void bsp_LedToggle(uint8_t _no)
{
	if (_no == 1)
	{
		GPIO_PORT_LED1->ODR ^= GPIO_PIN_LED1;
	}
	else if (_no == 2)
	{
		GPIO_PORT_LED2->ODR ^= GPIO_PIN_LED2;
	}
	else if (_no == 3)
	{
		GPIO_PORT_LED3->ODR ^= GPIO_PIN_LED3;
	}
	else if (_no == 4)
	{
		GPIO_PORT_LED4->ODR ^= GPIO_PIN_LED4;
	}
}

/*
*********************************************************************************************************
*	函 数 名: bsp_IsLedOn
*	功能说明: 判断LED指示灯是否已经点亮。
*	形    参:  _no : 指示灯序号，范围 1 - 4
*	返 回 值: 1表示已经点亮，0表示未点亮
*********************************************************************************************************
*/
uint8_t bsp_IsLedOn(uint8_t _no)
{
	if (_no == 1)
	{
		if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 0)
		{
			return 1;
		}
		return 0;
	}
	else if (_no == 2)
	{
		if ((GPIO_PORT_LED2->ODR & GPIO_PIN_LED2) == 0)
		{
			return 1;
		}
		return 0;
	}
	else if (_no == 3)
	{
		if ((GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 0)
		{
			return 1;
		}
		return 0;
	}
	else if (_no == 4)
	{
		if ((GPIO_PORT_LED4->ODR & GPIO_PIN_LED4) == 0)
		{
			return 1;
		}
		return 0;
	}

	return 0;
}

void bsp_LedAllOff(void)
{
	bsp_LedOff(1);
	bsp_LedOff(2);
	bsp_LedOff(3);
	bsp_LedOff(4);
	bsp_LedOff(5);
	bsp_LedOff(6);
	bsp_LedOff(7);
	bsp_LedOff(8);
	bsp_LedOff(9);
	bsp_LedOff(10);
	bsp_LedOff(11);
	bsp_LedOff(12);
	bsp_LedOff(13);
	bsp_LedOff(14);
}

static void ChannelLedAllOff(void)
{
	bsp_LedOff(1);
	bsp_LedOff(2);
	bsp_LedOff(3);
	bsp_LedOff(4);
	bsp_LedOff(5);
	bsp_LedOff(6);
}

static void ResLedAllOff(void)
{
	bsp_LedOff(7);
	bsp_LedOff(8);
	bsp_LedOff(9);
	bsp_LedOff(10);
	bsp_LedOff(11);
	bsp_LedOff(12);
	bsp_LedOff(13);
	bsp_LedOff(14);
}

//----------------------------------------
//  ch = 1,2,3,4,5,6
//---------------------------------------
void bsp_ChannelSelect(uint8_t _ch)
{
	static uint8_t s_ucOldCh=255;
	
	if(_ch==s_ucOldCh)
	{
		ChannelLedAllOff();
    bsp_RealyAllOff();
		s_ucOldCh=255;
	}
	else
	{
		s_ucOldCh = _ch;
		ChannelLedAllOff();
		bsp_LedOn(_ch);
    bsp_RelayOn(_ch);
	}
	
}

void bsp_ResSelect(uint8_t _res)
{
	ResLedAllOff();
  //printf("_res:%d\r\n",_res);
	bsp_LedOn(_res);
  bsp_SelectRes(_res);
}

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
