user_sever.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  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. #include "elect_sw.h"
  8. #include "user_fan.h"
  9. #include "user_adc.h"
  10. tmosTaskID user_server_task_id = INVALID_TASK_ID;
  11. static uint32_t offline_timeout = CAN_OFFLINE_TIMEOUT_DEFAULT / USER_SERVER_INTERVAL;
  12. static bool offline_stat = false;
  13. static uint8_t can_idx = 0xFF;
  14. static uint8_t left_fan_speed = 0;
  15. static uint8_t right_fan_speed = 0;
  16. static key_data_s key_data = {
  17. .elect_act = {
  18. .left_elect_act = 0,
  19. .left_elect_finish = 0,
  20. .right_elect_act = 0,
  21. .right_elect_finish = 0,
  22. },
  23. .elect_stat = {
  24. .left_key_elect_stat = 0,
  25. .left_charge_stat = 0,
  26. .left_Reserved = 0,
  27. .right_key_elect_stat = 0,
  28. .right_charge_stat = 0,
  29. .right_Reserved = 0,
  30. .left_elect_fault = 0,
  31. .left_elect_stat_Reserved = 0,
  32. .right_elect_fault = 0,
  33. .right_elect_stat_Reserved = 0,
  34. },
  35. .key_stat = {
  36. .left_key_stat = 0,
  37. .left_charge_stat = 0,
  38. .left_Reserved = 0,
  39. .right_key_stat = 0,
  40. .right_charge_stat = 0,
  41. .right_Reserved = 0,
  42. },
  43. .charge_temp = {
  44. .left_temperature = -100,
  45. .right_temperature = -100,
  46. },
  47. .left_key_id = 0,
  48. .right_key_id = 0,
  49. };
  50. static can_open_data_s can_open_data;
  51. /*******************************************************************************
  52. * @函数名称 prvUser_server_dev_type_protocol
  53. * @函数说明 设备类型索引解析
  54. * @输入参数 无
  55. * @输出参数 无
  56. * @返回参数 无
  57. *******************************************************************************/
  58. static void prvUser_server_dev_type_protocol(void)
  59. {
  60. if(can_open_data.subidx == REG_DEV_TYPE_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_WORD;
  66. s_data.idx = REG_DEV_TYPE_IDX;
  67. s_data.subidx = REG_DEV_TYPE_SUBIDX;
  68. s_data.data[0] = DEV_TYPE;
  69. s_data.data[1] = DEV_TYPE >> 8;
  70. s_data.data[2] = 0;
  71. s_data.data[3] = 0;
  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_DEV_TYPE_IDX;
  78. s_data.subidx = REG_DEV_TYPE_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_version_protocol
  86. * @函数说明 版本号索引解析
  87. * @输入参数 无
  88. * @输出参数 无
  89. * @返回参数 无
  90. *******************************************************************************/
  91. static void prvUser_server_version_protocol(void)
  92. {
  93. if(can_open_data.subidx == REG_VERSION_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_DWORD;
  99. s_data.idx = REG_VERSION_IDX;
  100. s_data.subidx = REG_VERSION_SUBIDX;
  101. s_data.data[0] = HARDWARE_VERSION;
  102. s_data.data[1] = HARDWARE_VERSION >> 8;
  103. s_data.data[2] = SOFTWARE_VERSION;
  104. s_data.data[3] = SOFTWARE_VERSION >> 8;
  105. vUser_can_send_data((uint8_t *)&s_data, 8);
  106. }
  107. else{
  108. can_open_data_s s_data;
  109. s_data.ins = R_INS_WR_FAIL;
  110. s_data.idx = REG_VERSION_IDX;
  111. s_data.subidx = REG_VERSION_SUBIDX;
  112. memset(s_data.data, 0, 4);
  113. vUser_can_send_data((uint8_t *)&s_data, 8);
  114. }
  115. }
  116. }
  117. /*******************************************************************************
  118. * @函数名称 prvUser_server_key_stat_protocol
  119. * @函数说明 钥匙索引解析
  120. * @输入参数 无
  121. * @输出参数 无
  122. * @返回参数 无
  123. *******************************************************************************/
  124. static void prvUser_server_key_stat_protocol(void)
  125. {
  126. if(can_open_data.subidx == REG_KEY_STAT_SUBIDX)
  127. {
  128. if(can_open_data.ins == S_INS_RD)
  129. {
  130. can_open_data_s s_data;
  131. s_data.ins = R_INS_RD_WORD;
  132. s_data.idx = REG_KEY_STAT_IDX;
  133. s_data.subidx = REG_KEY_STAT_SUBIDX;
  134. memset(s_data.data, 0, 4);
  135. memcpy(s_data.data,(uint8_t *)&(key_data.key_stat), 2);
  136. vUser_can_send_data((uint8_t *)&s_data, 8);
  137. }
  138. else{
  139. can_open_data_s s_data;
  140. s_data.ins = R_INS_WR_FAIL;
  141. s_data.idx = REG_KEY_STAT_IDX;
  142. s_data.subidx = REG_KEY_STAT_SUBIDX;
  143. memset(s_data.data, 0, 4);
  144. vUser_can_send_data((uint8_t *)&s_data, 8);
  145. }
  146. }
  147. }
  148. /*******************************************************************************
  149. * @函数名称 prvUser_server_elect_stat_protocol
  150. * @函数说明 电磁锁控制索引解析
  151. * @输入参数 无
  152. * @输出参数 无
  153. * @返回参数 无
  154. *******************************************************************************/
  155. static void prvUser_server_elect_stat_protocol(void)
  156. {
  157. if(can_open_data.subidx == REG_ELECT_STAT_SUBIDX)
  158. {
  159. if(can_open_data.ins == S_INS_RD)
  160. {
  161. can_open_data_s s_data;
  162. s_data.ins = R_INS_RD_WORD;
  163. s_data.idx = REG_ELECT_STAT_IDX;
  164. s_data.subidx = REG_ELECT_STAT_SUBIDX;
  165. memset(s_data.data, 0, 4);
  166. memcpy(s_data.data,(uint8_t *)&(key_data.elect_stat), 2);
  167. vUser_can_send_data((uint8_t *)&s_data, 8);
  168. }
  169. else if(can_open_data.ins == S_INS_WR_WORD)
  170. {
  171. key_elect_control_s elect;
  172. memcpy((uint8_t *)&elect, (uint8_t *)&can_open_data.data, 2);
  173. can_open_data_s s_data;
  174. s_data.ins = R_INS_WR_SUCC;
  175. s_data.idx = REG_ELECT_STAT_IDX;
  176. s_data.subidx = REG_ELECT_STAT_SUBIDX;
  177. memset(s_data.data, 0, 4);
  178. memcpy(s_data.data,(uint8_t *)&elect, 2);
  179. vUser_can_send_data((uint8_t *)&s_data, 8);
  180. if(elect.left_elect_enable == 1)
  181. {
  182. set_elect_work_stat(LEFT_IDX, (elect.left_elect_control == 1)?true:false);
  183. }
  184. if(elect.right_elect_enable == 1)
  185. {
  186. set_elect_work_stat(RIGHT_IDX, (elect.right_elect_control == 1)?true:false);
  187. }
  188. if(elect.left_charge_enable == 1)
  189. {
  190. set_user_charge_Queue((elect.left_charge_control == 1)?CHARGE_QUEUE_LEFT_OPEN:CHARGE_QUEUE_LEFT_CLOSE);
  191. }
  192. if(elect.right_charge_enable == 1)
  193. {
  194. set_user_charge_Queue((elect.right_charge_control == 1)?CHARGE_QUEUE_RIGHT_OPEN:CHARGE_QUEUE_RIGHT_CLOSE);
  195. }
  196. }
  197. else{
  198. can_open_data_s s_data;
  199. s_data.ins = R_INS_WR_FAIL;
  200. s_data.idx = REG_ELECT_STAT_IDX;
  201. s_data.subidx = REG_ELECT_STAT_SUBIDX;
  202. memset(s_data.data, 0, 4);
  203. vUser_can_send_data((uint8_t *)&s_data, 8);
  204. }
  205. }
  206. }
  207. /*******************************************************************************
  208. * @函数名称 prvUser_server_charge_temp_protocol
  209. * @函数说明 充电温度值索引解析
  210. * @输入参数 无
  211. * @输出参数 无
  212. * @返回参数 无
  213. *******************************************************************************/
  214. static void prvUser_server_charge_temp_protocol(void)
  215. {
  216. if(can_open_data.subidx == REG_CHARGE_TEMP_SUBIDX)
  217. {
  218. if(can_open_data.ins == S_INS_RD)
  219. {
  220. can_open_data_s s_data;
  221. s_data.ins = R_INS_RD_DWORD;
  222. s_data.idx = REG_CHARGE_TEMP_IDX;
  223. s_data.subidx = REG_CHARGE_TEMP_SUBIDX;
  224. memcpy(s_data.data,(uint8_t *)&(key_data.charge_temp), 4);
  225. vUser_can_send_data((uint8_t *)&s_data, 8);
  226. }
  227. else{
  228. can_open_data_s s_data;
  229. s_data.ins = R_INS_WR_FAIL;
  230. s_data.idx = REG_CHARGE_TEMP_IDX;
  231. s_data.subidx = REG_CHARGE_TEMP_SUBIDX;
  232. memset(s_data.data, 0, 4);
  233. vUser_can_send_data((uint8_t *)&s_data, 8);
  234. }
  235. }
  236. }
  237. /*******************************************************************************
  238. * @函数名称 prvUser_server_left_key_id_protocol
  239. * @函数说明 左边钥匙NFC号索引解析
  240. * @输入参数 无
  241. * @输出参数 无
  242. * @返回参数 无
  243. *******************************************************************************/
  244. static void prvUser_server_left_key_id_protocol(void)
  245. {
  246. if(can_open_data.subidx == REG_LEFT_KEY_ID_SUBIDX)
  247. {
  248. if(can_open_data.ins == S_INS_RD)
  249. {
  250. can_open_data_s s_data;
  251. s_data.ins = R_INS_RD_DWORD;
  252. s_data.idx = REG_LEFT_KEY_ID_IDX;
  253. s_data.subidx = REG_LEFT_KEY_ID_SUBIDX;
  254. s_data.data[0] = key_data.left_key_id[3];
  255. s_data.data[1] = key_data.left_key_id[2];
  256. s_data.data[2] = key_data.left_key_id[1];
  257. s_data.data[3] = key_data.left_key_id[0];
  258. vUser_can_send_data((uint8_t *)&s_data, 8);
  259. }
  260. else{
  261. can_open_data_s s_data;
  262. s_data.ins = R_INS_WR_FAIL;
  263. s_data.idx = REG_LEFT_KEY_ID_IDX;
  264. s_data.subidx = REG_LEFT_KEY_ID_SUBIDX;
  265. memset(s_data.data, 0, 4);
  266. vUser_can_send_data((uint8_t *)&s_data, 8);
  267. }
  268. }
  269. }
  270. /*******************************************************************************
  271. * @函数名称 prvUser_server_right_key_id_protocol
  272. * @函数说明 右边钥匙NFC号索引解析
  273. * @输入参数 无
  274. * @输出参数 无
  275. * @返回参数 无
  276. *******************************************************************************/
  277. static void prvUser_server_right_key_id_protocol(void)
  278. {
  279. if(can_open_data.subidx == REG_RIGHT_KEY_ID_SUBIDX)
  280. {
  281. if(can_open_data.ins == S_INS_RD)
  282. {
  283. can_open_data_s s_data;
  284. s_data.ins = R_INS_RD_DWORD;
  285. s_data.idx = REG_RIGHT_KEY_ID_IDX;
  286. s_data.subidx = REG_RIGHT_KEY_ID_SUBIDX;
  287. memset(s_data.data, 0, 4);
  288. s_data.data[0] = key_data.right_key_id[3];
  289. s_data.data[1] = key_data.right_key_id[2];
  290. s_data.data[2] = key_data.right_key_id[1];
  291. s_data.data[3] = key_data.right_key_id[0];
  292. vUser_can_send_data((uint8_t *)&s_data, 8);
  293. }
  294. else{
  295. can_open_data_s s_data;
  296. s_data.ins = R_INS_WR_FAIL;
  297. s_data.idx = REG_RIGHT_KEY_ID_IDX;
  298. s_data.subidx = REG_RIGHT_KEY_ID_SUBIDX;
  299. memset(s_data.data, 0, 4);
  300. vUser_can_send_data((uint8_t *)&s_data, 8);
  301. }
  302. }
  303. }
  304. /*******************************************************************************
  305. * @函数名称 prvUser_server_can_protocol
  306. * @函数说明 can总线协议解析
  307. * @输入参数 无
  308. * @输出参数 无
  309. * @返回参数 无
  310. *******************************************************************************/
  311. static void prvUser_server_can_protocol(void)
  312. {
  313. bool stat = false;
  314. switch(can_open_data.idx)
  315. {
  316. case REG_DEV_TYPE_IDX:prvUser_server_dev_type_protocol();stat = true;break;
  317. case REG_VERSION_IDX:prvUser_server_version_protocol();stat = true;break;
  318. case REG_KEY_STAT_IDX:prvUser_server_key_stat_protocol();stat = true;break;
  319. case REG_ELECT_STAT_IDX:prvUser_server_elect_stat_protocol();stat = true;break;
  320. case REG_CHARGE_TEMP_IDX:prvUser_server_charge_temp_protocol();stat = true;break;
  321. case REG_LEFT_KEY_ID_IDX:prvUser_server_left_key_id_protocol();stat = true;break;
  322. case REG_RIGHT_KEY_ID_IDX:prvUser_server_right_key_id_protocol();stat = true;break;
  323. default:break;
  324. }
  325. if(stat == true)
  326. {
  327. offline_timeout = CAN_OFFLINE_TIMEOUT_DEFAULT / USER_SERVER_INTERVAL;
  328. if(offline_stat == true)
  329. {
  330. offline_stat = false;
  331. vUser_led_set_alarm_view(LED_ALL_ALARM_OFFLINE, false);
  332. }
  333. }
  334. }
  335. /*******************************************************************************
  336. * @函数名称 ble_action_rst_pro
  337. * @函数说明 重启倒计时
  338. * @输入参数 无
  339. * @输出参数 无
  340. * @返回参数 无
  341. *******************************************************************************/
  342. static uint8_t rst_timeout = 5;
  343. static void ble_action_rst_pro(void)
  344. {
  345. if(rst_timeout == 0)
  346. {
  347. /* Software reset */
  348. NVIC_SystemReset();
  349. }
  350. else{
  351. rst_timeout--;
  352. PRINT("Restart countdown %d second\n", rst_timeout);
  353. }
  354. }
  355. /*******************************************************************************
  356. * @函数名称 prvUser_server_can_offline_check
  357. * @函数说明 CAN总线离线检测
  358. * @输入参数 无
  359. * @输出参数 无
  360. * @返回参数 无
  361. *******************************************************************************/
  362. static void prvUser_server_can_offline_check(void)
  363. {
  364. if(offline_timeout > 0)
  365. {
  366. if(offline_timeout == 1)
  367. {
  368. if(offline_stat == false)
  369. {
  370. offline_stat = true;
  371. vUser_led_set_alarm_view(LED_ALL_ALARM_OFFLINE, true);
  372. }
  373. }
  374. offline_timeout--;
  375. }
  376. }
  377. /*******************************************************************************
  378. * @函数名称 user_server_task_process_event
  379. * @函数说明 task的event处理回调函数,需要在注册task时候,传进去
  380. * @输入参数 task_id:任务ID
  381. events:事件
  382. * @输出参数 无
  383. * @返回参数 无
  384. *******************************************************************************/
  385. static uint16_t user_server_task_process_event(uint8_t task_id, uint16_t events)
  386. {
  387. //event 处理
  388. if(events & (1 << SERVER_QUEUE_TIME))
  389. {
  390. prvUser_server_can_offline_check();
  391. return (events ^ (1 << SERVER_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  392. }
  393. if(events & (1 << SERVER_QUEUE_CAN))
  394. {
  395. prvUser_server_can_protocol();
  396. return (events ^ (1 << SERVER_QUEUE_CAN)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  397. }
  398. if(events & (1 <<SERVER_BLE_RST))
  399. {
  400. ble_action_rst_pro();
  401. return (events ^ (1 << SERVER_BLE_RST)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  402. }
  403. return 0;
  404. }
  405. /*******************************************************************************
  406. * @函数名称 vUser_server_task_start
  407. * @函数说明 定时任务开始
  408. * @输入参数 无
  409. * @输出参数 无
  410. * @返回参数 无
  411. *******************************************************************************/
  412. void vUser_server_task_start(void)
  413. {
  414. bStatus_t stat = tmos_start_reload_task(user_server_task_id, (1 << SERVER_QUEUE_TIME), MS1_TO_SYSTEM_TIME(USER_SERVER_INTERVAL));
  415. }
  416. /*******************************************************************************
  417. * @函数名称 vUser_server_set_led_stat
  418. * @函数说明 设置LED灯变化
  419. * @输入参数 idx:左边或者右边
  420. * @输出参数 无
  421. * @返回参数 无
  422. *******************************************************************************/
  423. static void vUser_server_set_led_stat(uint8_t idx)
  424. {
  425. if(idx == LEFT_IDX)
  426. {
  427. if(key_data.elect_stat.left_elect_fault == 1)
  428. {
  429. vUser_led_set_view_stat(LEFT_IDX, LED_VIEW_ELECT_FAUIL);
  430. }
  431. else if(key_data.elect_stat.left_key_elect_stat == 1 && key_data.key_stat.left_key_stat == 1)
  432. {
  433. vUser_led_set_view_stat(LEFT_IDX, LED_VIEW_KEY_ELECT);
  434. }
  435. else if(key_data.elect_stat.left_key_elect_stat == 0 && key_data.key_stat.left_key_stat == 0)
  436. {
  437. vUser_led_set_view_stat(LEFT_IDX, LED_VIEW_NOKEY_NOELECT);
  438. }
  439. else if(key_data.elect_stat.left_key_elect_stat == 0 && key_data.key_stat.left_key_stat == 1)
  440. {
  441. vUser_led_set_view_stat(LEFT_IDX, LED_VIEW_KEY_NOELECT);
  442. }
  443. else if(key_data.elect_stat.left_key_elect_stat == 1 && key_data.key_stat.left_key_stat == 0)
  444. {
  445. vUser_led_set_view_stat(LEFT_IDX, LED_VIEW_NOKEY_ELECT);
  446. }
  447. }
  448. else if(idx ==RIGHT_IDX)
  449. {
  450. if(key_data.elect_stat.right_elect_fault == 1)
  451. {
  452. vUser_led_set_view_stat(RIGHT_IDX, LED_VIEW_ELECT_FAUIL);
  453. }
  454. else if(key_data.elect_stat.right_key_elect_stat == 1 && key_data.key_stat.right_key_stat == 1)
  455. {
  456. vUser_led_set_view_stat(RIGHT_IDX, LED_VIEW_KEY_ELECT);
  457. }
  458. else if(key_data.elect_stat.right_key_elect_stat == 0 && key_data.key_stat.right_key_stat == 0)
  459. {
  460. vUser_led_set_view_stat(RIGHT_IDX, LED_VIEW_NOKEY_NOELECT);
  461. }
  462. else if(key_data.elect_stat.right_key_elect_stat == 0 && key_data.key_stat.right_key_stat == 1)
  463. {
  464. vUser_led_set_view_stat(RIGHT_IDX, LED_VIEW_KEY_NOELECT);
  465. }
  466. else if(key_data.elect_stat.right_key_elect_stat == 1 && key_data.key_stat.right_key_stat == 0)
  467. {
  468. vUser_led_set_view_stat(RIGHT_IDX, LED_VIEW_NOKEY_ELECT);
  469. }
  470. }
  471. }
  472. /*******************************************************************************
  473. * @函数名称 vUser_server_get_key_data
  474. * @函数说明 获取钥匙底座数据变量
  475. * @输入参数 无
  476. * @输出参数 无
  477. * @返回参数 钥匙底座数据变量指针
  478. *******************************************************************************/
  479. key_data_s *vUser_server_get_key_data(void)
  480. {
  481. return &key_data;
  482. }
  483. /*******************************************************************************
  484. * @函数名称 vUser_can_recv_data_callback
  485. * @函数说明 can接收数据上报回调
  486. * @输入参数 data:数据指针
  487. size:数据长度
  488. * @输出参数 无
  489. * @返回参数 无
  490. *******************************************************************************/
  491. static void prvUser_can_recv_data_callback(uint8_t *data, uint8_t size)
  492. {
  493. memcpy(&can_open_data, data, sizeof(can_open_data_s));
  494. bStatus_t stat = tmos_start_task(user_server_task_id, (1 << SERVER_QUEUE_CAN), MS1_TO_SYSTEM_TIME(1));
  495. }
  496. /*******************************************************************************
  497. * @函数名称 prvUser_server_check_elect_stat
  498. * @函数说明 检测电磁锁状态是否正常
  499. * @输入参数 idx:左或者右边
  500. * @输出参数 无
  501. * @返回参数 无
  502. *******************************************************************************/
  503. static void prvUser_server_check_elect_stat(uint8_t idx)
  504. {
  505. if(idx == LEFT_IDX)
  506. {
  507. key_data.elect_stat.left_elect_fault = key_data.elect_act.left_elect_finish;
  508. }
  509. else if(idx == RIGHT_IDX)
  510. {
  511. key_data.elect_stat.right_elect_fault = key_data.elect_act.right_elect_finish;
  512. }
  513. vUser_server_set_led_stat(idx);
  514. }
  515. /*******************************************************************************
  516. * @函数名称 vUser_nfc_upload_card_callback
  517. * @函数说明 钥匙nfc标签读取上报回调
  518. * @输入参数 idx:左或者右边
  519. stat:是否有钥匙
  520. card:钥匙RFID号
  521. * @输出参数 无
  522. * @返回参数 无
  523. *******************************************************************************/
  524. static void prvUser_nfc_upload_card_callback(uint8_t idx, bool stat, unsigned char *card)
  525. {
  526. if(idx == LEFT_IDX)
  527. {
  528. key_data.key_stat.left_key_stat = (stat == true)?1:0;
  529. memcpy(key_data.left_key_id, &card[4], 4);
  530. }
  531. else if(idx == RIGHT_IDX)
  532. {
  533. key_data.key_stat.right_key_stat = (stat == true)?1:0;
  534. memcpy(key_data.right_key_id, &card[4], 4);
  535. }
  536. vUser_server_set_led_stat(idx);
  537. }
  538. /*******************************************************************************
  539. * @函数名称 vUser_elect_upload_stat_callback
  540. * @函数说明 设置钥匙位电磁锁状态回调
  541. * @输入参数 idx:左边或者右边
  542. stat:电磁锁是否锁死
  543. * @输出参数 无
  544. * @返回参数 无
  545. *******************************************************************************/
  546. static void vUser_elect_upload_stat_callback(uint8_t idx, bool stat, bool finish)
  547. {
  548. if(idx == LEFT_IDX)
  549. {
  550. key_data.elect_act.left_elect_act = (stat == true)?1:0;
  551. }
  552. else if(idx == RIGHT_IDX)
  553. {
  554. key_data.elect_act.right_elect_act = (stat == true)?1:0;
  555. }
  556. if(finish == false)
  557. {
  558. if(idx == LEFT_IDX)
  559. {
  560. if(key_data.elect_act.left_elect_act != key_data.elect_stat.left_key_elect_stat)
  561. {
  562. key_data.elect_act.left_elect_finish = 1;
  563. }
  564. }
  565. else if(idx == RIGHT_IDX)
  566. {
  567. if(key_data.elect_act.right_elect_act != key_data.elect_stat.right_key_elect_stat)
  568. {
  569. key_data.elect_act.right_elect_finish = 1;
  570. }
  571. }
  572. }
  573. else{
  574. prvUser_server_check_elect_stat(idx);
  575. }
  576. }
  577. /*******************************************************************************
  578. * @函数名称 vUser_charge_upload_stat_callback
  579. * @函数说明 设置钥匙位电磁锁状态回调
  580. * @输入参数 idx:左边或者右边
  581. stat:充电状态
  582. * @输出参数 无
  583. * @返回参数 无
  584. *******************************************************************************/
  585. static void vUser_charge_upload_stat_callback(uint8_t idx, bool stat)
  586. {
  587. if(idx == LEFT_IDX)
  588. {
  589. key_data.key_stat.left_charge_stat = (stat == true)?1:0;
  590. key_data.elect_stat.left_charge_stat = (stat == true)?1:0;
  591. if(stat == true)
  592. {
  593. set_fan_indication(LEFT_IDX, 50);
  594. }
  595. }
  596. else if(idx == RIGHT_IDX)
  597. {
  598. key_data.key_stat.right_charge_stat = (stat == true)?1:0;
  599. key_data.elect_stat.right_charge_stat = (stat == true)?1:0;
  600. if(stat == true)
  601. {
  602. set_fan_indication(RIGHT_IDX, 50);
  603. }
  604. }
  605. vUser_nfc_set_charge_stat(idx, stat);
  606. }
  607. /*******************************************************************************
  608. * @函数名称 prvDipsw_upload_callback
  609. * @函数说明 地址读取回调
  610. * @输入参数 无
  611. * @输出参数 无
  612. * @返回参数 无
  613. *******************************************************************************/
  614. static void prvDipsw_upload_callback(uint8_t addr)
  615. {
  616. vUser_can_set_addr(addr);
  617. elect_start(addr);
  618. if(addr != can_idx)
  619. {
  620. can_idx = addr;
  621. if(addr > 0)
  622. {
  623. vUser_led_set_alarm_view(LED_ALL_ALARM_CAN_IDX_ERROR, false);
  624. }
  625. else{
  626. vUser_led_set_alarm_view(LED_ALL_ALARM_CAN_IDX_ERROR, true);
  627. }
  628. }
  629. }
  630. /*******************************************************************************
  631. * @函数名称 prvDipsw_upload_callback
  632. * @函数说明 地址读取回调
  633. * @输入参数 无
  634. * @输出参数 无
  635. * @返回参数 无
  636. *******************************************************************************/
  637. static void prvElectsw_upload_callback(uint8_t idx, bool stat)
  638. {
  639. if(idx == LEFT_IDX)
  640. {
  641. key_data.elect_stat.left_key_elect_stat = (stat == true)?1:0;
  642. key_data.elect_act.left_elect_finish = 0;
  643. }
  644. else if(idx == RIGHT_IDX)
  645. {
  646. key_data.elect_stat.right_key_elect_stat = (stat == true)?1:0;
  647. key_data.elect_act.right_elect_finish = 0;
  648. }
  649. prvUser_server_check_elect_stat(idx);
  650. }
  651. /*******************************************************************************
  652. * @函数名称 prvUser_server_charge_fan_change
  653. * @函数说明 f风扇转速调整
  654. * @输入参数 无
  655. * @输出参数 无
  656. * @返回参数 无
  657. *******************************************************************************/
  658. static void prvUser_server_charge_fan_change(void)
  659. {
  660. if(key_data.key_stat.left_charge_stat == false)
  661. {
  662. if(key_data.charge_temp.left_temperature <= USER_FAN_STOP_DFAULT_VALUE)
  663. {
  664. if(left_fan_speed > 0)
  665. {
  666. left_fan_speed = 0;
  667. set_fan_indication(LEFT_IDX, 0);
  668. PRINT("left fan set 0\n");
  669. }
  670. }
  671. }
  672. else{
  673. if(key_data.charge_temp.left_temperature > USER_FAN_STOP_DFAULT_VALUE)
  674. {
  675. uint8_t value = (key_data.charge_temp.left_temperature - USER_FAN_STOP_DFAULT_VALUE) / 10;
  676. if(left_fan_speed != value)
  677. {
  678. left_fan_speed = value;
  679. set_fan_indication(LEFT_IDX, (value > 50)?100:(50 + value));
  680. PRINT("left fan set %d%%", value);
  681. }
  682. }
  683. else{
  684. if(left_fan_speed -= 50)
  685. {
  686. left_fan_speed = 50;
  687. set_fan_indication(LEFT_IDX, 50);
  688. PRINT("left fan set 0\n");
  689. }
  690. }
  691. }
  692. if(key_data.key_stat.right_charge_stat == false)
  693. {
  694. if(key_data.charge_temp.right_temperature <= USER_FAN_STOP_DFAULT_VALUE)
  695. {
  696. if(right_fan_speed > 0)
  697. {
  698. right_fan_speed = 0;
  699. set_fan_indication(RIGHT_IDX, 0);
  700. PRINT("right fan set 0\n");
  701. }
  702. }
  703. }
  704. else{
  705. if(key_data.charge_temp.right_temperature > USER_FAN_STOP_DFAULT_VALUE)
  706. {
  707. uint8_t value = (key_data.charge_temp.right_temperature - USER_FAN_STOP_DFAULT_VALUE) / 10;
  708. if(right_fan_speed != value)
  709. {
  710. right_fan_speed = value;
  711. set_fan_indication(RIGHT_IDX, (value > 50)?100:(50 + value));
  712. PRINT("right fan set %d%%", value);
  713. }
  714. }
  715. else{
  716. if(right_fan_speed != 50)
  717. {
  718. right_fan_speed = 50;
  719. set_fan_indication(RIGHT_IDX, 50);
  720. PRINT("right fan set 50\n");
  721. }
  722. }
  723. }
  724. }
  725. /*******************************************************************************
  726. * @函数名称 prvAdc_upload_callback
  727. * @函数说明 温度上报回调
  728. * @输入参数 data:温度数据
  729. tmp_stat:温度计状态
  730. * @输出参数 无
  731. * @返回参数 无
  732. *******************************************************************************/
  733. static void prvAdc_upload_callback(adc_data_s data, bool tmp_stat)
  734. {
  735. if(tmp_stat == true)
  736. {
  737. key_data.charge_temp.left_temperature = data.left_ntc / 10;
  738. key_data.charge_temp.right_temperature = data.right_ntc / 10;
  739. prvUser_server_charge_fan_change();
  740. }
  741. }
  742. /*******************************************************************************
  743. * @函数名称 vUser_server_init
  744. * @函数说明 初始化
  745. * @输入参数 无
  746. * @输出参数 无
  747. * @返回参数 无
  748. *******************************************************************************/
  749. void vUser_server_init(void)
  750. {
  751. vUser_can_set_recv_data_func(prvUser_can_recv_data_callback);
  752. vUser_nfc_set_upload_key_stat_func(prvUser_nfc_upload_card_callback);
  753. vUser_elect_set_upload_stat_func(vUser_elect_upload_stat_callback);
  754. vUser_charge_set_upload_stat_func(vUser_charge_upload_stat_callback);
  755. vDipsw_set_upload_func(prvDipsw_upload_callback);
  756. vElectsw_set_upload_func(prvElectsw_upload_callback);
  757. set_adc_upload_func(prvAdc_upload_callback);
  758. user_server_task_id = TMOS_ProcessEventRegister(user_server_task_process_event);
  759. PRINT("user_server_task_id=%d\n", user_server_task_id);
  760. }