⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 port.c

📁 名厂车载GPS通信终端
💻 C
字号:
#define PORT_GLOBAL              1
#include "includes.h"

#pragma ROM port_validtime[];
//--------------------------------0,1,2, 3, 4, 5, 6, 7, 8, 9--------
const uchar far port_validtime[]={2,4,30,20,20,10,15,10,10,4};

TIMER *Sample_Io_Timer;
TIMER *Sample_Ad_Timer;
TIMER *Output_Timer;

typedef struct
{
	uchar upload;
	uchar download;
	uchar up;
	uchar down;
	uint  time;
	uchar status;
	uchar restore;
}_OUTPUT_STRUCT;
_OUTPUT_STRUCT out_put[MAX_OUTPUT_NUM];
//_OUTPUT_STRUCT out_put_bak[MAX_OUTPUT_NUM];//

void Init_Port(void)
{
	uchar i;
	
	for(i=0; i<MAX_PORT_NUM; i++)
	{
		port[i].prestatus = 0;
		port[i].status    = 0;
		port[i].validtime = 0;
	}
	Port_Out(LED_PORT,10,10,0xffff,_FLASH,0xff);
	Port_Out(SHUTDOWN_PORT,0,0,0xffff,PORT_LOW,0xff);
	Sample_Io_Timer = Create_Timer(Sample_Io_Proc);
	Sample_Ad_Timer = Create_Timer(Sample_Ad_Proc);
	Output_Timer    = Create_Timer(Output_Proc);
	Start_Timer(Sample_Ad_Timer,6,SECOND);
	Start_Timer(Sample_Io_Timer,1,HMSEL);
	Start_Timer(Output_Timer,1,HMSEL);
	shut_down_status = 0;
	shut_down_led    = 0;
	need_pull_led    = 0;
}

void Shut_Power_Down(void)
{
	shut_down_status = 1;
	shut_down_led    = 1;
	Port_Out(SHUTDOWN_PORT,10,10,90,_FLASH,1);
}

void Shut_Power_On(void)
{
	shut_down_status = 0;
	shut_down_led    = 0;
	Port_Out(SHUTDOWN_PORT,0,0,0xffff,PORT_LOW,0xff);
}

void Put_Led_Flash(void)
{
	if((out_put[LED_PORT].status&0x7f)!=_FLASH)
	{
		Port_Out(LED_PORT,10,10,0xffff,_FLASH,0xff);
	}
}

void Put_Led_High(void)
{
	if((out_put[LED_PORT].status&0x7f)!=PORT_HIGH)
	{
		Port_Out(LED_PORT,0,0,0xffff,PORT_HIGH,0xff);
	}
}

void Put_Led_Low(void)
{
	if((out_put[LED_PORT].status&0x7f)!=PORT_LOW)
	{
		Port_Out(LED_PORT,0,0,0xffff,PORT_LOW,0xff);
	}
}

void control_port(uchar num,uchar attrib)
{
	switch(num)
	{
	case 0:
		ALARM_LED    = attrib;
		break;
	case 1:
		SHUTDOWN_CON   = attrib;
		//shut_down_led  = !attrib;
		break;
	}
}

void Port_Out(uchar portid,uchar up,uchar down,uint time,uchar attrib,uchar last)
{
	uchar temp;
	
	temp = 0;
	if(last ==1)
	{
		out_put[portid].restore   = PORT_HIGH;
		temp                      = NEED_RESTORE;
	}
	else if(last==0)
	{
		out_put[portid].restore = PORT_LOW;
		temp                    = NEED_RESTORE;
	}
	out_put[portid].upload   = up;
	out_put[portid].download = down;
	out_put[portid].up       = up;
	out_put[portid].down     = down;
	out_put[portid].status   = attrib|temp;
	out_put[portid].time     = time;
	
}

