//================================================================== // // Filename: mapp_bus.c // Description: External Input driver. // //------------------------------------------------------------------ // // version: // date: 08:54am, 08.Feb.2023, by dwd // Description: // //------------------------------------------------------------------ //================================================================== /*------------------------------------------------------------------------------ * I N C L U D E *------------------------------------------------------------------------------*/ #include "stm32f0xx.h" #include "general.h" #include "main.h" #include "mapp_gpio.h" #include "mapp_time.h" #include "mapp_arm.h" #include "mapp_msg.h" #include "mapp_bus.h" /*------------------------------- E O F ----------------------------------------*/ //============================================================== #define KEY0 KEY[0] //手柄 #define KEY1 KEY[1] //免提 #define KEY2 KEY[2] //换药 #define KEY3 KEY[3] //取消 #define KEY4 KEY[4] //护理 #define KEY5 KEY[5] //增援 #define KEY6 KEY[6] //拔针 #define VOICESW_H GPIO_SetBits(GPIOA, GPIO_Pin_0) //语音通道 #define VOICESW_L GPIO_ResetBits(GPIOA, GPIO_Pin_0) #define MUTE_H GPIO_SetBits(GPIOA, GPIO_Pin_1) // 音频MUET 低有效 //#define MUTE_H GPIO_ResetBits(GPIOA, GPIO_Pin_1) #define MUTE_L GPIO_ResetBits(GPIOA, GPIO_Pin_1) //============================================================== unsigned int BUS_RevBuf[30]; unsigned char BUS_RevIndex=0; unsigned char BUS_Rev_Cmd[3]; //总线接收 unsigned int BUS_RevOverTime=0; //超时 // unsigned char Bus_RevFlag=0; //?????? // unsigned char Bus_BroadFlag=0; //???? //============================================================== unsigned char BUS_SendInex=0; unsigned char BUS_SendCmd[30]; //发送数据 unsigned char BUS_SendingCmd[30]; //定时器正在处理数据 //============================================================== unsigned long LocalTime=0; unsigned char BufSentTime=0; unsigned long CallQuesetTime=0; //请求呼叫时间 unsigned long CallWaitTime=0; //等待接听时间重发 //============================================================== unsigned char KEY[7]={0,0}; //按键 unsigned char KEY_OLD[7]={0,0}; unsigned char Ledswitch=0; //指示灯开关 unsigned char Voiceswitch=0; //语音通道开关 unsigned char Micswitch=0; //麦克风开关 dwd190703 unsigned char callstate=0; //通话状态:0:挂断或广播 1:接听 2:主机呼叫 3:重发呼叫 unsigned char callmode=0; //双工模式 0:单工 1:双工 unsigned char signin_state=0; //签到 0:无 1:签到中 2:签到完成 unsigned long sandcnt =0; unsigned char VoiceCmd =0; //语音指令 unsigned char VoiceCmdApp = CMD_NULL; unsigned char VoiceCmdAppAck = CMD_NULL; unsigned char VoiceCmdFlag =0; unsigned char nursestate =0; //护理状态 // unsigned char SleepMode=0; //????,0 ?? 1 ????? unsigned char RunMode=0; //0:离线模式,>0在线工作模式 unsigned char Bus_SendLength=146; //注册时发送长度 unsigned char BUS_SendBuf[4]; //应用层发送数据 unsigned char BUS_SendBitBuf[30]; //应用层发送中断位 //============================================================== //SV22 SV23 二线制 SV30 SV31 三线制 // __root const unsigned char BlankStr[28]="555555555555"; unsigned char DeviceSN[16] ="SZMNI2210230001"; unsigned char DeviceAddr[10] ={0x13,0x86}; unsigned char Addrp[2]= {0}; T_BUS_FRAME brm = {0}; void SysVar_Init(void); void BUS_RevData(void); void GPIO_KEY_Tick(void); void GPIO_KEY2_Tick(void); void BUS_Rev_Tick(void); void GPIO_MIC_SW(unsigned char status); //============================================================== void SysVar_Init(void) { // Addrp=DeviceAddr; RunMode=1; callmode =0; callstate =0; } //============================================================================================================================ void GPIO_MIC_SW(unsigned char status) { //================================================================= if(status==0) { // PC_DDR_DDR5 =1; // PC_CR1_C15 =1; // PC_ODR_ODR5 =0; //关闭麦克风,pc5输出低 GPIO_ResetBits(GPIOC, GPIO_Pin_15) ; } else { // PC_DDR_DDR5 =1; // PC_CR1_C15 =1; // PC_ODR_ODR5 =1; //打开麦克风,PC5输出高 GPIO_SetBits(GPIOC, GPIO_Pin_15) ; } } void BUS_SendData(T_BUS_FRAME c) { unsigned char i=0; //=========================== // while(BUS_SendInex>0); //=========================== i = HI_BYTE(c.DaddressDate); i += LO_BYTE(c.DaddressDate); c.DataType &=0x0F; i += c.DataType ; c.DataType |=((i&0x0F)<<4); //=========================== BUS_SendBuf[0]=HI_BYTE(c.DaddressDate); BUS_SendBuf[1]= LO_BYTE(c.DaddressDate); BUS_SendBuf[2]= c.DataType; // 处理数据 BUS_SendBitBuf[0] = ((BUS_SendBuf[0] >>0) &0x01); BUS_SendBitBuf[1] = ((BUS_SendBuf[0] >>1) &0x01); BUS_SendBitBuf[2] = ((BUS_SendBuf[0] >>2) &0x01); BUS_SendBitBuf[3] = ((BUS_SendBuf[0] >>3) &0x01); BUS_SendBitBuf[4] = ((BUS_SendBuf[0] >>4) &0x01); BUS_SendBitBuf[5] = ((BUS_SendBuf[0] >>5) &0x01); BUS_SendBitBuf[6] = ((BUS_SendBuf[0] >>6) &0x01); BUS_SendBitBuf[7] = ((BUS_SendBuf[0] >>7) &0x01); BUS_SendBitBuf[8] = ((BUS_SendBuf[1] >>0) &0x01); BUS_SendBitBuf[9] = ((BUS_SendBuf[1] >>1) &0x01); BUS_SendBitBuf[10] = ((BUS_SendBuf[1] >>2) &0x01); BUS_SendBitBuf[11] = ((BUS_SendBuf[1] >>3) &0x01); BUS_SendBitBuf[12] = ((BUS_SendBuf[1] >>4) &0x01); BUS_SendBitBuf[13] = ((BUS_SendBuf[1] >>5) &0x01); BUS_SendBitBuf[14] = ((BUS_SendBuf[1] >>6) &0x01); BUS_SendBitBuf[15] = ((BUS_SendBuf[1] >>7) &0x01); BUS_SendBitBuf[16] = ((BUS_SendBuf[2] >>0) &0x01); BUS_SendBitBuf[17] = ((BUS_SendBuf[2] >>1) &0x01); BUS_SendBitBuf[18] = ((BUS_SendBuf[2] >>2) &0x01); BUS_SendBitBuf[19] = ((BUS_SendBuf[2] >>3) &0x01); BUS_SendBitBuf[20] = ((BUS_SendBuf[2] >>4) &0x01); BUS_SendBitBuf[21] = ((BUS_SendBuf[2] >>5) &0x01); BUS_SendBitBuf[22] = ((BUS_SendBuf[2] >>6) &0x01); BUS_SendBitBuf[23] = ((BUS_SendBuf[2] >>7) &0x01); //=========================== BUS_SendInex=1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } //============================================================================================================================ void GPIO_LED_Tick(void) { static long LEDTime; static unsigned char i=0; if(Ledswitch==1) { LED_RED_ON; } else if(Ledswitch==2) { LED_RED_ON; } else if(Ledswitch==3) { LED_RED_ON; } else { LED_RED_OFF; } } //============================================================== void BUS_Rev_Tick(void) { static unsigned char i=0,j=0,k=0; if(BUS_RevIndex==26) { BUS_Rev_Cmd[0]=0; BUS_Rev_Cmd[1]=0; BUS_Rev_Cmd[2]=0; for(k=0;k<24;k++) { i=k / 8; j=k % 8; // if ((BUS_RevBuf[k]>280)&&(BUS_RevBuf[k]<400)) if ((BUS_RevBuf[k]>220)&&(BUS_RevBuf[k]<400)) //280 { BUS_Rev_Cmd[i]|=(1<>4)&0x0F; if(i==j) //dwd191108 { BUS_Rev_Cmd[2]=BUS_Rev_Cmd[2]&0x0F; BUS_RevData(); } } } //===================总线IO输入捕获中断处理=========== void TIM3_IRQHandler(void) { static unsigned int lastCC4Value=0; unsigned int i,CC4Value; if(TIM_GetITStatus(TIM3,TIM_IT_CC4)!=RESET) { //========================================= i=TIM_GetCapture4(TIM3); if(i>lastCC4Value) CC4Value = i-lastCC4Value; else CC4Value=65535-lastCC4Value+i; lastCC4Value=i; gtArm.BufRxSentTime = OS_TIMER_100MS; //=========================================脉冲计算宽度 if(CC4Value<=150) { if(lastCC4Value>=CC4Value) { lastCC4Value=lastCC4Value-CC4Value; } else { lastCC4Value=65535-lastCC4Value+CC4Value; } } //=========================================处理误码 else { // TIM3_CC4[TIM1_cc_flag]=CC4Value; if(BUS_RevIndex==0) { if((CC4Value>400)&&(CC4Value<750)) //采集起始位:3.3ms { BUS_RevIndex=2; //dwd190703 VOICESW_L; if ( BUS_RevOverTime <200) { BUS_RevOverTime=200; //超时200ms } // TIM1_Rev_flag=1; } else { BUS_RevIndex=0; } } else if(BUS_RevIndex ==1) { if((i>400)&&(i<750)) { BUS_RevIndex=2; VOICESW_L; if ( BUS_RevOverTime <200) { BUS_RevOverTime=200; //超时200ms } // Bus_RevFlag=0; //清除接收标志 } else { BUS_RevIndex=0; } } else if(BUS_RevIndex <26) { BUS_RevBuf[BUS_RevIndex-2]= CC4Value; BUS_RevIndex++; } //============================================================================ } TIM_ClearITPendingBit(TIM3, TIM_IT_CC4); } } void TIM1_CC_IRQHandler(void) { static unsigned int lastCC4Value=0; unsigned int i,CC4Value; if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET) { //========================================= i=TIM_GetCapture1(TIM1); if(i>lastCC4Value) { CC4Value = i-lastCC4Value; } else { CC4Value=65535-lastCC4Value+i; } lastCC4Value=i; gtArm.BufRxSentTime = OS_TIMER_100MS; //=========================================脉冲计算宽度 if(CC4Value<=100) //最低180 { if(lastCC4Value>=CC4Value) { lastCC4Value=lastCC4Value-CC4Value; } else { lastCC4Value=65535-lastCC4Value+CC4Value; } } //=========================================处理误码 else { // TIM3_CC4[TIM1_cc_flag]=CC4Value; if(BUS_RevIndex==0) { // if((CC4Value>400)&&(CC4Value<750)) //采集起始位:5ms // if((CC4Value>300)&&(CC4Value<1250)) //采集起始位3.3ms if(CC4Value>320) { BUS_RevIndex=2; //dwd190703 VOICESW_L; if ( BUS_RevOverTime <200) { BUS_RevOverTime=200; //超时200ms } // TIM1_Rev_flag=1; } else { BUS_RevIndex=0; } } else if(BUS_RevIndex ==1) { if((i>320)&&(i<750)) //180 或280 { BUS_RevIndex=2; VOICESW_L; if ( BUS_RevOverTime <200) { BUS_RevOverTime=200; //超时200ms } // Bus_RevFlag=0; //清除接收标志 } else { BUS_RevIndex=0; } } else if(BUS_RevIndex <26) { BUS_RevBuf[BUS_RevIndex-2]= CC4Value; BUS_RevIndex++; } //============================================================================ } TIM_ClearITPendingBit(TIM1, TIM_IT_CC1); } } #define wtv38_h 140 #define wtv38_l 148 void TIM6_WTV3808S_TASK(void) { static unsigned char voiceflag=0; switch(voiceflag) { case 0: if(VoiceCmdFlag) { voiceflag =1; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } break; case 1: VOICE_PB15_OFF; //??? VoiceCmdFlag ++; if (VoiceCmdFlag >55) { //0.1*50 = 5ms voiceflag ++; VoiceCmdFlag = 150; } break; case 2: VOICE_PB15_ON; if (VoiceCmd&0x01) { if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6 voiceflag ++; //250*6 VoiceCmdFlag = 150; } else if (VoiceCmdFlag ) { VoiceCmdFlag --; } else { voiceflag ++; VoiceCmdFlag = 150; } } else { if (VoiceCmdFlag < wtv38_l) { voiceflag ++; //2*0.2 VoiceCmdFlag = 150; } else if (VoiceCmdFlag ) { VoiceCmdFlag --; } else { voiceflag ++; VoiceCmdFlag = 150; } } break; case 3: VOICE_PB15_OFF; if (VoiceCmd&0x01) { if (VoiceCmdFlag < wtv38_l){ voiceflag ++; VoiceCmdFlag = 150; } else if (VoiceCmdFlag ) { VoiceCmdFlag --; } else { voiceflag ++; VoiceCmdFlag = 150; } } else { if (VoiceCmdFlag 配置 PA6 为输出模式并拉低 initGPIOForOutput(); // 配置 PA6 为输出模式 GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_RESET); // 将 PA6 设置为低电平 } //注:1ms中断 改0.1ms中断 void TIM6_DAC_IRQHandler (void) { static unsigned char flag=0; if(TIM_GetITStatus(TIM6, TIM_IT_Update)== SET) { TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update); GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1); if(BUS_RevOverTime>0)BUS_RevOverTime--; if(BUS_SendInex ==0) { //语音处理芯片 TIM6_WTV3808S_TASK(); GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0); return; } //if(BufSentTime>0) { //dwd190707 // BufSentTime--; // return; // } //=================================== if (flag>=11) { TIM3->CCER |= 0x01; //打开 flag--; return; } else if ((flag<=10) && (flag!=0)) { TIM3->CCER &=~(1<<0); //关闭 flag --; GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0); return; } if((BUS_SendInex>0)&&(flag==0)) { if (BUS_SendInex==1) //起始位:总线5ms低电平 { flag=59;//41-9 =3.3ms 60-10 = 5ms TIM3->CCER |= 0x01; BUS_SendInex++; } else if(BUS_SendInex<(24+3)) { if (BUS_SendBitBuf[BUS_SendInex-2]) { //数据位1:2ms低电平 flag= 29; //29-9 = 2ms } else { //数据位0:1ms低电平 flag= 19; //19=9 = 1ms } TIM3->CCER |= 0x01; BUS_SendInex++; } else if(BUS_SendInex==(24+3)) { flag=0; TIM3->CCER &=~(1<<0); BUS_SendInex++; } else { BUS_SendInex=0; TIM3->CCER &=~(1<<0); flag=0; TIM_ITConfig(TIM6,TIM_IT_Update,DISABLE); } } GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0); } } void Uart_Call_RevData( unsigned char prm) { if (prm =='0') { //挂断或广播 Voiceswitch =0; Ledswitch =0; Micswitch =0; //dwd190703 MUTE_H; //dwd190725 BUS_RevOverTime = 250; //dwd190725 callstate =0; } else if (prm =='1') { //接听 Voiceswitch =1; Micswitch =1; Ledswitch =0; callstate = 1; } else if (prm =='2') { } } void Uart_EVEAL_RevData( unsigned char prm) { if (VoiceCmdAppAck == CMD_NEEDLES) { VoiceCmdApp = CMD_NEEDLESACK; VoiceCmdAppAck = CMD_NULL; } else if (VoiceCmdAppAck == CMD_REINFORCE) { VoiceCmdApp = CMD_REINFORCEACK; VoiceCmdAppAck = CMD_NULL; } else if (VoiceCmdAppAck == CMD_CHANGE) { VoiceCmdApp = CMD_CHANGEACK; VoiceCmdAppAck = CMD_NULL; } else { VoiceCmdAppAck = CMD_NULL; } } //============================================================== void BUS_RevData(void) { T_BUS_FRAME brm = {0}; //======================================= if(((BUS_Rev_Cmd[0]!=Addrp[0])||(BUS_Rev_Cmd[1]!=Addrp[1]))&&(BUS_Rev_Cmd[2]<0x0E)) //0x0e,0x0f,0x10E { if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF)) return; } //======================================= // SleepMode = 0; switch(BUS_Rev_Cmd[2]) { case 0: break; case 1: signin_state = 2; break; case 2: // 门灯 break; case 3: //门灯 break; case 4: //主机呼叫分机或分机响应主机 Voiceswitch =1; Micswitch =1; Ledswitch = 0; VoiceCmdApp = CMD_NULL; //dwd240907 呼叫时停止语音芯片播报 callstate = 1; #ifdef acktxcnt BUS_SendInex= acktxcnt ; //dwd190723 #endif break; case 5: //挂断 // if(LocalTime>BroadcastTime) // { Voiceswitch =0; Ledswitch =0; Micswitch =0; //dwd190703 MUTE_H; //dwd190725 BUS_RevOverTime = 250; //dwd190725 // } callstate =0; #ifdef acktxcnt if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF)) { BUS_SendInex= acktxcnt ; //dwd190723 } #endif break; case 6: //广播 if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF)) { //非广播指令,自动接听 callstate =2; MUTE_H; Voiceswitch =1; Micswitch =0; Ledswitch =3; BUS_RevOverTime = 1000 ; break; } BUS_RevOverTime = 1500 +sandcnt; MUTE_H; //dwd191108 Voiceswitch =1; Micswitch =0; Ledswitch =0; callstate =0; break; //========================================================================= case 7: //保留 case 8: //保留 case 9: //保留 break; case 10: //事件响应 if (VoiceCmdAppAck == CMD_NEEDLES) { VoiceCmdApp = CMD_NEEDLESACK; VoiceCmdAppAck = CMD_NULL; } else if (VoiceCmdAppAck == CMD_REINFORCE) { VoiceCmdApp = CMD_REINFORCEACK; VoiceCmdAppAck = CMD_NULL; } else if (VoiceCmdAppAck == CMD_CHANGE) { VoiceCmdApp = CMD_CHANGEACK; VoiceCmdAppAck = CMD_NULL; } else { VoiceCmdAppAck = CMD_NULL; } break; case 11: RELAY_ON; break; case 12: RELAY_OFF; break; //========================================================================= case 13: //状态查询 brm.DaddressDate = (uint16_t)((Addrp[0] <<8) | Addrp[1]); brm.DataType = 0x0d; BUS_SendData(brm); break; case 14: if(BUS_Rev_Cmd[1]=='Y') //在线模式启动 { RunMode=1; Bus_SendLength=26; //在线模式,在线工作,发26 (3byes*8+2) } else { RunMode=0; //0:离线模式,>0在线工作模式 Bus_SendLength=146; } break; case 15: if(BUS_Rev_Cmd[1]=='Y') //未知 { // GPIO_ResetBits(GPIOC, GPIO_Pin_14); //不需要 } else if(BUS_Rev_Cmd[1]=='N') //未知 { // GPIO_SetBits(GPIOC, GPIO_Pin_14); //不需要 } else if(BUS_Rev_Cmd[1]=='1') //双工模式 { callmode = 1; } else if(BUS_Rev_Cmd[1]=='0') { //单工模式 callmode = 0; if (callstate ==1 ) { Micswitch =1; } } break; } // Bus_RevFlag=0xFF; } unsigned char key6laycnt = 0; unsigned char key2laycnt = 0; /** * @brief 按键状态扫描处理函数 * * 检测按键状态变化,并更新KEY数组状态 * KEY0-KEY6对应不同的按键功能 */ void GPIO_KEY_Tick(void) { static unsigned char KeyoldState = 0; // 上一次按键状态的缓存 // 清除按键触发状态(值2)为正常状态(值0) if (KEY0 == 2) { KEY0 = 0; } if (KEY1 == 2) { KEY1 = 0; } if (KEY2 == 2) { KEY2 = 0; } if (KEY3 == 2) { KEY3 = 0; } if (KEY4 == 2) { KEY4 = 0; } if (KEY5 == 2) { KEY5 = 0; } // 换药键(KEY2)状态变化检测与防抖处理 if ((KeyoldState & 0x20) != (gtArm.KeyState & 0x20)) { // 检测位5(0x20)状态变化 key2laycnt++; if (key2laycnt > 20) { // 防抖计数器超限 key2laycnt = 0; } else { return; // 防抖期间直接返回 } if (gtArm.KeyState & 0x20) { // 按键按下 KEY2 = 1; // 按下状态 } else { KEY2 = 2; // 释放状态 } } // 免提键(KEY1)状态检测 - 对应gtArm.KeyState位0(0x01) if ((KeyoldState & 0x01) != (gtArm.KeyState & 0x01)) { if (gtArm.KeyState & 0x01) { KEY1 = 1; // 按下状态 } else { KEY1 = 2; // 释放状态 } } // 手柄键(KEY0)状态检测 - 对应gtArm.KeyState位1(0x02) if ((KeyoldState & 0x02) != (gtArm.KeyState & 0x02)) { if (gtArm.KeyState & 0x02) { KEY0 = 1; // 按下状态 } else { KEY0 = 2; // 释放状态 } } // 取消键(KEY3)状态检测 - 对应gtArm.KeyState位2(0x04) 注意这里可能有PA7冲突 if ((KeyoldState & 0x04) != (gtArm.KeyState & 0x04)) { if (gtArm.KeyState & 0x04) { KEY3 = 1; // 按下状态 } else { KEY3 = 2; // 释放状态 } } // 增援键(KEY5)状态检测 - 对应gtArm.KeyState位3(0x08) if ((KeyoldState & 0x08) != (gtArm.KeyState & 0x08)) { if (gtArm.KeyState & 0x08) { KEY5 = 1; // 按下状态 } else { KEY5 = 2; // 释放状态 } } // 护理键(KEY4)状态检测 - 对应gtArm.KeyState位4(0x10) if ((KeyoldState & 0x10) != (gtArm.KeyState & 0x10)) { if (gtArm.KeyState & 0x10) { KEY4 = 1; // 按下状态 } else { KEY4 = 2; // 释放状态 } } // 取消键(KEY3)状态检测 - 对应gtArm.KeyState位6(0x40) // 注意:这里存在KEY3同时受位2(0x04)和位6(0x40)控制的情况 if ((KeyoldState & 0x40) != (gtArm.KeyState & 0x40)) { if (gtArm.KeyState & 0x40) { KEY3 = 1; // 按下状态 } else { KEY3 = 2; // 释放状态 } } // 组合按键检测:同时按下KEY0和KEY2生成KEY6(拔针键) if ((KEY0 == 1) && (KEY2 == 1)) { KEY0 = 0; // 清除KEY0状态 KEY2 = 0; // 清除KEY2状态 KEY6 = 1; // 设置KEY6(拔针键) key6laycnt = 200; // 设置组合键延时计数器 } else { KEY6 = 0; // 清除KEY6状态 if (key6laycnt) { key6laycnt--; // 延时递减 KEY0 = 0; // 延时期间将KEY0置0 KEY2 = 0; // 延时期间将KEY2置0 } } KeyoldState = gtArm.KeyState; // 保存当前状态为下次对比基准 } void sentvoicecmd(unsigned char prm) { static unsigned char bcnt =0; //延时两条数据100ms间隔 static unsigned char VoiceCmdOld =0; static unsigned short s5muitecnt =0; //5秒后可以继续发语音 if(BUS_SendInex) { //总线数据先发 return ; } if (prm == CMD_NULL) { VoiceCmdOld = prm; s5muitecnt =0; VOICE_PF7_ON; //恢复呼叫通话 return ; } s5muitecnt ++; if (s5muitecnt > 400) { //500*10 = 5秒后关闭 //语音指令声音通道关闭 VOICE_PF7_ON; //恢复呼叫通话 VoiceCmdApp = CMD_NULL; VoiceCmdOld = CMD_NULL; bcnt = 10; return; } if (VoiceCmdOld != prm) { //语音芯片播报声音通道打开 VOICE_PF7_OFF; VoiceCmdAppAck = VoiceCmdApp; s5muitecnt =0; VoiceCmd = 0xfe; VoiceCmdFlag =1; bcnt = 10; VoiceCmdOld = prm; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); } if (bcnt !=0) { if (VoiceCmd == 0xfe) { bcnt --; } } if (bcnt ==0) { VoiceCmdFlag =1; VoiceCmd = VoiceCmdOld; TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); bcnt = 100; } } unsigned long dwdtestcnt = 0; //============================================================== /** * @brief 主任务函数 * * 处理系统主要逻辑,包括语音处理、按键扫描、状态更新等 */ void BUSTask(void) { T_BUS_FRAME brm = {0}; // 定义总线帧结构体 static unsigned long ii = 0; // 定义静态变量用于循环计数 // unsigned long SleepTimeDelay=0; //?????? static unsigned char TurnOnMode = 0; RunMode = 1; // 确保系统处于工作模式 Bus_SendLength = 26; #if 0 // 测试代码,用于验证功能 dwdtestcnt++; if (dwdtestcnt > 500) { dwdtestcnt = 1000; } else if (dwdtestcnt > 50) { dwdtestcnt = 600; brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x03; BUS_SendData(brm); VoiceCmdApp = CMD_NURSEOUT; } else { } #endif sentvoicecmd(VoiceCmdApp); // 调用语音处理函数 /* // 按键扫描处理 GPIO_KEY_Tick(); if (KEY_OLD[2] != KEY2) { // ?? if (KEY2 == 1) { if (VoiceCmdFlag == 0) { VoiceCmdFlag = 1; VoiceCmd = 0xfe; TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); senttestcnt = 1; } } KEY_OLD[2] = KEY2; } if (senttestcnt > 0) { senttestcnt++; if (senttestcnt > 10) { VoiceCmdFlag = 1; VoiceCmd = 0x01; TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); senttestcnt = 0; } } return; */ // 状态更新逻辑 if (nursestate) { // 如果护理状态为真 ii++; } else { ii = 0; } // 呼叫逻辑 if (sandcnt < 50) { sandcnt += 1; } else { sandcnt = 0; } // 启动逻辑 - 如果本地时间小于2秒 if (LocalTime < 2000) { // 启动前2秒初始化逻辑 TurnOnMode = 1; // 设置启动模式标志 CallQuesetTime = 0; // 清除请求时间 Ledswitch = 0; // 关闭LED灯 KEY1 = 0; // 清除所有按键状态 KEY0 = 0; KEY2 = 0; KEY3 = 0; KEY4 = 0; KEY5 = 0; KEY6 = 0; // 初始化硬件外设 GPIO_MIC_SW(Micswitch); // 麦克风开关 GPIO_LED_Tick(); // LED控制 BUS_Rev_Tick(); // 总线接收处理 GPIO_KEY_Tick(); // 按键状态扫描处理 // 语音通道控制逻辑 if (Voiceswitch) { VOICESW_H; } else { VOICESW_L; } return; // 启动期间直接返回,不执行后续逻辑 } // 启动后10秒内的特殊逻辑 if ((LocalTime < 1000) && (TurnOnMode == 0)) { // MUTE_H; // 静音设置 } else if (LocalTime < 1000) { CallQuesetTime = 0; } // 硬件外设控制 GPIO_MIC_SW(Micswitch); // 麦克风开关控制 GPIO_LED_Tick(); // LED指示灯控制 BUS_Rev_Tick(); // 总线数据接收 GPIO_KEY_Tick(); // 按键扫描 // 语音通道状态控制 if (1) { // 始终执行的语音控制逻辑 if (Voiceswitch) { // 如果语音开关开启 VOICESW_H; // 语音通道开 } else { if (VoiceCmdApp != CMD_NULL) { // 如果有语音指令 VOICESW_H; // 语音通道开 } else { VOICESW_L; // 语音通道关 } } if (callmode == 0) { // 单工模式 if (Voiceswitch > 0) { MUTE_L; // 取消静音 } else { if (VoiceCmdApp != CMD_NULL) { // 有语音播报 MUTE_L; // 取消静音 } else { MUTE_H; // 静音 } } } } else if ((BUS_RevOverTime >= 400) && (BUS_RevOverTime < 500)) { if (Voiceswitch) { VOICESW_H; // 语音通道开 } else { VOICESW_L; // 语音通道关 } } // 运行模式处理 if (RunMode == 0) { // 离线模式 // 离线模式处理逻辑 } else { // 在线模式 if (Ledswitch == 2) { Ledswitch = 0; } // 双工模式处理 if (callmode) { // 双工模式 (callmode=1) if (KEY0 == 1) { // 如果 KEY0 手柄按键按下 if (callstate == 1) { // 通话状态中 if (Ledswitch == 0) { // 发送对讲信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0F; BUS_SendData(brm); } Micswitch = 1; // 打开麦克风 Voiceswitch = 1; // 打开语音通道 MUTE_H; // 静音 Ledswitch = 1; // 开启LED } } else { // 按键松开 Micswitch = 0; // 关闭麦克风 if (callstate == 1) { // 通话状态中 if (Ledswitch == 1) { // 发送停止对讲信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0E; BUS_SendData(brm); } Voiceswitch = 1; // 保持语音通道 MUTE_L; // 取消静音 Ledswitch = 0; // 关闭LED } } } // 呼叫重发逻辑 if ((callstate == 3) && (LocalTime > CallWaitTime)) { // 发送呼叫信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0A; BUS_SendData(brm); callstate = 2; } // 手柄按键处理 if (KEY0 == 2) { // 手柄按键松开 if (Voiceswitch == 1) { // 当前在通话中 if ((Micswitch == 1) && (callstate == 1)) { // 对讲状态中挂断 // 发送挂断信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0B; BUS_SendData(brm); VoiceCmdApp = CMD_CALLESC; // 播报挂断语音 } else if (callstate == 2) { // 主机呼叫状态中重拨 // 发送重拨信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0A; BUS_SendData(brm); callstate = 3; CallWaitTime = LocalTime + 1500; // 设置重拨时间 VoiceCmdApp = CMD_CALLWAIT; // 播报等待语音 } Voiceswitch = 0; // 关闭语音通道 Micswitch = 0; // 关闭麦克风 } else { // 当前未通话 if ((LocalTime + 2000) > CallQuesetTime) { // 1秒防重复 // 发送呼叫信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0A; BUS_SendData(brm); Ledswitch = 1; // 开启LED CallQuesetTime = LocalTime + 3500; // 设置呼叫间隔 VoiceCmdApp = CMD_CALLING; // 播报呼叫语音 } } } // 免提按键处理 if (KEY1 == 2) { // 免提按键松开 if (Voiceswitch == 1) { // 当前在通话中挂断 // 发送挂断信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0B; BUS_SendData(brm); Voiceswitch = 0; // 关闭语音通道 Micswitch = 0; // 关闭麦克风 VoiceCmdApp = CMD_CALLINGCANCEL; // 播报取消语音 } else { // 当前未通话 if (Ledswitch == 1) { // 当前有呼叫请求,取消呼叫 CallQuesetTime = 0; // 发送取消信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0xB; BUS_SendData(brm); Ledswitch = 0; // 关闭LED VoiceCmdApp = CMD_CALLINGCANCEL; // 播报取消语音 } else { // 当前无呼叫请求,发起呼叫 // 发送呼叫信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x0A; BUS_SendData(brm); Ledswitch = 1; // 开启LED CallQuesetTime = LocalTime + 3500; // 设置呼叫间隔 VoiceCmdApp = CMD_CALLING; // 播报呼叫语音 } } } // 签到功能:同时按下免提和手柄 if ((KEY1 == 4) && (KEY0 == 4)) { if (signin_state == 0) { // 发送签到信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x01; BUS_SendData(brm); signin_state = 1; // 设置签到中 } } else { signin_state = 0; // 重置签到状态 } // 换药按键 if (KEY_OLD[2] != KEY2) { if (KEY2 == 1) { // 按键按下 // 发送换药信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x4; BUS_SendData(brm); VoiceCmdApp = CMD_CHANGE; // 播报换药语音 } KEY_OLD[2] = KEY2; // 更新状态 } // 取消按键 else if (KEY_OLD[3] != KEY3) { if (KEY3 == 1) { // 按键按下 // 发送取消信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x05; BUS_SendData(brm); VoiceCmdApp = CMD_CALLESC; // 播报取消语音 } KEY_OLD[3] = KEY3; // 更新状态 } // 护理按键 else if (KEY_OLD[4] != KEY4) { // if (ii > 500) { // 超过5秒 // nursestate = 0; // if (KEY4 == 1) { // 按键按下 // // 发送护理离开信号 // brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); // brm.DataType = 0x03; // BUS_SendData(brm); // VoiceCmdApp = CMD_NURSEOUT; // 播报护理离开 // } // } else { // 5秒内 // ii = 0; // nursestate = 1; // if (KEY4 == 1) { // 按键按下 // // 发送护理到达信号 // brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); // brm.DataType = 0x03; // BUS_SendData(brm); // VoiceCmdApp = CMD_NURSEIN; // 播报护理到达 // } // } if (KEY4 == 1) { // 按键按下 // 发送护理信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x03; BUS_SendData(brm); VoiceCmdApp =CMD_NURSEIN; // 播报护理到达 } KEY_OLD[4] = KEY4; // 更新状态 } // 增援按键 else if (KEY_OLD[5] != KEY5) { if (KEY5 == 1) { // 按键按下 // 发送增援信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x02; BUS_SendData(brm); VoiceCmdApp = CMD_REINFORCE; // 播报增援语音 } KEY_OLD[5] = KEY5; // 更新状态 } // 拔针按键处理 else if (KEY_OLD[6] != KEY6) { if (KEY6 == 1) { // 组合键按下 // 发送拔针信号 brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]); brm.DataType = 0x06; BUS_SendData(brm); VoiceCmdApp = CMD_NEEDLES; // 播报拔针语音 } KEY_OLD[6] = KEY6; // 更新状态 } /* // 语音通道控制:PF7引脚控制语音芯片使能 if (VoiceCmdApp == CMD_NULL) { VOICE_PF7_ON; } else { VOICE_PF7_OFF; } */ } // End-RunMode!=0 }