/***********************************************
*	�������̵��������ļ�
* ����				�޸���				�޸���Ϣ
--20210409		Magnin				�����޸�
************************************************/

/**************�������Ӧ��������***************
			RELAY -------------------------- PD2
***********************************************/
#include "relay.h"
#include "share.h"
#include "cm32m101a_conf.h"

//����Relay�Ʋ�������
typedef struct{
	sp_relay_t relay;
	GPIO_Module* GPIOx;
	uint16_t Pin;
}sp_led_param_t;

//����Relay�Ʋ�������
static sp_led_param_t relayParam[] = {
	{SP_RELAY1,GPIOD,GPIO_PIN_2}
};
//��ʼ��Relay
void Relay_Init(void)
{
	GPIO_InitType GPIO_InitStructure;
	//����GPIO�˿�ʱ��
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOD, ENABLE);
	//���������������
	GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;		//������С
	GPIO_InitStructure.GPIO_Pull    = GPIO_No_Pull;		//������������
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;	//�������
	
	for(uint8_t i = 0;i < ARRAY_SIZE(relayParam);i++)
	{		
		GPIO_InitStructure.Pin	= relayParam[i].Pin;
		GPIO_InitPeripheral(relayParam[i].GPIOx, &GPIO_InitStructure);
		//��ʼ���ر�Relay
		Relay_SetState(relayParam[i].relay,SP_RELAY_STATE_CLOSE);
	}
	
}
//����Relay״̬
void Relay_SetState(sp_relay_t relay,sp_relay_state_t state)
{
	for(uint8_t i = 0;i < ARRAY_SIZE(relayParam);i++)
	{		
		if(relayParam[i].relay == relay)	//�ҵ���ӦLED
		{
			if(state == SP_RELAY_STATE_OPEN)	GPIO_SetBits(relayParam[i].GPIOx,relayParam[i].Pin);		//�ߵ�ƽ����
			else 									GPIO_ResetBits(relayParam[i].GPIOx,relayParam[i].Pin);	
		}
	}
}
//��תRelay
void Relay_Toggles(sp_relay_t relay)
{
	for(uint8_t i = 0;i < ARRAY_SIZE(relayParam);i++)
	{		
		if(relayParam[i].relay == relay)	//�ҵ���ӦLED
		{
			relayParam[i].GPIOx->POD ^= relayParam[i].Pin;	//��ת��ƽ
		}
	}

}
//��ȡRelayD״̬
sp_relay_state_t Relay_GetState(sp_relay_t relay)
{
	for(uint8_t i = 0;i < ARRAY_SIZE(relayParam);i++)
	{		
		if(relayParam[i].relay == relay)	//�ҵ���ӦRelay
		{
			//��ȡRelay״̬
			if(GPIO_ReadOutputDataBit(relayParam[i].GPIOx,relayParam[i].Pin))	return SP_RELAY_STATE_OPEN;		
			else 	return SP_RELAY_STATE_CLOSE;	
		}
	}
	//Relay�����ڷ��عر�
	return SP_RELAY_STATE_CLOSE;
}