📄 door.c
字号:
#define _door_
#include "..\Inc\includes.h"
/*********************************************************************************************************
* 函数名称:Read_Door
*
* 功能描述:从控制读卡器读取记录
*
* 入口参数:adr:读卡器地址
*
* 说明:AA FF 08(分机地址) 01(长度) A2 FE(校验)
*
********************************************************************************************************/
void Read_Door(Uint8 adr)
{
Uint8 i;
if(adr==CARD_OUT) Task &=~ Read_OutDoor;
else Task &=~ Read_InDoor;
if(Com0Busy > 0 || (Task&Com1OrderToCom0) || (Task&Com0DataToCom1) || DoorOK==1) return;
STR0_Rec[0] = 0xAA;
STR0_Rec[1] = 0xFF;
STR0_Rec[2] = adr;
STR0_Rec[3] = 1;
STR0_Rec[4] = 0xA2;
STR0_Rec[5] = 0xAA;
for(i=1; i<5; i++)
STR0_Rec[5] ^= STR0_Rec[i];
SendStrlenToCom0(STR0_Rec,6);
if(Task&DoorSpeak)
{
Com0Busy=4;
Task &=~ DoorSpeak;
}
else Com0Busy = COMDELAY;
}
/*********************************************************************************************************
* 函数名称:Door_Speak
*
* 功能描述:控制读卡器发音
*
* 入口参数:adr:读卡器地址 cishu:发音次数 time:发音时长 jiangge:多次发音的间隔时间
*
* 说明:AA FF 08(分机地址) 04 A3 02 02 02 F8(校验)
*
********************************************************************************************************/
void Door_Speak(Uint8 adr,Uint8 cishu,Uint8 time,Uint8 jiange)
{
Uint8 i;
STR0_Rec[0] = 0xAA;
STR0_Rec[1] = 0xFF;
STR0_Rec[2] = adr;
STR0_Rec[3] = 4;
STR0_Rec[4] = 0xA3;
STR0_Rec[5] = cishu;
STR0_Rec[6] = time;
STR0_Rec[7] = jiange;
STR0_Rec[8] = 0xAA;
for(i=1; i<8; i++)
STR0_Rec[8] ^= STR0_Rec[i];
SendStrlenToCom0(STR0_Rec,9);
Task |= DoorSpeak;
}
/*********************************************************************************************************
* 函数名称:Door_Led
*
* 功能描述:控制读卡器LED灯的亮灭
*
* 入口参数:adr:读卡器地址 state:0 LED灯灭 1 LED灯亮
*
* 说明:AA FF 08(分机地址) 04 A3 02 02 02 F8(校验)
*
********************************************************************************************************/
void Door_Led(Uint8 adr,Uint8 state)
{
Uint8 i;
STR0_Rec[0] = 0xAA;
STR0_Rec[1] = 0xFF;
STR0_Rec[2] = adr;
STR0_Rec[3] = 2;
STR0_Rec[4] = 0xA5;
STR0_Rec[5] = state;
STR0_Rec[6] = 0xAA;
for(i=1; i<6; i++)
STR0_Rec[6] ^= STR0_Rec[i];
SendStrlenToCom0(STR0_Rec,7);
}
/*********************************************************************************************************
* 函数名称:ComparaCardNo
*
* 功能描述:对卡号进行权限鉴定,有权限返回1,后则返回0
*
* 入口参数:*p
*
* 说明:
*
********************************************************************************************************/
Uint16 ComparaCardNo(Uint8 *p)
{
Uint16 k;
for(k=0; k<MaxCard; k++)
{
if(CardNo[k][0]==1) //该卡号已被启用
{
if(*p==CardNo[k][1]&&*(p+1)==CardNo[k][2]&&*(p+2)==CardNo[k][3]&&*(p+3)==CardNo[k][4])
return 1;
}
}
return 0;
}
/*********************************************************************************************************
* 函数名称:CtrlDoor
*
* 功能描述:控制开关和关门
*
* 入口参数:state Open:1 Close:0
*
* 说明:
*
********************************************************************************************************/
void CtrlDoor(Uint16 state)
{
Uint16 tongdao;
tongdao = (1<<(DODOOR));
if(state==1) OutStates = OutStates | tongdao;
else OutStates = OutStates & (~tongdao);
ctrl(OutStates);
}
/*********************************************************************************************************
* 函数名称:DealDoorAlarm
*
* 功能描述:处理门报警(有人进门,出门(告警未解除提示),非法入侵,开、关门失败,告警信息保存等。
*
* 入口参数:
*
* 说明:
*
********************************************************************************************************/
void DealDoorAlarm(void)
{
switch(DoorAlarm_ID)
{
case 0x01: DoorAlarm &=~ (0x01);break;
case 0x02: DoorAlarm &=~ (0x02);break;
case 0x07: DoorAlarm &=~ (0x04);break;
case 0x12: DoorAlarm &=~ (0x10);break;
case 0x13: DoorAlarm &=~ (0x20);break;
default: break;
}
}
/*********************************************************************************************************
* 函数名称:Deal_DoorCommand
*
* 功能描述:处理上位机发给门禁的命令、响应
*
* 入口参数:
*
* 说明:
*
********************************************************************************************************/
void Deal_DoorCommand(Uint16 cid2)
{
switch(cid2)
{
case 0x43: SendDoorState(0); break;
case 0x44: SendDoorAlarm(); break;
case 0x45: YaoKongDoor(); break;
case 0x47: SendDoorSet(0); break;
case 0x49: SetDoor(); break;
default: ErrorDeal(0x04,ADRDOOR,0xB0,COM1); break;
}
}
/*********************************************************************************************************
* 函数名称:SendDoorState
*
* 功能描述:发送门状态
*
* 入口参数:k(为0 被动响应,否则主动上传)
*
* 说明:
*
********************************************************************************************************/
void SendDoorState(Uint8 k)
{
STR1_Rec[0] = SOI;
STR1_Rec[1] = ASCII[VER>>4];
STR1_Rec[2] = ASCII[VER&0x0f];
STR1_Rec[3] = ASCII[ADRDOOR>>4];
STR1_Rec[4] = ASCII[ADRDOOR&0x0f];
STR1_Rec[5] = ASCII[0xB0>>4];
STR1_Rec[6] = ASCII[0xB0&0x0f];
STR1_Rec[7] = ASCII[k>>4];
STR1_Rec[8] = ASCII[k&0x0f];
GetCheckLength(STR1_Rec,6); //数据长度校验
STR1_Rec[13] = ASCII[DATAFLAG>>4]; //DATAFLAG
STR1_Rec[14] = ASCII[DATAFLAG&0x0f];
STR1_Rec[15] = ASCII[0];
STR1_Rec[16] = ASCII[1-(DISam_Value[DIDOOR]&0x0f)];
STR1_Rec[17] = ASCII[0];
STR1_Rec[18] = ASCII[1-(DISam_Value[DILOCK]&0x0f)];
GetCheckSum(STR1_Rec,18); //数据包和校验
STR1_Rec[23]= EOI;
SendStrlenToCom1(STR1_Rec,24);
}
void SendDoorAlarm(void)
{
switch(DoorAlarm_ID)
{
case 0x01:break;//开门失败
case 0x02:break;//关门失败
case 0x07:break;//无权限
case 0x11:break;//内存已经满
}
/*********************************************************************************************************
* 函数名称:YaoKongDoor
*
* 功能描述:远程遥控开、关门
*
* 入口参数:
*
* 说明:
*
********************************************************************************************************/}
void YaoKongDoor(void)
{
Uint16 i;
i = Combine(STR1_Rec[13],STR1_Rec[14]);
if(i==0)//基站封网
{
//DoorAlarm |= 0x20;
//DoorAlarm_ID = 0x13;
DoorOK = 1;
}
else if(i==0xff)
{
DoorOK= 0;
}
else if(i==0x10)
{
CtrlDoor(OPEN);
HaveDoorRight = 1;
OpenDoorDelay = OPENDOORDELAY;
}
else if(i==0x1f)
{
CtrlDoor(CLOSE);
CloseDoorDelay = CLOSEDOORDELAY;
}
ErrorDeal(0,ADRDOOR,0xB0,COM1);
}
/*********************************************************************************************************
* 函数名称:SendDoorSet
*
* 功能描述:上传有权限的卡号
*
* 入口参数:
*
* 说明:
*
********************************************************************************************************/
void SendDoorSet(Uint8 k)
{
Uint16 i;
STR1_Rec[0] = SOI;
STR1_Rec[1] = ASCII[VER>>4];
STR1_Rec[2] = ASCII[VER&0x0f];
STR1_Rec[3] = ASCII[ADRDOOR>>4];
STR1_Rec[4] = ASCII[ADRDOOR&0x0f];
STR1_Rec[5] = ASCII[0xB0>>4];
STR1_Rec[6] = ASCII[0xB0&0x0f];
STR1_Rec[7] = ASCII[k>>4];
STR1_Rec[8] = ASCII[k&0x0f];
k=0;
for(i=0; i<MaxCard; i++)
{
if(CardNo[i][0]==1) k += 1;
}
GetCheckLength(STR1_Rec,k*8+4); //数据长度校验 12
STR1_Rec[13] = ASCII[DoorOK>>4]; //基站是否封网
STR1_Rec[14] = ASCII[DoorOK&0x0f];
STR1_Rec[15] = ASCII[k>>4]; //维护卡号个数
STR1_Rec[16] = ASCII[k&0x0f];
k=0;
for(i=0; i<MaxCard; i++)
{
if(CardNo[i][0]==1)
{
STR1_Rec[k*4+17] = CardNo[i][1];
STR1_Rec[k*4+18] = CardNo[i][2];
STR1_Rec[k*4+19] = CardNo[i][3];
STR1_Rec[k*4+20] = CardNo[i][4];
k += 1;
}
}
i = (k-1)*4+20;
GetCheckSum(STR1_Rec,i); //数据包和校验
STR1_Rec[i+4]= EOI;
SendStrlenToCom1(STR1_Rec,i+5);
}
/*********************************************************************************************************
* 函数名称:SetDoor
*
* 功能描述:设置有权限的卡号
*
* 入口参数:
*
* 说明:
*
********************************************************************************************************/
void SetDoor(void)
{
Uint16 k,i;
Uint8 *p = CardNo[0];
DoorOK = Combine(STR1_Rec[13],STR1_Rec[14]);//门禁系统是否启用
i = Combine(STR1_Rec[15],STR1_Rec[16]); //维护的卡号数
if(i > MaxCard)
{
ErrorDeal(0x11,ADRDOOR,0xB0,COM1);
return;
}
for(k=0; k < MaxCard; k++)
{
if(k<i)
{
CardNo[k][0]=1;
CardNo[k][1]=Combine(STR1_Rec[17],STR1_Rec[18]);
CardNo[k][2]=Combine(STR1_Rec[19],STR1_Rec[20]);
CardNo[k][3]=Combine(STR1_Rec[21],STR1_Rec[22]);
CardNo[k][4]=Combine(STR1_Rec[23],STR1_Rec[24]);
}
else CardNo[k][0]=0;
}
i = MaxCard * 5;
for(k=0; k<i; k++)
{
II3WR(AT24C256,I2C_Card + k,*(p+k));
}
ErrorDeal(0,ADRDOOR,0xB0,COM1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -