app_single_line_pair.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  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*2) / 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. ob_app_single_line_pair.pair_timeout_ms = TIME_GetTicks();
  166. }
  167. else
  168. {
  169. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  170. }
  171. }
  172. else
  173. {
  174. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  175. }
  176. }
  177. //获取左右指令
  178. if(byte == APP_SINGLE_LINE_PAIR_LR_CMD)
  179. {
  180. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  181. {
  182. if(mFlash.isHost == 1)
  183. bll_single_line_half_duplex_transfer_onebyte(0x55);
  184. else
  185. bll_single_line_half_duplex_transfer_onebyte(0x56);
  186. }
  187. }
  188. break;
  189. case 1: //发送数据阶段
  190. ob_app_single_line_pair.mac[3 + index] = byte;
  191. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0 && index != 2)
  192. {
  193. if(bll_single_line_half_duplex_transfer_onebyte(ob_app_single_line_pair.mac[index + 1]) == 0)
  194. {
  195. index++;
  196. //发送后,开始计时
  197. ob_app_single_line_pair.pair_timeout_ms = TIME_GetTicks();
  198. }
  199. else
  200. {
  201. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  202. }
  203. }
  204. else
  205. {
  206. if(index == 2)
  207. {
  208. ob_app_single_line_pair.pair_flow = 0;
  209. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  210. ob_app_single_line_pair.save_adv_scan_flow = 0;
  211. //注册线程任务,用于处理保存、广播、扫描
  212. Process_Start(0,"app_single_line_pair_save_adv_or_scan_Process",app_single_line_pair_save_adv_or_scan_Process);
  213. }
  214. else
  215. {
  216. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  217. }
  218. }
  219. break;
  220. }
  221. }
  222. static void app_single_line_pair_slave_process(uint8_t byte)
  223. {
  224. static int index = 0;
  225. DEBUG_LOG("--->s index:%d flow:%d byte:%d\r\n",index,ob_app_single_line_pair.pair_flow,byte);
  226. switch(ob_app_single_line_pair.pair_flow)
  227. {
  228. case 0: //接收指令阶段
  229. if(byte == APP_SINGLE_LINE_PAIR_CMD)
  230. {
  231. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  232. {
  233. if(bll_single_line_half_duplex_transfer_onebyte(APP_SINGLE_LINE_PAIR_CMD) == 0)//回馈指令
  234. {
  235. index = 0;
  236. ob_app_single_line_pair.pair_flow = 1;
  237. //更改状态
  238. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_ING;
  239. //发送后,开始计时
  240. ob_app_single_line_pair.pair_timeout_ms = TIME_GetTicks();
  241. 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);
  242. //全功率配对
  243. Process_SetHoldOn(app_single_line_pair_Process,1);
  244. //亮灯
  245. LED_Start(LED_PAIR,COLOR_BLUE);
  246. }
  247. else
  248. {
  249. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  250. DEBUG_LOG("============>err 1\r\n");
  251. }
  252. }
  253. else
  254. {
  255. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  256. DEBUG_LOG("============>err 2\r\n");
  257. }
  258. }
  259. //获取左右指令
  260. if(byte == APP_SINGLE_LINE_PAIR_LR_CMD)
  261. {
  262. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  263. {
  264. if(mFlash.isHost == 1)
  265. bll_single_line_half_duplex_transfer_onebyte(0x55);
  266. else
  267. bll_single_line_half_duplex_transfer_onebyte(0x56);
  268. }
  269. }
  270. break;
  271. case 1: //发送数据阶段
  272. ob_app_single_line_pair.mac[index] = byte;
  273. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0 && index != 3)
  274. {
  275. if(bll_single_line_half_duplex_transfer_onebyte(ob_app_single_line_pair.mac[3 + index]) == 0)
  276. {
  277. index++;
  278. //发送后,开始计时
  279. ob_app_single_line_pair.pair_timeout_ms = TIME_GetTicks();
  280. if(index == 3)
  281. {
  282. ob_app_single_line_pair.pair_flow = 0;
  283. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  284. ob_app_single_line_pair.save_adv_scan_flow = 0;
  285. //注册线程任务,用于处理保存、广播、扫描
  286. Process_Start(0,"app_single_line_pair_save_adv_or_scan_Process",app_single_line_pair_save_adv_or_scan_Process);
  287. }
  288. }
  289. else
  290. {
  291. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  292. DEBUG_LOG("============>err 3\r\n");
  293. }
  294. }
  295. else
  296. {
  297. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;//配对失败
  298. DEBUG_LOG("============>err 4\r\n");
  299. }
  300. break;
  301. }
  302. }
  303. static void app_single_line_pair_Process(void)
  304. {
  305. //角色切换
  306. if(mFlash.isHost == 1 && ob_app_single_line_pair.role != APP_SINGLE_LINE_PAIR_ROLE_HOST)
  307. {
  308. app_single_line_pair_Init(APP_SINGLE_LINE_PAIR_ROLE_HOST);
  309. }
  310. else if(mFlash.isHost == 0 && ob_app_single_line_pair.role != APP_SINGLE_LINE_PAIR_ROLE_SLAVE)
  311. {
  312. app_single_line_pair_Init(APP_SINGLE_LINE_PAIR_ROLE_SLAVE);
  313. }
  314. switch(ob_app_single_line_pair.role)
  315. {
  316. case APP_SINGLE_LINE_PAIR_ROLE_HOST: //主机行为
  317. //配对完成或配对失败
  318. 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)
  319. {
  320. //配对操作失败,必须得超时才能尝试下一轮。
  321. 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)
  322. {
  323. ob_app_single_line_pair.pair_flow = 0;
  324. //更新触发次数
  325. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  326. //灭灯
  327. LED_Stop(LED_PAIR);
  328. //取消全功率配对
  329. Process_SetHoldOn(app_single_line_pair_Process,0);
  330. 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);
  331. return;
  332. }
  333. //允许发送
  334. if(bll_single_line_half_duplex_is_ready_to_transfer() == 0)
  335. {
  336. //触发次数不为0
  337. if(ob_app_single_line_pair.trigger_times != 0)
  338. {
  339. //发送配对指令
  340. if(bll_single_line_half_duplex_transfer_onebyte(APP_SINGLE_LINE_PAIR_CMD) == 0)
  341. {
  342. //更改状态
  343. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_ING;
  344. 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);
  345. LED_Start(LED_PAIR,COLOR_BLUE);
  346. ob_app_single_line_pair.pair_flow = 0;
  347. //发送后,开始计时
  348. ob_app_single_line_pair.pair_timeout_ms = TIME_GetTicks();
  349. //减少触发次数
  350. ob_app_single_line_pair.trigger_times--;
  351. //全功率配对
  352. Process_SetHoldOn(app_single_line_pair_Process,1);
  353. }
  354. }
  355. }
  356. else
  357. {
  358. //更新触发次数
  359. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  360. }
  361. }
  362. else
  363. {
  364. //监控是否超时,主机要比从机多一个字节的传输时间来确保从机已经超时。
  365. 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)) && \
  366. ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_ING)
  367. {
  368. //配对超时失败
  369. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;
  370. ob_app_single_line_pair.pair_flow = 0;
  371. //更新触发次数
  372. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  373. 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);
  374. //灭灯
  375. LED_Stop(LED_PAIR);
  376. //取消全功率配对
  377. Process_SetHoldOn(app_single_line_pair_Process,0);
  378. }
  379. }
  380. break;
  381. case APP_SINGLE_LINE_PAIR_ROLE_SLAVE: //从机行为
  382. //监控是否超时。
  383. if(TIME_GetTicks() - ob_app_single_line_pair.pair_timeout_ms >= (APP_SINGLE_LINE_PAIR_TIMEOUT) && \
  384. ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_ING)
  385. {
  386. //配对超时失败
  387. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL;
  388. 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);
  389. }
  390. if(ob_app_single_line_pair.state == APP_SINGLE_LINE_PAIR_STATE_PAIR_FAIL)
  391. {
  392. ob_app_single_line_pair.pair_flow = 0;
  393. 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);
  394. //灭灯
  395. LED_Stop(LED_PAIR);
  396. //取消全功率配对
  397. Process_SetHoldOn(app_single_line_pair_Process,0);
  398. }
  399. break;
  400. }
  401. }
  402. /*API ----------------------------------------------*/
  403. /**
  404. @brief 初始化单线配对应用
  405. @param role - [in] 角色
  406. @return 错误代码 - [out] -1失败,0成功
  407. */
  408. int app_single_line_pair_Init(APP_SINGLE_LINE_PAIR_ROLE_e role)
  409. {
  410. int ret;
  411. ble_gap_addr_t mAddr;
  412. //初始化单线半双工业务
  413. ret = bll_single_line_half_duplex_Init((BLL_SINGLE_LINE_HALF_DUPLEX_ROLE_e)role);
  414. //重置
  415. memset(&ob_app_single_line_pair, 0, sizeof(ob_app_single_line_pair));
  416. //初始化结构体
  417. uint32_t err_code = sd_ble_gap_addr_get(&mAddr);
  418. if(err_code != NRF_SUCCESS)return -1;
  419. if(role == APP_SINGLE_LINE_PAIR_ROLE_HOST)
  420. {
  421. ob_app_single_line_pair.mac[0] = mAddr.addr[0];
  422. ob_app_single_line_pair.mac[1] = mAddr.addr[1];
  423. ob_app_single_line_pair.mac[2] = mAddr.addr[2];
  424. bll_single_line_half_duplex_receive_register(app_single_line_pair_host_process);
  425. }
  426. else
  427. {
  428. ob_app_single_line_pair.mac[3] = mAddr.addr[0];
  429. ob_app_single_line_pair.mac[4] = mAddr.addr[1];
  430. ob_app_single_line_pair.mac[5] = mAddr.addr[2];
  431. bll_single_line_half_duplex_receive_register(app_single_line_pair_slave_process);
  432. }
  433. ob_app_single_line_pair.trigger_times = APP_SINGLE_LINE_PAIR_TRIGGER_TIMES;
  434. ob_app_single_line_pair.state = APP_SINGLE_LINE_PAIR_STATE_PAIR_DONE;
  435. ob_app_single_line_pair.role = role;
  436. //初始化配对线程
  437. Process_Start(1000,"app_single_line_pair_Process",app_single_line_pair_Process);
  438. return (ret == 0)?0:-1;
  439. }