#include "BSP.h" #include "TIM1_CAP.h" #include "UART_ARM.h" #include "TIM6_1MS.h" #include "GPIO_LED.h" #include "GPIO_SYS.h" #include "app_def.h" #include "app_msg.h" #include "IIC_FM1288.h" //#define SIMPLEX 1 unsigned char DogTime=0; unsigned char gVisionInfo[25] ={"$V,WDZHIV71V20250120F#"}; void BUS_Rev_NewInfo(unsigned char *pInfo); void BUS_Rev_146BInfo(unsigned char *pInfo); void UART_Rev_NewInfo(unsigned char *pInfo); int BinToASC(unsigned char * pSrc, unsigned int nSrcLength, unsigned char *pDst ); unsigned int AndroidDogTime =0; unsigned char AndroidDOGSW=0; unsigned char RunMode=0; //工作模式,0表示注册模式,1表示正常呼叫模式 unsigned char CallMode=0; //通话模式,0;双工 1;单工 int main(void) { BSP_init(); OSQInit(); LED[1]=0; //Andorid看门狗指示灯 AndroidDOGSW=0; AndroidDogTime=LocalTime; gtI2cstate = I2C_ON_RESET; #ifdef SIMPLEX CallMode =1; #endif while(1) { //==================== if(DogTime>0) { DogTime--; } else { DogTime=255; WDG_Feed(); } if(AndroidDOGSW>0) { if ((LocalTime>AndroidDogTime) && (AndroidDogTime > 50000)) { SYS_Reset(); AndroidDOGSW=0; LED[1]=0; LED[0]=0; } LED[1]=1; } else { AndroidDogTime=LocalTime+50000; LED[1]=0; } //==================== BSP_Tick(); } } int BinToASC(unsigned char * pSrc, unsigned int nSrcLength, unsigned char *pDst ) { unsigned int i; unsigned char const tab[]="0123456789ABCDEF"; if ( pSrc == 0 || pDst == 0 ) return 0; for(i=0; i> 4]; *pDst++ = tab[*pSrc & 0x0f]; pSrc++; } *pDst = ' '; return nSrcLength * 2; } unsigned char HexToInt(unsigned char Txt1,unsigned char Txt2) { unsigned char i=0; if((Txt1>=0x30)&&(Txt1<=0x39)) i= Txt1-0x30; else i= Txt1-0x37; i=i<<4; if((Txt2>=0x30)&&(Txt2<=0x39)) return i|(Txt2-0x30); else return i|(Txt2-0x37); } void UART_Rev_NewInfo(unsigned char *pInfo) { unsigned char Addr[2]={0}; if (pInfo[1] <0x8) { //分线器协议 230326 230408 //Addr[0]=HexToInt(pInfo[3],pInfo[4]); // Addr[1]=HexToInt(pInfo[5],pInfo[6]); gfxq_cmd = pInfo[1]; OSQPost(BusMsgQueue, BUS_MSG_FXQ1, TO_WORD(pInfo[3], pInfo[4])); OSQPost(BusMsgQueue, BUS_MSG_FXQ2, TO_WORD(pInfo[5], pInfo[6])); return; } switch(pInfo[1]) { case '0': break; case '1': if(pInfo[3]=='W') { AndroidDOGSW=0; //关闭看门狗信号 AndroidDogTime=LocalTime+45000; } else { AndroidDOGSW=1; //使用看门狗信号 AndroidDogTime=LocalTime+45000; } // UART_Send(gVisionInfo,22); break; case '2': if(pInfo[3]=='0') { SYS_Reset(); } else if(pInfo[3]=='1') { Mcu_Reset(1); } AndroidDOGSW=0; LED[1]=0; LED[0]=0; break; case '3': //SIP注册状态 $3,x1# x:0:表示注册中,1表示注册成功,2表示注册失败! if(pInfo[3]=='0') { LED[0]=2; } else if(pInfo[3]=='1') { LED[0]=1; if(RunMode==0) { RunMode=1; // BUS_SendBuf[0]=0xFF; // BUS_SendBuf[1]='Y'; // BUS_SendBuf[2]=0x0E; // BUS_SendData(); // BUS_SendData(); OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y')); OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y')); OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y')); } } else if(pInfo[3]=='2') { LED[0]=0; } break; case '4': //主机呼叫分机,SIP协议回调 $4,AABB1# GPIO_PA12_BroadcastMute(0); Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); // BUS_SendBuf[0]=Addr[0]; // BUS_SendBuf[1]=Addr[1]; // BUS_SendBuf[2]=pInfo[1]; // BUS_SendData(); if (CallLineMode) { //dwd211202 OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, 'Y')); } else { OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, 'N')); } OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA4, TO_WORD(Addr[0], Addr[1])); gtackvalid =2; // OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA4, TO_WORD(Addr[0], Addr[1])); // OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA4, TO_WORD(Addr[0], Addr[1])); break; case '5': //主机挂断分机,SIP协议回调 $5,AABB1# GPIO_PA12_BroadcastMute(0); Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA5, TO_WORD(Addr[0], Addr[1])); gtackvalid =2; // OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA5, TO_WORD(Addr[0], Addr[1])); // OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA5, TO_WORD(Addr[0], Addr[1])); break; case '6': //开启广播模式 GPIO_PA12_BroadcastMute(1); Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA6, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA6, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA6, TO_WORD(Addr[0], Addr[1])); break; case '7': //打开指定门灯 Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA7, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA7, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA7, TO_WORD(Addr[0], Addr[1])); break; case 'G': //打开指定门灯 Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA20, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA20, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA20, TO_WORD(Addr[0], Addr[1])); break; case 'W': //打开指定门灯 Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA21, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA21, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA21, TO_WORD(Addr[0], Addr[1])); break; case '8': //关闭指定门灯 Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA8, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA8, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA8, TO_WORD(Addr[0], Addr[1])); break; case '9': //取消紧急呼叫 Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA9, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA9, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA9, TO_WORD(Addr[0], Addr[1])); gt_busrxflag =0; break; case 'D': //设备注册命令 Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_REGEDITQUEST, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_REGEDITQUEST, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_REGEDITQUEST, TO_WORD(Addr[0], Addr[1])); break; case 'E': if(pInfo[7]=='Y') { RunMode=1; } else { RunMode=0; } OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, pInfo[7])); break; case 'F': #ifdef SIMPLEX pInfo[7]='1' ; if ( CallMode ==0) { SlaveI2CFM1288Write(0x230c,0x00); SlaveI2CFM1288Write(0x230d,0x1000); } CallMode = 1; OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); #else if(pInfo[7]=='1') //单工通话 { if ( CallMode ==0) { SlaveI2CFM1288Write(0x230c,0x00); SlaveI2CFM1288Write(0x230d,0x1000); } CallMode = 1; OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); } else if(pInfo[7]=='0') //shuang gong { if ( CallMode ==1) { SlaveI2CFM1288Write(0x230c,0x280); SlaveI2CFM1288Write(0x230d,0x1000); } CallMode = 0; OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); OSQPost(BusMsgQueue, BUS_MSG_CALLMODE, TO_WORD(0xff, pInfo[7])); } #endif break; case 'S': //签到反馈 Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_SIGINACK, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_SIGINACK, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_SIGINACK, TO_WORD(Addr[0], Addr[1])); break; case 'Z': //事件响应 case 'H': case 'Y': Addr[0]=HexToInt(pInfo[3],pInfo[4]); Addr[1]=HexToInt(pInfo[5],pInfo[6]); OSQPost(BusMsgQueue, BUS_MSG_EVEACK, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EVEACK, TO_WORD(Addr[0], Addr[1])); OSQPost(BusMsgQueue, BUS_MSG_EVEACK, TO_WORD(Addr[0], Addr[1])); break; case 'R': //清除所有事件 不需要 break; } } unsigned char SendBufFX[30]; void BUS_Rev_NewInfo(unsigned char *pInfo) { unsigned char SendBuf[30]; static unsigned char SendpreBuf[10]= {0}; unsigned char i; RunMode =1; //dwdtest if(RunMode==0) // 保持原有的注册模式代码不变 { UartBusTime = 0; SendBuf[0]='$'; SendBuf[1]='E'; SendBuf[2]=','; BinToASC(pInfo,2,&SendBuf[3]); for(i=0;i<15;i++) { SendBuf[7+i]=pInfo[i+2]; } SendBuf[22]='@'; SendBuf[23]='#'; UART_Send(SendBuf,24); } else { if((pInfo[2]==0x0A)||(pInfo[2]==0x0B)||(pInfo[2]==0x0C)) { SendBuf[0]='$'; //===================================== if(pInfo[2]<=0x09) SendBuf[1]=pInfo[2]+0x30; else SendBuf[1]=pInfo[2]+0x37; //转换命令字节 //===================================== SendBuf[2]=','; //===================================== BinToASC(pInfo,2,&SendBuf[3]); //转换地址码 //===================================== SendBuf[7]='1'; SendBuf[8]='#'; if (( SendpreBuf[0] != pInfo[0]) || ( SendpreBuf[1] != pInfo[1]) //dwd190815 || ( SendpreBuf[2] != pInfo[2])) { SendpreBuf[0] = pInfo[0]; SendpreBuf[1] = pInfo[1]; SendpreBuf[2] = pInfo[2]; gt_busrxflag =0; } if (pInfo[2]==0x0C) { if (!gt_busrxflag ) { UART_Send(SendBuf,9); } gt_busrxflag =1; //停止发串口 } else { UART_Send(SendBuf,9); } } else if (pInfo[2]==0xE) { //分机接听 if ( CallMode ==1) { SlaveI2CFM1288Write(0x230c,0x00); SlaveI2CFM1288Write(0x230d,0x1000); } } else if (pInfo[2]==0xF) { if ( CallMode ==1) { SlaveI2CFM1288Write(0x230c,0x280); SlaveI2CFM1288Write(0x230d,0x00); } } else if (pInfo[2]==1) { //签到 SendBuf[0]='$'; //===================================== SendBuf[1]='Q'; //转换命令字节 //===================================== SendBuf[2]=','; //===================================== BinToASC(pInfo,2,&SendBuf[3]); //转换地址码 //===================================== SendBuf[7]='1'; SendBuf[8]='#'; UART_Send(SendBuf,9); } else if (pInfo[2]==2) { //增援 SendBuf[0]='$'; //===================================== SendBuf[1]='Z'; //转换命令字节 //===================================== SendBuf[2]=','; //===================================== BinToASC(pInfo,2,&SendBuf[3]); //转换地址码 //===================================== SendBuf[7]='1'; SendBuf[8]='#'; UART_Send(SendBuf,9); } else if (pInfo[2]==3) { //护理 SendBuf[0]='$'; //===================================== SendBuf[1]='H'; //转换命令字节 //===================================== SendBuf[2]=','; //===================================== BinToASC(pInfo,2,&SendBuf[3]); //转换地址码 //===================================== SendBuf[7]='1'; SendBuf[8]='#'; UART_Send(SendBuf,9); } else if (pInfo[2]==4) { //换药 SendBuf[0]='$'; //===================================== SendBuf[1]='Y'; //转换命令字节 //===================================== SendBuf[2]=','; //===================================== BinToASC(pInfo,2,&SendBuf[3]); //转换地址码 //===================================== SendBuf[7]='1'; SendBuf[8]='#'; UART_Send(SendBuf,9); } else if (pInfo[2]==5) { //清除所有事件 SendBuf[0]='$'; //===================================== SendBuf[1]='R'; //转换命令字节 //===================================== SendBuf[2]=','; //===================================== BinToASC(pInfo,2,&SendBuf[3]); //转换地址码 //===================================== SendBuf[7]='1'; SendBuf[8]='#'; UART_Send(SendBuf,9); } else if (pInfo[2]==7) { //紧急按钮取消按键 SendBuf[0]='$'; SendBuf[1]='P'; SendBuf[2]=','; BinToASC(pInfo,2,&SendBuf[3]); SendBuf[7]='1'; SendBuf[8]='#'; // 添加过滤逻辑,与0x0C消息类似 if((SendpreBuf[0] != pInfo[0]) || (SendpreBuf[1] != pInfo[1]) || (SendpreBuf[2] != pInfo[2])) { SendpreBuf[0] = pInfo[0]; SendpreBuf[1] = pInfo[1]; SendpreBuf[2] = pInfo[2]; UART_Send(SendBuf,9); // 只有消息不同时才发送 } gt_busrxflag = 0; // 保持重置0x0C消息的过滤标志 } } } void BUS_Rev_146BInfo(unsigned char *pInfo) { unsigned char SendBuf[30]; // 分机发的注册码,还未发完,需等待350MS 发注册指令 //=================== // BUS_SendBuf[0]=0xFF; // BUS_SendBuf[1]='Y'; // BUS_SendBuf[2]=0x0E; // BUS_SendData(); // BUS_SendData(); gt_busrxflag =0; OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff,'Y')); OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff,'Y')); OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff,'Y')); //=================== //重复广播同步信号 if((pInfo[0]&0xF0)==0x10) //床头分机 { SendBuf[0]='$'; SendBuf[1]='A'; SendBuf[2]=','; BinToASC(pInfo,2,&SendBuf[3]); SendBuf[7]='1'; SendBuf[8]='#'; UartBusTime = 0; UART_Send(SendBuf,9); } else if((pInfo[0]&0xF0)==0x30) //紧急按钮 { SendBuf[0]='$'; SendBuf[1]='C'; SendBuf[2]=','; BinToASC(pInfo,2,&SendBuf[3]); SendBuf[7]='1'; SendBuf[8]='#'; UartBusTime = 0; UART_Send(SendBuf,9); } }