void Output_Proc(void)
{
	uchar i;
	uchar temp;
	Start_Timer(Output_Timer,1,HMSEL);
	
	for(i=0; i<MAX_OUTPUT_NUM; i++)
	{
		temp = out_put[i].status&0x7f;
		switch(temp)
		{
		case 0:
            if(i==1)
            {
				shut_down_led = 0;
            }
            control_port(i,VOL_LOW);
			break;
		case 1:
            if(i==1)
            {
				shut_down_led = 0;
            }
            control_port(i,VOL_HIGH);
			break;
		case 2:
            if(out_put[i].up!=0)
            {
				out_put[i].up--;
				control_port(i,VOL_HIGH);
            }
            else
            {
				if(out_put[i].down!=0)
				{
					control_port(i,VOL_LOW);
					out_put[i].down--;
				}
				else
				{
					if(out_put[i].time!=0xffff&&out_put[i].time!=0)
					{
						out_put[i].time --;
					}
					if(out_put[i].time==0)
					{
						if(out_put[i].status&NEED_RESTORE)
						{
							out_put[i].status   = out_put[i].restore;
							out_put[i].up       = out_put[i].upload;
							out_put[i].down     = out_put[i].download;
						}  
					}
					else
					{
						out_put[i].up   = out_put[i].upload;
						out_put[i].down = out_put[i].download;
					}
				}
            }
			break;
		default:
			break;
		}
	}
}

void Sample_Ad_Proc(void)
{
	static uchar count=0;
	//static uchar count1=0;
	static uchar mp_count=0;
	static uchar mpa_start=0;
	//uint   bat_voltage;
	WORD   voltage;
	WORD   main_voltage;  //added by leon for main power alarm!
	
	Start_Timer(Sample_Ad_Timer,2,SECOND);
	InitADC(1,10);
	StartADC();
	//   clr_watchdog();
	while(Adc_Flag!=AD_COMPELETE)            //bak power ad test//
	{  
		//     clr_watchdog();
	}
	voltage = (WORD)((DWORD)(((DWORD)(Adc_Value))*((DWORD)(1617)))/1024); //amp 10 times;
	if(voltage<=710)
	{
        BAT_CON = VOL_HIGH;
	}
	if(voltage>=805)
	{
        BAT_CON = VOL_LOW;
	}
	InitADC(3,10);
	StartADC();
	//   clr_watchdog();
	while(Adc_Flag!=AD_COMPELETE)              //main power ad test//
	{  
		//     clr_watchdog();
	}
	main_voltage = (WORD)((DWORD)(((DWORD)(Adc_Value))*((DWORD)(4290)))/1024)+70; //amp 100 times//
	//#ifdef DEBUG_AT
	//Uart1Send("test voltage "); //masked by leon 
	//Uart1Word(power_voltage);
	//#endif 
//	if(main_voltage <= voltage)  //main power alarm!//Removed by lxo 0224011
	if(((main_voltage-70) <= voltage)&&(main_voltage< 800))  //main power alarm!//Added by lxo 0224012
	{
#ifdef DEBUG_AT
		//Uart1Send("Main power cutted!");
#endif

		if(mp_count!=0xff) mp_count++;
		if(mp_count==5)
		{
			Set_Word_Bit(&alarm_flag,_POWER_ALM);
			Send_Taskmsg(AlarmTaskid,STATUSCHANGE,NULL);
		}
	}
	else
	{
		mp_count =0;
		//alarm_remove(_POWER_ALM);   //added by leon 051110
	}
	if(main_voltage<(save.basevalue.low_voltage*100))
	{   
		//count1 = 0;
		//Uart1Send("voltage low");
		if(count!=0xff)  count++;
		if(count==20)
		{
			Set_Word_Bit(&alarm_flag,_VOLTAGE_ALM);
			Send_Taskmsg(AlarmTaskid,STATUSCHANGE,NULL);
		}
	}
	else
	{  
		//if(count1!=0xff)
		//	count1++;
		//Uart1Send("voltage ok ");  //masked by leon
		//if(count1>=20) 
		count = 0;
		//alarm_remove(_VOLTAGE_ALM);  //added by leon 051110
	}
}


