user_sever.c 16 KB

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