user_ws2812b.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. #include "user_ws2812b.h"
  2. #include "user_config.h"
  3. tmosTaskID user_ws2812b_task_id = INVALID_TASK_ID;
  4. static uint16_t user_ws2812b_task_process_event(uint8_t task_id, uint16_t events);
  5. static void vUser_ws2812b_left_wrRGB(uint8_t r, uint8_t g, uint8_t b);
  6. static void vUser_ws2812b_right_wrRGB(uint8_t r, uint8_t g, uint8_t b);
  7. static user_ws2812b_work_s user_ws2812b_work[2] = {
  8. {
  9. .idx = LEFT_IDX,
  10. .txStat = false,
  11. .alarm_stat = 0,
  12. .change = false,
  13. .bright_stat = false, //灯是否亮
  14. .flicker_type = WS2812B_FLICKER_NULL,
  15. .flicker_delaytime = 0, //闪烁间隔时间
  16. .breath_bright = 0, //呼吸灯亮度
  17. .delaytime = 0,
  18. .count = 0,
  19. .tail_step = 0,
  20. .tail_idx = 0,
  21. .tail_dir = false,
  22. .rgbValue = NULL,
  23. .rValue = 0,
  24. .gValue = 0,
  25. .bValue = 0,
  26. },
  27. {
  28. .idx = RIGHT_IDX,
  29. .txStat = false,
  30. .alarm_stat = 0,
  31. .change = false,
  32. .bright_stat = false, //灯是否亮
  33. .flicker_type = WS2812B_FLICKER_NULL,
  34. .flicker_delaytime = 0, //闪烁间隔时间
  35. .breath_bright = 0, //呼吸灯亮度
  36. .delaytime = 0,
  37. .count = 0,
  38. .tail_step = 0,
  39. .tail_idx = 0,
  40. .tail_dir = false,
  41. .rgbValue = NULL,
  42. .rValue = 0,
  43. .gValue = 0,
  44. .bValue = 0,
  45. },
  46. };
  47. /*******************************************************************************
  48. * @函数名称 vUser_ws2812b_set_wrByte
  49. * @函数说明 转换ws2812b颜色数据
  50. * @输入参数 byte:字节
  51. color:spi发送数据属猪
  52. * @输出参数 无
  53. * @返回参数 无
  54. *******************************************************************************/
  55. static void vUser_ws2812b_set_wrByte(uint8_t byte, uint8_t *color)
  56. {
  57. for(uint8_t i = 0; i < 8; i++)
  58. {
  59. if((byte & 0x80) == 0x80)
  60. {
  61. *color++ = WS2812B_HIGH;
  62. }
  63. else
  64. {
  65. *color++ = WS2812B_LOW;
  66. }
  67. byte <<= 1;
  68. }
  69. }
  70. /*******************************************************************************
  71. * @函数名称 prvUser_ws2812b_set_led_bright
  72. * @函数说明 设置ws2812b点亮状态
  73. * @输入参数 ws2812b:变量指针
  74. * @输出参数 无
  75. * @返回参数 无
  76. *******************************************************************************/
  77. static void prvUser_ws2812b_set_led_bright(user_ws2812b_work_s *ws2812b)
  78. {
  79. for(uint8_t i = 0; i < ws2812b->count; i++)
  80. {
  81. vUser_ws2812b_set_wrByte(ws2812b->gValue, &ws2812b->rgbValue[i * 24]);
  82. vUser_ws2812b_set_wrByte(ws2812b->rValue, &ws2812b->rgbValue[i * 24 + 8]);
  83. vUser_ws2812b_set_wrByte(ws2812b->bValue, &ws2812b->rgbValue[i * 24 + 16]);
  84. }
  85. }
  86. /*******************************************************************************
  87. * @函数名称 prvUser_ws2812b_set_led_dark
  88. * @函数说明 设置ws2812b暗状态
  89. * @输入参数 ws2812b:变量指针
  90. * @输出参数 无
  91. * @返回参数 无
  92. *******************************************************************************/
  93. static void prvUser_ws2812b_set_led_dark(user_ws2812b_work_s *ws2812b)
  94. {
  95. for(uint8_t i = 0; i < ws2812b->count; i++)
  96. {
  97. vUser_ws2812b_set_wrByte(0, &ws2812b->rgbValue[i * 24]);
  98. vUser_ws2812b_set_wrByte(0, &ws2812b->rgbValue[i * 24 + 8]);
  99. vUser_ws2812b_set_wrByte(0, &ws2812b->rgbValue[i * 24 + 16]);
  100. }
  101. }
  102. /*******************************************************************************
  103. * @函数名称 vUser_ws2812b_set_normal_stat
  104. * @函数说明 设置ws2812b普通状态
  105. * @输入参数 idx:左边或者右边
  106. * @输出参数 无
  107. * @返回参数 无
  108. *******************************************************************************/
  109. void vUser_ws2812b_set_normal_stat(uint8_t idx)
  110. {
  111. user_ws2812b_work[idx].rValue = (WS2812B_NORMAL_RGB >> 16) & 0xFF;
  112. user_ws2812b_work[idx].gValue = (WS2812B_NORMAL_RGB >> 8) & 0xFF;
  113. user_ws2812b_work[idx].bValue = WS2812B_NORMAL_RGB & 0xFF;
  114. user_ws2812b_work[idx].tail_idx = 0;
  115. user_ws2812b_work[idx].tail_step = user_ws2812b_work[idx].count / 3;
  116. user_ws2812b_work[idx].tail_dir = false,
  117. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  118. user_ws2812b_work[idx].flicker_type = WS2812B_FLICKER_NULL;
  119. user_ws2812b_work[idx].change = true;
  120. }
  121. /*******************************************************************************
  122. * @函数名称 vUser_ws2812b_set_ble_connect_stat
  123. * @函数说明 设置蓝牙连接状态
  124. * @输入参数 idx:左边或者右边
  125. * @输出参数 无
  126. * @返回参数 无
  127. *******************************************************************************/
  128. void vUser_ws2812b_set_ble_connect_stat(uint8_t idx)
  129. {
  130. user_ws2812b_work[idx].rValue = (WS2812B_BLE_RGB >> 16) & 0xFF;
  131. user_ws2812b_work[idx].gValue = (WS2812B_BLE_RGB >> 8) & 0xFF;
  132. user_ws2812b_work[idx].bValue = WS2812B_BLE_RGB & 0xFF;
  133. user_ws2812b_work[idx].tail_idx = 0;
  134. user_ws2812b_work[idx].tail_step = user_ws2812b_work[idx].count / 3;
  135. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  136. user_ws2812b_work[idx].flicker_delaytime = BREATH_SPEED_DEFAULT;
  137. user_ws2812b_work[idx].breath_bright = 0;
  138. user_ws2812b_work[idx].bright_stat = true;
  139. user_ws2812b_work[idx].flicker_type = WS2812B_FLICKER_NULL;
  140. }
  141. /*******************************************************************************
  142. * @函数名称 vUser_ws2812b_set_can_id_alarm_stat
  143. * @函数说明 设置ws2812b CAN id错误状态
  144. * @输入参数 idx:左边或者右边
  145. * @输出参数 无
  146. * @返回参数 无
  147. *******************************************************************************/
  148. void vUser_ws2812b_set_can_id_alarm_stat(uint8_t idx)
  149. {
  150. user_ws2812b_work[idx].rValue = (WS2812B_CANID_ERROR_RGB >> 16) & 0xFF;
  151. user_ws2812b_work[idx].gValue = (WS2812B_CANID_ERROR_RGB >> 8) & 0xFF;
  152. user_ws2812b_work[idx].bValue = WS2812B_CANID_ERROR_RGB & 0xFF;
  153. user_ws2812b_work[idx].tail_idx = 0;
  154. user_ws2812b_work[idx].tail_step = user_ws2812b_work[idx].count / 3;
  155. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  156. user_ws2812b_work[idx].flicker_delaytime = ID_ERROR_FLICKER_DEFAULT;
  157. user_ws2812b_work[idx].flicker_type = WS2812B_FLICKER_NULL;
  158. }
  159. /*******************************************************************************
  160. * @函数名称 vUser_ws2812b_set_offline_alarm_stat
  161. * @函数说明 设置ws2812b CAN 离线错误状态
  162. * @输入参数 idx:左边或者右边
  163. * @输出参数 无
  164. * @返回参数 无
  165. *******************************************************************************/
  166. void vUser_ws2812b_set_offline_alarm_stat(uint8_t idx)
  167. {
  168. user_ws2812b_work[idx].rValue = (WS2812B_OFFLINE_RGB >> 16) & 0xFF;
  169. user_ws2812b_work[idx].gValue = (WS2812B_OFFLINE_RGB >> 8) & 0xFF;
  170. user_ws2812b_work[idx].bValue = WS2812B_OFFLINE_RGB & 0xFF;
  171. user_ws2812b_work[idx].tail_idx = 0;
  172. user_ws2812b_work[idx].tail_step = user_ws2812b_work[idx].count / 3;
  173. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  174. user_ws2812b_work[idx].flicker_delaytime = OFFLINE_FLICKER_DEFAULT;
  175. user_ws2812b_work[idx].flicker_type = WS2812B_FLICKER_NULL;
  176. }
  177. /*******************************************************************************
  178. * @函数名称 vUser_ws2812b_set_alarm_view
  179. * @函数说明 设置ws2812b故障显示状态
  180. * @输入参数 alarmStat:故障类型
  181. stat:故障状态
  182. * @输出参数 无
  183. * @返回参数 无
  184. *******************************************************************************/
  185. void vUser_ws2812b_set_alarm_view(uint8_t idx, ws2812b_all_alarm_stat_e alarmStat, bool stat)
  186. {
  187. if(stat == true)
  188. {
  189. user_ws2812b_work[idx].alarm_stat |= (1 << alarmStat);
  190. }
  191. else{
  192. user_ws2812b_work[idx].alarm_stat &= ~(1 << alarmStat);
  193. }
  194. if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_LOCK)) != 0)
  195. {
  196. }
  197. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_RST)) != 0)
  198. {
  199. }
  200. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_BLE)) != 0)
  201. {
  202. vUser_ws2812b_set_ble_connect_stat(idx);
  203. }
  204. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_CAN_IDX_ERROR)) != 0)
  205. {
  206. vUser_ws2812b_set_can_id_alarm_stat(idx);
  207. }
  208. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_OFFLINE)) != 0)
  209. {
  210. vUser_ws2812b_set_offline_alarm_stat(idx);
  211. }
  212. else if(user_ws2812b_work[idx].alarm_stat == 0)
  213. {
  214. vUser_ws2812b_set_normal_stat(idx);
  215. }
  216. }
  217. /*******************************************************************************
  218. * @函数名称 prvUser_ws2812b_set_tail
  219. * @函数说明 设置ws2812b 拖尾效果
  220. * @输入参数 idx:左边或者右边
  221. * @输出参数 无
  222. * @返回参数 无
  223. *******************************************************************************/
  224. static void prvUser_ws2812b_set_tail(uint8_t idx)
  225. {
  226. prvUser_ws2812b_set_led_dark(&user_ws2812b_work[idx]);
  227. for(uint8_t i = 0; i < user_ws2812b_work[idx].tail_step; i++)
  228. {
  229. // 计算当前拖尾段的相对位置,越靠前越亮
  230. uint32_t rev = user_ws2812b_work[idx].tail_step - 1 - i;
  231. // 线性亮度值(0~255),头部最亮,尾部最暗
  232. uint8_t lin = 0xFF - (rev * 0xFF / user_ws2812b_work[idx].tail_step);
  233. // 应用二次衰减算法(非线性),亮度更柔和自然
  234. uint8_t bri = (lin * lin) >> 8;
  235. // 设置第 i 颗灯的颜色,按亮度比例缩放
  236. if(user_ws2812b_work[idx].tail_dir == false) //正向
  237. {
  238. if((user_ws2812b_work[idx].tail_idx + i) >= user_ws2812b_work[idx].tail_step)
  239. {
  240. uint16_t wrIdx = user_ws2812b_work[idx].tail_idx - user_ws2812b_work[idx].tail_step + i;
  241. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].gValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24]);
  242. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].rValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24 + 8]);
  243. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].bValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24 + 16]);
  244. }
  245. }
  246. else{
  247. if(user_ws2812b_work[idx].tail_idx >= user_ws2812b_work[idx].tail_step - 1)
  248. {
  249. if((user_ws2812b_work[idx].tail_idx - i) < user_ws2812b_work[idx].count)
  250. {
  251. uint16_t wrIdx = user_ws2812b_work[idx].tail_idx - i;
  252. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].gValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24]);
  253. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].rValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24 + 8]);
  254. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].bValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24 + 16]);
  255. }
  256. }
  257. else{
  258. if((user_ws2812b_work[idx].tail_idx - i) >= 0)
  259. {
  260. uint16_t wrIdx = user_ws2812b_work[idx].tail_idx - i;
  261. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].gValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24]);
  262. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].rValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24 + 8]);
  263. vUser_ws2812b_set_wrByte((user_ws2812b_work[idx].bValue * bri) >> 8, &user_ws2812b_work[idx].rgbValue[wrIdx * 24 + 16]);
  264. }
  265. }
  266. }
  267. }
  268. }
  269. /*******************************************************************************
  270. * @函数名称 prvUser_ws2812b_set_flowing_water
  271. * @函数说明 设置ws2812b 流水灯效果
  272. * @输入参数 idx:左边或者右边
  273. * @输出参数 无
  274. * @返回参数 无
  275. *******************************************************************************/
  276. static void prvUser_ws2812b_set_flowing_water(uint8_t idx)
  277. {
  278. if(user_ws2812b_work[idx].delaytime > 0)
  279. {
  280. user_ws2812b_work[idx].delaytime--;
  281. }
  282. else{
  283. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  284. prvUser_ws2812b_set_tail(idx);
  285. if(user_ws2812b_work[idx].tail_dir == false)
  286. {
  287. if(user_ws2812b_work[idx].tail_idx >= (user_ws2812b_work[idx].count + user_ws2812b_work[idx].tail_step) - 1)
  288. {
  289. user_ws2812b_work[idx].tail_dir = true;
  290. }
  291. else{
  292. user_ws2812b_work[idx].tail_idx += 1;
  293. }
  294. }
  295. else{
  296. if(user_ws2812b_work[idx].tail_idx <= 0)
  297. {
  298. user_ws2812b_work[idx].tail_dir = false;
  299. }
  300. else{
  301. user_ws2812b_work[idx].tail_idx -= 1;
  302. }
  303. }
  304. }
  305. }
  306. /*******************************************************************************
  307. * @函数名称 prvUser_ws2812b_set_flick
  308. * @函数说明 设置ws2812b 闪烁效果
  309. * @输入参数 idx:左边或者右边
  310. * @输出参数 无
  311. * @返回参数 无
  312. *******************************************************************************/
  313. static void prvUser_ws2812b_set_flick(uint8_t idx)
  314. {
  315. if(user_ws2812b_work[idx].delaytime > 0)
  316. {
  317. user_ws2812b_work[idx].delaytime--;
  318. }
  319. else{
  320. user_ws2812b_work[idx].delaytime = user_ws2812b_work[idx].flicker_delaytime;
  321. if(user_ws2812b_work[idx].bright_stat == false)
  322. {
  323. user_ws2812b_work[idx].bright_stat = true;
  324. prvUser_ws2812b_set_led_bright(&user_ws2812b_work[idx]);
  325. }
  326. else{
  327. user_ws2812b_work[idx].bright_stat = false;
  328. prvUser_ws2812b_set_led_dark(&user_ws2812b_work[idx]);
  329. }
  330. }
  331. }
  332. /*******************************************************************************
  333. * @函数名称 prvUser_ws2812b_set_breath
  334. * @函数说明 设置ws2812b 呼吸灯效果
  335. * @输入参数 idx:左边或者右边
  336. * @输出参数 无
  337. * @返回参数 无
  338. *******************************************************************************/
  339. static void prvUser_ws2812b_set_breath(uint8_t idx)
  340. {
  341. if(user_ws2812b_work[idx].delaytime > 0)
  342. {
  343. user_ws2812b_work[idx].delaytime--;
  344. }
  345. else{
  346. user_ws2812b_work[idx].delaytime = user_ws2812b_work[idx].flicker_delaytime / 100;
  347. if(user_ws2812b_work[idx].bright_stat == false)
  348. {
  349. if(user_ws2812b_work[idx].breath_bright > 10)
  350. {
  351. user_ws2812b_work[idx].breath_bright -= 2;
  352. }
  353. else{
  354. user_ws2812b_work[idx].bright_stat = true;
  355. }
  356. }
  357. else{
  358. if(user_ws2812b_work[idx].breath_bright < 250)
  359. {
  360. user_ws2812b_work[idx].breath_bright += 2;
  361. }
  362. else{
  363. user_ws2812b_work[idx].bright_stat = false;
  364. }
  365. }
  366. // 应用二次衰减算法(非线性),亮度更柔和自然
  367. uint8_t bri = (user_ws2812b_work[idx].breath_bright * user_ws2812b_work[idx].breath_bright) >> 8;
  368. // 应用亮度到颜色
  369. uint8_t out_r = ((uint16_t)user_ws2812b_work[idx].rValue * (uint16_t)bri) >> 8;
  370. uint8_t out_g = ((uint16_t)user_ws2812b_work[idx].gValue * (uint16_t)bri) >> 8;
  371. uint8_t out_b = ((uint16_t)user_ws2812b_work[idx].bValue * (uint16_t)bri) >> 8;
  372. for(uint8_t i = 0; i < user_ws2812b_work[idx].count; i++)
  373. {
  374. vUser_ws2812b_set_wrByte(out_g, &user_ws2812b_work[idx].rgbValue[i * 24]);
  375. vUser_ws2812b_set_wrByte(out_r, &user_ws2812b_work[idx].rgbValue[i * 24 + 8]);
  376. vUser_ws2812b_set_wrByte(out_b, &user_ws2812b_work[idx].rgbValue[i * 24 + 16]);
  377. }
  378. }
  379. }
  380. /*******************************************************************************
  381. * @函数名称 prvUser_ws2812b_txData
  382. * @函数说明 发送ws2812b数据
  383. * @输入参数 idx:左边或者右边
  384. * @输出参数 无
  385. * @返回参数 无
  386. *******************************************************************************/
  387. static void prvUser_ws2812b_txData(uint8_t idx)
  388. {
  389. bUser_spi_WriteByte(idx, user_ws2812b_work[idx].rgbValue, user_ws2812b_work[idx].count * 3 * 8);
  390. }
  391. /*******************************************************************************
  392. * @函数名称 prvUser_ws2812b_set_ble_connect_check
  393. * @函数说明 设置ws2812b 蓝牙连接状态
  394. * @输入参数 idx:左边或者右边
  395. * @输出参数 无
  396. * @返回参数 无
  397. *******************************************************************************/
  398. static void prvUser_ws2812b_set_ble_connect_check(uint8_t idx)
  399. {
  400. prvUser_ws2812b_set_breath(idx);
  401. prvUser_ws2812b_txData(idx);
  402. }
  403. /*******************************************************************************
  404. * @函数名称 vUser_ws2812b_set_can_id_alarm_check
  405. * @函数说明 设置ws2812b CAN id错误状态
  406. * @输入参数 idx:左边或者右边
  407. * @输出参数 无
  408. * @返回参数 无
  409. *******************************************************************************/
  410. static void prvUser_ws2812b_set_can_id_alarm_check(uint8_t idx)
  411. {
  412. prvUser_ws2812b_set_flick(idx);
  413. prvUser_ws2812b_txData(idx);
  414. }
  415. /*******************************************************************************
  416. * @函数名称 prvUser_ws2812b_set_offline_alarm_check
  417. * @函数说明 设置ws2812b CAN 离线错误状态
  418. * @输入参数 idx:左边或者右边
  419. * @输出参数 无
  420. * @返回参数 无
  421. *******************************************************************************/
  422. static void prvUser_ws2812b_set_offline_alarm_check(uint8_t idx)
  423. {
  424. prvUser_ws2812b_set_flick(idx);
  425. prvUser_ws2812b_txData(idx);
  426. }
  427. /*******************************************************************************
  428. * @函数名称 vUser_ws2812b_normal_check
  429. * @函数说明 ws2812b闪正常状态处理
  430. * @输入参数 无
  431. * @输出参数 无
  432. * @返回参数 无
  433. *******************************************************************************/
  434. static void prvUser_ws2812b_normal_check(uint8_t idx)
  435. {
  436. // prvUser_ws2812b_set_flowing_water(idx);
  437. // prvUser_ws2812b_txData(idx);
  438. if(user_ws2812b_work[idx].change == true)
  439. {
  440. user_ws2812b_work[idx].change = false;
  441. prvUser_ws2812b_set_led_bright(&user_ws2812b_work[idx]);
  442. prvUser_ws2812b_txData(idx);
  443. }
  444. }
  445. /*******************************************************************************
  446. * @函数名称 vUser_ws2812b_normal_check
  447. * @函数说明 ws2812b闪正常状态处理
  448. * @输入参数 无
  449. * @输出参数 无
  450. * @返回参数 无
  451. *******************************************************************************/
  452. static void prvUser_ws2812b_lock_check(uint8_t idx)
  453. {
  454. switch(user_ws2812b_work[idx].flicker_type)
  455. {
  456. case WS2812B_DARK:{
  457. if(user_ws2812b_work[idx].change == true)
  458. {
  459. user_ws2812b_work[idx].change = false;
  460. prvUser_ws2812b_set_led_dark(&user_ws2812b_work[idx]);
  461. prvUser_ws2812b_txData(idx);
  462. }
  463. }break;
  464. case WS2812B_BRIGHT:{
  465. if(user_ws2812b_work[idx].change == true)
  466. {
  467. user_ws2812b_work[idx].change = false;
  468. prvUser_ws2812b_set_led_bright(&user_ws2812b_work[idx]);
  469. prvUser_ws2812b_txData(idx);
  470. }
  471. }break;
  472. case WS2812B_FLICKER_ON:{
  473. prvUser_ws2812b_set_flick(idx);
  474. prvUser_ws2812b_txData(idx);
  475. }break;
  476. case WS2812B_BREATH_ON:{
  477. prvUser_ws2812b_set_breath(idx);
  478. prvUser_ws2812b_txData(idx);
  479. }break;
  480. case WS2812B_TAIL_ON:{
  481. prvUser_ws2812b_set_flowing_water(idx);
  482. prvUser_ws2812b_txData(idx);
  483. }break;
  484. default:break;
  485. }
  486. }
  487. /*******************************************************************************
  488. * @函数名称 vUser_ws2812b_left_time_task
  489. * @函数说明 ws2812b时间循环任务
  490. * @输入参数 无
  491. * @输出参数 无
  492. * @返回参数 无
  493. *******************************************************************************/
  494. static void vUser_ws2812b_check(uint8_t idx)
  495. {
  496. if(user_ws2812b_work[idx].txStat == false)
  497. {
  498. if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_LOCK)) != 0)
  499. {
  500. prvUser_ws2812b_lock_check(idx);
  501. }
  502. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_RST)) != 0)
  503. {
  504. }
  505. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_BLE)) != 0)
  506. {
  507. prvUser_ws2812b_set_ble_connect_check(idx);
  508. }
  509. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_CAN_IDX_ERROR)) != 0)
  510. {
  511. prvUser_ws2812b_set_can_id_alarm_check(idx);
  512. }
  513. else if((user_ws2812b_work[idx].alarm_stat & (1 << WS2812B_ALL_ALARM_OFFLINE)) != 0)
  514. {
  515. prvUser_ws2812b_set_offline_alarm_check(idx);
  516. }
  517. else if(user_ws2812b_work[idx].alarm_stat == 0)
  518. {
  519. prvUser_ws2812b_normal_check(idx);
  520. }
  521. }
  522. }
  523. /*******************************************************************************
  524. * @函数名称 vUser_ws2812b_time_task
  525. * @函数说明 ws2812b时间循环任务
  526. * @输入参数 无
  527. * @输出参数 无
  528. * @返回参数 无
  529. *******************************************************************************/
  530. static void vUser_ws2812b_time_task(void)
  531. {
  532. vUser_ws2812b_check(LEFT_IDX);
  533. vUser_ws2812b_check(RIGHT_IDX);
  534. }
  535. /*******************************************************************************
  536. * @函数名称 user_charge_task_process_event
  537. * @函数说明 task的event处理回调函数,需要在注册task时候,传进去
  538. * @输入参数 task_id:任务ID
  539. events:事件
  540. * @输出参数 无
  541. * @返回参数 无
  542. *******************************************************************************/
  543. static uint16_t user_ws2812b_task_process_event(uint8_t task_id, uint16_t events)
  544. {
  545. //event 处理
  546. if(events & (1 << WS2812B_QUEUE_TIME))
  547. {
  548. vUser_ws2812b_time_task();
  549. return (events ^ (1 << WS2812B_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  550. }
  551. if(events & (1 << WS2812B_QUEUE_INT))
  552. {
  553. return (events ^ (1 << WS2812B_QUEUE_INT)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  554. }
  555. return 0;
  556. }
  557. /*******************************************************************************
  558. * @函数名称 vUser_ws2812b_task_start
  559. * @函数说明 任务开始
  560. * @输入参数 无
  561. * @输出参数 无
  562. * @返回参数 无
  563. *******************************************************************************/
  564. void vUser_ws2812b_task_start(void)
  565. {
  566. bStatus_t stat = tmos_start_reload_task(user_ws2812b_task_id, (1 << WS2812B_QUEUE_TIME), MS1_TO_SYSTEM_TIME(USER_WS2812B_INTERVAL));
  567. }
  568. /*******************************************************************************
  569. * @函数名称 vUser_ws2812b_init
  570. * @函数说明 初始化
  571. * @输入参数 无
  572. * @输出参数 无
  573. * @返回参数 无
  574. *******************************************************************************/
  575. void vUser_ws2812b_init(void)
  576. {
  577. user_ws2812b_work[LEFT_IDX].count = (user_config_param.left_ws2812b_count > WS2812B_MAX_COUNT)?WS2812B_MAX_COUNT:user_config_param.left_ws2812b_count;
  578. user_ws2812b_work[RIGHT_IDX].count = (user_config_param.right_ws2812b_count > WS2812B_MAX_COUNT)?WS2812B_MAX_COUNT:user_config_param.right_ws2812b_count;
  579. user_ws2812b_work[LEFT_IDX].rgbValue = (uint8_t *)malloc(user_ws2812b_work[LEFT_IDX].count * 3 * 8);
  580. user_ws2812b_work[RIGHT_IDX].rgbValue = (uint8_t *)malloc(user_ws2812b_work[RIGHT_IDX].count * 3 * 8);
  581. prvUser_ws2812b_set_led_dark(&user_ws2812b_work[LEFT_IDX]);
  582. prvUser_ws2812b_set_led_dark(&user_ws2812b_work[RIGHT_IDX]);
  583. user_spi_Init();
  584. user_spi_01_dma_init(user_ws2812b_work[LEFT_IDX].rgbValue, user_ws2812b_work[LEFT_IDX].count * 3 * 8);
  585. user_spi_02_dma_init(user_ws2812b_work[RIGHT_IDX].rgbValue, user_ws2812b_work[LEFT_IDX].count * 3 * 8);
  586. user_ws2812b_task_id = TMOS_ProcessEventRegister(user_ws2812b_task_process_event);
  587. PRINT("user_ws2812b_task_id=%d\n", user_ws2812b_task_id);
  588. }
  589. /*******************************************************************************
  590. * @函数名称 vUser_ws2812b_set_tx_stat
  591. * @函数说明 设置数据发射状态
  592. * @输入参数 idx:左边或者右边
  593. stat:状态
  594. * @输出参数 无
  595. * @返回参数 无
  596. *******************************************************************************/
  597. void vUser_ws2812b_set_tx_stat(uint8_t idx, bool stat)
  598. {
  599. user_ws2812b_work[idx].txStat = stat;
  600. }
  601. /*******************************************************************************
  602. * @函数名称 vUser_ws2812b_set_tx_stat
  603. * @函数说明 设置数据发射状态
  604. * @输入参数 idx:左边或者右边
  605. stat:锁定状态
  606. type:灯状态
  607. timeValue:时间
  608. * @输出参数 无
  609. * @返回参数 无
  610. *******************************************************************************/
  611. void vUser_ws2812b_set_lock_stat(uint8_t idx, bool lock, ws2812b_flicker_type_e type, uint8_t r, uint8_t g, uint8_t b, uint32_t timeValue)
  612. {
  613. PRINT("idx=%d,lock=%s,type=%d,r=%02X,g=%02X,b=%02X,time=%dms\n",idx, (lock == true)?"true":"false",type - 1,r,g,b,timeValue);
  614. if(lock == true)
  615. {
  616. vUser_ws2812b_set_alarm_view(idx, WS2812B_ALL_ALARM_LOCK, true);
  617. user_ws2812b_work[idx].rValue = r;
  618. user_ws2812b_work[idx].gValue = g;
  619. user_ws2812b_work[idx].bValue = b;
  620. user_ws2812b_work[idx].flicker_type = type;
  621. switch(user_ws2812b_work[idx].flicker_type)
  622. {
  623. case WS2812B_DARK:{
  624. user_ws2812b_work[idx].change = true;
  625. }break;
  626. case WS2812B_BRIGHT:{
  627. user_ws2812b_work[idx].change = true;
  628. }break;
  629. case WS2812B_FLICKER_ON:{
  630. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  631. user_ws2812b_work[idx].flicker_delaytime = timeValue / USER_WS2812B_INTERVAL;
  632. }break;
  633. case WS2812B_BREATH_ON:{
  634. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  635. user_ws2812b_work[idx].flicker_delaytime = timeValue / USER_WS2812B_INTERVAL;
  636. }break;
  637. case WS2812B_TAIL_ON:{
  638. user_ws2812b_work[idx].tail_step = user_ws2812b_work[idx].count / 3;
  639. user_ws2812b_work[idx].delaytime = FLICKER_DELAYTIME_DEFAULT;
  640. user_ws2812b_work[idx].flicker_delaytime = timeValue / USER_WS2812B_INTERVAL;
  641. }break;
  642. default:break;
  643. }
  644. }
  645. else{
  646. vUser_ws2812b_set_alarm_view(idx, WS2812B_ALL_ALARM_LOCK, false);
  647. }
  648. }