uchar Read_Port(uchar port_num)
{
	uchar in;
	
	switch(port_num) 
	{
	case _CARLED    : 
		in = (!CAR_LED)^save.basevalue.io.bit.carled;
		break;    
	case _TIMEKEEPER:
		in = (!TIME_KEEPER)^save.basevalue.io.bit.keep;
		break;
	case _ULTRAS    :
		in = (!ULTRAS)^save.basevalue.io.bit.ultra;
		break;
	case _VIBRATION :
		in = (!VIBRATION)^save.basevalue.io.bit.shake;
		break;
	case _DOOR      :
		in = (!DOOR_IN)^save.basevalue.io.bit.door;
		break;
	case _SOS       :
		in = (!SOS_IN);
		break;
	case _ACC       :
		in = (!ACC_IN);
		break;
	case _ENGINE    :
		in = (!ENGINE_HOOD)^save.basevalue.io.bit.engine;
		break;
	case _BAKUP     :
		in = (!BAKUP_CHEST)^save.basevalue.io.bit.bak;
		break;
	case _RAIN      :
		in = (!RAIN_BRUSH)^save.basevalue.io.bit.rainer;
		break;
	default:
		break;
	}  
	return in;
}     

void Set_Alarmflag(uchar port_num)
{
	switch(port_num) 
	{
	case _CARLED    : 
		break;    
	case _TIMEKEEPER:
		break;
	case _ULTRAS    :
		if(save.basevalue.mode.bit.defend)
		{
			Set_Word_Bit(&alarm_flag,_BROKE_ALM);
		}
		break;
	case _VIBRATION :
		if(save.basevalue.mode.bit.defend)
		{
			Set_Word_Bit(&alarm_flag,_DRAG_ALM );
		}
		break;
	case _DOOR      :
		
		break;
	case _SOS       :
		if(save.basevalue.need_service==1)
		{
            Uart1Send("sos isnot ok ");
            break;
		}
		if(need_pull_led==0)
		{
			need_pull_led = 1;
			Put_Led_Low();
		}
		Set_Word_Bit(&alarm_flag,_ROP_ALM);
		break;
	case _ACC       :
		break;
	case _ENGINE    :
		if(save.basevalue.mode.bit.defend)Set_Word_Bit(&alarm_flag,_ENGINE_ALM);
		break;
	case _BAKUP     :
		if(save.basevalue.mode.bit.defend)Set_Word_Bit(&alarm_flag,_BAK_ALM);
		break;
	case _RAIN      :
		break;
	default:
		break;
	} 
}

void Sample_Io_Proc(void)
{
	uchar i;
	uchar flag;
	uchar nowstatus;
	
	flag = 0;
	
	Start_Timer(Sample_Io_Timer,1,HMSEL);
	
	for(i=0; i<MAX_PORT_NUM; i++)
	{
		nowstatus = Read_Port(i);
		if(port[i].prestatus!=nowstatus)
		{
			port[i].validtime = 0;
		}
		else
		{
			if(port[i].validtime!=0xff)port[i].validtime ++;
		}
		port[i].prestatus = nowstatus;                        
		if(port[i].validtime>=port_validtime[i]&&port[i].status != port[i].prestatus)
		{
			port[i].status = port[i].prestatus;
			if(i==_ACC)
			{
				if(port[i].status==0)
				{
#ifdef DEBUG_AT
					Uart1Send("Send_ACC_OFF");
#endif
					Send_Taskmsg(GprsTaskid,SEND_ACC_OFF,NULL);
				}
				else
				{
#ifdef DEBUG_AT
					Uart1Send("Send_ACC_ON");
#endif
					Send_Taskmsg(GprsTaskid,SEND_ACC_ON,NULL);
				}
			}
			else if(port[i].status==1) 
			{
				flag = 1;
				Set_Alarmflag(i);
			}
		}
	}
	if(flag==1) Deal_Alarm();
}     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -