📄 admcptcl.c
字号:
/*******************************************************************************
* 版权所有 (C)2005,深圳豪恩科技有限公司
*
* 文件名称: main.C
* 文件标识:
* 内容摘要: LHD6000主板主芯片程序,2005.12.05开始
* 其它说明:
* 当前版本: 0.000
* 作 者: 涂常亮(豪恩科技研发中心安全主机组)
* 完成日期: 2005.03.28
*
* 修改纪录1:
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* 修改纪录2:
*******************************************************************************/
//#define USE_EMULATE
#ifndef AdemcoProtocol_C
#define AdemcoProtocol_C
#include "reg54.h"
#include <intrins.h>
#include "EEPROM.H"
//c_auiContactIDCode[],CONTACTID_INDEX 的宏定义在头文件"AdmcPtcl.H"中
#include "AdmcPtcl.H"
#include "Head.H"
/*******************************************************************************
* 函 数 名:
* 功 能:
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
*
*******************************************************************************/
//24C04存放是否使用ContactID的位置定义为 EEPROM_ADD_CONTACT_ID_SEL
unsigned char idata g_ucAdemcoEvtSend = 0;//原来为AdemcoAlarm()的静态变量,从 g_ucAdemcoEvts 解析出来为 4+1 事件码
///事件发送变量
unsigned char idata g_ucAdmcCheckSum;//原来为AdemcoAlarm()的静态变量,//不需初始化
///校验和
unsigned char idata g_ucTryTimes_AdmcAlm = 0;//原来为AdemcoAlarm()的静态变量,
///尝试次数
bit g_FlagRdPrtclSel = 0;
///协议选择
static unsigned char s_ucVar_CntctID;
///ContactID静态变量
extern bit g_FlagAdmcAlmg;
///安定宝正在报警
extern bit g_FlagDialNextDigit;
///正在拨下一个数字标志位
extern unsigned char idata g_ucAdemcoEvts; //记录防区号,将来记录报警个数
///记录安定宝(4+1或ContactID)事件号
extern unsigned char idata g_ucAlarmStage;
///报警某个阶段
extern unsigned char idata g_ucLastBackRing;
///回铃音暂存变量
extern unsigned char idata g_ucUserIDH;
extern unsigned char idata g_ucUserIDL;
///用户密码占两个字节
extern unsigned char idata g_ucDialNextDigit;
///要拨的下一个数字
extern bit data_receiving;
///正在接收数据标志位
extern bit g_FlagPrtcl41;//24C04地址定义EEPROM_ADD_FLAG41_SEL
///选择4+1还是ContactID协议
//外部函数
void SendHT9200(unsigned char ucDataHT9200);///DTMF发码
void Hangup(void); ///挂机
unsigned char ReadByte(unsigned int uiAddRead);
///从24C04读一个字节
unsigned char CalcZoneType(unsigned char ucZoneNum);
///根据防区号得出防区类型
bit WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite); //24C04.C;写入成功返回0
///写一个字节,写地址为整形数据
bit IsBCD(unsigned char ucNum_IsBCD);
///判断是否为BCD码
/*unsigned char PageFill(unsigned char const idata ucDataPgFill,
unsigned int uiAddStart_Fill,
unsigned char ucLengthFill);*/
void ContactID(void);
///ContactID函数
void Ademco41(void);
///4+1函数
void AdemcoAlarm(void);
///向接警中心报警
/*******************************************************************************
* 函 数 名: void ContactID(void)
* 功 能: 按照CCCC+18+Q+EEE+GG+ZZZ+X格式发送ADEMCO ContactID信息。
* 输入参数: 无 ///但是有全局变量g_ucAlarmStage
* 输出参数: 无 按照发送阶段发送ContactID码
* 返 回 值: 无
* 其它说明:并不是完全按照这种格式来的,不懂。 ///080506
* 修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
*
*******************************************************************************/
void ContactID(void)
{
unsigned char ucTmp_CntctID; ///ContactID函数的一个中间变量
bit FlagErr_CtctID; ///出错标志位
switch (g_ucAlarmStage)///阶段
{
//数字之间要有间隔,DTMF暂停
case ADEMCO_SEND_FMT: //发送 18 //case 8:
{
SendHT9200(0x01);
g_ucAdmcCheckSum++;
g_ucAlarmStage++; ///报警阶段
}
break;
case ADEMCO_SEND_FMT + 2: //10(0x0A)
{
SendHT9200(0x08);
g_ucAdmcCheckSum += 8;
g_ucAlarmStage++;
//预先读出,减少读取24C04对时间的影响,因为别的部分可能写过24C04.
FlagErr_CtctID = 0;
if (MAX_CNTCT_EVT_NUM <= g_ucAdemcoEvtSend)
{
g_ucAdemcoEvtSend = 0;///发的个数超过了最大的ContactID事件号
}
do{
if (FlagErr_CtctID)//放在判断里面,可以顺便再次检查 g_ucAdemcoEvts,也好排版
{ ///FlagErr_CtctID=1,表示什么意思。
g_ucAdemcoEvts--; ///???
g_ucAdemcoEvtSend++; ///???
if (MAX_CNTCT_EVT_NUM <= g_ucAdemcoEvtSend)
{
g_ucAdemcoEvtSend = 0;
}
}
if ((0 != g_ucAdemcoEvts) && (MAX_CNTCT_EVT_NUM >= g_ucAdemcoEvts))
{
;
}
else
{
//后面处理和 Ademco41() 出错处理一样 if (8 <= g_ucAdemcoEvtSend)
g_ucAdemcoEvts = 0;
Hangup();
return;
}
s_ucVar_CntctID = ReadByte(EEPROM_ADD_CNTCT_EVT_START
+g_ucAdemcoEvtSend*BYTES_PER_CNTCT_EVTS);
///读出事件号///单字节///b7b6是,b5b4b3b2b1b0是事件索引号
ClrWdt();
//高两位只能是01或02,b0~b5 是事件索引号
///高两位的01或02表示什么意思?
FlagErr_CtctID = (bit) (( (( (bit)(s_ucVar_CntctID&0x80))
== ((bit)(s_ucVar_CntctID&0x40))) ) ///高两位相同都为0或都为1
|| ( (0 == (s_ucVar_CntctID&0x3F)) ///
|| (MAX_CONTACTID_INDEX+1 < (s_ucVar_CntctID&0x3F)) ));//索引号写入前加了一
}while(FlagErr_CtctID);///只要有错则死循环
}
break;
//发送一个事件标志码,1是新事件或撤防,3是新的恢复事件或布防
case CONTACTID_SEND_MARK_EVT: //12(0x0C)
{ ///发送一位事件标识码
if (01 == (s_ucVar_CntctID>>6))
{
ucTmp_CntctID = 0x01; ///b7b6=01代表什么意思:新事件或撤防
}
else //if (0x02 == (s_ucVar_CntctID>>6))
{
ucTmp_CntctID = 0x03; ///b7b6=11代表什么意思:恢复事件或布防
}
//else
SendHT9200(ucTmp_CntctID);///发送事件标识码
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;
//格式17(4+1)或27(4+2)之间的停顿间隔, 下面3个 case 一个 break;
case CONTACTID_SEND_EVT1: //14(0x0E)
{ ///发送事件代码1
s_ucVar_CntctID &= 0x3F; ///将高两位清零,将事件标识码去掉
s_ucVar_CntctID--;//24C04 存储时从1开始
///24C04存储应该是从0开始吧
ucTmp_CntctID = c_auiContactIDCode[s_ucVar_CntctID]>>8;///为什么要右移8位
if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A; ///不懂
}
SendHT9200(ucTmp_CntctID);
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;
case CONTACTID_SEND_EVT2: //16(0x10)
{
s_ucVar_CntctID = c_auiContactIDCode[s_ucVar_CntctID];
ucTmp_CntctID = s_ucVar_CntctID >> 4; ///???
//ucTmp_CntctID = ((unsigned char)(c_auiContactIDCode[s_ucVar_CntctID])) >> 4;
if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A; ///???
}
SendHT9200(ucTmp_CntctID);
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;
case CONTACTID_SEND_EVT3: //18(0x12)
{
ucTmp_CntctID = s_ucVar_CntctID & 0x0F;
//ucTmp_CntctID = c_auiContactIDCode[s_ucVar_CntctID] & 0x0F;
if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A;
}
SendHT9200(ucTmp_CntctID);
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;
case CONTACTID_SEND_SUB_SYS1: //20(0x14)
/*{ //暂时不使用子系统号,发送为 00
ucTmp_CntctID = 0;
if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A;
}
SendHT9200(ucTmp_CntctID);
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;*/
case CONTACTID_SEND_SUB_SYS2: //22(0x16)
{
//ucTmp_CntctID = 0;//暂时不使用子系统号,发送为 00
//if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A;
}
SendHT9200(ucTmp_CntctID); ///发送的不是0x0A吗,怎么变成了0x00呢
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;
case CONTACTID_SEND_ZN_NUM1:
{
//ucTmp_CntctID = 0; //没有这么防区数
//if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A;
}
SendHT9200(ucTmp_CntctID);
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
//预先读出防区号/操作者,减少读取24C04对时间的影响,因为别的部分可能写过24C04.
s_ucVar_CntctID = ReadByte(EEPROM_ADD_CNTCT_EVT_START
+g_ucAdemcoEvtSend*BYTES_PER_CNTCT_EVTS+1);
///g_ucAdemcoEvtSend发送的第几个事件号
//因为别的部分可能写过24C04.
ClrWdt();
/*if (0 == CalcZoneType(s_ucVar_CntctID))
{
#define CONTACTID_RD_ZN_ERR_SET_ZERO
//出错发送下一个,或者防区号置为00.
#ifndef CONTACTID_RD_ZN_ERR_SET_ZERO
//出错发送下一个
if ((0 != g_ucAdemcoEvts) && (MAX_CNTCT_EVT_NUM >= g_ucAdemcoEvts))
{
g_ucAdemcoEvts--;
g_ucAdemcoEvtSend++;
if (MAX_CNTCT_EVT_NUM <= g_ucAdemcoEvtSend)
{
g_ucAdemcoEvtSend = 0;
}
g_ucAlarmStage = ADEMCO_END;
}
else
{ //和 Ademco41() 出错处理一样 if (8 <= g_ucAdemcoEvtSend)
g_ucAdemcoEvts = 0;
Hangup();
return;
}
#else
//发送 00 .
s_ucVar_CntctID = 0;
#endif
}*/
}
break;
case CONTACTID_SEND_ZN_NUM2:
{
ucTmp_CntctID = s_ucVar_CntctID >> 4;
if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A;
}
SendHT9200(ucTmp_CntctID);
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;
case CONTACTID_SEND_ZN_NUM3:
{
ucTmp_CntctID = s_ucVar_CntctID & 0x0F;
if (0 == ucTmp_CntctID)
{
ucTmp_CntctID = 0x0A;
}
SendHT9200(ucTmp_CntctID);
g_ucAdmcCheckSum += ucTmp_CntctID;
g_ucAlarmStage++;
}
break;
//事件码之间的停顿
case CONTACTID_SEND_ZN_NUM3 + 1:
g_ucAlarmStage = ADEMCO_SEND_CHK_SUM - 1;
//break;//不用 break;
case ADEMCO_SEND_FMT + 1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -