user_sever.c 21 KB

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