hal_ble_host.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include "hal_ble_host.h"
  2. #include "system.h"
  3. #include "bsp_time.h"
  4. #include "hal_flash.h"
  5. #include "hal_imu.h"
  6. /************************ 函数声明 ***********************************/
  7. extern int send_bytes_server(uint8_t * bytes, uint16_t len);
  8. void BLE_Host_Tx_Process(void);
  9. /************************ 变量 ***********************************/
  10. /********************** 环形缓存区 *************************/
  11. static const int RxLen = 1024;
  12. static volatile unsigned char RxBuf[RxLen];
  13. static volatile unsigned char* RxW=RxBuf;
  14. static volatile unsigned char* RxR=RxBuf;
  15. void BLE_Host_Push(unsigned char* p,int len)
  16. {
  17. volatile unsigned char *W=RxW; //这里要与上面指针相同
  18. if(len<5) return;
  19. unsigned char L = p[1];
  20. unsigned char LF = ~p[2];
  21. if(p[0]==0xAA&&L==LF&&L==len&&p[3]<5){
  22. IMU_SetSlaveData(p,len);
  23. }else{
  24. for(int i=0;i<len;i++){
  25. W=RxW+1; if(W>=RxBuf+RxLen) W=RxBuf; //取下一位置(到顶转到底)
  26. if(W!=RxR){*RxW=*(p+i); RxW=W;}
  27. else break;
  28. }
  29. }
  30. }
  31. static unsigned int CheckLen(void) //检查RX接收了多少数据
  32. {
  33. unsigned int Len; //short
  34. volatile unsigned char *W=RxW; volatile unsigned char *R=RxR;
  35. if(W>=R)Len=W-R;else Len=(W+RxLen)-R; //这样正确(中途中断改变也变不了结果)
  36. return Len;
  37. }
  38. //static unsigned char ReadByte(void) //读RX中数锯,地指加一,和丢弃
  39. //{
  40. // unsigned char R=*RxR; //读数
  41. // if(RxR!=RxW){ if(RxR+1>=(RxBuf+RxLen))RxR =RxBuf; else RxR++;}//下标
  42. // return R;
  43. //}
  44. static unsigned char CheckByte(unsigned short n) //看RX中数锯,地指不变,
  45. {
  46. volatile unsigned char *R=RxR+n;
  47. if(R>=(RxBuf+RxLen))R-=RxLen;
  48. return *R;
  49. }
  50. static void Discard(unsigned short n) //丢弃RX数据几位
  51. {
  52. while(n){ n--;
  53. if(RxR==RxW) return;
  54. if(RxR+1>=RxBuf+RxLen){RxR=RxBuf;} else RxR++; //下标
  55. }
  56. }
  57. //********************* 接收 **********************//
  58. #define BLE_Host_RX_CMD_LEN 256
  59. static BLE_Host_Rx_t mBLE_Host_Rx[BLE_Host_NUM_OF_R];
  60. static unsigned char cmdDatBuf[BLE_Host_RX_CMD_LEN]; //存放一条完整命令
  61. static unsigned int rxNum = 0;
  62. int BLE_Host_Rx_Regist(unsigned char cmd,BLE_Host_Callback cb) //注册
  63. {
  64. if(rxNum>=BLE_Host_NUM_OF_R) return -1;
  65. mBLE_Host_Rx[rxNum].cb = cb;
  66. mBLE_Host_Rx[rxNum].cmd = cmd;
  67. mBLE_Host_Rx[rxNum].pDat = cmdDatBuf;
  68. rxNum++;
  69. return 0;
  70. }
  71. //********************* 接收协议 **********************//
  72. //协议(1位头+ 1位长度+ 1位长度反码+ 1命令+ N数据+ 1效验)
  73. static void Protocol(unsigned char len) //协议处理
  74. {
  75. #if DEBUG_BLE_Host
  76. SEGGER_RTT_printf(0,"Rx_BLE_Host(%d):",CheckByte(1)); for(int i=0;i<len;i++){SEGGER_RTT_printf(0,"%02X ",CheckByte(i));} SEGGER_RTT_printf(0,"\r\n");
  77. #endif
  78. uint8_t cmd = CheckByte(3);
  79. if(cmd<5){
  80. uint8_t buf[BLE_Host_RX_CMD_LEN];
  81. for(int i=0;i<len-5;i++) buf[i] = CheckByte(i+4);
  82. BLE_Host_Tx_Send(0,cmd,buf,len-5);
  83. }
  84. if(len<5) return;
  85. for(int j=0;j<rxNum;j++){
  86. if(mBLE_Host_Rx[j].cmd==cmd&&mBLE_Host_Rx[j].cb){
  87. for(int i=0;i<len-5;i++) mBLE_Host_Rx[j].pDat[i] = CheckByte(i+4);
  88. mBLE_Host_Rx[j].datLen = len-5;
  89. mBLE_Host_Rx[j].cb((BLE_Host_Rx_t*)&mBLE_Host_Rx[j]);
  90. break;
  91. }
  92. }
  93. }
  94. //协议(1位头+ 1位长度+ 1位长度反码+ 1命令+ N数据+ 1效验)
  95. void BLE_Host_Rx_Process(void)
  96. {
  97. static unsigned char R=0;
  98. static unsigned char L=0;
  99. //接收缓存有数据,就全部处理
  100. while(1){
  101. switch( R ){
  102. case 0: if( CheckLen()<3 )return; else{
  103. if(CheckByte(0)!=0xAA){ Discard(1);}
  104. else{unsigned char LF=CheckByte(2);LF=~LF; L=CheckByte(1); if((LF==L)&&(L>=5)){ R++;}else { Discard(1);}}
  105. } break;
  106. // 多收数据 7 = 3位头+ 1位长度负数+ 1位长度+ 2效验
  107. case 1: if( CheckLen()<L) { return; }else{ //SEGGER_RTT_printf(0,"Rx:"); for(int i=0;i<L;i++){SEGGER_RTT_printf(0,"%02X ",CheckByte(i));} SEGGER_RTT_printf(0,"\r\n");
  108. unsigned char i,ver=0;
  109. for(i=0;i<L-1;i++){ ver += CheckByte(i); }
  110. if(CheckByte(L-1)==ver){ Protocol(L);Discard(L);//丢弃整条命令
  111. } else Discard(1);
  112. R=0;
  113. } break;
  114. default: R=0;break; }
  115. }
  116. }
  117. //********************* 发送协议 **********************//
  118. //协议(1位头+ 1位长度+ 1位长度反码+ 1命令+ N数据+ 1效验)
  119. void BLE_Host_Send(unsigned char cmd,unsigned char *pDat,unsigned char datLen) //协议发送
  120. {
  121. unsigned char buf[255];
  122. unsigned char ver=0;
  123. unsigned char i,L=0,Len=datLen+5;
  124. buf[L]=0xAA; ver+=buf[L++]; // 头
  125. buf[L]=Len; ver+=buf[L++]; //1位长度
  126. buf[L]=~Len; ver+=buf[L++]; // 1位长度反码
  127. buf[L]=cmd; ver+=buf[L++]; //1命令
  128. for(i=0;i<datLen; i++){ buf[L]=pDat[i];ver+=buf[L++];} //数据
  129. buf[L++]=ver; //效验
  130. #if DEBUG_BLE_Host
  131. SEGGER_RTT_printf(0,"Tx_BLE_Host:"); for(int i=0;i<L;i++){SEGGER_RTT_printf(0,"%02X ",buf[i]);} SEGGER_RTT_printf(0,"\r\n");
  132. #endif
  133. send_bytes_server(buf,L); //压入发送缓存
  134. }
  135. static BLE_Host_Tx_t* head_handle = 0;
  136. void BLE_Host_Tx_Send(BLE_Host_Tx_t* handle,unsigned char cmd,unsigned char *pDat,unsigned char datLen)
  137. {
  138. BLE_Host_Tx_t* target = head_handle;
  139. if(handle){
  140. handle->cmd = cmd;
  141. handle->pDat = pDat;
  142. handle->datLen = datLen;
  143. handle->tcnt = handle->t;
  144. if(handle->n>0) handle->ncnt = handle->n-1;
  145. else handle->ncnt = 0;
  146. handle->holdon = 1;
  147. while(target){ //检查是否已经存在
  148. if(target==handle){
  149. SEGGER_RTT_printf(0,"handle(%d)\n",handle);
  150. return;
  151. }
  152. target = target->next ;
  153. }
  154. SEGGER_RTT_printf(0,"add handle(%d)\n",handle);
  155. handle->next = head_handle;
  156. head_handle = handle;
  157. }
  158. BLE_Host_Send(cmd,pDat,datLen);
  159. }
  160. void BLE_Host_Tx_Clear(BLE_Host_Tx_t* handle)
  161. {
  162. BLE_Host_Tx_t** curr;
  163. for(curr=&head_handle;*curr;){
  164. BLE_Host_Tx_t* entry = *curr;
  165. if(entry==handle){
  166. handle->holdon = 0;
  167. *curr = entry->next;
  168. }else{
  169. curr = &entry->next;
  170. }
  171. }
  172. }
  173. void BLE_Host_Tx_Process(void)
  174. {
  175. BLE_Host_Tx_t* target;
  176. uint8_t holdon = 0;
  177. for(target=head_handle; target; target=target->next) {
  178. if(target->tcnt > 0){
  179. if(target->tcnt >= HeartTime_Interval)target->tcnt -= HeartTime_Interval;
  180. else target->tcnt =0;
  181. if(target->tcnt==0){
  182. if(target->ncnt>0){target->ncnt--;
  183. target->tcnt = target->t;
  184. BLE_Host_Send(target->cmd,target->pDat,target->datLen);
  185. }else{
  186. BLE_Host_Tx_Clear(target);
  187. if(target->cb){
  188. target->cb(target);
  189. }
  190. }
  191. }
  192. }
  193. holdon |= target->holdon;
  194. }
  195. Process_SetHoldOn(BLE_Host_Tx_Process,holdon);
  196. }
  197. void BLE_Host_Initialize(void)
  198. {
  199. Process_Start(0,"BLE_Host_Rx",BLE_Host_Rx_Process);
  200. Process_Start(10,"BLE_Host_Tx",BLE_Host_Tx_Process);
  201. }