/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：opto_switch.c
 * 描  述  ：光电开关驱动程序
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/03/06 
*********************************************************************************/
#include "opto_switch.h"
#include "timer.h"

//红外光电开关
#define OPTO_SWITCH_PORT_PerClock			RCC_APB2Periph_GPIOB
#define OPTO_SWITCH_PORT							GPIOB				
#define OPTO_SWITCH_PIN								GPIO_Pin_6

//接近开关
#define SWITCH1_PORT_PerClock			RCC_APB2Periph_GPIOC
#define SWITCH1_PORT							GPIOC		
#define SWITCH1_PIN								GPIO_Pin_4

#define SWITCH2_PORT_PerClock			RCC_APB2Periph_GPIOB
#define SWITCH2_PORT							GPIOB
#define SWITCH2_PIN								GPIO_Pin_0

uint8_t keyReleaseMark = 0;							//按键松开标志
uint8_t optoKeyValue = 0;								//红外光电开关键值
uint8_t optoKeyStatus = 0;							//红外光电开关状态
	
/*
***********************************************************************
*	函 数 名: OptoKeyInit
*	功能说明: 红外光电开关IO口初始化
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void OptoSwitchInit(void)
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(OPTO_SWITCH_PORT_PerClock, ENABLE);
	RCC_APB2PeriphClockCmd(SWITCH1_PORT_PerClock, ENABLE);
	RCC_APB2PeriphClockCmd(SWITCH2_PORT_PerClock, ENABLE);
	
	//光电开关IO口配置
	GPIO_InitStructure.GPIO_Pin = OPTO_SWITCH_PIN;			 				
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 		
	GPIO_Init(OPTO_SWITCH_PORT, &GPIO_InitStructure);	
	
	//接近开关IO口配置
	GPIO_InitStructure.GPIO_Pin = SWITCH1_PIN;			 				
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 		
	GPIO_Init(SWITCH1_PORT, &GPIO_InitStructure);	
	
	GPIO_InitStructure.GPIO_Pin = SWITCH2_PIN;			 				
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 		
	GPIO_Init(SWITCH2_PORT, &GPIO_InitStructure);	
}

/*
***********************************************************************
*	函 数 名: OptoSwitchScanning
*	功能说明: 红外光电开关检测
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void OptoSwitchScanning(void)
{
	static uint8_t key1_state = 0;
	static uint8_t key2_state = 0;
	
	//第1路红外光电开关检测
	switch (key1_state)
	{
		case 0x00:		//初始状态
			if(OPTO_KEY == 1)
			{
				key1_state = 0x01;
			}
			break;
			
		case 0x01:		//确认状态
			if(OPTO_KEY == 1)
			{
				optoKeyValue = 1;
				key1_state = 0x02;
			}else{
				optoKeyValue = 0;
				key1_state = 0x00;
			}
			break;
			
		case 0x02:		//等待释放状态
			if(OPTO_KEY == 0)
			{
				keyReleaseMark = 1;
				key1_state = 0x00;
			}
			break;
			
		default:
			key1_state = 0x00;
			break;
	}
}

/*
***********************************************************************
*	函 数 名: OptoKeysTest
*	功能说明: 红外光电开关测试
*	形    参:	无
*	返 回 值: 无
***********************************************************************
*/
void OptoKeysTest(void)
{
	static uint8_t optoKeyStatus1 = 0;
	
	if(optoKeyStatus1 != optoKeyValue)
	{
		optoKeyStatus1 = optoKeyValue;
		
		if(optoKeyValue)
		{
			printf("\r\n红外光电开关1触发\r\n");
		}else{
			printf("\r\n红外光电开关1恢复正常\r\n");
		}
	}
}

/******************** (C) COPYRIGHT 2018 Ping *****END OF FILE*******************/
