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

📄 admcptcl.c

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