/*********************************************************************************
 * COPYRIGHT NOTICE
 * Copyright (c) 2017, XinJiang University
 * All rights reserved.
 *
 * ļ		:	Sys_Basic.c
 *  		:	ϵͳжϺMCUײ㣬ʱ
 *
 * 汾			:	V3.0.2
 * 			:	־
 * 			:	2017-10-22
 * 
 * ȫ֮Ȩ½ѧУܡл񹲺͹Ȩ
 * δһȨȨκελ͸˲ý³ҵ;
 * ޸Ĵ˳뱣Ȩóע
**********************************************************************************/
#include "config.h"

/********************** ȫֱ ************************/
PWM_s							PWM 						= 	{0,Disable};	//PWMر
IRON_STATUS_e			IronStateFlag 	= 	NORMAL;				//״̬־λ
TIMER_s						Timer					 	= 	{0,0,0};			//ʱ
IRONUSE_STATUS_s	IronUse_Status 	= 	{FREE,FREE};	//ʹ״̬־λ


/************************************************************
 * 		:	timer0_int
 * ˵	:	ʱ0жϣPWM
 *
 * 	:	
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{
	static unsigned int 		BeepCounter = 0;
	static unsigned char 	PWM_counter	=	0;
	
	//PWM
	PWM_counter++;
	if((PWM_counter<PWM.Duty) && PWM.Run)
		IRON = 1;
		//IRON = 0;
	else
		IRON = 0;
	
	//
	//תºBeepCounterFlagλʼ
	if(BeepCounterFlag)
	{
		BeepCounter++;
	}
	//С趨ֵʱ򿪣ʱر,Beep_Volumeֵռձ
	if((BeepCounter > 0) && (BeepCounter <= MENU_DATA_Table.Other_s.Beep_Volume*BEEP_TIME))
	{
		BEEP_ON;
	}
	else
	{
		BEEP_OFF;
	}
	//
	if(BeepCounter == BEEP_TIME*10)
	{
		BeepCounter = 0;
		BeepCounterFlag = 0;
	}
}


/************************************************************
 * 		:	timer1_int
 * ˵	:	ʱ1жϣҪ
 *
 * 	:		
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
void timer1_int (void) interrupt TIMER1_VECTOR
{
	static unsigned int 		IronUseCounter=0;
	static	unsigned int 	ShutDownCounter = 0;
	static unsigned char 	P01_Old = 0;
	
	//1ms
	Timer.mSec++;			//ʱ0ֶμԼ
	EC11_Capture();		//׽EC11Ϣ	

	//10ms
	if(Timer.mSec%10 == 0)
	{
		if(IronUse_Status.Handle || IronUse_Status.Coder)//ˣҪǲʲô״̬
		{
			if(IronStateFlag)
			{
				Timer.Sec = 0;
				Timer.Min = 0;
				ec11_state.Key = KEY_FREE;
				ec11_state.Coder = CODER_FREE;
				IronStateFlag = NORMAL;
				Beep(MENU_DATA_Table.Other_s.Beep_Volume);
			}
		}
	}
	
	//100ms
	if(Timer.mSec%100 == 0)
	{
		//ˮؼⲢ
		if(SLEEP != P01_Old)
		{
			IronUseCounter++;
		}
		P01_Old = SLEEP;
		
		//¶ȿƣIronTemp_AMƣ߰Slp_Temp,
		if(IronStateFlag == NORMAL)
		{
			IronTempControl(IronTemp.Set);
		}
		else if(IronStateFlag==SLEEPING)
		{
			IronTempControl(MENU_DATA_Table.Temp_s.Slp_Temp);
		}
		else
		{
			IronTempControl(0);
		}
	}
	
	//1s
	if(Timer.mSec == 1000)
	{
		//һڿ10أ10Nֱ״̬仯ôΪȷʵʹ
		if(IronUseCounter>MENU_DATA_Table.Other_s.Shock_Sensor)
		{
			IronUse_Status.Handle = USING;
		}
		else
		{
			IronUse_Status.Handle = FREE;
		}
		//
		IronUseCounter = 0;
		
		//ΪûʹãôʼʱֻҪ˾㣨ûʹ&&ûʹ&&ûн˵
		if(IronUse_Status.Handle == FREE && IronUse_Status.Coder == FREE && ShutdownCounterFlag==0)
		{
			Timer.Sec++;
		}
		else
		{
			Timer.Sec = 0;
			Timer.Min = 0;
			IronUse_Status.Coder = FREE;
		}
		Timer.mSec = 0;
	}
	
	//1min
	if(Timer.Sec == 55)//ʱ׼
	{
		Timer.Min++;
		Timer.Sec = 0;
		//ߡػ
		// ˯ʱ䲻Ϊ0&&״̬
		if((MENU_DATA_Table.Time_s.Slp_Time > 0) && (IronStateFlag == NORMAL))
		{
			if(Timer.Min == MENU_DATA_Table.Time_s.Slp_Time)
			{
				IronStateFlag = SLEEPING;
				Beep(MENU_DATA_Table.Other_s.Beep_Volume);
				//ʱΪ׼
				Timer.Sec = 0;
				Timer.Min = 0;
			}
		}
		//ػʱ>=0&&Ѿ
		if((MENU_DATA_Table.Time_s.Shutdown_Time >= 0) && (IronStateFlag == SLEEPING))
		{
			if(Timer.Min == MENU_DATA_Table.Time_s.Shutdown_Time)
			{
				//ʱΪ绽׼
				Timer.Sec = 0;
				Timer.Min = 0;
				//״̬־λ
				IronStateFlag = STANDBY;
				//죬ȷصλ
				BEEP_ON;
				Delay_ms(100);
				OLED_Init();//жʱĻָ벻ڳʼλã˳ʼһ
				OLED_CLS();
				PWM.Run = Disable;
				IRON = 0;
				BEEP_OFF;
				Delay_ms(150);
				OLED_CLS();
				BEEP_ON;
				Delay_ms(150);
				OLED_CLS();
				BEEP_OFF;
				//ػʱ㣬ʼ绽ѶʱΪ16sҽģʽֱӵ
				if(MENU_DATA_Table.Time_s.Suicide_Time > 0)
				{
					//绽Ѷʱʼ
					WKTCL = 0xfe;                   	//û16s
					WKTCH = 0xff;                   	//ʹܵ绽Ѷʱ
					PCON |= 0x02;//
					_nop_();
					_nop_();
				}
				else
				{
					PCON |= 0x02;//
					_nop_();
					_nop_();
				}
				while(MENU_DATA_Table.Time_s.Suicide_Time > 0)
				{
					//¼ڶʱʱɱ
					ShutDownCounter++;
					if(ShutDownCounter > MENU_DATA_Table.Time_s.Suicide_Time*4+1)
					{
						SHUTDOWN = 0;
					}
					//ɵ绽Ѷʱѣ磻ѭ
					if(WKTCL==0xff && WKTCH==0xff)
					{
						PCON |= 0x02;//
					}
					else
					{
						ShutDownCounter = 0;
						break;
					}
					_nop_();
					_nop_();
				}
				IronUse_Status.Coder = USING;
			}
		}
	}
}


/************************************************************
 * 		:	timer2_int
 * ˵	:	趨¶Ⱥչɨ裬º͵ѹ
 *
 * 	:	
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
void timer2_int (void) interrupt TIMER2_VECTOR
{
	static unsigned char SetTempCounter = 0;

	//趨¶ȣôʾ趨¶ֵ
	if(SetTempFlag == 1)
	{
		SetTempCounter++;
	}
	if(SetTempCounter == 50)
	{
		SetTempCounter = 0;
		SetTempFlag = 0;
		if((MENU_DATA_Table.Temp_s.Default_Temp == 0) || (MENU_DATA_Table.Temp_s.Default_CH == 0))
		{
			EEPROM_SectorErase(0x0);
			EEPROM_write_n(0x0,(unsigned char *)&MENU_DATA_Table,sizeof(MENU_DATA_Table));
		}
	}
	
	//º͵ѹ
	RoomTemp = GetRoomTemp();
	VCCVoltage = GetVoltage();
	
	//ɨ
	Key_Scan();
}

void exint4() interrupt 16
{}
	
//float ADC_BandGap_Volt(void)     //ȡADCڲѹ,תΪ10λ
//{
//	unsigned int 	BangGap=0;
//	unsigned char code *BandAddr;
//	
//	BandAddr=BangGap_Addr;
//	BangGap=*BandAddr++;
//	BangGap=BangGap<<8;
//	BangGap+=*BandAddr;
//	
//	return (float)BangGap / 4.88f;
//}

//u16 ADC_GetDat(u8 Ch,u8 ChASF)   //ADC
//{
//	u16 ADC_Dat=0;
//	P1ASF=ChASF;
//	ADC_CONTR&=~(0x07<<0);
//	ADC_CONTR|=(Ch&0x07)<<0;
//	ADC_CONTR&=~(1<<4);
//	 ADC_RES=0;
//	 ADC_RESL=0;
//	ADC_CONTR|=1<<3;  //ADCת
//	
//	while((ADC_CONTR&0x10)==0);  //ȴADCת
//	ADC_CONTR&=~(1<<4);
//	
//	ADC_Dat=ADC_RES<<8;
//	ADC_Dat+=ADC_RESL;
//	
//	return ADC_Dat;
//}

//u16 ADC_BandGap_Dat()    //ȡADC׼ѹ
//{
//	u16 AD_Return = 0;
//	u8  i;
//	
//	ADC_GetDat(0,0x00);  //ȡ2ȡȶ
//	ADC_GetDat(0,0x00);
//	
//	EA = 0;
//	for (i = 0 ; i <DATA_SUM ; i++ )   //ȡDATA_SUMλ׼ѹ ȡƽֵ
//	{
//		AD_Return += ADC_GetDat(0,0x00);
//	}
//	EA = 1;
//	return AD_Return	>>	DATA_DIV;
//}
//u16 ADC_ReadCH_Dat(u8 CH)   //ȡͨѹ
//{
//	u16 AD_Return = 0;
//	u8  i;
//	
//	ADC_GetDat(CH,0xff);    //ȡ2ȡȶ
//	ADC_GetDat(CH,0xff);
//	
//	EA = 0;
//	for (i = 0 ; i <DATA_SUM ; i++ )   //ȡDATA_SUMλ׼ѹȡƽֵ
//	{
//		AD_Return += ADC_GetDat(CH,0xff);
//	}
//	EA = 1;
//	return AD_Return >> DATA_DIV;
//}
/************************************************************
 * 		:	Get_ADC10bitResult
 * ˵	:	ADCֵ
 *
 * 	:	channelADCͨţ0-7
 * 	:	ADCֵ0-1023
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
unsigned int	Get_ADC10bitResult(unsigned char channel)
{
	u16	adc;
	u8	i;

	ADC_RES = 0;
	ADC_RESL = 0;

	ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel; 
	NOP(4);			//ADC_CONTRҪ4Tܷ֮

	for(i=0; i<250; i++)		//ʱ
	{
		if(ADC_CONTR & ADC_FLAG)
		{
			ADC_CONTR &= ~ADC_FLAG;
			adc = (u16)(ADC_RES & 3);
			adc = (adc << 8) | ADC_RESL;
			return	adc;
		}
	}
	return	1024;	//,1024,õĳж
}


/************************************************************
 * 		:	DisableEEPROM
 * ˵	:	ʧEEPROM
 *
 * 	:	
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
void	DisableEEPROM(void)
{
	ISP_CONTR = 0;			//ֹISP/IAP
	ISP_CMD   = 0;			//ȥISP/IAP
	ISP_TRIG  = 0;			//ֹISP/IAP󴥷
	ISP_ADDRH = 0xff;		//0ַֽ
	ISP_ADDRL = 0xff;		//0ַֽڣָEEPROMֹ
}


/************************************************************
 * 		:	
 * ˵	:	ָEEPROM׵ַnֽڷָĻ.
 *
 * 	:	EE_addressEEPROM׵ַDataAddressݷŻ׵ַnumberֽڳ.
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
	EA = 0;		//ֹж
	ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);	//õȴʱ䣬ISP/IAPһξ͹
	ISP_READ();																	//ֽڶıʱ
	do
	{
		ISP_ADDRH = EE_address / 256;							//͵ַֽڣַҪıʱ͵ַ
		ISP_ADDRL = EE_address % 256;							//͵ַֽ
		ISP_TRIG();																//5AHA5HISP/IAPĴÿζҪ
																							//A5HISP/IAP
																							//CPUȴIAPɺ󣬲Żִг
		_nop_();
		*DataAddress = ISP_DATA;									//
		EE_address++;
		DataAddress++;
	}while(--number);

	DisableEEPROM();
	EA = 1;		//ж
}


/************************************************************
 * 		:	EEPROM_SectorErase
 * ˵	:	ַָEEPROM
 *
 * 	:	EE_address:ҪEEPROMĵַ.
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
void EEPROM_SectorErase(u16 EE_address)
{
	EA = 0;		//ֹж
																							//ֻûֽڲ512ֽ/
																							//һֽڵַַ
	ISP_ADDRH = EE_address / 256;								//ַֽڣַҪıʱ͵ַ
	ISP_ADDRL = EE_address % 256;								//ַֽ
	ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);	//õȴʱ䣬ISP/IAPһξ͹
	ISP_ERASE();																//ıʱ
	ISP_TRIG();
	_nop_();
	DisableEEPROM();
	EA = 1;		//ж
}


/************************************************************
 * 		:	EEPROM_write_n
 * ˵	:	ѻnֽдָ׵ַEEPROM.
 *
 * 	:	EE_addressдEEPROM׵ַDataAddressдԴݵĻ׵ַnumberдֽڳ.
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
	EA = 0;		//ֹж

	ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);	//õȴʱ䣬ISP/IAPһξ͹
	ISP_WRITE();																//ֽдıʱ
	do
	{
		ISP_ADDRH = EE_address / 256;							//͵ַֽڣַҪıʱ͵ַ
		ISP_ADDRL = EE_address % 256;							//͵ַֽ
		ISP_DATA  = *DataAddress;									//ݵISP_DATAֻݸıʱ
		ISP_TRIG();
		_nop_();
		EE_address++;
		DataAddress++;
	}while(--number);

	DisableEEPROM();
	EA = 1;		//ж
}


/************************************************************
 * 		:	Delay_ms
 * ˵	:	msʱ
 *
 * 	:	ms
 * 	:	
 *
 * ޸ļ¼	:	һα༭
 * 	:	־
 * 			:	2017-10-18
*************************************************************/	
void Delay_ms(unsigned char ms)		//@24MHz
{
	unsigned char i = 22,j = 128,k;
	
	for(k=0;k<ms;k++)
	{
		i = 22;
		j = 128;
		do
		{
			while (--j);
		} while (--i);
	}
}

