// zfCascoCctv.cpp: implementation of the CCascoCctv class. // ////////////////////////////////////////////////////////////////////// #include "zfCascoCctv.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CCascoCctv::CCascoCctv() { } CCascoCctv::~CCascoCctv() { } sint32 CCascoCctv::TxProc() { return 1; } //2bytes,11:电视墙;12:任务;21:选屏;22:分隔切换;23:选窗口;24:切换视频源;31:云台;41:录像;51:抓拍 //1 2 3 4 5 6 7 8 9 10 11 12 //角色值 操作大类LoHi 电视墙 任务 屏 分割 窗 通道视频源 云台 云台参数LoHi 录像 录像参数 int CCascoCctv::fPTZConv(uint8 ptz)//Modified by WYF 20191128 { int tPtz=0; tPtz=ptz; switch(tPtz){ /* case 0://停 case 1://上下左右 case 2: case 3: case 4: tPtz+=10; break; case 11://左上,左下,右上,右下 case 12: case 13: case 14: tPtz+=4; break; case 5://变倍大小,光圈大小 case 6: case 9: case 10: tPtz+=15; break; case 8://近焦 tPtz+=14; break; case 7://远焦 tPtz+=16; break; */ case 10://停 case 11://上下左右 case 12: case 13: case 14: tPtz-=10; break; case 15://左上,左下,右上,右下 case 16: case 17: case 18: tPtz-=4; break; case 20://变倍大小,光圈大小 case 21: case 24: case 25: tPtz-=15; break; case 22://近焦 tPtz-=14; break; case 23://远焦 tPtz-=16; break; } return tPtz; } sint32 CCascoCctv::RxProc() { //sint32 rtuno = pLink->GetRtuNo(); //unsigned char rtuaddr = pRtu->GetRtuAddr(rtuno); uint8 buf[512] = {0}; int datalen = 0; int buflen=pRxBuf->GetReadableSize(); int nowtime = GetNowSecond(); if ((nowtime-m_LastSendTime) >= 5/*m_RcvTimeOuts*/) //每帧发送后返回(响应)超时 发-收 { pLink->RegisterFrm(FRAME_RX_TIMEOUT); m_LastSendTime = nowtime; PrintLog(LOG_WARNING,"3控4 链路数据空闲超时!\n"); } /* if (m_bCmd && (nowtime-m_LastCmdSendTime >= m_cmdTimeOut)) //下发命令后没有获取到响应结果超时 { }*/ if (buflen<7) //无数据或数据不够不改变链路通讯状态,继续等待 return 1; datalen = pRxBuf->Read(buf,buflen,DEF_BUFF_NOMOVE); uint16 d_len=buf[4]*256 + buf[5] + 6; if(buflenMove(buflen); //pLink->RegisterFrm(FRAME_RX_CHECKERR); PrintLog(LOG_WARNING,"3控4 ModbusHead校验错误,数据长度不够,buflen=%d,d_len=%d\n",buflen,d_len); return -1; } datalen = pRxBuf->Read(buf,d_len,DEF_BUFF_MOVE); if (buf[7] == 0x03) { if (m_bCmd) { pLink->RegisterFrm(FRAME_RX_SUC); pLink->SetCommStatus(CMST_NORMAL); /* m_decodeRlt = -1; //需要写获取下发命令返回结果才给m_lastSequence等赋值 if (m_decodeRlt == -1) { m_lastDecodeRlt = 0xffff; } else { m_lastDecodeRlt = m_decodeRlt; }*/ m_lastDecodeRlt = m_ReplyDecode; m_lastSequence = m_sequence; WriteToRegisterAi(buf); m_bCmd = FALSE; PrintLog(LOG_INFORMATION, "3控4 帧号%d,记录命令号affair No=%d,decode=%d,下发命令成功\n",buf[0]*256+buf[1], m_lastSequence, m_lastDecodeRlt); } else { pLink->RegisterFrm(FRAME_RX_SUC); pLink->SetCommStatus(CMST_NORMAL); WriteToRegisterAi(buf); } } else if (buf[7] == 0x10) { S_RAWCMD rawcmd; CSI_D_CCTV_CMD cctvCtrl; memset(&rawcmd, 0, sizeof(rawcmd)); memset(&cctvCtrl, 0, sizeof(cctvCtrl)); uint8 staNum = StationNumConvert(buf[14]);//(buf[13]); if (staNum) { if(buf[20]>=11 && buf[20]<=25 )//PTZ 8方向、变倍、聚焦、光圈 cctvCtrl.Func = 2; else cctvCtrl.Func = CCTV_FUNC_MON; cctvCtrl.Sta = 67-buf[14];//buf[13];//1byte-->2bytes cctvCtrl.decode = buf[16];//m_FepDecode; //16//buf[14];//1byte-->2bytes cctvCtrl.Cam = buf[17]*256+buf[18];//buf[15]*256+buf[16]; cctvCtrl.Mon = m_FepDecode; cctvCtrl.User = 0xFF; cctvCtrl.Val = buf[22]*0x100+fPTZConv(buf[20]);//speed-ptz if(buf[23]*256+buf[24]==1)cctvCtrl.Task = cctvCtrl.Task | 0x81; else cctvCtrl.Task=0;//按下--弹起 rawcmd.type = DC_K_CMD_CCTVCTRL; memcpy(rawcmd.data, &cctvCtrl, sizeof(cctvCtrl)); pCmdMem->PutACmd(m_rtuNo, rawcmd); // PrintLog(LOG_INFORMATION, "3控4 帧号%d,Sta=%d,Cam=%d,decode=%d,下发命令成功\n",buf[0]*256+buf[1], buf[13], buf[15]*256+buf[16], buf[14]); if(cctvCtrl.Func==1) PrintLog(LOG_INFORMATION, "3控4切摄像头 帧号%d,Sta=%d,Cam=%d,decode=%d,ptz=%d,speed=%d,push=%d下发命令成功\n",buf[0]*256+buf[1], buf[13]*256+buf[14], buf[17]*256+buf[18], buf[16], buf[19]*256+buf[20], buf[21]*256+buf[22], buf[23]*256+buf[24]); if(cctvCtrl.Func==2) PrintLog(LOG_INFORMATION, "3控4切PTZ 帧号%d,Sta=%d,Cam=%d,decode=%d,ptz=%d,speed=%d,push=%d下发命令成功\n",buf[0]*256+buf[1], buf[13]*256+buf[14], buf[17]*256+buf[18], buf[16], buf[19]*256+buf[20], buf[21]*256+buf[22], buf[23]*256+buf[24]); m_bCmd = TRUE; m_sequence = buf[0]*256 + buf[1]; m_ReplyDecode = buf[14]; } else { // PrintLog(LOG_ERROR, "3控4 帧号%d,Sta=%d,Cam=%d,decode=%d,下发命令失败,站号不匹配\n",buf[0]*256+buf[1], buf[13], buf[15]*256+buf[16], buf[14]); PrintLog(LOG_ERROR, "3控4 帧号%d,Sta=%d,Cam=%d,decode=%d,下发命令失败,站号不匹配\n",buf[0]*256+buf[1], buf[13]*256+buf[14], buf[17]*256+buf[18], buf[16]); } pLink->RegisterFrm(FRAME_RX_SUC); pLink->SetCommStatus(CMST_NORMAL); //返回 WriteToRegister(buf); } return 1; } void CCascoCctv::WriteToRegister(uint8 *buf) { uint8 txbuff[256] = {0}; uint8 len=0; //7bytes Head txbuff[len++]=buf[0];//H Transaction Identifier txbuff[len++]=buf[1];//L txbuff[len++]=0;//Protocol Identifier "0 = MODBUS protocol" txbuff[len++]=0; txbuff[len++]=0;//len_H txbuff[len++]=6;//len_L txbuff[len++]=buf[6];//Unit Identifier txbuff[len++]=buf[7]; //控制命令 txbuff[len++]=buf[8];//寄存器地址高 txbuff[len++]=buf[9];//低 txbuff[len++]=buf[10];//寄存器个数高 txbuff[len++]=buf[11];//低 pLink->RegisterFrm(FRAME_TX_SUC); pTxBuf->Write(txbuff,len); pLink->SetCommStatus(CMST_RX_CNT); m_LastSendTime = GetNowSecond(); PrintLog(LOG_INFORMATION,"3控4 回复0x10命令成功"); } void CCascoCctv::WriteToRegisterAi(uint8 *buf) { uint8 txbuff[256] = {0}; uint8 len=0; //7bytes Head txbuff[len++]=buf[0];//H Transaction Identifier txbuff[len++]=buf[1];//L txbuff[len++]=0;//Protocol Identifier "0 = MODBUS protocol" txbuff[len++]=0; txbuff[len++]=0;//len_H txbuff[len++]=7;//len_L txbuff[len++]=buf[6];//Unit Identifier txbuff[len++]=buf[7]; //控制命令 03 txbuff[len++]=4;//响应的字节数 2寄存器*2 txbuff[len++]=m_lastSequence/0x100;//affair No 高 txbuff[len++]=m_lastSequence%0x100;//低 txbuff[len++]=m_lastDecodeRlt/0x100;//高 txbuff[len++]=m_lastDecodeRlt%0x100;//低 pLink->RegisterFrm(FRAME_TX_SUC); pTxBuf->Write(txbuff,len); pLink->SetCommStatus(CMST_RX_CNT); m_LastSendTime = GetNowSecond(); PrintLog(LOG_INFORMATION,"3控4 回复0x03命令成功,affair No=%d,decode=%d",m_lastSequence,m_lastDecodeRlt); } void CCascoCctv::Init(S_PROTOCOLCFG *pcfg) { PRawCtrl = pcfg->PRawCtrl; pRxBuf = pcfg->pRxBuf; pTxBuf = pcfg->pTxBuf; pCmdMem = pcfg->pCmdMem; pRtu = pcfg->pRtu; pLink = pcfg->pLink; pTable = pcfg->pTable; pZfDataCtrl = pcfg->pZfDataCtrl; // pHis = pcfg->pHis; pRxBuf->Move(pRxBuf->GetReadableSize()); pTxBuf->Move(pTxBuf->GetReadableSize()); m_RcvTimeOuts = pLink->GetRxTimeouts(); //m_bCmdReply = FALSE; m_bCmd = FALSE; m_rtuNo = 0; m_FepDecode = 0; //m_cascoDecode = 0; m_cmdTimeOut = 0; m_LastSendTime = 0; m_sequence = 0; m_lastSequence = 0; m_decodeRlt = 0; m_lastDecodeRlt = 0xffff; m_LastCmdSendTime = 0; m_ReplyDecode = 0; if(m_RcvTimeOuts <= 0) m_RcvTimeOuts = 10; ReadIni(); } void CCascoCctv::ReadIni() { char filename[512]; CReadConf readconf; char *pWorkPath; pWorkPath = getenv(SE_EMS_RUN_DIR); if(pWorkPath!=NULL) sprintf(filename,"%s%s",pWorkPath,"/cfg/zfCctvCasco.ini"); m_rtuNo = readconf.ReadLong("FepAndCascoAndMatrixMsg", "CmdRtuNo", filename, "0"); m_FepDecode = readconf.ReadLong("FepAndCascoAndMatrixMsg", "FepDecode", filename, "0"); //m_cascoDecode = readconf.ReadLong("FepAndCascoAndMatrixMsg", "CascoDecode", filename, "0"); m_cmdTimeOut = readconf.ReadLong("FepAndCascoAndMatrixMsg", "CctvSendCmdTimeOut", filename, "0"); } int CCascoCctv::GetNowSecond() { CSeTime SE_T; TCriterionTime tmptime; SE_T.GetNow(&tmptime); return (int)tmptime; } void CCascoCctv::SetExtendedPara(uint16 no, sint32 val){} uint8 CCascoCctv::StationNumConvert(uint8 staNum) { int ret = 0; if(30<=staNum && staNum<=46)ret = 1; return ret; } uint8 CCascoCctv::DecoderPortConvert(uint8 decodeNum) { return 0; } //规约对象创建函数 #ifdef __unix extern "C" CProtocol* CreateProtocol(char *defpara) #else extern "C" __declspec(dllexport) CProtocol* CreateProtocol(char *defpara) #endif { CProtocol *pEpv = new CCascoCctv; return pEpv; }