press_down_detect.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. #include "press_down_detect.h"
  2. int back_jump_stage = 0;
  3. int cancel_down = 0;
  4. int virus_flag = 0;
  5. float real_front_min_left = 50000.f;
  6. float real_front_min_right = 50000.f;
  7. int press_down_detect_new(int index, float front_mag_left, float back_mag_left,
  8. float front_mag_right, float back_mag_right,
  9. float left_acc_x,float left_acc_y, float left_acc_z, float right_acc_x, float right_acc_y, float right_acc_z,
  10. int *front_down, int *back_down)
  11. {
  12. static float front_mag_norm_left[PRESS_COUNT_MAX];
  13. static float front_mag_norm_right[PRESS_COUNT_MAX];
  14. static float back_mag_norm_left[PRESS_COUNT_MAX];
  15. static float back_mag_norm_right[PRESS_COUNT_MAX];
  16. static float left_acc_x_window[10];
  17. static float left_acc_y_window[10];
  18. static float left_acc_z_window[10];
  19. static float right_acc_x_window[10];
  20. static float right_acc_y_window[10];
  21. static float right_acc_z_window[10];
  22. static int down_count_down = 0;
  23. static int special_down_count_down = 0;
  24. memcpy(front_mag_norm_left, front_mag_norm_left + 1, (PRESS_COUNT_MAX - 1) * sizeof(float));
  25. front_mag_norm_left[PRESS_COUNT_MAX - 1] = front_mag_left;
  26. memcpy(back_mag_norm_left, back_mag_norm_left + 1, (PRESS_COUNT_MAX - 1) * sizeof(float));
  27. back_mag_norm_left[PRESS_COUNT_MAX - 1] = back_mag_left;
  28. memcpy(front_mag_norm_right, front_mag_norm_right + 1, (PRESS_COUNT_MAX - 1) * sizeof(float));
  29. front_mag_norm_right[PRESS_COUNT_MAX - 1] = front_mag_right;
  30. memcpy(back_mag_norm_right, back_mag_norm_right + 1, (PRESS_COUNT_MAX - 1) * sizeof(float));
  31. back_mag_norm_right[PRESS_COUNT_MAX - 1] = back_mag_right;
  32. /*
  33. * 三轴加速度的滑动窗口
  34. */
  35. memcpy(left_acc_x_window, left_acc_x_window + 1, 9 * sizeof(float));
  36. left_acc_x_window[9] = left_acc_x;
  37. memcpy(left_acc_y_window, left_acc_y_window + 1, 9 * sizeof(float));
  38. left_acc_y_window[9] = left_acc_y;
  39. memcpy(left_acc_z_window, left_acc_z_window + 1, 9 * sizeof(float));
  40. left_acc_z_window[9] = left_acc_z;
  41. memcpy(right_acc_x_window, right_acc_x_window + 1, 9 * sizeof(float));
  42. right_acc_x_window[9] = right_acc_x;
  43. memcpy(right_acc_y_window, right_acc_y_window + 1, 9 * sizeof(float));
  44. right_acc_y_window[9] = right_acc_y;
  45. memcpy(right_acc_z_window, right_acc_z_window + 1, 9 * sizeof(float));
  46. right_acc_z_window[9] = right_acc_z;
  47. int front_down_tmp = 0;
  48. int back_down_tmp = 0;
  49. float left_max_front_val = front_mag_left;
  50. float left_min_front_val = front_mag_left;
  51. int left_min_front_index = PRESS_COUNT_MAX - 1;
  52. int left_max_front_index = PRESS_COUNT_MAX - 1;
  53. float left_max_back_val = back_mag_left;
  54. float left_min_back_val = back_mag_left;
  55. int left_min_back_index = PRESS_COUNT_MAX - 1;
  56. int left_max_back_index = PRESS_COUNT_MAX - 1;
  57. float right_max_front_val = front_mag_right;
  58. float right_min_front_val = front_mag_right;
  59. int right_min_front_index = PRESS_COUNT_MAX - 1;
  60. int right_max_front_index = PRESS_COUNT_MAX - 1;
  61. float right_max_back_val = back_mag_right;
  62. float right_min_back_val = back_mag_right;
  63. int right_min_back_index = PRESS_COUNT_MAX - 1;
  64. int right_max_back_index = PRESS_COUNT_MAX - 1;
  65. for(int i = 0; i < PRESS_COUNT_MAX; i++)
  66. {
  67. if(front_mag_norm_left[i] > left_max_front_val)
  68. {
  69. left_max_front_val = front_mag_norm_left[i];
  70. left_max_front_index = i;
  71. }
  72. if(front_mag_norm_left[i] < left_min_front_val)
  73. {
  74. left_min_front_val = front_mag_norm_left[i];
  75. left_min_front_index = i;
  76. }
  77. if(back_mag_norm_left[i] > left_max_back_val)
  78. {
  79. left_max_back_val = back_mag_norm_left[i];
  80. left_max_back_index = i;
  81. }
  82. if(back_mag_norm_left[i] < left_min_back_val)
  83. {
  84. left_min_back_val = back_mag_norm_left[i];
  85. left_min_back_index = i;
  86. }
  87. if(front_mag_norm_right[i] > right_max_front_val)
  88. {
  89. right_max_front_val = front_mag_norm_right[i];
  90. right_max_front_index = i;
  91. }
  92. if(front_mag_norm_right[i] < right_min_front_val)
  93. {
  94. right_min_front_val = front_mag_norm_right[i];
  95. right_min_front_index = i;
  96. }
  97. if(back_mag_norm_right[i] > right_max_back_val)
  98. {
  99. right_max_back_val = back_mag_norm_right[i];
  100. right_max_back_index = i;
  101. }
  102. if(back_mag_norm_right[i] < right_min_back_val)
  103. {
  104. right_min_back_val = back_mag_norm_right[i];
  105. right_min_back_index = i;
  106. }
  107. }
  108. /*
  109. * 平稳状态测试
  110. */
  111. float left_acc_x_min = left_acc_x;
  112. float left_acc_x_max = left_acc_x;
  113. float left_acc_y_min = left_acc_y;
  114. float left_acc_y_max = left_acc_y;
  115. float left_acc_z_min = left_acc_z;
  116. float left_acc_z_max = left_acc_z;
  117. float right_acc_x_min = right_acc_x;
  118. float right_acc_x_max = right_acc_x;
  119. float right_acc_y_min = right_acc_y;
  120. float right_acc_y_max = right_acc_y;
  121. float right_acc_z_min = right_acc_z;
  122. float right_acc_z_max = right_acc_z;
  123. for(int i = 0; i < 10; i++)
  124. {
  125. if(left_acc_x_window[i] > left_acc_x_max)
  126. {
  127. left_acc_x_max = left_acc_x_window[i];
  128. }
  129. if(left_acc_x_window[i] < left_acc_x_min)
  130. {
  131. left_acc_x_min = left_acc_x_window[i];
  132. }
  133. if(left_acc_y_window[i] > left_acc_y_max)
  134. {
  135. left_acc_y_max = left_acc_y_window[i];
  136. }
  137. if(left_acc_y_window[i] < left_acc_y_min)
  138. {
  139. left_acc_y_min = left_acc_y_window[i];
  140. }
  141. if(left_acc_z_window[i] > left_acc_z_max)
  142. {
  143. left_acc_z_max = left_acc_z_window[i];
  144. }
  145. if(left_acc_z_window[i] < left_acc_z_min)
  146. {
  147. left_acc_z_min = left_acc_z_window[i];
  148. }
  149. if(right_acc_x_window[i] > right_acc_x_max)
  150. {
  151. right_acc_x_max = right_acc_x_window[i];
  152. }
  153. if(right_acc_x_window[i] < right_acc_x_min)
  154. {
  155. right_acc_x_min = right_acc_x_window[i];
  156. }
  157. if(right_acc_y_window[i] > right_acc_y_max)
  158. {
  159. right_acc_y_max = right_acc_y_window[i];
  160. }
  161. if(right_acc_y_window[i] < right_acc_y_min)
  162. {
  163. right_acc_y_min = right_acc_y_window[i];
  164. }
  165. if(right_acc_z_window[i] > right_acc_z_max)
  166. {
  167. right_acc_z_max = right_acc_z_window[i];
  168. }
  169. if(right_acc_z_window[i] < right_acc_z_min)
  170. {
  171. right_acc_z_min = right_acc_z_window[i];
  172. }
  173. }
  174. //判断前蹲
  175. /*
  176. if(left_max_front_index > left_min_front_index && left_max_front_val > left_min_front_val + 2000.0f
  177. && right_max_front_index > right_min_front_index && right_max_front_val > right_min_front_val + 2000.0f
  178. && abs(right_max_front_index - left_max_front_index) < 4)
  179. {
  180. front_down_tmp = 1;
  181. }*/
  182. if(left_max_front_index > left_min_front_index && left_max_front_val > left_min_front_val + 200.0f)
  183. {
  184. real_front_min_left = real_front_min_left < left_min_front_val ? real_front_min_left : left_min_front_val;
  185. }
  186. else
  187. {
  188. real_front_min_left = 50000.f;
  189. }
  190. if(right_max_front_index > right_min_front_index && right_max_front_val > right_min_front_val + 200.0f)
  191. {
  192. real_front_min_right = real_front_min_right < right_min_front_val ? real_front_min_right : right_min_front_val;
  193. }
  194. else
  195. {
  196. real_front_min_right = 50000.f;
  197. }
  198. if(left_max_front_val - real_front_min_left > 1500.0f &&
  199. right_max_front_val - real_front_min_right > 1500.0f &&
  200. abs(left_max_front_index - right_max_front_index) < 10)
  201. {
  202. down_count_down = 30;
  203. }
  204. /*
  205. * 检测左右脚,左重右轻, 左轻右重的情况
  206. */
  207. if((left_max_front_index > left_min_front_index && left_max_front_val > left_min_front_val + 3000.0f
  208. && right_max_front_val < right_min_front_val + 800.0f) ||
  209. (right_max_front_index > right_min_front_index && right_max_front_val > right_min_front_val + 3000.0f &&
  210. left_max_front_val < left_min_front_val + 800.0f))
  211. {
  212. // down_count_down = 30;
  213. special_down_count_down = 30;
  214. // back_down_tmp = 1;
  215. }
  216. /*
  217. * 有一脚前踩,有一只先踩了,但是待另一只脚落地,会出现后脚压力变小的情况
  218. */
  219. if(right_max_back_val > back_mag_right + 3000.0f && left_max_front_val - real_front_min_left > 3000.0f)
  220. {
  221. // back_down_tmp = 1;
  222. special_down_count_down = 30;
  223. }
  224. if(left_max_back_val > back_mag_left + 3000.0f && right_max_front_val - real_front_min_right > 3000.0f)
  225. {
  226. // back_down_tmp = 1;
  227. special_down_count_down = 30;
  228. }
  229. /*
  230. * 检测左右脚,踩得比较及时,同时比较用力
  231. */
  232. if(right_max_back_index < right_min_back_index && right_max_back_val > right_min_back_val + 2000.0f
  233. && left_max_back_index > left_min_back_index && left_max_back_val > left_min_back_val + 2000.0f)
  234. {
  235. down_count_down = 0;
  236. }
  237. /*
  238. * 根据情况删除延时等待
  239. */
  240. if(right_max_back_index > right_min_back_index && right_max_back_val > right_min_back_val + 2000.0f
  241. && left_max_back_index < left_min_back_index && left_max_back_val > left_min_back_val + 2000.0f)
  242. {
  243. down_count_down = 0;
  244. }
  245. if(left_max_front_index < left_min_front_index && left_max_front_val > left_min_front_val + 3000.0f)
  246. {
  247. down_count_down = 0;
  248. special_down_count_down = 0;
  249. }
  250. if(right_max_front_index < right_min_front_index && right_max_front_val > right_min_front_val + 3000.0f)
  251. {
  252. down_count_down = 0;
  253. special_down_count_down = 0;
  254. }
  255. if((right_max_back_index < right_min_back_index && right_max_back_val > right_min_back_val + 2000.0f
  256. && left_max_back_index > left_min_back_index && left_max_back_val > left_min_back_val + 2000.0f) ||
  257. (right_max_back_index > right_min_back_index && right_max_back_val > right_min_back_val + 2000.0f
  258. && left_max_back_index < left_min_back_index && left_max_back_val > left_min_back_val + 2000.0f))
  259. {
  260. special_down_count_down = 0;
  261. }
  262. if(left_acc_x_max - left_acc_x_min < 0.15f &&
  263. right_acc_x_max - right_acc_x_min < 0.15f &&
  264. down_count_down > 0)
  265. {
  266. front_down_tmp = 1;
  267. }
  268. if(left_acc_z_max - left_acc_z_min < 0.1f && right_acc_z_max - right_acc_z_min < 0.1f &&
  269. left_acc_y_max - left_acc_y_min < 0.1f && right_acc_y_max - right_acc_y_min < 0.1f &&
  270. left_acc_x_max - left_acc_x_min < 0.1f && right_acc_x_max - right_acc_x_min < 0.1f &&
  271. special_down_count_down > 0)
  272. {
  273. back_down_tmp = 1;
  274. }
  275. if(down_count_down > 0)
  276. {
  277. down_count_down --;
  278. }
  279. if(special_down_count_down > 0)
  280. {
  281. special_down_count_down --;
  282. }
  283. // if(left_max_back_index > left_min_back_index && left_max_back_val > left_min_back_val + 2000.0f
  284. // && right_max_back_index > right_min_back_index && right_max_back_val > right_min_back_val + 2000.0f
  285. // && abs(right_max_back_index - left_max_back_index) < 4)
  286. // {
  287. // back_down_tmp = 1;
  288. // }
  289. if(right_max_back_index > right_min_back_index && right_max_back_val > right_min_back_val + 3000.0f
  290. && left_max_back_index > left_min_back_index && left_max_back_val > left_min_back_val + 3000.0f &&
  291. abs(right_max_front_index - left_max_front_index) < 15
  292. && left_acc_x_max - left_acc_x_min < 0.15f && right_acc_x_max - right_acc_x_min < 0.15f )
  293. {
  294. back_down_tmp = 1;
  295. }
  296. // if(right_max_back_index > right_min_back_index && right_max_back_val > right_min_back_val + 2000.0f
  297. // && left_max_back_index > left_min_back_index && left_max_back_val > left_min_back_val + 2000.0f
  298. // && back_mag_norm_right[0] > 15000.0f && back_mag_norm_left[0] > 15000.0f && right_max_back_val > 15000.0f && right_max_back_val > 15000.0f
  299. // && abs(right_max_front_index - left_max_front_index) < 6
  300. // && left_acc_x_max - left_acc_x_min < 0.15f && right_acc_x_max - right_acc_x_min < 0.15f )
  301. // {
  302. // back_down_tmp = 1;
  303. // }
  304. *front_down = front_down_tmp;
  305. *back_down = back_down_tmp;
  306. return 0;
  307. }
  308. //short press_jump_detect(int16_t *h_pos, int16_t *s_pos)
  309. //{
  310. // static int last_h_z;
  311. // static int last_s_z;
  312. // static int left_up;
  313. // static int right_up;
  314. //
  315. // static int left_up_count;
  316. // static int right_up_count;
  317. //
  318. // if(h_pos[2] - last_h_z > 0 && h_pos[2]> 0)
  319. // {
  320. // left_up = 1;
  321. // }
  322. // else if((h_pos[2] - last_h_z < 0) || h_pos[2] <= 0)
  323. // {
  324. // left_up = -1;
  325. // }
  326. //
  327. // if(left_up == 1)
  328. // {
  329. // left_up_count ++;
  330. // }
  331. // else
  332. // {
  333. // left_up_count = 0;
  334. // }
  335. //
  336. // if(s_pos[2] - last_s_z > 0 && s_pos[2] > 0)
  337. // {
  338. // right_up = 1;
  339. // }
  340. // else if((s_pos[2] - last_s_z < 0) || s_pos[2] <= 0)
  341. // {
  342. // right_up = -1;
  343. // }
  344. //
  345. // if(right_up == 1)
  346. // {
  347. // right_up_count ++;
  348. // }
  349. // else
  350. // {
  351. // right_up_count = 0;
  352. // }
  353. //
  354. // last_h_z = h_pos[2];
  355. // last_s_z = s_pos[2];
  356. //
  357. // if(left_up == 1 && right_up == 1 && right_up_count < 15 && left_up_count < 20
  358. // && right_up_count > 2 && left_up_count > 2)
  359. // {
  360. // return 1;
  361. // }
  362. //
  363. // return 0;
  364. //}
  365. //由于仅靠IMU来探测触底了,高度估计得不太对,所以用加速度来算起跳动作
  366. void max_min_window(float *data, int length, float *max_val , int *max_index, float * min_val, int *min_index)
  367. {
  368. *max_val = data[0];
  369. *max_index = 0;
  370. *min_val = data[0];
  371. *min_index = 0;
  372. for(int i = 0; i < length; i++)
  373. {
  374. if(*max_val < data[i])
  375. {
  376. *max_val = data[i];
  377. *max_index = i;
  378. }
  379. if(*min_val > data[i])
  380. {
  381. *min_val = data[i];
  382. *min_index = i;
  383. }
  384. }
  385. }
  386. //short press_jump_detect(float left_acc_z, float right_acc_z, int left_zupt, int right_zupt, int left_front_press, int right_front_press)
  387. //{
  388. //
  389. // static float right_data_z_buff[10];
  390. // static float left_data_z_buff[10];
  391. //
  392. // static int last_right_press;
  393. // static int last_left_press;
  394. // static int left_max_press;
  395. // static int right_max_press;
  396. //
  397. // static int wait;
  398. //
  399. // /*
  400. // * 存储数据
  401. // */
  402. // memcpy(right_data_z_buff, right_data_z_buff + 1, 9 * sizeof(float));
  403. //
  404. // memcpy(left_data_z_buff, left_data_z_buff + 1, 9 * sizeof(float));
  405. //
  406. // right_data_z_buff[9] = right_acc_z;
  407. // left_data_z_buff[9] = left_acc_z;
  408. //
  409. // if(left_zupt && right_zupt)
  410. // {
  411. // wait = 30;
  412. // }
  413. //
  414. // /*
  415. // * 检测压力下降用的逻辑
  416. // */
  417. // if(last_left_press - left_front_press > 200)
  418. // {
  419. // if(last_left_press > left_max_press)
  420. // {
  421. // left_max_press = last_left_press;
  422. // }
  423. // }
  424. // else if(last_left_press - left_front_press < -200)
  425. // {
  426. // left_max_press = 0;
  427. // }
  428. //
  429. // last_left_press = left_front_press;
  430. //
  431. // if(last_right_press - right_front_press > 200)
  432. // {
  433. // if(last_right_press > right_max_press)
  434. // {
  435. // right_max_press = last_right_press;
  436. // }
  437. // }
  438. // else if(last_right_press - right_front_press < -200)
  439. // {
  440. // right_max_press = 0;
  441. // }
  442. //
  443. // last_right_press = right_front_press;
  444. //
  445. // /*
  446. // * 加速变化估计
  447. // */
  448. //
  449. // float max_val_right, min_val_right, max_val_left, min_val_left;
  450. //
  451. // int max_index_right, min_index_right, max_index_left, min_index_left;
  452. //
  453. //
  454. // max_min_window(right_data_z_buff, 10, &max_val_right , &max_index_right, &min_val_right, &min_index_right);
  455. //
  456. // max_min_window(left_data_z_buff, 10, &max_val_left , &max_index_left, &min_val_left, &min_index_left);
  457. //
  458. // if(wait > 0)
  459. // {
  460. // wait --;
  461. // }
  462. //
  463. // /*
  464. // * 1.0f的阈值轻轻跳就可以达到了,现在改为1.3f的阈值
  465. // */
  466. // if( max_index_right < min_index_right && max_index_left < min_index_left &&
  467. //
  468. // max_val_right - min_val_right > 1.3f && max_val_left - min_val_left > 1.3f && wait > 0 && left_zupt == 0 && right_zupt == 0
  469. //
  470. // && left_max_press - left_front_press > 3000 && right_max_press - right_front_press > 3000 )
  471. // //if(left_max_press - left_front_press > 3000 && right_max_press - right_front_press > 3000)
  472. // {
  473. // SEGGER_RTT_printf(0, "test\n");
  474. // SEGGER_RTT_printf(0," left_max_press - left_front_press= %d , right_max_press - right_front_press = %d\n", left_max_press - left_front_press, right_max_press - right_front_press);
  475. // return 1;
  476. // }
  477. //
  478. // return 0;
  479. //
  480. //}
  481. short press_jump_detect(float left_acc_z, float right_acc_z, int left_zupt, int right_zupt, int left_front_press, int right_front_press)
  482. {
  483. static float right_data_z_buff[10];
  484. static float left_data_z_buff[10];
  485. static float right_data_press[10];
  486. static float left_data_press[10];
  487. static int wait;
  488. /*
  489. * 存储数据
  490. */
  491. memcpy(right_data_z_buff, right_data_z_buff + 1, 9 * sizeof(float));
  492. memcpy(left_data_z_buff, left_data_z_buff + 1, 9 * sizeof(float));
  493. memcpy(right_data_press, right_data_press + 1, 9 * sizeof(float));
  494. memcpy(left_data_press, left_data_press + 1, 9 * sizeof(float));
  495. right_data_z_buff[9] = right_acc_z; left_data_z_buff[9] = left_acc_z;
  496. right_data_press[9] = right_front_press; left_data_press[9] = left_front_press;
  497. if(left_zupt && right_zupt)
  498. {
  499. wait = 30;
  500. }
  501. /*
  502. * 检测压力下降用的逻辑
  503. */
  504. float max_val_right_press, min_val_right_press, max_val_left_press, min_val_left_press;
  505. int max_index_right_press, min_index_right_press, max_index_left_press, min_index_left_press;
  506. max_min_window(right_data_press, 10, &max_val_right_press , &max_index_right_press, &min_val_right_press, &min_index_right_press);
  507. max_min_window(left_data_press, 10, &max_val_left_press , &max_index_left_press, &min_val_left_press, &min_index_left_press);
  508. /*
  509. * 加速变化估计
  510. */
  511. float max_val_right, min_val_right, max_val_left, min_val_left;
  512. int max_index_right, min_index_right, max_index_left, min_index_left;
  513. max_min_window(right_data_z_buff, 10, &max_val_right , &max_index_right, &min_val_right, &min_index_right);
  514. max_min_window(left_data_z_buff, 10, &max_val_left , &max_index_left, &min_val_left, &min_index_left);
  515. if(wait > 0)
  516. {
  517. wait --;
  518. }
  519. /*
  520. * 1.0f的阈值轻轻跳就可以达到了,现在改为1.3f的阈值
  521. */
  522. if( max_index_right < min_index_right && max_index_left < min_index_left &&
  523. max_val_right - min_val_right > 0.8f && max_val_left - min_val_left > 0.8f && wait > 0 && left_zupt == 0 && right_zupt == 0
  524. && max_index_right_press < min_index_right_press && max_index_left_press < min_index_left_press &&
  525. max_val_right_press - min_val_right_press > 3000.f && max_val_left_press - min_val_left_press > 3000.f)
  526. //if(left_max_press - left_front_press > 3000 && right_max_press - right_front_press > 3000)
  527. {
  528. SEGGER_RTT_printf(0, "test\n");
  529. return 1;
  530. }
  531. return 0;
  532. }