user_sever.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. #include "user_server.h"
  2. #include "user_nfc.h"
  3. #include "user_elect.h"
  4. #include "user_led.h"
  5. #include "dip_sw.h"
  6. tmosTaskID user_server_task_id = INVALID_TASK_ID;
  7. static uint32_t offline_timeout = CAN_OFFLINE_TIMEOUT_DEFAULT / USER_SERVER_INTERVAL;
  8. static bool offline_stat = false;
  9. static uint8_t can_idx = 0xFF;
  10. static lock_data_s lock_data = {
  11. .lock_stat = 0,
  12. .elect_stat = 0,
  13. .lock_id = {0},
  14. };
  15. static can_open_data_s can_open_data;
  16. /*******************************************************************************
  17. * @函数名称 prvUser_server_dev_type_protocol
  18. * @函数说明 设备类型索引解析
  19. * @输入参数 无
  20. * @输出参数 无
  21. * @返回参数 无
  22. *******************************************************************************/
  23. static void prvUser_server_dev_type_protocol(void)
  24. {
  25. if(can_open_data.subidx == REG_DEV_TYPE_SUBIDX)
  26. {
  27. if(can_open_data.ins == S_INS_RD)
  28. {
  29. can_open_data_s s_data;
  30. s_data.ins = R_INS_RD_WORD;
  31. s_data.idx = REG_DEV_TYPE_IDX;
  32. s_data.subidx = REG_DEV_TYPE_SUBIDX;
  33. s_data.data[0] = DEV_TYPE;
  34. s_data.data[1] = DEV_TYPE >> 8;
  35. s_data.data[2] = 0;
  36. s_data.data[3] = 0;
  37. vUser_can_send_data((uint8_t *)&s_data, 8);
  38. }
  39. else{
  40. can_open_data_s s_data;
  41. s_data.ins = R_INS_WR_FAIL;
  42. s_data.idx = REG_DEV_TYPE_IDX;
  43. s_data.subidx = REG_DEV_TYPE_SUBIDX;
  44. memset(s_data.data, 0, 4);
  45. vUser_can_send_data((uint8_t *)&s_data, 8);
  46. }
  47. }
  48. }
  49. /*******************************************************************************
  50. * @函数名称 prvUser_server_version_protocol
  51. * @函数说明 版本号索引解析
  52. * @输入参数 无
  53. * @输出参数 无
  54. * @返回参数 无
  55. *******************************************************************************/
  56. static void prvUser_server_version_protocol(void)
  57. {
  58. if(can_open_data.subidx == REG_VERSION_SUBIDX)
  59. {
  60. if(can_open_data.ins == S_INS_RD)
  61. {
  62. can_open_data_s s_data;
  63. s_data.ins = R_INS_RD_DWORD;
  64. s_data.idx = REG_VERSION_IDX;
  65. s_data.subidx = REG_VERSION_SUBIDX;
  66. s_data.data[0] = HARDWARE_VERSION;
  67. s_data.data[1] = HARDWARE_VERSION >> 8;
  68. s_data.data[2] = SOFTWARE_VERSION;
  69. s_data.data[3] = SOFTWARE_VERSION >> 8;
  70. vUser_can_send_data((uint8_t *)&s_data, 8);
  71. }
  72. else{
  73. can_open_data_s s_data;
  74. s_data.ins = R_INS_WR_FAIL;
  75. s_data.idx = REG_VERSION_IDX;
  76. s_data.subidx = REG_VERSION_SUBIDX;
  77. memset(s_data.data, 0, 4);
  78. vUser_can_send_data((uint8_t *)&s_data, 8);
  79. }
  80. }
  81. }
  82. /*******************************************************************************
  83. * @函数名称 prvUser_server_lock_stat_protocol
  84. * @函数说明 挂锁索引解析
  85. * @输入参数 无
  86. * @输出参数 无
  87. * @返回参数 无
  88. *******************************************************************************/
  89. static void prvUser_server_lock_stat_protocol(void)
  90. {
  91. if(can_open_data.subidx == REG_LOCK_STAT_SUBIDX)
  92. {
  93. if(can_open_data.ins == S_INS_RD)
  94. {
  95. can_open_data_s s_data;
  96. s_data.ins = R_INS_RD_BYTE;
  97. s_data.idx = REG_LOCK_STAT_IDX;
  98. s_data.subidx = REG_LOCK_STAT_SUBIDX;
  99. memset(s_data.data, 0, 4);
  100. memcpy(s_data.data,(uint8_t *)&(lock_data.lock_stat), 1);
  101. vUser_can_send_data((uint8_t *)&s_data, 8);
  102. }
  103. else{
  104. can_open_data_s s_data;
  105. s_data.ins = R_INS_WR_FAIL;
  106. s_data.idx = REG_LOCK_STAT_IDX;
  107. s_data.subidx = REG_LOCK_STAT_SUBIDX;
  108. memset(s_data.data, 0, 4);
  109. vUser_can_send_data((uint8_t *)&s_data, 8);
  110. }
  111. }
  112. }
  113. /*******************************************************************************
  114. * @函数名称 prvUser_server_elect_stat_protocol
  115. * @函数说明 电磁锁控制索引解析
  116. * @输入参数 无
  117. * @输出参数 无
  118. * @返回参数 无
  119. *******************************************************************************/
  120. static void prvUser_server_elect_stat_protocol(void)
  121. {
  122. if(can_open_data.subidx == REG_ELECT_STAT_SUBIDX)
  123. {
  124. if(can_open_data.ins == S_INS_RD)
  125. {
  126. can_open_data_s s_data;
  127. s_data.ins = R_INS_RD_WORD;
  128. s_data.idx = REG_ELECT_STAT_IDX;
  129. s_data.subidx = REG_ELECT_STAT_SUBIDX;
  130. memset(s_data.data, 0, 4);
  131. memcpy(s_data.data,(uint8_t *)&(lock_data.elect_stat), 2);
  132. vUser_can_send_data((uint8_t *)&s_data, 8);
  133. }
  134. else if(can_open_data.ins == S_INS_WR_WORD)
  135. {
  136. uint16_t temp = 0;
  137. memcpy((uint8_t *)&temp, (uint8_t *)&can_open_data.data, 2);
  138. can_open_data_s s_data;
  139. s_data.ins = R_INS_WR_SUCC;
  140. s_data.idx = REG_ELECT_STAT_IDX;
  141. s_data.subidx = REG_ELECT_STAT_SUBIDX;
  142. memset(s_data.data, 0, 4);
  143. memcpy(s_data.data,(uint8_t *)&temp, 2);
  144. vUser_can_send_data((uint8_t *)&s_data, 8);
  145. for(int i = 0; i < LOCK_COUNT; i++)
  146. {
  147. if((temp & (1 << (i + 8))) != 0)
  148. {
  149. if((temp & (1 << i)) != 0)
  150. {
  151. set_elect_work_stat(i, true);
  152. }
  153. else{
  154. set_elect_work_stat(i, false);
  155. }
  156. }
  157. }
  158. }
  159. else{
  160. can_open_data_s s_data;
  161. s_data.ins = R_INS_WR_FAIL;
  162. s_data.idx = REG_ELECT_STAT_IDX;
  163. s_data.subidx = REG_ELECT_STAT_SUBIDX;
  164. memset(s_data.data, 0, 4);
  165. vUser_can_send_data((uint8_t *)&s_data, 8);
  166. }
  167. }
  168. }
  169. /*******************************************************************************
  170. * @函数名称 prvUser_server_lock_id_protocol
  171. * @函数说明 挂锁NFC号索引解析
  172. * @输入参数 无
  173. * @输出参数 无
  174. * @返回参数 无
  175. *******************************************************************************/
  176. static void prvUser_server_lock_id_protocol(void)
  177. {
  178. if(can_open_data.subidx == REG_LOCK_01_ID_SUBIDX)
  179. {
  180. if(can_open_data.ins == S_INS_RD)
  181. {
  182. can_open_data_s s_data;
  183. s_data.ins = R_INS_RD_DWORD;
  184. s_data.idx = REG_LOCK_ID_IDX;
  185. s_data.subidx = REG_LOCK_01_ID_SUBIDX;
  186. memset(s_data.data, 0, 4);
  187. s_data.data[0] = lock_data.lock_id[0][3];
  188. s_data.data[1] = lock_data.lock_id[0][2];
  189. s_data.data[2] = lock_data.lock_id[0][1];
  190. s_data.data[3] = lock_data.lock_id[0][0];
  191. vUser_can_send_data((uint8_t *)&s_data, 8);
  192. }
  193. else{
  194. can_open_data_s s_data;
  195. s_data.ins = R_INS_WR_FAIL;
  196. s_data.idx = REG_LOCK_ID_IDX;
  197. s_data.subidx = REG_LOCK_01_ID_SUBIDX;
  198. memset(s_data.data, 0, 4);
  199. vUser_can_send_data((uint8_t *)&s_data, 8);
  200. }
  201. }
  202. else if(can_open_data.subidx == REG_LOCK_02_ID_SUBIDX)
  203. {
  204. if(can_open_data.ins == S_INS_RD)
  205. {
  206. can_open_data_s s_data;
  207. s_data.ins = R_INS_RD_DWORD;
  208. s_data.idx = REG_LOCK_ID_IDX;
  209. s_data.subidx = REG_LOCK_02_ID_SUBIDX;
  210. memset(s_data.data, 0, 4);
  211. s_data.data[0] = lock_data.lock_id[1][3];
  212. s_data.data[1] = lock_data.lock_id[1][2];
  213. s_data.data[2] = lock_data.lock_id[1][1];
  214. s_data.data[3] = lock_data.lock_id[1][0];
  215. vUser_can_send_data((uint8_t *)&s_data, 8);
  216. }
  217. else{
  218. can_open_data_s s_data;
  219. s_data.ins = R_INS_WR_FAIL;
  220. s_data.idx = REG_LOCK_ID_IDX;
  221. s_data.subidx = REG_LOCK_02_ID_SUBIDX;
  222. memset(s_data.data, 0, 4);
  223. vUser_can_send_data((uint8_t *)&s_data, 8);
  224. }
  225. }
  226. else if(can_open_data.subidx == REG_LOCK_03_ID_SUBIDX)
  227. {
  228. if(can_open_data.ins == S_INS_RD)
  229. {
  230. can_open_data_s s_data;
  231. s_data.ins = R_INS_RD_DWORD;
  232. s_data.idx = REG_LOCK_ID_IDX;
  233. s_data.subidx = REG_LOCK_03_ID_SUBIDX;
  234. memset(s_data.data, 0, 4);
  235. s_data.data[0] = lock_data.lock_id[2][3];
  236. s_data.data[1] = lock_data.lock_id[2][2];
  237. s_data.data[2] = lock_data.lock_id[2][1];
  238. s_data.data[3] = lock_data.lock_id[2][0];
  239. vUser_can_send_data((uint8_t *)&s_data, 8);
  240. }
  241. else{
  242. can_open_data_s s_data;
  243. s_data.ins = R_INS_WR_FAIL;
  244. s_data.idx = REG_LOCK_ID_IDX;
  245. s_data.subidx = REG_LOCK_03_ID_SUBIDX;
  246. memset(s_data.data, 0, 4);
  247. vUser_can_send_data((uint8_t *)&s_data, 8);
  248. }
  249. }
  250. else if(can_open_data.subidx == REG_LOCK_04_ID_SUBIDX)
  251. {
  252. if(can_open_data.ins == S_INS_RD)
  253. {
  254. can_open_data_s s_data;
  255. s_data.ins = R_INS_RD_DWORD;
  256. s_data.idx = REG_LOCK_ID_IDX;
  257. s_data.subidx = REG_LOCK_04_ID_SUBIDX;
  258. memset(s_data.data, 0, 4);
  259. s_data.data[0] = lock_data.lock_id[3][3];
  260. s_data.data[1] = lock_data.lock_id[3][2];
  261. s_data.data[2] = lock_data.lock_id[3][1];
  262. s_data.data[3] = lock_data.lock_id[3][0];
  263. vUser_can_send_data((uint8_t *)&s_data, 8);
  264. }
  265. else{
  266. can_open_data_s s_data;
  267. s_data.ins = R_INS_WR_FAIL;
  268. s_data.idx = REG_LOCK_ID_IDX;
  269. s_data.subidx = REG_LOCK_04_ID_SUBIDX;
  270. memset(s_data.data, 0, 4);
  271. vUser_can_send_data((uint8_t *)&s_data, 8);
  272. }
  273. }
  274. else if(can_open_data.subidx == REG_LOCK_05_ID_SUBIDX)
  275. {
  276. if(can_open_data.ins == S_INS_RD)
  277. {
  278. can_open_data_s s_data;
  279. s_data.ins = R_INS_RD_DWORD;
  280. s_data.idx = REG_LOCK_ID_IDX;
  281. s_data.subidx = REG_LOCK_05_ID_SUBIDX;
  282. memset(s_data.data, 0, 4);
  283. s_data.data[0] = lock_data.lock_id[4][3];
  284. s_data.data[1] = lock_data.lock_id[4][2];
  285. s_data.data[2] = lock_data.lock_id[4][1];
  286. s_data.data[3] = lock_data.lock_id[4][0];
  287. vUser_can_send_data((uint8_t *)&s_data, 8);
  288. }
  289. else{
  290. can_open_data_s s_data;
  291. s_data.ins = R_INS_WR_FAIL;
  292. s_data.idx = REG_LOCK_ID_IDX;
  293. s_data.subidx = REG_LOCK_05_ID_SUBIDX;
  294. memset(s_data.data, 0, 4);
  295. vUser_can_send_data((uint8_t *)&s_data, 8);
  296. }
  297. }
  298. }
  299. /*******************************************************************************
  300. * @函数名称 prvUser_server_can_protocol
  301. * @函数说明 can总线协议解析
  302. * @输入参数 无
  303. * @输出参数 无
  304. * @返回参数 无
  305. *******************************************************************************/
  306. static void prvUser_server_can_protocol(void)
  307. {
  308. bool stat = false;
  309. switch(can_open_data.idx)
  310. {
  311. case REG_DEV_TYPE_IDX:{
  312. prvUser_server_dev_type_protocol();
  313. stat = true;
  314. }break;
  315. case REG_VERSION_IDX:{
  316. prvUser_server_version_protocol();
  317. stat = true;
  318. }break;
  319. case REG_LOCK_STAT_IDX:{
  320. prvUser_server_lock_stat_protocol();
  321. stat = true;
  322. }break;
  323. case REG_ELECT_STAT_IDX:{
  324. prvUser_server_elect_stat_protocol();
  325. stat = true;
  326. }break;
  327. case REG_LOCK_ID_IDX:{
  328. prvUser_server_lock_id_protocol();
  329. stat = true;
  330. }break;
  331. default:break;
  332. }
  333. if(stat == true)
  334. {
  335. offline_timeout = CAN_OFFLINE_TIMEOUT_DEFAULT / USER_SERVER_INTERVAL;
  336. if(offline_stat == true)
  337. {
  338. offline_stat = false;
  339. vUser_led_set_alarm_view(LED_ALL_ALARM_OFFLINE, false);
  340. }
  341. }
  342. }
  343. /*******************************************************************************
  344. * @函数名称 ble_action_rst_pro
  345. * @函数说明 重启倒计时
  346. * @输入参数 无
  347. * @输出参数 无
  348. * @返回参数 无
  349. *******************************************************************************/
  350. static uint8_t rst_timeout = 5;
  351. static void ble_action_rst_pro(void)
  352. {
  353. if(rst_timeout == 0)
  354. {
  355. /* Software reset */
  356. NVIC_SystemReset();
  357. }
  358. else{
  359. rst_timeout--;
  360. PRINT("Restart countdown %d second\n", rst_timeout);
  361. }
  362. }
  363. /*******************************************************************************
  364. * @函数名称 prvUser_server_can_offline_check
  365. * @函数说明 CAN总线离线检测
  366. * @输入参数 无
  367. * @输出参数 无
  368. * @返回参数 无
  369. *******************************************************************************/
  370. static void prvUser_server_can_offline_check(void)
  371. {
  372. if(offline_timeout > 0)
  373. {
  374. if(offline_timeout == 1)
  375. {
  376. if(offline_stat == false)
  377. {
  378. offline_stat = true;
  379. vUser_led_set_alarm_view(LED_ALL_ALARM_OFFLINE, true);
  380. }
  381. }
  382. offline_timeout--;
  383. }
  384. }
  385. /*******************************************************************************
  386. * @函数名称 user_server_task_process_event
  387. * @函数说明 task的event处理回调函数,需要在注册task时候,传进去
  388. * @输入参数 task_id:任务ID
  389. events:事件
  390. * @输出参数 无
  391. * @返回参数 无
  392. *******************************************************************************/
  393. static uint16_t user_server_task_process_event(uint8_t task_id, uint16_t events)
  394. {
  395. //event 处理
  396. if(events & (1 << SERVER_QUEUE_TIME))
  397. {
  398. prvUser_server_can_offline_check();
  399. return (events ^ (1 << SERVER_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  400. }
  401. if(events & (1 << SERVER_QUEUE_CAN))
  402. {
  403. prvUser_server_can_protocol();
  404. return (events ^ (1 << SERVER_QUEUE_CAN)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  405. }
  406. if(events & (1 <<SERVER_BLE_RST))
  407. {
  408. ble_action_rst_pro();
  409. return (events ^ (1 << SERVER_BLE_RST)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  410. }
  411. return 0;
  412. }
  413. /*******************************************************************************
  414. * @函数名称 vUser_server_task_start
  415. * @函数说明 定时任务开始
  416. * @输入参数 无
  417. * @输出参数 无
  418. * @返回参数 无
  419. *******************************************************************************/
  420. void vUser_server_task_start(void)
  421. {
  422. bStatus_t stat = tmos_start_reload_task(user_server_task_id, (1 << SERVER_QUEUE_TIME), MS1_TO_SYSTEM_TIME(USER_SERVER_INTERVAL));
  423. }
  424. /*******************************************************************************
  425. * @函数名称 vUser_server_set_led_stat
  426. * @函数说明 设置LED灯变化
  427. * @输入参数 idx:底座号
  428. * @输出参数 无
  429. * @返回参数 无
  430. *******************************************************************************/
  431. static void vUser_server_set_led_stat(uint8_t idx)
  432. {
  433. if(((lock_data.elect_stat & (1 << idx)) != 0 ) && ((lock_data.lock_stat & (1 << idx)) != 0))
  434. {
  435. vUser_led_set_view_stat(idx, LED_VIEW_LOCK_ELECT);
  436. }
  437. else if(((lock_data.elect_stat & (1 << idx)) == 0 ) && ((lock_data.lock_stat & (1 << idx)) == 0))
  438. {
  439. vUser_led_set_view_stat(idx, LED_VIEW_NOLOCK_NOELECT);
  440. }
  441. else if(((lock_data.elect_stat & (1 << idx)) == 0 ) && ((lock_data.lock_stat & (1 << idx)) != 0))
  442. {
  443. vUser_led_set_view_stat(idx, LED_VIEW_LOCK_NOELECT);
  444. }
  445. else if(((lock_data.elect_stat & (1 << idx)) != 0 ) && ((lock_data.lock_stat & (1 << idx)) == 0))
  446. {
  447. vUser_led_set_view_stat(idx, LED_VIEW_NOLOCK_ELECT);
  448. }
  449. }
  450. /*******************************************************************************
  451. * @函数名称 vUser_server_get_lock_data
  452. * @函数说明 获取挂锁底座数据变量
  453. * @输入参数 无
  454. * @输出参数 无
  455. * @返回参数 挂锁底座数据变量指针
  456. *******************************************************************************/
  457. lock_data_s *vUser_server_get_lock_data(void)
  458. {
  459. return &lock_data;
  460. }
  461. /*******************************************************************************
  462. * @函数名称 vUser_can_recv_data_callback
  463. * @函数说明 can接收数据上报回调
  464. * @输入参数 data:数据指针
  465. size:数据长度
  466. * @输出参数 无
  467. * @返回参数 无
  468. *******************************************************************************/
  469. static void prvUser_can_recv_data_callback(uint8_t *data, uint8_t size)
  470. {
  471. memcpy(&can_open_data, data, sizeof(can_open_data_s));
  472. bStatus_t stat = tmos_start_task(user_server_task_id, (1 << SERVER_QUEUE_CAN), MS1_TO_SYSTEM_TIME(1));
  473. }
  474. /*******************************************************************************
  475. * @函数名称 vUser_nfc_upload_card_callback
  476. * @函数说明 钥匙nfc标签读取上报回调
  477. * @输入参数 idx:挂锁底座号
  478. stat:是否有挂锁
  479. card:挂锁RFID号
  480. * @输出参数 无
  481. * @返回参数 无
  482. *******************************************************************************/
  483. static void prvUser_nfc_upload_card_callback(uint8_t idx, bool stat, unsigned char *card)
  484. {
  485. if(stat == true)
  486. {
  487. lock_data.lock_stat |= (1 << idx);
  488. memcpy(lock_data.lock_id[idx], &card[4], 4);
  489. }
  490. else{
  491. lock_data.lock_stat &= ~(1 << idx);
  492. memcpy(lock_data.lock_id[idx], &card[4], 4);
  493. }
  494. vUser_server_set_led_stat(idx);
  495. }
  496. /*******************************************************************************
  497. * @函数名称 vUser_elect_upload_stat_callback
  498. * @函数说明 设置挂锁位电磁锁状态回调
  499. * @输入参数 idx:挂锁底座号
  500. stat:电磁锁是否锁死
  501. * @输出参数 无
  502. * @返回参数 无
  503. *******************************************************************************/
  504. static void vUser_elect_upload_stat_callback(uint8_t idx, bool stat)
  505. {
  506. if(stat == true)
  507. {
  508. lock_data.elect_stat |= (1 << idx);
  509. }
  510. else{
  511. lock_data.elect_stat &= ~(1 << idx);
  512. }
  513. vUser_server_set_led_stat(idx);
  514. }
  515. /*******************************************************************************
  516. * @函数名称 prvDipsw_upload_callback
  517. * @函数说明 地址读取回调
  518. * @输入参数 无
  519. * @输出参数 无
  520. * @返回参数 无
  521. *******************************************************************************/
  522. static void prvDipsw_upload_callback(uint8_t addr)
  523. {
  524. vUser_can_set_addr(addr);
  525. elect_start(addr);
  526. if(addr != can_idx)
  527. {
  528. can_idx = addr;
  529. if(addr > 0)
  530. {
  531. vUser_led_set_alarm_view(LED_ALL_ALARM_CAN_IDX_ERROR, false);
  532. }
  533. else{
  534. vUser_led_set_alarm_view(LED_ALL_ALARM_CAN_IDX_ERROR, true);
  535. }
  536. }
  537. }
  538. /*******************************************************************************
  539. * @函数名称 vUser_server_init
  540. * @函数说明 初始化
  541. * @输入参数 无
  542. * @输出参数 无
  543. * @返回参数 无
  544. *******************************************************************************/
  545. void vUser_server_init(void)
  546. {
  547. vUser_can_set_recv_data_func(prvUser_can_recv_data_callback);
  548. vUser_nfc_set_upload_key_stat_func(prvUser_nfc_upload_card_callback);
  549. vUser_elect_set_upload_stat_func(vUser_elect_upload_stat_callback);
  550. vDipsw_set_upload_func(prvDipsw_upload_callback);
  551. user_server_task_id = TMOS_ProcessEventRegister(user_server_task_process_event);
  552. PRINT("user_server_task_id=%d\n", user_server_task_id);
  553. }