uart_comm.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: Uart_comm.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2014-12-17
  7. 功能说明: 面板通信
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #ifdef FUN_GPRS
  15. #include "gprs_aux.h"
  16. #endif
  17. /*------------------------------- 宏定义 --------------------------------------
  18. */
  19. #define COMM_TYPE 5
  20. #define MAX_INST_MASK 3
  21. #define MAX_BOARD_MASK 3
  22. /*------------------------------ 类型结构 -------------------------------------
  23. */
  24. UART_INST_BUF_DEF ptBuf[COMM_TYPE];
  25. int prior=1;
  26. int hmi_chnl=0;
  27. bool hmi_status=0;
  28. DWORD count = 0;
  29. /*------------------------------ 函数声明 -------------------------------------
  30. */
  31. //static void _Uart_Comm_Send(int len,u8 *buf);
  32. //static void _uart_comm_queue(void);
  33. /*------------------------------ 外部函数 -------------------------------------
  34. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  35. */
  36. void uart_comm_init(UART_COMM_STRUCT *pt,BYTE chnl)
  37. {
  38. memset(pt,0,sizeof(UART_COMM_STRUCT));
  39. pt->type = IEC_HMI_CHN;
  40. hmi_chnl = chnl;
  41. }
  42. //将数据加入缓冲区
  43. int Add_Uart_Frame(int board,int len,u8 *para)
  44. {
  45. UART_INST_DEF *pt = &ptBuf[board].tInst[ptBuf[board].head];
  46. memcpy(pt->para, para, len);
  47. pt->len=(BYTE)len;
  48. ptBuf[board].head = (ptBuf[board].head + 1) & (UART_MAX_INST_BUFS-1);
  49. return 1;
  50. }
  51. void Sub_Uart_Frame(int board )
  52. {
  53. ptBuf[board].tail = (ptBuf[board].tail - 1) & (UART_MAX_INST_BUFS-1);
  54. }
  55. void Uart_Comm_Send(void)
  56. {
  57. int i = 0;
  58. static int s_cnt[COMM_TYPE] ={0};
  59. int ret = 0;
  60. //按优先级发送
  61. for(i=1;i<COMM_TYPE;i++)
  62. {
  63. UART_INST_DEF *pt = &ptBuf[i].tInst[ptBuf[i].tail];
  64. //连续3次后,接下来发送低优先级缓冲区数据
  65. if(s_cnt[i]<MAX_INST_MASK)
  66. {
  67. if(ptBuf[i].head != ptBuf[i].tail)
  68. {
  69. //发送数据
  70. ret=protocol_put_oneframe(&g_h_boj[0], pt->para, (int)pt->len);
  71. if(ret==0)
  72. {
  73. ptBuf[i].tail = (ptBuf[i].tail + 1) & (UART_MAX_INST_BUFS-1);
  74. s_cnt[i]++;
  75. if(g_print_hmi)
  76. {
  77. print_msg("TX_HMI:",pt->para,(int)pt->len);
  78. }
  79. }
  80. break;
  81. }
  82. }
  83. else
  84. {
  85. s_cnt[i] = 0;
  86. }
  87. }
  88. }
  89. #ifdef FUN_HMI_WATCH
  90. u8 hmi_commstate=false;
  91. void set_hmi_comstate(u8 state)
  92. {
  93. static int first=0;
  94. if(state == true)
  95. {
  96. if(first == 0)
  97. {
  98. first = 1;
  99. watchdog_register_hmi(); /*第一次连接上注册软看门狗*/
  100. log_str_time(LOG_OPERATE,"---监视启动\r\n",0,0);
  101. }
  102. else
  103. {
  104. watchdog_feed_hmi();
  105. }
  106. }
  107. hmi_commstate = state;
  108. }
  109. #endif
  110. void Uart_Comm_Recv(void)
  111. {
  112. u8 buf[UART_FRAME_LEN];
  113. int ret = 0;
  114. BYTE src_addr;
  115. BYTE dst_addr;
  116. ret = protocol_get_oneframe(&g_h_boj[0], buf);
  117. if(ret == 0)
  118. {
  119. ret = (int)buf[1] + 6;
  120. if(g_print_hmi)
  121. print_msg("RX_HMI:",buf, ret);
  122. if(buf[ret-1] & 0x80)
  123. {
  124. src_addr = (buf[ret-1] >> 3) & 0x07; // 起始地址
  125. dst_addr = buf[ret-1] & 0x07; // 目标地址
  126. switch(src_addr)
  127. {
  128. case HMI_BOARD:
  129. #ifdef FUN_HMI_WATCH
  130. set_hmi_comstate(true);
  131. #endif
  132. HMI_Board_Recv((int)buf[1] + 6, buf);
  133. hmi_status = true;
  134. count = ustimer_get_origin();
  135. break;
  136. case PDA_BOARD:
  137. PDA_Board_Recv((int)buf[1] + 6, buf);
  138. break;
  139. case GPRS_BOARD:
  140. #ifdef FUN_GPRS // modfiy for xxxxxx 20220706 GPRS没有使用。
  141. GPRS_Board_Proc((int)buf[1] + 6, buf);
  142. #endif
  143. break;
  144. case MAINTAIN_BOARD:
  145. Maintain_Board_Recv((int)buf[1] + 6,buf);
  146. break;
  147. default:
  148. break;
  149. }
  150. }
  151. }
  152. if(ustimer_get_duration(count) > 10 * USTIMER_SEC)
  153. {
  154. hmi_status = false;
  155. }
  156. }
  157. /*------------------------------ 内部函数 -------------------------------------
  158. */
  159. void Reset_Uart_Link(UART_COMM_STRUCT *pt)
  160. {
  161. pt->cTypeCounter = 0;
  162. pt->cRecvCnt = 0;
  163. }
  164. /*------------------------------ 文件结束 -------------------------------------
  165. */