app_single_line_pair.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /*Includes ----------------------------------------------*/
  2. #include "ble_gap.h"
  3. #include "ble_comm.h"
  4. #include "bsp_time.h"
  5. #include "system.h"
  6. #include "hal_mt.h"
  7. #include "hal_led.h"
  8. #include "app_flash.h"
  9. #include "app_single_line_pair.h"
  10. /*Private macro ------------------------------------------------*/
  11. #define APP_SINGLE_LINE_PAIR_TRIGGER_TIMES 1 //触发次数
  12. #define APP_SINGLE_LINE_PAIR_CMD 0x00 //配对指令
  13. #define APP_SINGLE_LINE_PAIR_LR_CMD 0x01 //获取左右指令
  14. #define APP_SINGLE_LINE_PAIR_TIMEOUT ((FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS* \
  15. FML_SINGLE_LINE_SIMPLEX_PWM_SEQ_VALUES_LEN*8) / 1000) //配对超时时间 单位:ms
  16. /*STRUCTION -----------------------------------------------------*/
  17. typedef enum
  18. {
  19. APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE = 0, //配对状态 —— 配对完成
  20. APP_SINGLE_LINE_PAIR_STATE_PAIR_ING, //配对状态 —— 配对中
  21. APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL, //配对状态 —— 配对失败
  22. } APP_SINGLE_LINE_PAIR_STATE_e; //配对状态
  23. typedef struct _app_single_line_pair
  24. {
  25. APP_SINGLE_LINE_PAIR_ROLE_e role; //角色
  26. APP_SINGLE_LINE_PAIR_STATE_e state; //配对状态
  27. uint8_t mac[6]; //物理地址
  28. int trigger_times; //触发次数
  29. uint32_t pair_timeout_ms; //配对超时
  30. int pair_flow; //配对流程
  31. int save_adv_scan_flow; //保存、广播、扫描流程
  32. } App_Single_Line_Pair_t;
  33. /*Local Variable ----------------------------------------------*/
  34. static App_Single_Line_Pair_t ob_app_single_line_pair;
  35. /*Local Functions ----------------------------------------------*/
  36. static void app_single_line_pair_Process(void);
  37. static void app_single_line_pair_save_adv_or_scan_Process(void)
  38. {
  39. static uint32_t tim =0;
  40. char buf[16];
  41. switch(ob_app_single_line_pair.save_adv_scan_flow)
  42. {
  43. case 0:
  44. MT_Run(500);
  45. if(memcmp(&mFlash.mClient.macAddr[3],&ob_app_single_line_pair.mac[3],3) == 0 && memcmp(&mFlash.macHost[0],&ob_app_single_line_pair.mac[0],3) == 0) //若已配对过
  46. {
  47. DEBUG_LOG(">>>>>>>>already paired \r\n");
  48. //只有配对成功时,才运行。
  49. Process_Stop(app_single_line_pair_save_adv_or_scan_Process);
  50. //关灯
  51. LED_Stop(LED_PAIR);
  52. //取消全功率配对
  53. Process_SetHoldOn(app_single_line_pair_Process,0);
  54. //更新状态
  55. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  56. }
  57. else //若没配对过
  58. {
  59. //配对时候清空所有的步数
  60. if(Flash_DeleteAllStep() != ZONE_OP_SUCCESS){Except_TxError(EXCEPT_DATEStep,"clear step fail");break;}
  61. memset(&mFlash.mStep,0,sizeof(FlashStep_t));
  62. mFlash.mClient.isConfig = 'C';
  63. if(Flash_SaveStep() != ZONE_OP_SUCCESS)Except_TxError(EXCEPT_DATEStep,"save step fail");
  64. //右鞋地址
  65. mFlash.mClient.macAddr[0] = 0;
  66. mFlash.mClient.macAddr[1] = 0;
  67. mFlash.mClient.macAddr[2] = 0;
  68. mFlash.mClient.macAddr[3] = ob_app_single_line_pair.mac[3];
  69. mFlash.mClient.macAddr[4] = ob_app_single_line_pair.mac[4];
  70. mFlash.mClient.macAddr[5] = ob_app_single_line_pair.mac[5];
  71. //左鞋地址
  72. mFlash.macHost[0] = ob_app_single_line_pair.mac[0];
  73. mFlash.macHost[1] = ob_app_single_line_pair.mac[1];
  74. mFlash.macHost[2] = ob_app_single_line_pair.mac[2];
  75. mFlash.macHost[3] = 0;
  76. mFlash.macHost[4] = 0;
  77. mFlash.macHost[5] = 0;
  78. ob_app_single_line_pair.save_adv_scan_flow =1;
  79. tim = TIME_GetTicks();
  80. }
  81. break;
  82. case 1:
  83. if(TIME_GetTicks()-tim>=10000)
  84. {
  85. tim = TIME_GetTicks();//10秒超时退出
  86. //只有配对成功时,才运行。
  87. Process_Stop(app_single_line_pair_save_adv_or_scan_Process);
  88. //关灯
  89. LED_Stop(LED_PAIR);
  90. //取消全功率配对
  91. Process_SetHoldOn(app_single_line_pair_Process,0);
  92. //更新状态
  93. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;
  94. }
  95. if(ob_app_single_line_pair.role == APP_SINGLE_LINE_PAIR_ROLE_HOST) //主机处理
  96. {
  97. if(host_isconnect())
  98. {
  99. host_disconnect();
  100. }
  101. else
  102. {
  103. DEBUG_LOG(">>>>>ST_scan_start =0 \r\n");
  104. memset(buf,0,sizeof(buf));
  105. sprintf(buf,"%02X%02X%02X%02X%02X%02X",mFlash.macHost[0],mFlash.macHost[1],mFlash.macHost[2],mFlash.mClient.macAddr[3],mFlash.mClient.macAddr[4],mFlash.mClient.macAddr[5]);
  106. DEBUG_LOG("scanName(%d):%s\n",strlen(buf),buf);
  107. host_set_scan_name(buf,strlen(buf));
  108. ST_scan_stop();
  109. ST_scan_start();
  110. //只有配对成功时,才运行。
  111. Process_Stop(app_single_line_pair_save_adv_or_scan_Process);
  112. //关灯
  113. LED_Stop(LED_PAIR);
  114. //取消全功率配对
  115. Process_SetHoldOn(app_single_line_pair_Process,0);
  116. //更新状态
  117. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  118. }
  119. }
  120. else //从机处理
  121. {
  122. if(slave_isconnect())
  123. {
  124. slave_disconnect();
  125. }
  126. else
  127. {
  128. memset(buf,0,sizeof(buf));
  129. sprintf(buf,"%02X%02X%02X%02X%02X%02X",mFlash.macHost[0],mFlash.macHost[1],mFlash.macHost[2],mFlash.mClient.macAddr[3],mFlash.mClient.macAddr[4],mFlash.mClient.macAddr[5]);
  130. DEBUG_LOG("advName(%d):%s\n",strlen(buf),buf);
  131. slave_set_adv_name(buf,strlen(buf));
  132. advertising_stop();
  133. slave_adv_init();
  134. DEBUG_LOG(">>>>>>>>advertising_start =0 \r\n");
  135. advertising_start();
  136. //只有配对成功时,才运行。
  137. Process_Stop(app_single_line_pair_save_adv_or_scan_Process);
  138. //关灯
  139. LED_Stop(LED_PAIR);
  140. //取消全功率配对
  141. Process_SetHoldOn(app_single_line_pair_Process,0);
  142. //更新状态
  143. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  144. }
  145. }
  146. break;
  147. }
  148. }
  149. static void app_single_line_pair_host_process(uint8_t byte)
  150. {
  151. static int index = 0;
  152. DEBUG_LOG("host_process:%d\r\n",byte);
  153. switch(ob_app_single_line_pair.pair_flow)
  154. {
  155. case 0: //接收指令阶段
  156. if(byte == APP_SINGLE_LINE_PAIR_CMD)
  157. {
  158. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  159. {
  160. if(bll_single_line_half_duplex_transfer_onebyte(ob_app_single_line_pair.mac[0]) == 0)
  161. {
  162. index = 0;
  163. ob_app_single_line_pair.pair_flow = 1;
  164. }
  165. else
  166. {
  167. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  168. }
  169. }
  170. else
  171. {
  172. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  173. }
  174. }
  175. //获取左右指令
  176. if(byte == APP_SINGLE_LINE_PAIR_LR_CMD)
  177. {
  178. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  179. {
  180. if(mFlash.isHost == 1)
  181. bll_single_line_half_duplex_transfer_onebyte(0x55);
  182. else
  183. bll_single_line_half_duplex_transfer_onebyte(0x56);
  184. }
  185. }
  186. break;
  187. case 1: //发送数据阶段
  188. ob_app_single_line_pair.mac[3 + index] = byte;
  189. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0 && index != 2)
  190. {
  191. if(bll_single_line_half_duplex_transfer_onebyte(ob_app_single_line_pair.mac[index + 1]) == 0)
  192. {
  193. index++;
  194. }
  195. else
  196. {
  197. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  198. }
  199. }
  200. else
  201. {
  202. if(index == 2)
  203. {
  204. ob_app_single_line_pair.pair_flow = 0;
  205. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  206. ob_app_single_line_pair.save_adv_scan_flow = 0;
  207. //注册线程任务,用于处理保存、广播、扫描
  208. Process_Start(0,"app_single_line_pair_save_adv_or_scan_Process",app_single_line_pair_save_adv_or_scan_Process);
  209. }
  210. else
  211. {
  212. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  213. }
  214. }
  215. break;
  216. }
  217. }
  218. static void app_single_line_pair_slave_process(uint8_t byte)
  219. {
  220. static int index = 0;
  221. DEBUG_LOG("--->s index:%d flow:%d byte:%d\r\n",index,ob_app_single_line_pair.pair_flow,byte);
  222. switch(ob_app_single_line_pair.pair_flow)
  223. {
  224. case 0: //接收指令阶段
  225. if(byte == APP_SINGLE_LINE_PAIR_CMD)
  226. {
  227. //更改状态
  228. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_ING;
  229. //记录配对开始时间
  230. ob_app_single_line_pair.pair_timeout_ms = TIME_GetTicks();
  231. DEBUG_LOG("cmd TIME_GetTicks():%d,ob_app_single_line_pair.pair_timeout_ms:%d,counter:%d\r\n",TIME_GetTicks(),ob_app_single_line_pair.pair_timeout_ms,NRF_RTC0->COUNTER);
  232. //全功率配对
  233. Process_SetHoldOn(app_single_line_pair_Process,1);
  234. //亮灯
  235. LED_Start(LED_PAIR,COLOR_BLUE);
  236. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  237. {
  238. if(bll_single_line_half_duplex_transfer_onebyte(APP_SINGLE_LINE_PAIR_CMD) == 0)//回馈指令
  239. {
  240. index = 0;
  241. ob_app_single_line_pair.pair_flow = 1;
  242. }
  243. else
  244. {
  245. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  246. DEBUG_LOG("============>err 1\r\n");
  247. }
  248. }
  249. else
  250. {
  251. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  252. DEBUG_LOG("============>err 2\r\n");
  253. }
  254. }
  255. //获取左右指令
  256. if(byte == APP_SINGLE_LINE_PAIR_LR_CMD)
  257. {
  258. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  259. {
  260. if(mFlash.isHost == 1)
  261. bll_single_line_half_duplex_transfer_onebyte(0x55);
  262. else
  263. bll_single_line_half_duplex_transfer_onebyte(0x56);
  264. }
  265. }
  266. break;
  267. case 1: //发送数据阶段
  268. ob_app_single_line_pair.mac[index] = byte;
  269. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0 && index != 3)
  270. {
  271. if(bll_single_line_half_duplex_transfer_onebyte(ob_app_single_line_pair.mac[3 + index]) == 0)
  272. {
  273. index++;
  274. if(index == 3)
  275. {
  276. ob_app_single_line_pair.pair_flow = 0;
  277. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  278. ob_app_single_line_pair.save_adv_scan_flow = 0;
  279. //注册线程任务,用于处理保存、广播、扫描
  280. Process_Start(0,"app_single_line_pair_save_adv_or_scan_Process",app_single_line_pair_save_adv_or_scan_Process);
  281. }
  282. }
  283. else
  284. {
  285. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  286. DEBUG_LOG("============>err 3\r\n");
  287. }
  288. }
  289. else
  290. {
  291. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  292. DEBUG_LOG("============>err 4\r\n");
  293. }
  294. break;
  295. }
  296. }
  297. static void app_single_line_pair_Process(void)
  298. {
  299. //角色切换
  300. if(mFlash.isHost == 1 && ob_app_single_line_pair.role != APP_SINGLE_LINE_PAIR_ROLE_HOST)
  301. {
  302. app_single_line_pair_Init(APP_SINGLE_LINE_PAIR_ROLE_HOST);
  303. }
  304. else if(mFlash.isHost == 0 && ob_app_single_line_pair.role != APP_SINGLE_LINE_PAIR_ROLE_SLAVE)
  305. {
  306. app_single_line_pair_Init(APP_SINGLE_LINE_PAIR_ROLE_SLAVE);
  307. }
  308. switch(ob_app_single_line_pair.role)
  309. {
  310. case APP_SINGLE_LINE_PAIR_ROLE_HOST: //主机行为
  311. //配对完成或配对失败
  312. if(ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE || ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL)
  313. {
  314. //配对操作失败,必须得超时才能尝试下一轮。
  315. if(ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL && TIME_GetTicks() - ob_app_single_line_pair.pair_timeout_ms < APP_SINGLE_LINE_PAIR_TIMEOUT)
  316. {
  317. ob_app_single_line_pair.pair_flow = 0;
  318. //更新触发次数
  319. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  320. //灭灯
  321. LED_Stop(LED_PAIR);
  322. //取消全功率配对
  323. Process_SetHoldOn(app_single_line_pair_Process,0);
  324. DEBUG_LOG("o fail TIME_GetTicks():%d,ob_app_single_line_pair.pair_timeout_ms:%d,counter:%d\r\n",TIME_GetTicks(),ob_app_single_line_pair.pair_timeout_ms,NRF_RTC0->COUNTER);
  325. return;
  326. }
  327. //允许发送
  328. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  329. {
  330. //触发次数不为0
  331. if(ob_app_single_line_pair.trigger_times != 0)
  332. {
  333. //发送配对指令
  334. if(bll_single_line_half_duplex_transfer_onebyte(APP_SINGLE_LINE_PAIR_CMD) == 0)
  335. {
  336. //更改状态
  337. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_ING;
  338. DEBUG_LOG("cmd TIME_GetTicks():%d,ob_app_single_line_pair.pair_timeout_ms:%d,counter:%d\r\n",TIME_GetTicks(),ob_app_single_line_pair.pair_timeout_ms,NRF_RTC0->COUNTER);
  339. LED_Start(LED_PAIR,COLOR_BLUE);
  340. ob_app_single_line_pair.pair_flow = 0;
  341. //记录配对开始时间
  342. ob_app_single_line_pair.pair_timeout_ms = TIME_GetTicks();
  343. //减少触发次数
  344. ob_app_single_line_pair.trigger_times--;
  345. //全功率配对
  346. Process_SetHoldOn(app_single_line_pair_Process,1);
  347. }
  348. }
  349. }
  350. else
  351. {
  352. //更新触发次数
  353. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  354. }
  355. }
  356. else
  357. {
  358. //监控是否超时,主机要比从机多一个字节的传输时间来确保从机已经超时。
  359. if(TIME_GetTicks() - ob_app_single_line_pair.pair_timeout_ms >= (APP_SINGLE_LINE_PAIR_TIMEOUT + (FML_SINGLE_LINE_SIMPLEX_PWM_SEQ_VALUES_LEN * FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS / 1000)) && \
  360. ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_ING)
  361. {
  362. //配对超时失败
  363. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;
  364. ob_app_single_line_pair.pair_flow = 0;
  365. //更新触发次数
  366. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  367. DEBUG_LOG("t fail TIME_GetTicks():%d,ob_app_single_line_pair.pair_timeout_ms:%d,counter:%d\r\n",TIME_GetTicks(),ob_app_single_line_pair.pair_timeout_ms,NRF_RTC0->COUNTER);
  368. //灭灯
  369. LED_Stop(LED_PAIR);
  370. //取消全功率配对
  371. Process_SetHoldOn(app_single_line_pair_Process,0);
  372. }
  373. }
  374. break;
  375. case APP_SINGLE_LINE_PAIR_ROLE_SLAVE: //从机行为
  376. //监控是否超时。
  377. if(TIME_GetTicks() - ob_app_single_line_pair.pair_timeout_ms >= (APP_SINGLE_LINE_PAIR_TIMEOUT - (FML_SINGLE_LINE_SIMPLEX_PWM_SEQ_VALUES_LEN * FML_SINGLE_LINE_SIMPLEX_SEND_ONE_BIT_TIEMS / 1000)) && \
  378. ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_ING)
  379. {
  380. //配对超时失败
  381. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;
  382. DEBUG_LOG("t fail TIME_GetTicks():%d,ob_app_single_line_pair.pair_timeout_ms:%d,counter:%d\r\n",TIME_GetTicks(),ob_app_single_line_pair.pair_timeout_ms,NRF_RTC0->COUNTER);
  383. }
  384. if(ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL)
  385. {
  386. ob_app_single_line_pair.pair_flow = 0;
  387. DEBUG_LOG("o fail TIME_GetTicks():%d,ob_app_single_line_pair.pair_timeout_ms:%d,counter:%d\r\n",TIME_GetTicks(),ob_app_single_line_pair.pair_timeout_ms,NRF_RTC0->COUNTER);
  388. //灭灯
  389. LED_Stop(LED_PAIR);
  390. //取消全功率配对
  391. Process_SetHoldOn(app_single_line_pair_Process,0);
  392. }
  393. break;
  394. }
  395. }
  396. /*API ----------------------------------------------*/
  397. /**
  398. @brief 初始化单线配对应用
  399. @param role - [in] 角色
  400. @return 错误代码 - [out] -1失败,0成功
  401. */
  402. int app_single_line_pair_Init(APP_SINGLE_LINE_PAIR_ROLE_e role)
  403. {
  404. int ret;
  405. ble_gap_addr_t mAddr;
  406. //初始化单线半双工业务
  407. ret = bll_single_line_half_duplex_Init((BLL_SINGLE_LINE_HALF_DUPLEX_ROLE_e)role);
  408. //重置
  409. memset(&ob_app_single_line_pair, 0, sizeof(ob_app_single_line_pair));
  410. //初始化结构体
  411. uint32_t err_code = sd_ble_gap_addr_get(&mAddr);
  412. if(err_code != NRF_SUCCESS)return -1;
  413. if(role == APP_SINGLE_LINE_PAIR_ROLE_HOST)
  414. {
  415. ob_app_single_line_pair.mac[0] = mAddr.addr[0];
  416. ob_app_single_line_pair.mac[1] = mAddr.addr[1];
  417. ob_app_single_line_pair.mac[2] = mAddr.addr[2];
  418. bll_single_line_half_duplex_receive_register(app_single_line_pair_host_process);
  419. }
  420. else
  421. {
  422. ob_app_single_line_pair.mac[3] = mAddr.addr[0];
  423. ob_app_single_line_pair.mac[4] = mAddr.addr[1];
  424. ob_app_single_line_pair.mac[5] = mAddr.addr[2];
  425. bll_single_line_half_duplex_receive_register(app_single_line_pair_slave_process);
  426. }
  427. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  428. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  429. ob_app_single_line_pair.role = role;
  430. //初始化配对线程
  431. Process_Start(1000,"app_single_line_pair_Process",app_single_line_pair_Process);
  432. return (ret == 0)?0:-1;
  433. }