📄 admcptcl.c
字号:
case ADEMCO_SEND_FMT + 3:
case CONTACTID_SEND_MARK_EVT + 1:
case CONTACTID_SEND_EVT1 + 1:
case CONTACTID_SEND_EVT2 + 1:
case CONTACTID_SEND_EVT3 + 1:
case CONTACTID_SEND_SUB_SYS1 + 1:
case CONTACTID_SEND_SUB_SYS2 + 1:
case CONTACTID_SEND_ZN_NUM1 + 1:
case CONTACTID_SEND_ZN_NUM2 + 1:
SendHT9200(0xFF);
g_ucAlarmStage++;
break;
default:
if ((MAX_TIMES_ADEMCO_TRY <= g_ucTryTimes_AdmcAlm) || (0 == g_ucAdemcoEvts))
{ //同上不考虑出现忙音(测试程序发出15个数据包,只测试了一次)///g_ucAdemcoEvts在这里是什么意思
Hangup();
}
else
{
g_ucAlarmStage = ADEMCO_START; ///重新开始
g_ucTryTimes_AdmcAlm++;
}
break;
} //switch (g_ucAlarmStage) 结束
}
/*******************************************************************************
* 函 数 名: void Ademco41(void)
* 功 能: ///按照4+1协议格式发送4+1通信码
///为什么没有发送校验位。
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
*
*******************************************************************************/
void Ademco41(void)
{
//unsigned char ucTmp_AdmcAlm;
bit FlagErr_Admc41; ///4+1发送错误的标志 ///中间变量也不要,就用一个全局变量
switch (g_ucAlarmStage)
{
//数字之间要有间隔,DTMF暂停
case ADEMCO_SEND_FMT: ///8
{
SendHT9200(0x01);///发送1
g_ucAdmcCheckSum++;
g_ucAlarmStage++;///加了一个1,执行case ADEMCO_SEND_FMT+1:发送数字之间的间隔SendHT9200(0xFF)
}
break;
case ADEMCO_SEND_FMT + 2:
{
SendHT9200(0x07);
g_ucAdmcCheckSum += 7; //发送7
g_ucAlarmStage++;
//FlagErr_Admc41 = 0;
do
{
s_ucVar_CntctID = ReadByte(EEPROM_ADD_CNTCT_EVT_START
+g_ucAdemcoEvtSend);///g_ucAdemcoEvtSend是发送的个数
///读出事件号
FlagErr_Admc41 = (0 != (s_ucVar_CntctID & 0xF0)); ///高四位如果不全为0,则表示出错
if (FlagErr_Admc41) ///如果有错,怎么办
{
g_ucAdemcoEvts--; ///???
if (0 == g_ucAdemcoEvts)
{
Hangup(); ///错了g_ucAdemcoEvts次就挂机。
return;
}
g_ucAdemcoEvtSend++;///???
if (MAX_41EVT_NUM <= g_ucAdemcoEvtSend)
{
g_ucAdemcoEvtSend = 0;
}
}
}while (FlagErr_Admc41);///只要有错
///对了就退出
}
break;
case ADEMCO41_SEND_EVENT:
{
//SendHT9200(g_ucAdemcoEvtSend + 1);
//g_ucAdmcCheckSum += g_ucAdemcoEvtSend + 1;
SendHT9200(s_ucVar_CntctID);///经过前面的一番处理,得到了正确的事件号
g_ucAdmcCheckSum += s_ucVar_CntctID;
g_ucAlarmStage++;
}
break;
//发送事件码之后的停顿,并将下一次指向校验和
case ADEMCO41_SEND_EVENT + 1://13(0x0D)
g_ucAlarmStage = ADEMCO_SEND_CHK_SUM - 1;
//break;//不用 break;
//格式17(4+1)之间的停顿间隔
case ADEMCO_SEND_FMT + 1: //9
case ADEMCO_SEND_FMT + 3: //11(0x0B)
//事件码之间的停顿
SendHT9200(0xFF);
g_ucAlarmStage++;
break;
default:
if ((MAX_TIMES_ADEMCO_TRY <= g_ucTryTimes_AdmcAlm) || (0 == g_ucAdemcoEvts))
{ //同上不考虑出现忙音(测试程序发出15个数据包,只测试了一次)
///协议发送的尝试次数超过了最大次数或者g_ucAdemcoEvts减为0了
Hangup();
}
else
{
g_ucAlarmStage = ADEMCO_START; ///重新发一遍
g_ucTryTimes_AdmcAlm++;
}
break;
} //switch (g_ucAlarmStage) 结束
}
/*******************************************************************************
* 函 数 名: void AdemcoAlarm(void)
* 功 能: 拨号部分及摘机由 PhoneAlarm() 完成
///接警中心报警:发送协议的用户码和校验码,与Ademco41和ContactID共同完成整个接警协议的发送
///Ademco41发送4+1协议的格式识别和事件标识码,ContactID发送ContactID协议的格式识别和事件标识码
///AdemcoAlarm发送协议的用户码和校验码(4+1和ContactID相同的部分)
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
*
*******************************************************************************/
void AdemcoAlarm(void)
{
/*static UChar g_ucAdemcoEvtSend; //分为4+1和 ContactID两部分,要改为全局变量
static UChar g_ucTryTimes_AdmcAlm = 0;
static UChar g_ucAdmcCheckSum = 0;*/
unsigned char ucTmp_AdmcAlm; ///中间变量
unsigned char ucTryTms; ///尝试次数
bit FlagRdErr; ///出错标志
bit FlagPrePrtcl41; ///4+1标志
//不再需要"||"后面的判断 ?? .
///如果使用两种协议,后面的(!g_FlagPrtcl41)应该不要????
if ((0 != g_ucAdemcoEvts) || ((ADEMCO_SEND_FMT < g_ucAlarmStage) && (!g_FlagPrtcl41)))
{ ///g_ucAdemcoEvts不为0,g_ucAlarmStage大于ADEMCO_SEND_FMT,并且是ContactID协议
if (g_FlagAdmcAlmg) //在向Ademco685 发送报警信息
{ ///正在向接警中心发送报警
if (g_FlagDialNextDigit
|| ((3 == g_ucLastBackRing) && (ADEMCO_WAIT_WAIT_ACK == g_ucAlarmStage)))
{ ///正在拨下一个数字或(等待确认回铃)
switch (g_ucAlarmStage)
{
case ADEMCO_START_SEND_ID1:///开始发送ID//0
EX1 = 0; ///停止检测回铃音
data_receiving = 0;
g_ucLastBackRing = 0;
ucTmp_AdmcAlm = g_ucUserIDH >> 4;///g_ucUserIDH用户ID号
//g_ucAdmcCheckSum = ucTmp_AdmcAlm;
// !! 可删除为0的判断,SendHT9200()会处理
if (0 == ucTmp_AdmcAlm)
{
ucTmp_AdmcAlm = 0x0A; ///???
}
SendHT9200(ucTmp_AdmcAlm); // ? 这条语句不用ucTmp_AdmcAlm倒省空间
g_ucAdmcCheckSum = ucTmp_AdmcAlm;
/*SendHT9200(g_ucUserIDH >> 4);
if (0 == (g_ucUserIDH >> 4))
{
g_ucAdmcCheckSum += 0x0A;
}
else
{
g_ucAdmcCheckSum += (g_ucUserIDH >> 4);
}*/
g_ucAlarmStage++;
break;
case ADEMCO_START_SEND_ID2: ///2
ucTmp_AdmcAlm = g_ucUserIDH & 0x0F;
//g_ucAdmcCheckSum += ucTmp_AdmcAlm;
if (0 == ucTmp_AdmcAlm)
{
ucTmp_AdmcAlm = 0x0A; ///为什么赋值0x0A
}
SendHT9200(ucTmp_AdmcAlm);
g_ucAdmcCheckSum += ucTmp_AdmcAlm;
g_ucAlarmStage++;
break;
case ADEMCO_START_SEND_ID3:
ucTmp_AdmcAlm = (g_ucUserIDL >> 4);
//g_ucAdmcCheckSum += ucTmp_AdmcAlm;
if (0 == ucTmp_AdmcAlm)
{
ucTmp_AdmcAlm = 0x0A;///为什么为0就要赋值0x0A
}
SendHT9200(ucTmp_AdmcAlm);
g_ucAdmcCheckSum += ucTmp_AdmcAlm;
g_ucAlarmStage++;
break;
case ADEMCO_START_SEND_ID4:
ucTmp_AdmcAlm = g_ucUserIDL & 0x0F;
//g_ucAdmcCheckSum += ucTmp_AdmcAlm;
if (0 == ucTmp_AdmcAlm)
{
ucTmp_AdmcAlm = 0x0A;///为什么为0就要赋值0x0A
///难道是为了发送的方便
}
SendHT9200(ucTmp_AdmcAlm);
g_ucAdmcCheckSum += ucTmp_AdmcAlm;
g_ucAlarmStage++;
break;
case ADEMCO_SEND_CHK_SUM:
{
//发送校验和
g_ucAdmcCheckSum %= 15;//g_ucAdmcCheckSum %= 0x0F;
g_ucAdmcCheckSum = 0x0F - g_ucAdmcCheckSum;
SendHT9200(g_ucAdmcCheckSum);
g_ucAlarmStage = ADEMCO_END;
//g_ucAdmcCheckSum = 0;
}
break;
//用户ID之间的停顿间隔,下面的4个 case 语句没有 break;
case ADEMCO_START_SEND_ID1 + 1:
case ADEMCO_START_SEND_ID2 + 1:
case ADEMCO_START_SEND_ID3 + 1:
case ADEMCO_SEND_ID_END://ADEMCO_START_SEND_ID4
SendHT9200(0xFF);
g_ucAlarmStage++;
break;
case ADEMCO_END: //18(0x12)
SendHT9200(0xFF);
IE1 = 0;
EX1 = 1; ///重新开中断检测回铃音
g_ucDialNextDigit = 150;//10ms为单位
///g_ucDialNextDigit干啥的
g_ucAlarmStage = ADEMCO_WAIT_WAIT_ACK;//g_ucAlarmStage++;
break;
case ADEMCO_WAIT_WAIT_ACK: ///等待确认回铃阶段
if (3 == g_ucLastBackRing)//接收主机在 250ms 内回复,
//经测试发送结束到下次起始间隔 2.4s能成功,2.5s不能成功,接收主机会挂断
{
g_ucAdemcoEvtSend++; ///这两个变量理解模糊
g_ucAdemcoEvts--;
if(g_FlagPrtcl41)
{
//g_ucAdemcoEvts &= ~(0x01 << g_ucAdemcoEvtSend);
if (MAX_41EVT_NUM <= g_ucAdemcoEvtSend)
{
g_ucAdemcoEvtSend = 0;
}
}
else
{
if (MAX_CNTCT_EVT_NUM <= g_ucAdemcoEvtSend)
{
g_ucAdemcoEvtSend = 0;
}
}
if (0 == g_ucAdemcoEvts) ///g_ucAdemcoEvts==0表示什么意思
{
/*if (g_FlagCallEnd) //Hangup()会放开电话线 ???? .
{
pin_TakeLine = 0;
}*/
Hangup();
}
else
{
if ((!g_FlagDialNextDigit) && (g_ucDialNextDigit>4))
{
SendHT9200(0xFF); //可以不要
}
g_ucAlarmStage = ADEMCO_START;
g_ucTryTimes_AdmcAlm++;
}
}
else //出现忙音 PhoneAlarm() 会先挂断的,所以不考虑忙音(忽略出错情况)
{
g_ucAlarmStage = ADEMCO_START;
g_ucTryTimes_AdmcAlm++;
}
if (MAX_TIMES_ADEMCO_TRY <= g_ucTryTimes_AdmcAlm)//实际只能发送15次,不到16次?
{
Hangup();
}
break;
default:
if (g_FlagPrtcl41)
{
Ademco41(); ///发送4+1格式识别和事件码
}
else
{
ContactID(); ///发送ContactID格式识别和事件码
}
break;
}
}
}
}
//读取 g_FlagPrtcl41 .
else if (g_FlagRdPrtclSel) ///键盘传信息过来使用4+1协议
///与g_FlagPrtcl41有什么区别
{ ///g_FlagRdPrtclSel什么意思
//bit FlagRdErr = 1;
FlagPrePrtcl41 = g_FlagPrtcl41;
FlagRdErr = 1; ///???
ucTryTms = 3; //2007-2-7
while (FlagRdErr)
{
//unsigned char ucTryTms = 3;
//ucTryTms = 3;
FlagRdErr = 0;
ucTmp_AdmcAlm = ReadByte(EEPROM_ADD_FLAG41_SEL);
if (YES == ucTmp_AdmcAlm)
{
g_FlagPrtcl41 = 1;
}
else
{
g_FlagPrtcl41 = 0;
if (NO != ucTmp_AdmcAlm)
{
FlagRdErr = 1;
}
}
ucTryTms--;
if (0 == ucTryTms)
{
WriteByte(NO, EEPROM_ADD_FLAG41_SEL);
ClrWdt();
break;
}
}
if (FlagPrePrtcl41 ^ g_FlagPrtcl41)
{
g_ucAdemcoEvtSend = 0;
//PageFill(0xFF, EEPROM_ADD_CNTCT_EVT_START, MAX_CNTCT_EVT_NUM*BYTES_PER_CNTCT_EVTS);
}
g_FlagRdPrtclSel = 0;
}
}
#endif //#ifndef AdemcoProtocol_C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -