user_sever.c 19 KB

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