user_sever.c 19 KB

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