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

📄 admcptcl.c

📁 内容摘要: LHD6000主板主芯片程序 ISD1730时序说明: 参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -