📄 port.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 + -