mapp_bus.c 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682
  1. //==================================================================
  2. //
  3. // Filename: mapp_bus.c
  4. // Description: External Input driver.
  5. //
  6. //------------------------------------------------------------------
  7. //
  8. // version:
  9. // date: 08:54am, 08.Feb.2023, by dwd
  10. // Description:
  11. //
  12. //------------------------------------------------------------------
  13. //==================================================================
  14. /*------------------------------------------------------------------------------
  15. * I N C L U D E
  16. *------------------------------------------------------------------------------*/
  17. #include "stm32f0xx.h"
  18. #include "general.h"
  19. #include "main.h"
  20. #include "mapp_gpio.h"
  21. #include "mapp_time.h"
  22. #include "mapp_arm.h"
  23. #include "mapp_msg.h"
  24. #include "mapp_bus.h"
  25. /*------------------------------- E O F ----------------------------------------*/
  26. //==============================================================
  27. #define KEY0 KEY[0] //手柄
  28. #define KEY1 KEY[1] //免提
  29. #define KEY2 KEY[2] //换药
  30. #define KEY3 KEY[3] //取消
  31. #define KEY4 KEY[4] //护理
  32. #define KEY5 KEY[5] //增援
  33. #define KEY6 KEY[6] //拔针
  34. #define VOICESW_H GPIO_SetBits(GPIOA, GPIO_Pin_0) //语音通道
  35. #define VOICESW_L GPIO_ResetBits(GPIOA, GPIO_Pin_0)
  36. #define MUTE_H GPIO_SetBits(GPIOA, GPIO_Pin_1) // 音频MUET 低有效
  37. //#define MUTE_H GPIO_ResetBits(GPIOA, GPIO_Pin_1)
  38. #define MUTE_L GPIO_ResetBits(GPIOA, GPIO_Pin_1)
  39. //==============================================================
  40. unsigned int BUS_RevBuf[30];
  41. unsigned char BUS_RevIndex=0;
  42. unsigned char BUS_Rev_Cmd[3]; //总线接收
  43. unsigned int BUS_RevOverTime=0; //超时
  44. // unsigned char Bus_RevFlag=0; //??????
  45. // unsigned char Bus_BroadFlag=0; //????
  46. //==============================================================
  47. unsigned char BUS_SendInex=0;
  48. unsigned char BUS_SendCmd[30]; //发送数据
  49. unsigned char BUS_SendingCmd[30]; //定时器正在处理数据
  50. //==============================================================
  51. unsigned long LocalTime=0;
  52. unsigned char BufSentTime=0;
  53. unsigned long CallQuesetTime=0; //请求呼叫时间
  54. unsigned long CallWaitTime=0; //等待接听时间重发
  55. //==============================================================
  56. unsigned char KEY[7]={0,0}; //按键
  57. unsigned char KEY_OLD[7]={0,0};
  58. unsigned char Ledswitch=0; //指示灯开关
  59. unsigned char Voiceswitch=0; //语音通道开关
  60. unsigned char Micswitch=0; //麦克风开关 dwd190703
  61. unsigned char callstate=0; //通话状态:0:挂断或广播 1:接听 2:主机呼叫 3:重发呼叫
  62. unsigned char callmode=0; //双工模式 0:单工 1:双工
  63. unsigned char signin_state=0; //签到 0:无 1:签到中 2:签到完成
  64. unsigned long sandcnt =0;
  65. unsigned char VoiceCmd =0; //语音指令
  66. unsigned char VoiceCmdApp = CMD_NULL;
  67. unsigned char VoiceCmdAppAck = CMD_NULL;
  68. unsigned char VoiceCmdFlag =0;
  69. unsigned char nursestate =0; //护理状态
  70. // unsigned char SleepMode=0; //????,0 ?? 1 ?????
  71. unsigned char RunMode=0; //0:离线模式,>0在线工作模式
  72. unsigned char Bus_SendLength=146; //注册时发送长度
  73. unsigned char BUS_SendBuf[4]; //应用层发送数据
  74. unsigned char BUS_SendBitBuf[30]; //应用层发送中断位
  75. //==============================================================
  76. //SV22 SV23 二线制 SV30 SV31 三线制
  77. // __root const unsigned char BlankStr[28]="555555555555";
  78. unsigned char DeviceSN[16] ="SZMNI2210230001";
  79. unsigned char DeviceAddr[10] ={0x13,0x86};
  80. unsigned char Addrp[2]= {0};
  81. T_BUS_FRAME brm = {0};
  82. void SysVar_Init(void);
  83. void BUS_RevData(void);
  84. void GPIO_KEY_Tick(void);
  85. void GPIO_KEY2_Tick(void);
  86. void BUS_Rev_Tick(void);
  87. void GPIO_MIC_SW(unsigned char status);
  88. //==============================================================
  89. void SysVar_Init(void)
  90. {
  91. // Addrp=DeviceAddr;
  92. RunMode=1;
  93. callmode =0;
  94. callstate =0;
  95. }
  96. //============================================================================================================================
  97. void GPIO_MIC_SW(unsigned char status)
  98. {
  99. //=================================================================
  100. if(status==0)
  101. {
  102. // PC_DDR_DDR5 =1;
  103. // PC_CR1_C15 =1;
  104. // PC_ODR_ODR5 =0;
  105. //关闭麦克风,pc5输出低
  106. GPIO_ResetBits(GPIOC, GPIO_Pin_15) ;
  107. }
  108. else
  109. {
  110. // PC_DDR_DDR5 =1;
  111. // PC_CR1_C15 =1;
  112. // PC_ODR_ODR5 =1;
  113. //打开麦克风,PC5输出高
  114. GPIO_SetBits(GPIOC, GPIO_Pin_15) ;
  115. }
  116. }
  117. void BUS_SendData(T_BUS_FRAME c)
  118. {
  119. unsigned char i=0;
  120. //===========================
  121. // while(BUS_SendInex>0);
  122. //===========================
  123. i = HI_BYTE(c.DaddressDate);
  124. i += LO_BYTE(c.DaddressDate);
  125. c.DataType &=0x0F;
  126. i += c.DataType ;
  127. c.DataType |=((i&0x0F)<<4);
  128. //===========================
  129. BUS_SendBuf[0]=HI_BYTE(c.DaddressDate);
  130. BUS_SendBuf[1]= LO_BYTE(c.DaddressDate);
  131. BUS_SendBuf[2]= c.DataType;
  132. // 处理数据
  133. BUS_SendBitBuf[0] = ((BUS_SendBuf[0] >>0) &0x01);
  134. BUS_SendBitBuf[1] = ((BUS_SendBuf[0] >>1) &0x01);
  135. BUS_SendBitBuf[2] = ((BUS_SendBuf[0] >>2) &0x01);
  136. BUS_SendBitBuf[3] = ((BUS_SendBuf[0] >>3) &0x01);
  137. BUS_SendBitBuf[4] = ((BUS_SendBuf[0] >>4) &0x01);
  138. BUS_SendBitBuf[5] = ((BUS_SendBuf[0] >>5) &0x01);
  139. BUS_SendBitBuf[6] = ((BUS_SendBuf[0] >>6) &0x01);
  140. BUS_SendBitBuf[7] = ((BUS_SendBuf[0] >>7) &0x01);
  141. BUS_SendBitBuf[8] = ((BUS_SendBuf[1] >>0) &0x01);
  142. BUS_SendBitBuf[9] = ((BUS_SendBuf[1] >>1) &0x01);
  143. BUS_SendBitBuf[10] = ((BUS_SendBuf[1] >>2) &0x01);
  144. BUS_SendBitBuf[11] = ((BUS_SendBuf[1] >>3) &0x01);
  145. BUS_SendBitBuf[12] = ((BUS_SendBuf[1] >>4) &0x01);
  146. BUS_SendBitBuf[13] = ((BUS_SendBuf[1] >>5) &0x01);
  147. BUS_SendBitBuf[14] = ((BUS_SendBuf[1] >>6) &0x01);
  148. BUS_SendBitBuf[15] = ((BUS_SendBuf[1] >>7) &0x01);
  149. BUS_SendBitBuf[16] = ((BUS_SendBuf[2] >>0) &0x01);
  150. BUS_SendBitBuf[17] = ((BUS_SendBuf[2] >>1) &0x01);
  151. BUS_SendBitBuf[18] = ((BUS_SendBuf[2] >>2) &0x01);
  152. BUS_SendBitBuf[19] = ((BUS_SendBuf[2] >>3) &0x01);
  153. BUS_SendBitBuf[20] = ((BUS_SendBuf[2] >>4) &0x01);
  154. BUS_SendBitBuf[21] = ((BUS_SendBuf[2] >>5) &0x01);
  155. BUS_SendBitBuf[22] = ((BUS_SendBuf[2] >>6) &0x01);
  156. BUS_SendBitBuf[23] = ((BUS_SendBuf[2] >>7) &0x01);
  157. //===========================
  158. BUS_SendInex=1;
  159. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
  160. }
  161. //============================================================================================================================
  162. void GPIO_LED_Tick(void)
  163. {
  164. static long LEDTime;
  165. static unsigned char i=0;
  166. if(Ledswitch==1)
  167. {
  168. LED_RED_ON;
  169. }
  170. else if(Ledswitch==2)
  171. {
  172. LED_RED_ON;
  173. }
  174. else if(Ledswitch==3)
  175. {
  176. LED_RED_ON;
  177. }
  178. else
  179. {
  180. LED_RED_OFF;
  181. }
  182. }
  183. //==============================================================
  184. void BUS_Rev_Tick(void)
  185. {
  186. static unsigned char i=0,j=0,k=0;
  187. if(BUS_RevIndex==26)
  188. {
  189. BUS_Rev_Cmd[0]=0;
  190. BUS_Rev_Cmd[1]=0;
  191. BUS_Rev_Cmd[2]=0;
  192. for(k=0;k<24;k++)
  193. {
  194. i=k / 8;
  195. j=k % 8;
  196. // if ((BUS_RevBuf[k]>280)&&(BUS_RevBuf[k]<400))
  197. if ((BUS_RevBuf[k]>220)&&(BUS_RevBuf[k]<400)) //280
  198. {
  199. BUS_Rev_Cmd[i]|=(1<<j);
  200. }
  201. }
  202. BUS_RevIndex=0;
  203. i=(BUS_Rev_Cmd[0]+ BUS_Rev_Cmd[1]+(BUS_Rev_Cmd[2]&0x0F))&0x0F;
  204. j=(BUS_Rev_Cmd[2]>>4)&0x0F;
  205. if(i==j) //dwd191108
  206. {
  207. BUS_Rev_Cmd[2]=BUS_Rev_Cmd[2]&0x0F;
  208. BUS_RevData();
  209. }
  210. }
  211. }
  212. //===================总线IO输入捕获中断处理===========
  213. void TIM3_IRQHandler(void)
  214. {
  215. static unsigned int lastCC4Value=0;
  216. unsigned int i,CC4Value;
  217. if(TIM_GetITStatus(TIM3,TIM_IT_CC4)!=RESET)
  218. {
  219. //=========================================
  220. i=TIM_GetCapture4(TIM3);
  221. if(i>lastCC4Value)
  222. CC4Value = i-lastCC4Value;
  223. else
  224. CC4Value=65535-lastCC4Value+i;
  225. lastCC4Value=i;
  226. gtArm.BufRxSentTime = OS_TIMER_100MS;
  227. //=========================================脉冲计算宽度
  228. if(CC4Value<=150)
  229. {
  230. if(lastCC4Value>=CC4Value)
  231. {
  232. lastCC4Value=lastCC4Value-CC4Value;
  233. }
  234. else
  235. {
  236. lastCC4Value=65535-lastCC4Value+CC4Value;
  237. }
  238. }
  239. //=========================================处理误码
  240. else
  241. {
  242. // TIM3_CC4[TIM1_cc_flag]=CC4Value;
  243. if(BUS_RevIndex==0)
  244. {
  245. if((CC4Value>400)&&(CC4Value<750)) //采集起始位:3.3ms
  246. {
  247. BUS_RevIndex=2; //dwd190703
  248. VOICESW_L;
  249. if ( BUS_RevOverTime <200) {
  250. BUS_RevOverTime=200; //超时200ms
  251. }
  252. // TIM1_Rev_flag=1;
  253. } else {
  254. BUS_RevIndex=0;
  255. }
  256. }
  257. else if(BUS_RevIndex ==1)
  258. {
  259. if((i>400)&&(i<750))
  260. {
  261. BUS_RevIndex=2;
  262. VOICESW_L;
  263. if ( BUS_RevOverTime <200) {
  264. BUS_RevOverTime=200; //超时200ms
  265. }
  266. // Bus_RevFlag=0; //清除接收标志
  267. }
  268. else
  269. {
  270. BUS_RevIndex=0;
  271. }
  272. } else if(BUS_RevIndex <26)
  273. {
  274. BUS_RevBuf[BUS_RevIndex-2]= CC4Value;
  275. BUS_RevIndex++;
  276. }
  277. //============================================================================
  278. }
  279. TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
  280. }
  281. }
  282. void TIM1_CC_IRQHandler(void)
  283. {
  284. static unsigned int lastCC4Value=0;
  285. unsigned int i,CC4Value;
  286. if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET)
  287. {
  288. //=========================================
  289. i=TIM_GetCapture1(TIM1);
  290. if(i>lastCC4Value) {
  291. CC4Value = i-lastCC4Value;
  292. }
  293. else {
  294. CC4Value=65535-lastCC4Value+i;
  295. }
  296. lastCC4Value=i;
  297. gtArm.BufRxSentTime = OS_TIMER_100MS;
  298. //=========================================脉冲计算宽度
  299. if(CC4Value<=100) //最低180
  300. {
  301. if(lastCC4Value>=CC4Value)
  302. {
  303. lastCC4Value=lastCC4Value-CC4Value;
  304. }
  305. else
  306. {
  307. lastCC4Value=65535-lastCC4Value+CC4Value;
  308. }
  309. }
  310. //=========================================处理误码
  311. else
  312. {
  313. // TIM3_CC4[TIM1_cc_flag]=CC4Value;
  314. if(BUS_RevIndex==0)
  315. {
  316. // if((CC4Value>400)&&(CC4Value<750)) //采集起始位:5ms
  317. // if((CC4Value>300)&&(CC4Value<1250)) //采集起始位3.3ms
  318. if(CC4Value>320)
  319. {
  320. BUS_RevIndex=2; //dwd190703
  321. VOICESW_L;
  322. if ( BUS_RevOverTime <200) {
  323. BUS_RevOverTime=200; //超时200ms
  324. }
  325. // TIM1_Rev_flag=1;
  326. } else {
  327. BUS_RevIndex=0;
  328. }
  329. }
  330. else if(BUS_RevIndex ==1)
  331. {
  332. if((i>320)&&(i<750)) //180 或280
  333. {
  334. BUS_RevIndex=2;
  335. VOICESW_L;
  336. if ( BUS_RevOverTime <200) {
  337. BUS_RevOverTime=200; //超时200ms
  338. }
  339. // Bus_RevFlag=0; //清除接收标志
  340. }
  341. else
  342. {
  343. BUS_RevIndex=0;
  344. }
  345. } else if(BUS_RevIndex <26)
  346. {
  347. BUS_RevBuf[BUS_RevIndex-2]= CC4Value;
  348. BUS_RevIndex++;
  349. }
  350. //============================================================================
  351. }
  352. TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
  353. }
  354. }
  355. #define wtv38_h 140
  356. #define wtv38_l 148
  357. void TIM6_WTV3808S_TASK(void)
  358. {
  359. static unsigned char voiceflag=0;
  360. switch(voiceflag) {
  361. case 0:
  362. if(VoiceCmdFlag) {
  363. voiceflag =1;
  364. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
  365. }
  366. break;
  367. case 1:
  368. VOICE_PB15_OFF; //???
  369. VoiceCmdFlag ++;
  370. if (VoiceCmdFlag >55) { //0.1*50 = 5ms
  371. voiceflag ++;
  372. VoiceCmdFlag = 150;
  373. }
  374. break;
  375. case 2:
  376. VOICE_PB15_ON;
  377. if (VoiceCmd&0x01) {
  378. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  379. voiceflag ++; //250*6
  380. VoiceCmdFlag = 150;
  381. } else if (VoiceCmdFlag ) {
  382. VoiceCmdFlag --;
  383. } else {
  384. voiceflag ++;
  385. VoiceCmdFlag = 150;
  386. }
  387. } else {
  388. if (VoiceCmdFlag < wtv38_l) {
  389. voiceflag ++; //2*0.2
  390. VoiceCmdFlag = 150;
  391. } else if (VoiceCmdFlag ) {
  392. VoiceCmdFlag --;
  393. } else {
  394. voiceflag ++;
  395. VoiceCmdFlag = 150;
  396. }
  397. }
  398. break;
  399. case 3:
  400. VOICE_PB15_OFF;
  401. if (VoiceCmd&0x01) {
  402. if (VoiceCmdFlag < wtv38_l){
  403. voiceflag ++;
  404. VoiceCmdFlag = 150;
  405. } else if (VoiceCmdFlag ) {
  406. VoiceCmdFlag --;
  407. } else {
  408. voiceflag ++;
  409. VoiceCmdFlag = 150;
  410. }
  411. } else {
  412. if (VoiceCmdFlag <wtv38_h) {
  413. voiceflag ++;
  414. VoiceCmdFlag = 150;
  415. } else if (VoiceCmdFlag ) {
  416. VoiceCmdFlag --;
  417. } else {
  418. voiceflag ++;
  419. VoiceCmdFlag = 150;
  420. }
  421. }
  422. break;
  423. case 4:
  424. VOICE_PB15_ON;
  425. if (VoiceCmd&0x02) {
  426. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  427. voiceflag ++; //250*6
  428. VoiceCmdFlag = 150;
  429. } else if (VoiceCmdFlag ) {
  430. VoiceCmdFlag --;
  431. } else {
  432. voiceflag ++;
  433. VoiceCmdFlag = 150;
  434. }
  435. } else {
  436. if (VoiceCmdFlag < wtv38_l) {
  437. voiceflag ++; //2*0.2
  438. VoiceCmdFlag = 150;
  439. } else if (VoiceCmdFlag ) {
  440. VoiceCmdFlag --;
  441. } else {
  442. voiceflag ++;
  443. VoiceCmdFlag = 150;
  444. }
  445. }
  446. break;
  447. case 5:
  448. VOICE_PB15_OFF;
  449. if (VoiceCmd&0x02) {
  450. if (VoiceCmdFlag < wtv38_l){
  451. voiceflag ++;
  452. VoiceCmdFlag = 150;
  453. } else if (VoiceCmdFlag ) {
  454. VoiceCmdFlag --;
  455. } else {
  456. voiceflag ++;
  457. VoiceCmdFlag = 150;
  458. }
  459. } else {
  460. if (VoiceCmdFlag <wtv38_h) {
  461. voiceflag ++;
  462. VoiceCmdFlag = 150;
  463. } else if (VoiceCmdFlag ) {
  464. VoiceCmdFlag --;
  465. } else {
  466. voiceflag ++;
  467. VoiceCmdFlag = 150;
  468. }
  469. }
  470. break;
  471. case 6:
  472. VOICE_PB15_ON;
  473. if (VoiceCmd&0x04) {
  474. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  475. voiceflag ++; //250*6
  476. VoiceCmdFlag = 150;
  477. } else if (VoiceCmdFlag ) {
  478. VoiceCmdFlag --;
  479. } else {
  480. voiceflag ++;
  481. VoiceCmdFlag = 150;
  482. }
  483. } else {
  484. if (VoiceCmdFlag < wtv38_l) {
  485. voiceflag ++; //2*0.2
  486. VoiceCmdFlag = 150;
  487. } else if (VoiceCmdFlag ) {
  488. VoiceCmdFlag --;
  489. } else {
  490. voiceflag ++;
  491. VoiceCmdFlag = 150;
  492. }
  493. }
  494. break;
  495. case 7:
  496. VOICE_PB15_OFF;
  497. if (VoiceCmd&0x04) {
  498. if (VoiceCmdFlag < wtv38_l){
  499. voiceflag ++;
  500. VoiceCmdFlag = 150;
  501. } else if (VoiceCmdFlag ) {
  502. VoiceCmdFlag --;
  503. } else {
  504. voiceflag ++;
  505. VoiceCmdFlag = 150;
  506. }
  507. } else {
  508. if (VoiceCmdFlag <wtv38_h) {
  509. voiceflag ++;
  510. VoiceCmdFlag = 150;
  511. } else if (VoiceCmdFlag ) {
  512. VoiceCmdFlag --;
  513. } else {
  514. voiceflag ++;
  515. VoiceCmdFlag = 150;
  516. }
  517. }
  518. break;
  519. case 8:
  520. VOICE_PB15_ON;
  521. if (VoiceCmd&0x08) {
  522. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  523. voiceflag ++; //250*6
  524. VoiceCmdFlag = 150;
  525. } else if (VoiceCmdFlag ) {
  526. VoiceCmdFlag --;
  527. } else {
  528. voiceflag ++;
  529. VoiceCmdFlag = 150;
  530. }
  531. } else {
  532. if (VoiceCmdFlag < wtv38_l) {
  533. voiceflag ++; //2*0.2
  534. VoiceCmdFlag = 150;
  535. } else if (VoiceCmdFlag ) {
  536. VoiceCmdFlag --;
  537. } else {
  538. voiceflag ++;
  539. VoiceCmdFlag = 150;
  540. }
  541. }
  542. break;
  543. case 9:
  544. VOICE_PB15_OFF;
  545. if (VoiceCmd&0x08) {
  546. if (VoiceCmdFlag < wtv38_l){
  547. voiceflag ++;
  548. VoiceCmdFlag = 150;
  549. } else if (VoiceCmdFlag ) {
  550. VoiceCmdFlag --;
  551. } else {
  552. voiceflag ++;
  553. VoiceCmdFlag = 150;
  554. }
  555. } else {
  556. if (VoiceCmdFlag <wtv38_h) {
  557. voiceflag ++;
  558. VoiceCmdFlag = 150;
  559. } else if (VoiceCmdFlag ) {
  560. VoiceCmdFlag --;
  561. } else {
  562. voiceflag ++;
  563. VoiceCmdFlag = 150;
  564. }
  565. }
  566. break;
  567. case 10:
  568. VOICE_PB15_ON;
  569. if (VoiceCmd&0x10) {
  570. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  571. voiceflag ++; //250*6
  572. VoiceCmdFlag = 150;
  573. } else if (VoiceCmdFlag ) {
  574. VoiceCmdFlag --;
  575. } else {
  576. voiceflag ++;
  577. VoiceCmdFlag = 150;
  578. }
  579. } else {
  580. if (VoiceCmdFlag < wtv38_l) {
  581. voiceflag ++; //2*0.2
  582. VoiceCmdFlag = 150;
  583. } else if (VoiceCmdFlag ) {
  584. VoiceCmdFlag --;
  585. } else {
  586. voiceflag ++;
  587. VoiceCmdFlag = 150;
  588. }
  589. }
  590. break;
  591. case 11:
  592. VOICE_PB15_OFF;
  593. if (VoiceCmd&0x10) {
  594. if (VoiceCmdFlag < wtv38_l){
  595. voiceflag ++;
  596. VoiceCmdFlag = 150;
  597. } else if (VoiceCmdFlag ) {
  598. VoiceCmdFlag --;
  599. } else {
  600. voiceflag ++;
  601. VoiceCmdFlag = 150;
  602. }
  603. } else {
  604. if (VoiceCmdFlag <wtv38_h) {
  605. voiceflag ++;
  606. VoiceCmdFlag = 150;
  607. } else if (VoiceCmdFlag ) {
  608. VoiceCmdFlag --;
  609. } else {
  610. voiceflag ++;
  611. VoiceCmdFlag = 150;
  612. }
  613. }
  614. break;
  615. case 12:
  616. VOICE_PB15_ON;
  617. if (VoiceCmd&0x20) {
  618. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  619. voiceflag ++; //250*6
  620. VoiceCmdFlag = 150;
  621. } else if (VoiceCmdFlag ) {
  622. VoiceCmdFlag --;
  623. } else {
  624. voiceflag ++;
  625. VoiceCmdFlag = 150;
  626. }
  627. } else {
  628. if (VoiceCmdFlag < wtv38_l) {
  629. voiceflag ++; //2*0.2
  630. VoiceCmdFlag = 150;
  631. } else if (VoiceCmdFlag ) {
  632. VoiceCmdFlag --;
  633. } else {
  634. voiceflag ++;
  635. VoiceCmdFlag = 150;
  636. }
  637. }
  638. break;
  639. case 13:
  640. VOICE_PB15_OFF;
  641. if (VoiceCmd&0x20) {
  642. if (VoiceCmdFlag < wtv38_l){
  643. voiceflag ++;
  644. VoiceCmdFlag = 150;
  645. } else if (VoiceCmdFlag ) {
  646. VoiceCmdFlag --;
  647. } else {
  648. voiceflag ++;
  649. VoiceCmdFlag = 150;
  650. }
  651. } else {
  652. if (VoiceCmdFlag <wtv38_h) {
  653. voiceflag ++;
  654. VoiceCmdFlag = 150;
  655. } else if (VoiceCmdFlag ) {
  656. VoiceCmdFlag --;
  657. } else {
  658. voiceflag ++;
  659. VoiceCmdFlag = 150;
  660. }
  661. }
  662. break;
  663. case 14:
  664. VOICE_PB15_ON;
  665. if (VoiceCmd&0x40) {
  666. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  667. voiceflag ++; //250*6
  668. VoiceCmdFlag = 150;
  669. } else if (VoiceCmdFlag ) {
  670. VoiceCmdFlag --;
  671. } else {
  672. voiceflag ++;
  673. VoiceCmdFlag = 150;
  674. }
  675. } else {
  676. if (VoiceCmdFlag < wtv38_l) {
  677. voiceflag ++; //2*0.2
  678. VoiceCmdFlag = 150;
  679. } else if (VoiceCmdFlag ) {
  680. VoiceCmdFlag --;
  681. } else {
  682. voiceflag ++;
  683. VoiceCmdFlag = 150;
  684. }
  685. }
  686. break;
  687. case 15:
  688. VOICE_PB15_OFF;
  689. if (VoiceCmd&0x40) {
  690. if (VoiceCmdFlag < wtv38_l){
  691. voiceflag ++;
  692. VoiceCmdFlag = 150;
  693. } else if (VoiceCmdFlag ) {
  694. VoiceCmdFlag --;
  695. } else {
  696. voiceflag ++;
  697. VoiceCmdFlag = 150;
  698. }
  699. } else {
  700. if (VoiceCmdFlag <wtv38_h) {
  701. voiceflag ++;
  702. VoiceCmdFlag = 150;
  703. } else if (VoiceCmdFlag ) {
  704. VoiceCmdFlag --;
  705. } else {
  706. voiceflag ++;
  707. VoiceCmdFlag = 150;
  708. }
  709. }
  710. break;
  711. case 16:
  712. VOICE_PB15_ON;
  713. if (VoiceCmd&0x80) {
  714. if (VoiceCmdFlag < wtv38_h){ //6*0.1 = 0.6
  715. voiceflag ++; //250*6
  716. VoiceCmdFlag = 150;
  717. } else if (VoiceCmdFlag ) {
  718. VoiceCmdFlag --;
  719. } else {
  720. voiceflag ++;
  721. VoiceCmdFlag = 150;
  722. }
  723. } else {
  724. if (VoiceCmdFlag < wtv38_l) {
  725. voiceflag ++; //2*0.2
  726. VoiceCmdFlag = 150;
  727. } else if (VoiceCmdFlag ) {
  728. VoiceCmdFlag --;
  729. } else {
  730. voiceflag ++;
  731. VoiceCmdFlag = 150;
  732. }
  733. }
  734. break;
  735. case 17:
  736. VOICE_PB15_OFF;
  737. if (VoiceCmd&0x80) {
  738. if (VoiceCmdFlag < wtv38_l){
  739. voiceflag ++;
  740. VoiceCmdFlag = 150;
  741. } else if (VoiceCmdFlag ) {
  742. VoiceCmdFlag --;
  743. } else {
  744. voiceflag ++;
  745. VoiceCmdFlag = 150;
  746. }
  747. } else {
  748. if (VoiceCmdFlag <wtv38_h) {
  749. voiceflag ++;
  750. VoiceCmdFlag = 150;
  751. } else if (VoiceCmdFlag ) {
  752. VoiceCmdFlag --;
  753. } else {
  754. voiceflag ++;
  755. VoiceCmdFlag = 150;
  756. }
  757. }
  758. break;
  759. case 18:
  760. VOICE_PB15_ON;
  761. voiceflag =0;
  762. VoiceCmdFlag =0;
  763. break;
  764. default:
  765. VOICE_PB15_ON;
  766. voiceflag =0;
  767. VoiceCmdFlag =0;
  768. break;
  769. }
  770. }
  771. // 定义一个标志位,指示PA6的模式(1表示使用模式,0表示输出模式)
  772. volatile uint8_t PA6Mode = 0; // 默认是输出模式
  773. // 初始化 GPIO 为输出模式
  774. void initGPIOForOutput(void) {
  775. GPIO_InitTypeDef GPIO_InitStructure;
  776. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置为输出模式
  777. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  778. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
  779. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上拉/下拉
  780. GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 PA6
  781. GPIO_ResetBits(GPIOA, GPIO_Pin_6); // 将 PA6 设置为低电平
  782. }
  783. // 初始化 GPIO 为复用模式
  784. void initGPIOForAF(void) {
  785. GPIO_InitTypeDef GPIO_InitStructure;
  786. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置为复用模式
  787. GPIO_Init(GPIOA, &GPIO_InitStructure);
  788. GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1); // 配置复用功能(例如 USART1)
  789. }
  790. void UpdatePA6Mode(void)
  791. {
  792. // 检查TIM6中断是否被使用
  793. PA6Mode=0;
  794. // TIM6 更新中断被使用 -> 配置 PA6 为输出模式并拉低
  795. initGPIOForOutput(); // 配置 PA6 为输出模式
  796. GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_RESET); // 将 PA6 设置为低电平
  797. }
  798. //注:1ms中断 改0.1ms中断
  799. void TIM6_DAC_IRQHandler (void)
  800. {
  801. static unsigned char flag=0;
  802. if(TIM_GetITStatus(TIM6, TIM_IT_Update)== SET)
  803. {
  804. TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);
  805. GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);
  806. if(BUS_RevOverTime>0)BUS_RevOverTime--;
  807. if(BUS_SendInex ==0) { //语音处理芯片
  808. TIM6_WTV3808S_TASK();
  809. GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
  810. return;
  811. }
  812. //if(BufSentTime>0) { //dwd190707
  813. // BufSentTime--;
  814. // return;
  815. // }
  816. //===================================
  817. if (flag>=11)
  818. {
  819. TIM3->CCER |= 0x01; //打开
  820. flag--;
  821. return;
  822. }
  823. else if ((flag<=10) && (flag!=0))
  824. {
  825. TIM3->CCER &=~(1<<0); //关闭
  826. flag --;
  827. GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
  828. return;
  829. }
  830. if((BUS_SendInex>0)&&(flag==0))
  831. {
  832. if (BUS_SendInex==1) //起始位:总线5ms低电平
  833. {
  834. flag=59;//41-9 =3.3ms 60-10 = 5ms
  835. TIM3->CCER |= 0x01;
  836. BUS_SendInex++;
  837. }
  838. else if(BUS_SendInex<(24+3))
  839. {
  840. if (BUS_SendBitBuf[BUS_SendInex-2]) { //数据位1:2ms低电平
  841. flag= 29; //29-9 = 2ms
  842. } else { //数据位0:1ms低电平
  843. flag= 19; //19=9 = 1ms
  844. }
  845. TIM3->CCER |= 0x01;
  846. BUS_SendInex++;
  847. }
  848. else if(BUS_SendInex==(24+3))
  849. {
  850. flag=0;
  851. TIM3->CCER &=~(1<<0);
  852. BUS_SendInex++;
  853. }
  854. else
  855. {
  856. BUS_SendInex=0;
  857. TIM3->CCER &=~(1<<0);
  858. flag=0;
  859. TIM_ITConfig(TIM6,TIM_IT_Update,DISABLE);
  860. }
  861. }
  862. GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
  863. }
  864. }
  865. void Uart_Call_RevData( unsigned char prm)
  866. {
  867. if (prm =='0') { //挂断或广播
  868. Voiceswitch =0;
  869. Ledswitch =0;
  870. Micswitch =0; //dwd190703
  871. MUTE_H; //dwd190725
  872. BUS_RevOverTime = 250; //dwd190725
  873. callstate =0;
  874. } else if (prm =='1') { //接听
  875. Voiceswitch =1;
  876. Micswitch =1;
  877. Ledswitch =0;
  878. callstate = 1;
  879. } else if (prm =='2') {
  880. }
  881. }
  882. void Uart_EVEAL_RevData( unsigned char prm)
  883. {
  884. if (VoiceCmdAppAck == CMD_NEEDLES) {
  885. VoiceCmdApp = CMD_NEEDLESACK;
  886. VoiceCmdAppAck = CMD_NULL;
  887. } else if (VoiceCmdAppAck == CMD_REINFORCE) {
  888. VoiceCmdApp = CMD_REINFORCEACK;
  889. VoiceCmdAppAck = CMD_NULL;
  890. } else if (VoiceCmdAppAck == CMD_CHANGE) {
  891. VoiceCmdApp = CMD_CHANGEACK;
  892. VoiceCmdAppAck = CMD_NULL;
  893. } else {
  894. VoiceCmdAppAck = CMD_NULL;
  895. }
  896. }
  897. //==============================================================
  898. void BUS_RevData(void)
  899. {
  900. T_BUS_FRAME brm = {0};
  901. //=======================================
  902. if(((BUS_Rev_Cmd[0]!=Addrp[0])||(BUS_Rev_Cmd[1]!=Addrp[1]))&&(BUS_Rev_Cmd[2]<0x0E)) //0x0e,0x0f,0x10E
  903. {
  904. if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF))
  905. return;
  906. }
  907. //=======================================
  908. // SleepMode = 0;
  909. switch(BUS_Rev_Cmd[2])
  910. {
  911. case 0:
  912. break;
  913. case 1:
  914. signin_state = 2;
  915. break;
  916. case 2: // 门灯
  917. break;
  918. case 3: //门灯
  919. break;
  920. case 4: //主机呼叫分机或分机响应主机
  921. Voiceswitch =1;
  922. Micswitch =1;
  923. Ledswitch = 0;
  924. VoiceCmdApp = CMD_NULL; //dwd240907 呼叫时停止语音芯片播报
  925. callstate = 1;
  926. #ifdef acktxcnt
  927. BUS_SendInex= acktxcnt ; //dwd190723
  928. #endif
  929. break;
  930. case 5: //挂断
  931. // if(LocalTime>BroadcastTime)
  932. // {
  933. Voiceswitch =0;
  934. Ledswitch =0;
  935. Micswitch =0; //dwd190703
  936. MUTE_H; //dwd190725
  937. BUS_RevOverTime = 250; //dwd190725
  938. // }
  939. callstate =0;
  940. #ifdef acktxcnt
  941. if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF))
  942. {
  943. BUS_SendInex= acktxcnt ; //dwd190723
  944. }
  945. #endif
  946. break;
  947. case 6: //广播
  948. if((BUS_Rev_Cmd[0]!=0xFF)||(BUS_Rev_Cmd[1]!=0xFF)) { //非广播指令,自动接听
  949. callstate =2;
  950. MUTE_H;
  951. Voiceswitch =1;
  952. Micswitch =0;
  953. Ledswitch =3;
  954. BUS_RevOverTime = 1000 ;
  955. break;
  956. }
  957. BUS_RevOverTime = 1500 +sandcnt;
  958. MUTE_H; //dwd191108
  959. Voiceswitch =1;
  960. Micswitch =0;
  961. Ledswitch =0;
  962. callstate =0;
  963. break;
  964. //=========================================================================
  965. case 7: //保留
  966. case 8: //保留
  967. case 9: //保留
  968. break;
  969. case 10: //事件响应
  970. if (VoiceCmdAppAck == CMD_NEEDLES) {
  971. VoiceCmdApp = CMD_NEEDLESACK;
  972. VoiceCmdAppAck = CMD_NULL;
  973. } else if (VoiceCmdAppAck == CMD_REINFORCE) {
  974. VoiceCmdApp = CMD_REINFORCEACK;
  975. VoiceCmdAppAck = CMD_NULL;
  976. } else if (VoiceCmdAppAck == CMD_CHANGE) {
  977. VoiceCmdApp = CMD_CHANGEACK;
  978. VoiceCmdAppAck = CMD_NULL;
  979. } else {
  980. VoiceCmdAppAck = CMD_NULL;
  981. }
  982. break;
  983. case 11:
  984. RELAY_ON;
  985. break;
  986. case 12:
  987. RELAY_OFF;
  988. break;
  989. //=========================================================================
  990. case 13: //状态查询
  991. brm.DaddressDate = (uint16_t)((Addrp[0] <<8) | Addrp[1]);
  992. brm.DataType = 0x0d;
  993. BUS_SendData(brm);
  994. break;
  995. case 14:
  996. if(BUS_Rev_Cmd[1]=='Y') //在线模式启动
  997. {
  998. RunMode=1;
  999. Bus_SendLength=26; //在线模式,在线工作,发26 (3byes*8+2)
  1000. }
  1001. else
  1002. {
  1003. RunMode=0; //0:离线模式,>0在线工作模式
  1004. Bus_SendLength=146;
  1005. }
  1006. break;
  1007. case 15:
  1008. if(BUS_Rev_Cmd[1]=='Y') //未知
  1009. {
  1010. // GPIO_ResetBits(GPIOC, GPIO_Pin_14); //不需要
  1011. }
  1012. else if(BUS_Rev_Cmd[1]=='N') //未知
  1013. {
  1014. // GPIO_SetBits(GPIOC, GPIO_Pin_14); //不需要
  1015. }
  1016. else if(BUS_Rev_Cmd[1]=='1') //双工模式
  1017. {
  1018. callmode = 1;
  1019. } else if(BUS_Rev_Cmd[1]=='0') { //单工模式
  1020. callmode = 0;
  1021. if (callstate ==1 ) {
  1022. Micswitch =1;
  1023. }
  1024. }
  1025. break;
  1026. }
  1027. // Bus_RevFlag=0xFF;
  1028. }
  1029. unsigned char key6laycnt = 0;
  1030. unsigned char key2laycnt = 0;
  1031. /**
  1032. * @brief 按键状态扫描处理函数
  1033. *
  1034. * 检测按键状态变化,并更新KEY数组状态
  1035. * KEY0-KEY6对应不同的按键功能
  1036. */
  1037. void GPIO_KEY_Tick(void)
  1038. {
  1039. static unsigned char KeyoldState = 0; // 上一次按键状态的缓存
  1040. // 清除按键触发状态(值2)为正常状态(值0)
  1041. if (KEY0 == 2) {
  1042. KEY0 = 0;
  1043. }
  1044. if (KEY1 == 2) {
  1045. KEY1 = 0;
  1046. }
  1047. if (KEY2 == 2) {
  1048. KEY2 = 0;
  1049. }
  1050. if (KEY3 == 2) {
  1051. KEY3 = 0;
  1052. }
  1053. if (KEY4 == 2) {
  1054. KEY4 = 0;
  1055. }
  1056. if (KEY5 == 2) {
  1057. KEY5 = 0;
  1058. }
  1059. // 换药键(KEY2)状态变化检测与防抖处理
  1060. if ((KeyoldState & 0x20) != (gtArm.KeyState & 0x20)) { // 检测位5(0x20)状态变化
  1061. key2laycnt++;
  1062. if (key2laycnt > 20) { // 防抖计数器超限
  1063. key2laycnt = 0;
  1064. } else {
  1065. return; // 防抖期间直接返回
  1066. }
  1067. if (gtArm.KeyState & 0x20) { // 按键按下
  1068. KEY2 = 1; // 按下状态
  1069. } else {
  1070. KEY2 = 2; // 释放状态
  1071. }
  1072. }
  1073. // 免提键(KEY1)状态检测 - 对应gtArm.KeyState位0(0x01)
  1074. if ((KeyoldState & 0x01) != (gtArm.KeyState & 0x01)) {
  1075. if (gtArm.KeyState & 0x01) {
  1076. KEY1 = 1; // 按下状态
  1077. } else {
  1078. KEY1 = 2; // 释放状态
  1079. }
  1080. }
  1081. // 手柄键(KEY0)状态检测 - 对应gtArm.KeyState位1(0x02)
  1082. if ((KeyoldState & 0x02) != (gtArm.KeyState & 0x02)) {
  1083. if (gtArm.KeyState & 0x02) {
  1084. KEY0 = 1; // 按下状态
  1085. } else {
  1086. KEY0 = 2; // 释放状态
  1087. }
  1088. }
  1089. // 取消键(KEY3)状态检测 - 对应gtArm.KeyState位2(0x04) 注意这里可能有PA7冲突
  1090. if ((KeyoldState & 0x04) != (gtArm.KeyState & 0x04)) {
  1091. if (gtArm.KeyState & 0x04) {
  1092. KEY3 = 1; // 按下状态
  1093. } else {
  1094. KEY3 = 2; // 释放状态
  1095. }
  1096. }
  1097. // 增援键(KEY5)状态检测 - 对应gtArm.KeyState位3(0x08)
  1098. if ((KeyoldState & 0x08) != (gtArm.KeyState & 0x08)) {
  1099. if (gtArm.KeyState & 0x08) {
  1100. KEY5 = 1; // 按下状态
  1101. } else {
  1102. KEY5 = 2; // 释放状态
  1103. }
  1104. }
  1105. // 护理键(KEY4)状态检测 - 对应gtArm.KeyState位4(0x10)
  1106. if ((KeyoldState & 0x10) != (gtArm.KeyState & 0x10)) {
  1107. if (gtArm.KeyState & 0x10) {
  1108. KEY4 = 1; // 按下状态
  1109. } else {
  1110. KEY4 = 2; // 释放状态
  1111. }
  1112. }
  1113. // 取消键(KEY3)状态检测 - 对应gtArm.KeyState位6(0x40)
  1114. // 注意:这里存在KEY3同时受位2(0x04)和位6(0x40)控制的情况
  1115. if ((KeyoldState & 0x40) != (gtArm.KeyState & 0x40)) {
  1116. if (gtArm.KeyState & 0x40) {
  1117. KEY3 = 1; // 按下状态
  1118. } else {
  1119. KEY3 = 2; // 释放状态
  1120. }
  1121. }
  1122. // 组合按键检测:同时按下KEY0和KEY2生成KEY6(拔针键)
  1123. if ((KEY0 == 1) && (KEY2 == 1)) {
  1124. KEY0 = 0; // 清除KEY0状态
  1125. KEY2 = 0; // 清除KEY2状态
  1126. KEY6 = 1; // 设置KEY6(拔针键)
  1127. key6laycnt = 200; // 设置组合键延时计数器
  1128. } else {
  1129. KEY6 = 0; // 清除KEY6状态
  1130. if (key6laycnt) {
  1131. key6laycnt--; // 延时递减
  1132. KEY0 = 0; // 延时期间将KEY0置0
  1133. KEY2 = 0; // 延时期间将KEY2置0
  1134. }
  1135. }
  1136. KeyoldState = gtArm.KeyState; // 保存当前状态为下次对比基准
  1137. }
  1138. void sentvoicecmd(unsigned char prm)
  1139. {
  1140. static unsigned char bcnt =0; //延时两条数据100ms间隔
  1141. static unsigned char VoiceCmdOld =0;
  1142. static unsigned short s5muitecnt =0; //5秒后可以继续发语音
  1143. if(BUS_SendInex) { //总线数据先发
  1144. return ;
  1145. }
  1146. if (prm == CMD_NULL) {
  1147. VoiceCmdOld = prm;
  1148. s5muitecnt =0;
  1149. VOICE_PF7_ON; //恢复呼叫通话
  1150. return ;
  1151. }
  1152. s5muitecnt ++;
  1153. if (s5muitecnt > 400) { //500*10 = 5秒后关闭
  1154. //语音指令声音通道关闭
  1155. VOICE_PF7_ON; //恢复呼叫通话
  1156. VoiceCmdApp = CMD_NULL;
  1157. VoiceCmdOld = CMD_NULL;
  1158. bcnt = 10;
  1159. return;
  1160. }
  1161. if (VoiceCmdOld != prm) {
  1162. //语音芯片播报声音通道打开
  1163. VOICE_PF7_OFF;
  1164. VoiceCmdAppAck = VoiceCmdApp;
  1165. s5muitecnt =0;
  1166. VoiceCmd = 0xfe;
  1167. VoiceCmdFlag =1;
  1168. bcnt = 10;
  1169. VoiceCmdOld = prm;
  1170. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
  1171. }
  1172. if (bcnt !=0) {
  1173. if (VoiceCmd == 0xfe) {
  1174. bcnt --;
  1175. }
  1176. }
  1177. if (bcnt ==0) {
  1178. VoiceCmdFlag =1;
  1179. VoiceCmd = VoiceCmdOld;
  1180. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
  1181. bcnt = 100;
  1182. }
  1183. }
  1184. unsigned long dwdtestcnt = 0;
  1185. //==============================================================
  1186. /**
  1187. * @brief 主任务函数
  1188. *
  1189. * 处理系统主要逻辑,包括语音处理、按键扫描、状态更新等
  1190. */
  1191. void BUSTask(void)
  1192. {
  1193. T_BUS_FRAME brm = {0}; // 定义总线帧结构体
  1194. static unsigned long ii = 0; // 定义静态变量用于循环计数
  1195. // unsigned long SleepTimeDelay=0; //??????
  1196. static unsigned char TurnOnMode = 0;
  1197. RunMode = 1; // 确保系统处于工作模式
  1198. Bus_SendLength = 26;
  1199. #if 0
  1200. // 测试代码,用于验证功能
  1201. dwdtestcnt++;
  1202. if (dwdtestcnt > 500) {
  1203. dwdtestcnt = 1000;
  1204. } else if (dwdtestcnt > 50) {
  1205. dwdtestcnt = 600;
  1206. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1207. brm.DataType = 0x03;
  1208. BUS_SendData(brm);
  1209. VoiceCmdApp = CMD_NURSEOUT;
  1210. } else {
  1211. }
  1212. #endif
  1213. sentvoicecmd(VoiceCmdApp); // 调用语音处理函数
  1214. /*
  1215. // 按键扫描处理
  1216. GPIO_KEY_Tick();
  1217. if (KEY_OLD[2] != KEY2) { // ??
  1218. if (KEY2 == 1) {
  1219. if (VoiceCmdFlag == 0) {
  1220. VoiceCmdFlag = 1;
  1221. VoiceCmd = 0xfe;
  1222. TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
  1223. senttestcnt = 1;
  1224. }
  1225. }
  1226. KEY_OLD[2] = KEY2;
  1227. }
  1228. if (senttestcnt > 0) {
  1229. senttestcnt++;
  1230. if (senttestcnt > 10) {
  1231. VoiceCmdFlag = 1;
  1232. VoiceCmd = 0x01;
  1233. TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
  1234. senttestcnt = 0;
  1235. }
  1236. }
  1237. return;
  1238. */
  1239. // 状态更新逻辑
  1240. if (nursestate) { // 如果护理状态为真
  1241. ii++;
  1242. } else {
  1243. ii = 0;
  1244. }
  1245. // 呼叫逻辑
  1246. if (sandcnt < 50) {
  1247. sandcnt += 1;
  1248. } else {
  1249. sandcnt = 0;
  1250. }
  1251. // 启动逻辑 - 如果本地时间小于2秒
  1252. if (LocalTime < 2000) { // 启动前2秒初始化逻辑
  1253. TurnOnMode = 1; // 设置启动模式标志
  1254. CallQuesetTime = 0; // 清除请求时间
  1255. Ledswitch = 0; // 关闭LED灯
  1256. KEY1 = 0; // 清除所有按键状态
  1257. KEY0 = 0;
  1258. KEY2 = 0;
  1259. KEY3 = 0;
  1260. KEY4 = 0;
  1261. KEY5 = 0;
  1262. KEY6 = 0;
  1263. // 初始化硬件外设
  1264. GPIO_MIC_SW(Micswitch); // 麦克风开关
  1265. GPIO_LED_Tick(); // LED控制
  1266. BUS_Rev_Tick(); // 总线接收处理
  1267. GPIO_KEY_Tick(); // 按键状态扫描处理
  1268. // 语音通道控制逻辑
  1269. if (Voiceswitch) {
  1270. VOICESW_H;
  1271. } else {
  1272. VOICESW_L;
  1273. }
  1274. return; // 启动期间直接返回,不执行后续逻辑
  1275. }
  1276. // 启动后10秒内的特殊逻辑
  1277. if ((LocalTime < 1000) && (TurnOnMode == 0)) {
  1278. // MUTE_H; // 静音设置
  1279. } else if (LocalTime < 1000) {
  1280. CallQuesetTime = 0;
  1281. }
  1282. // 硬件外设控制
  1283. GPIO_MIC_SW(Micswitch); // 麦克风开关控制
  1284. GPIO_LED_Tick(); // LED指示灯控制
  1285. BUS_Rev_Tick(); // 总线数据接收
  1286. GPIO_KEY_Tick(); // 按键扫描
  1287. // 语音通道状态控制
  1288. if (1) { // 始终执行的语音控制逻辑
  1289. if (Voiceswitch) { // 如果语音开关开启
  1290. VOICESW_H; // 语音通道开
  1291. } else {
  1292. if (VoiceCmdApp != CMD_NULL) { // 如果有语音指令
  1293. VOICESW_H; // 语音通道开
  1294. } else {
  1295. VOICESW_L; // 语音通道关
  1296. }
  1297. }
  1298. if (callmode == 0) { // 单工模式
  1299. if (Voiceswitch > 0) {
  1300. MUTE_L; // 取消静音
  1301. } else {
  1302. if (VoiceCmdApp != CMD_NULL) { // 有语音播报
  1303. MUTE_L; // 取消静音
  1304. } else {
  1305. MUTE_H; // 静音
  1306. }
  1307. }
  1308. }
  1309. } else if ((BUS_RevOverTime >= 400) && (BUS_RevOverTime < 500)) {
  1310. if (Voiceswitch) {
  1311. VOICESW_H; // 语音通道开
  1312. } else {
  1313. VOICESW_L; // 语音通道关
  1314. }
  1315. }
  1316. // 运行模式处理
  1317. if (RunMode == 0) { // 离线模式
  1318. // 离线模式处理逻辑
  1319. } else { // 在线模式
  1320. if (Ledswitch == 2) {
  1321. Ledswitch = 0;
  1322. }
  1323. // 双工模式处理
  1324. if (callmode) { // 双工模式 (callmode=1)
  1325. if (KEY0 == 1) { // 如果 KEY0 手柄按键按下
  1326. if (callstate == 1) { // 通话状态中
  1327. if (Ledswitch == 0) {
  1328. // 发送对讲信号
  1329. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1330. brm.DataType = 0x0F;
  1331. BUS_SendData(brm);
  1332. }
  1333. Micswitch = 1; // 打开麦克风
  1334. Voiceswitch = 1; // 打开语音通道
  1335. MUTE_H; // 静音
  1336. Ledswitch = 1; // 开启LED
  1337. }
  1338. } else { // 按键松开
  1339. Micswitch = 0; // 关闭麦克风
  1340. if (callstate == 1) { // 通话状态中
  1341. if (Ledswitch == 1) {
  1342. // 发送停止对讲信号
  1343. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1344. brm.DataType = 0x0E;
  1345. BUS_SendData(brm);
  1346. }
  1347. Voiceswitch = 1; // 保持语音通道
  1348. MUTE_L; // 取消静音
  1349. Ledswitch = 0; // 关闭LED
  1350. }
  1351. }
  1352. }
  1353. // 呼叫重发逻辑
  1354. if ((callstate == 3) && (LocalTime > CallWaitTime)) {
  1355. // 发送呼叫信号
  1356. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1357. brm.DataType = 0x0A;
  1358. BUS_SendData(brm);
  1359. callstate = 2;
  1360. }
  1361. // 手柄按键处理
  1362. if (KEY0 == 2) { // 手柄按键松开
  1363. if (Voiceswitch == 1) { // 当前在通话中
  1364. if ((Micswitch == 1) && (callstate == 1)) { // 对讲状态中挂断
  1365. // 发送挂断信号
  1366. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1367. brm.DataType = 0x0B;
  1368. BUS_SendData(brm);
  1369. VoiceCmdApp = CMD_CALLESC; // 播报挂断语音
  1370. } else if (callstate == 2) { // 主机呼叫状态中重拨
  1371. // 发送重拨信号
  1372. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1373. brm.DataType = 0x0A;
  1374. BUS_SendData(brm);
  1375. callstate = 3;
  1376. CallWaitTime = LocalTime + 1500; // 设置重拨时间
  1377. VoiceCmdApp = CMD_CALLWAIT; // 播报等待语音
  1378. }
  1379. Voiceswitch = 0; // 关闭语音通道
  1380. Micswitch = 0; // 关闭麦克风
  1381. } else { // 当前未通话
  1382. if ((LocalTime + 2000) > CallQuesetTime) { // 1秒防重复
  1383. // 发送呼叫信号
  1384. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1385. brm.DataType = 0x0A;
  1386. BUS_SendData(brm);
  1387. Ledswitch = 1; // 开启LED
  1388. CallQuesetTime = LocalTime + 3500; // 设置呼叫间隔
  1389. VoiceCmdApp = CMD_CALLING; // 播报呼叫语音
  1390. }
  1391. }
  1392. }
  1393. // 免提按键处理
  1394. if (KEY1 == 2) { // 免提按键松开
  1395. if (Voiceswitch == 1) { // 当前在通话中挂断
  1396. // 发送挂断信号
  1397. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1398. brm.DataType = 0x0B;
  1399. BUS_SendData(brm);
  1400. Voiceswitch = 0; // 关闭语音通道
  1401. Micswitch = 0; // 关闭麦克风
  1402. VoiceCmdApp = CMD_CALLINGCANCEL; // 播报取消语音
  1403. } else { // 当前未通话
  1404. if (Ledswitch == 1) { // 当前有呼叫请求,取消呼叫
  1405. CallQuesetTime = 0;
  1406. // 发送取消信号
  1407. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1408. brm.DataType = 0xB;
  1409. BUS_SendData(brm);
  1410. Ledswitch = 0; // 关闭LED
  1411. VoiceCmdApp = CMD_CALLINGCANCEL; // 播报取消语音
  1412. } else { // 当前无呼叫请求,发起呼叫
  1413. // 发送呼叫信号
  1414. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1415. brm.DataType = 0x0A;
  1416. BUS_SendData(brm);
  1417. Ledswitch = 1; // 开启LED
  1418. CallQuesetTime = LocalTime + 3500; // 设置呼叫间隔
  1419. VoiceCmdApp = CMD_CALLING; // 播报呼叫语音
  1420. }
  1421. }
  1422. }
  1423. // 签到功能:同时按下免提和手柄
  1424. if ((KEY1 == 4) && (KEY0 == 4)) {
  1425. if (signin_state == 0) {
  1426. // 发送签到信号
  1427. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1428. brm.DataType = 0x01;
  1429. BUS_SendData(brm);
  1430. signin_state = 1; // 设置签到中
  1431. }
  1432. } else {
  1433. signin_state = 0; // 重置签到状态
  1434. }
  1435. // 换药按键
  1436. if (KEY_OLD[2] != KEY2) {
  1437. if (KEY2 == 1) { // 按键按下
  1438. // 发送换药信号
  1439. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1440. brm.DataType = 0x4;
  1441. BUS_SendData(brm);
  1442. VoiceCmdApp = CMD_CHANGE; // 播报换药语音
  1443. }
  1444. KEY_OLD[2] = KEY2; // 更新状态
  1445. }
  1446. // 取消按键
  1447. else if (KEY_OLD[3] != KEY3) {
  1448. if (KEY3 == 1) { // 按键按下
  1449. // 发送取消信号
  1450. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1451. brm.DataType = 0x05;
  1452. BUS_SendData(brm);
  1453. VoiceCmdApp = CMD_CALLESC; // 播报取消语音
  1454. }
  1455. KEY_OLD[3] = KEY3; // 更新状态
  1456. }
  1457. // 护理按键
  1458. else if (KEY_OLD[4] != KEY4) {
  1459. // if (ii > 500) { // 超过5秒
  1460. // nursestate = 0;
  1461. // if (KEY4 == 1) { // 按键按下
  1462. // // 发送护理离开信号
  1463. // brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1464. // brm.DataType = 0x03;
  1465. // BUS_SendData(brm);
  1466. // VoiceCmdApp = CMD_NURSEOUT; // 播报护理离开
  1467. // }
  1468. // } else { // 5秒内
  1469. // ii = 0;
  1470. // nursestate = 1;
  1471. // if (KEY4 == 1) { // 按键按下
  1472. // // 发送护理到达信号
  1473. // brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1474. // brm.DataType = 0x03;
  1475. // BUS_SendData(brm);
  1476. // VoiceCmdApp = CMD_NURSEIN; // 播报护理到达
  1477. // }
  1478. // }
  1479. if (KEY4 == 1) { // 按键按下
  1480. // 发送护理信号
  1481. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1482. brm.DataType = 0x03;
  1483. BUS_SendData(brm);
  1484. VoiceCmdApp =CMD_NURSEIN; // 播报护理到达
  1485. }
  1486. KEY_OLD[4] = KEY4; // 更新状态
  1487. }
  1488. // 增援按键
  1489. else if (KEY_OLD[5] != KEY5) {
  1490. if (KEY5 == 1) { // 按键按下
  1491. // 发送增援信号
  1492. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1493. brm.DataType = 0x02;
  1494. BUS_SendData(brm);
  1495. VoiceCmdApp = CMD_REINFORCE; // 播报增援语音
  1496. }
  1497. KEY_OLD[5] = KEY5; // 更新状态
  1498. }
  1499. // 拔针按键处理
  1500. else if (KEY_OLD[6] != KEY6) {
  1501. if (KEY6 == 1) { // 组合键按下
  1502. // 发送拔针信号
  1503. brm.DaddressDate = (uint16_t)((Addrp[0] << 8) | Addrp[1]);
  1504. brm.DataType = 0x06;
  1505. BUS_SendData(brm);
  1506. VoiceCmdApp = CMD_NEEDLES; // 播报拔针语音
  1507. }
  1508. KEY_OLD[6] = KEY6; // 更新状态
  1509. }
  1510. /*
  1511. // 语音通道控制:PF7引脚控制语音芯片使能
  1512. if (VoiceCmdApp == CMD_NULL) {
  1513. VOICE_PF7_ON;
  1514. } else {
  1515. VOICE_PF7_OFF;
  1516. }
  1517. */
  1518. } // End-RunMode!=0
  1519. }