user_led.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. #include "user_led.h"
  2. #include "define.h"
  3. #include "stdarg.h"
  4. tmosTaskID led_task_id = INVALID_TASK_ID;
  5. static uint32_t alarm_stat = 0;
  6. static uint16_t led_task_process_event(uint8_t task_id, uint16_t events);
  7. static void led_dev_duty(uint16_t duty);
  8. static void left_light_duty(uint16_t duty);
  9. static void right_light_duty(uint16_t duty);
  10. static void left_pwm_duty(uint16_t duty);
  11. static void right_pwm_duty(uint16_t duty);
  12. static led_work_s led_work[LED_TYPE_MAX] = {
  13. {
  14. .idx = DEV_LED,
  15. .set_duty = led_dev_duty,
  16. .color = RED_LED,
  17. .workStat = LED_WORK_OFF,
  18. .viewStat = LED_VIEW_NULL,
  19. .single_flicker_period = 0,
  20. .flicker_period = 0,
  21. .flicker_onperiod = 0,
  22. .flicker_count = 0,
  23. .duty_on = 95,
  24. .duty_value = 0,
  25. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  26. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  27. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  28. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  29. },
  30. {
  31. .idx = LEFT_LIGHT,
  32. .set_duty = left_light_duty,
  33. .color = RED_LED,
  34. .workStat = LED_WORK_OFF,
  35. .viewStat = LED_VIEW_NULL,
  36. .single_flicker_period = 0,
  37. .flicker_period = 0,
  38. .flicker_onperiod = 0,
  39. .flicker_count = 0,
  40. .duty_on = 95,
  41. .duty_value = 0,
  42. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  43. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  44. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  45. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  46. },
  47. {
  48. .idx = RIGHT_LIGHT,
  49. .set_duty = right_light_duty,
  50. .color = RED_LED,
  51. .workStat = LED_WORK_OFF,
  52. .viewStat = LED_VIEW_NULL,
  53. .single_flicker_period = 0,
  54. .flicker_period = 0,
  55. .flicker_onperiod = 0,
  56. .flicker_count = 0,
  57. .duty_on = 95,
  58. .duty_value = 0,
  59. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  60. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  61. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  62. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  63. },
  64. {
  65. .idx = RIGHT_PWM,
  66. .set_duty = left_pwm_duty,
  67. .color = RED_LED,
  68. .workStat = LED_WORK_OFF,
  69. .viewStat = LED_VIEW_NULL,
  70. .single_flicker_period = 0,
  71. .flicker_period = 0,
  72. .flicker_onperiod = 0,
  73. .flicker_count = 0,
  74. .duty_on = 95,
  75. .duty_value = 0,
  76. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  77. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  78. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  79. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  80. },
  81. {
  82. .idx = RIGHT_PWM,
  83. .set_duty = right_pwm_duty,
  84. .color = RED_LED,
  85. .workStat = LED_WORK_OFF,
  86. .viewStat = LED_VIEW_NULL,
  87. .single_flicker_period = 0,
  88. .flicker_period = 0,
  89. .flicker_onperiod = 0,
  90. .flicker_count = 0,
  91. .duty_on = 95,
  92. .duty_value = 0,
  93. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  94. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  95. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  96. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  97. },
  98. };
  99. /*******************************************************************************
  100. * @函数名称 led_pwm_init
  101. * @函数说明 初始化
  102. * @输入参数 无
  103. * @输出参数 无
  104. * @返回参数 无
  105. *******************************************************************************/
  106. static void led_pwm_init(void)
  107. {
  108. GPIO_InitTypeDef GPIO_InitStructure={0};
  109. TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
  110. TIM_OCInitTypeDef TIM_OutputCompareInitStructure;
  111. TIM_BDTRInitTypeDef BDTR_Structure;
  112. TIM5_TimeBaseInitTypeDef TIM5_BaseInitStructure;
  113. TIM5_OCInitTypeDef TIM5_OutputCompareInitStructure;
  114. TIM5_BDTRInitTypeDef BDTR5_Structure;
  115. LED_GPIO_RCC_ENABLE;
  116. GPIO_InitStructure.GPIO_Pin = DEV_LED_R_PIN;
  117. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  118. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  119. GPIO_Init(DEV_LED_R_GPIO, &GPIO_InitStructure );
  120. GPIO_InitStructure.GPIO_Pin = DEV_LED_G_PIN;
  121. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  122. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  123. GPIO_Init(DEV_LED_G_GPIO, &GPIO_InitStructure );
  124. GPIO_InitStructure.GPIO_Pin = LEFT_LIGHT_PIN;
  125. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  126. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  127. GPIO_Init(LEFT_LIGHT_GPIO, &GPIO_InitStructure );
  128. GPIO_InitStructure.GPIO_Pin = LEFT_PWM_PIN;
  129. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  130. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  131. GPIO_Init(LEFT_PWM_GPIO, &GPIO_InitStructure );
  132. GPIO_InitStructure.GPIO_Pin = RIGHT_LIGHT_PIN;
  133. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  134. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  135. GPIO_Init(RIGHT_LIGHT_GPIO, &GPIO_InitStructure );
  136. GPIO_InitStructure.GPIO_Pin = RIGHT_PWM_PIN;
  137. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  138. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  139. GPIO_Init(RIGHT_PWM_GPIO, &GPIO_InitStructure );
  140. LED_PWM_RCC_ENABLE;
  141. #ifdef LED_REMAPCONFIG_ENABLE
  142. LED_REMAPCONFIG_ENABLE;
  143. #endif
  144. TIM_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
  145. TIM_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
  146. TIM_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
  147. TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  148. TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
  149. TIM_TimeBaseInit(TIM_LIGHT_LED,&TIM_BaseInitStructure);
  150. TIM_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //占空比设置的高电平
  151. TIM_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  152. TIM_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
  153. TIM_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  154. TIM_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  155. TIM_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  156. TIM_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  157. TIM_OutputCompareInitStructure.TIM_Pulse = 0;
  158. BDTR_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  159. BDTR_Structure.TIM_Break = TIM_Break_Disable;
  160. BDTR_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  161. BDTR_Structure.TIM_DeadTime = 0x80;
  162. BDTR_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  163. BDTR_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
  164. BDTR_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
  165. TIM_BDTRConfig(TIM_LIGHT_LED,&BDTR_Structure);
  166. LEFT_LIGHT_INIT(&TIM_OutputCompareInitStructure);
  167. LEFT_PWM_INIT(&TIM_OutputCompareInitStructure);
  168. RIGHT_LIGHT_INIT(&TIM_OutputCompareInitStructure);
  169. RIGHT_PWM_INIT(&TIM_OutputCompareInitStructure);
  170. TIM5_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
  171. TIM5_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
  172. TIM5_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
  173. TIM5_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  174. TIM5_BaseInitStructure.TIM_RepetitionCounter = 0;
  175. TIM5_TimeBaseInit(&TIM5_BaseInitStructure);
  176. TIM5_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //占空比设置的高电平
  177. TIM5_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  178. TIM5_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
  179. TIM5_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  180. TIM5_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  181. TIM5_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  182. TIM5_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  183. TIM5_OutputCompareInitStructure.TIM_Pulse = 0;
  184. BDTR5_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  185. BDTR5_Structure.TIM_Break = TIM_Break_Disable;
  186. BDTR5_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  187. BDTR5_Structure.TIM_DeadTime = 0x80;
  188. BDTR5_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  189. BDTR5_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
  190. BDTR5_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
  191. TIM5_BDTRConfig(&BDTR5_Structure);
  192. DEV_LED_R_INIT(&TIM5_OutputCompareInitStructure);
  193. DEV_LED_G_INIT(&TIM5_OutputCompareInitStructure);
  194. DEV_LED_R_RUN;
  195. DEV_LED_G_RUN;
  196. LEFT_LIGHT_RUN;
  197. LEFT_PWM_RUN;
  198. RIGHT_LIGHT_RUN;
  199. RIGHT_PWM_RUN;
  200. DEV_LED_R_COMPARE(0);
  201. DEV_LED_G_COMPARE(0);
  202. LEFT_LIGHT_COMPARE(0);
  203. LEFT_PWM_COMPARE(0);
  204. RIGHT_LIGHT_COMPARE(0);
  205. RIGHT_PWM_COMPARE(0);
  206. TIM_Cmd(TIM_DEV_LED,ENABLE);
  207. TIM_Cmd(TIM_LIGHT_LED,ENABLE);
  208. }
  209. /*******************************************************************************
  210. * @函数名称 led_dev_duty
  211. * @函数说明 设置设备指示灯PWM百分比
  212. * @输入参数 duty:百分比
  213. * @输出参数 无
  214. * @返回参数 无
  215. *******************************************************************************/
  216. static void led_dev_duty(uint16_t duty)
  217. {
  218. uint16_t value = TIM_LED_PERIOD * duty / 100;
  219. if(led_work[DEV_LED].color == RED_LED)
  220. {
  221. DEV_LED_G_COMPARE(LED_OFF_DUTY);
  222. DEV_LED_R_COMPARE(duty);
  223. }
  224. else if(led_work[DEV_LED].color == GREEN_LED)
  225. {
  226. DEV_LED_R_COMPARE(LED_OFF_DUTY);
  227. DEV_LED_G_COMPARE(duty);
  228. }
  229. else if(led_work[DEV_LED].color == YELLOW_LED)
  230. {
  231. DEV_LED_R_COMPARE(duty);
  232. DEV_LED_G_COMPARE(duty);
  233. }
  234. }
  235. /*******************************************************************************
  236. * @函数名称 left_light_duty
  237. * @函数说明 设置照明灯PWM百分比
  238. * @输入参数 duty:百分比
  239. * @输出参数 无
  240. * @返回参数 无
  241. *******************************************************************************/
  242. static void left_light_duty(uint16_t duty)
  243. {
  244. uint16_t value = TIM_LED_PERIOD * duty / 100;
  245. LEFT_LIGHT_COMPARE(value);
  246. }
  247. /*******************************************************************************
  248. * @函数名称 right_light_duty
  249. * @函数说明 设置照明灯PWM百分比
  250. * @输入参数 duty:百分比
  251. * @输出参数 无
  252. * @返回参数 无
  253. *******************************************************************************/
  254. static void right_light_duty(uint16_t duty)
  255. {
  256. uint16_t value = TIM_LED_PERIOD * duty / 100;
  257. RIGHT_LIGHT_COMPARE(value);
  258. }
  259. /*******************************************************************************
  260. * @函数名称 left_pwm_duty
  261. * @函数说明 设置PWM百分比
  262. * @输入参数 duty:百分比
  263. * @输出参数 无
  264. * @返回参数 无
  265. *******************************************************************************/
  266. static void left_pwm_duty(uint16_t duty)
  267. {
  268. uint16_t value = TIM_LED_PERIOD * duty / 100;
  269. LEFT_PWM_COMPARE(value);
  270. }
  271. /*******************************************************************************
  272. * @函数名称 right_pwm_duty
  273. * @函数说明 设置PWM百分比
  274. * @输入参数 duty:百分比
  275. * @输出参数 无
  276. * @返回参数 无
  277. *******************************************************************************/
  278. static void right_pwm_duty(uint16_t duty)
  279. {
  280. uint16_t value = TIM_LED_PERIOD * duty / 100;
  281. RIGHT_PWM_COMPARE(value);
  282. }
  283. /*******************************************************************************
  284. * @函数名称 led_invert
  285. * @函数说明 LED闪烁处理
  286. * @输入参数 led_work:led灯结构体直针
  287. * @输出参数 无
  288. * @返回参数 无
  289. *******************************************************************************/
  290. static void led_invert(led_work_s *led_work)
  291. {
  292. if(led_work->flicker_count > 0)
  293. {
  294. if(led_work->single_flicker_period == 0)
  295. {
  296. led_work->single_flicker_period = led_work->flicker_period;
  297. led_work->stat = LED_STAT_ON;
  298. led_work->set_duty(LED_ON_DUTY);
  299. }
  300. else if(led_work->single_flicker_period == (led_work->flicker_period - led_work->flicker_onperiod))
  301. {
  302. led_work->single_flicker_period--;
  303. led_work->stat = LED_STAT_OFF;
  304. led_work->set_duty(LED_OFF_DUTY);
  305. led_work->flicker_count--;
  306. }
  307. else{
  308. led_work->single_flicker_period--;
  309. }
  310. }
  311. else{
  312. led_work->workStat = LED_WORK_OFF;
  313. led_work->set_duty(LED_OFF_DUTY);
  314. }
  315. }
  316. /*******************************************************************************
  317. * @函数名称 led_heart
  318. * @函数说明 LED呼吸灯处理
  319. * @输入参数 led_work:led灯结构体直针
  320. * @输出参数 无
  321. * @返回参数 无
  322. *******************************************************************************/
  323. static void led_heart(led_work_s *led_work)
  324. {
  325. if(led_work->flicker_count > 0)
  326. {
  327. uint32_t off_period = led_work->flicker_period - led_work->flicker_onperiod;
  328. if(led_work->single_flicker_period == 0)
  329. {
  330. led_work->single_flicker_period = led_work->flicker_period;
  331. led_work->duty_value = 0;
  332. led_work->single_off_durationTime = led_work->off_durationTime;
  333. led_work->set_duty(led_work->duty_value);
  334. led_work->flicker_count--;
  335. }
  336. else if(led_work->single_flicker_period == off_period)
  337. {
  338. led_work->single_flicker_period--;
  339. led_work->duty_value = led_work->duty_on;
  340. led_work->single_on_durationTime = led_work->on_durationTime;
  341. led_work->set_duty(led_work->duty_value);
  342. }
  343. else{
  344. if(led_work->single_flicker_period > off_period)
  345. {
  346. if(led_work->single_off_durationTime == 0)
  347. {
  348. led_work->single_flicker_period--;
  349. led_work->duty_value = (led_work->flicker_period - led_work->single_flicker_period) * 100 / led_work->flicker_onperiod;
  350. led_work->set_duty(led_work->duty_value);
  351. }
  352. else{
  353. led_work->single_off_durationTime--;
  354. }
  355. }
  356. else{
  357. if(led_work->single_on_durationTime == 0)
  358. {
  359. led_work->single_flicker_period--;
  360. led_work->duty_value = led_work->single_flicker_period * 100 / off_period;
  361. led_work->set_duty(led_work->duty_value);
  362. }
  363. else{
  364. led_work->single_on_durationTime--;
  365. }
  366. }
  367. }
  368. }
  369. else{
  370. led_work->workStat = LED_WORK_OFF;
  371. }
  372. }
  373. /*******************************************************************************
  374. * @函数名称 led_indication
  375. * @函数说明 LED灯处理
  376. * @输入参数 led_work:led灯结构体直针
  377. * @输出参数 无
  378. * @返回参数 无
  379. *******************************************************************************/
  380. static void led_indication(led_work_s *led_work)
  381. {
  382. switch(led_work->workStat)
  383. {
  384. case LED_WORK_OFF:
  385. {
  386. break;
  387. }
  388. case LED_WORK_ON:
  389. {
  390. break;
  391. }
  392. case LED_WORK_INVERT:
  393. {
  394. led_invert(led_work);
  395. break;
  396. }
  397. case LED_WORK_BREATHE:
  398. {
  399. led_heart(led_work);
  400. break;
  401. }
  402. default:break;
  403. }
  404. }
  405. /*******************************************************************************
  406. * @函数名称 led_task
  407. * @函数说明 LED任务
  408. * @输入参数 无
  409. * @输出参数 无
  410. * @返回参数 无
  411. *******************************************************************************/
  412. static void led_task(void)
  413. {
  414. for(int i = 0; i < LED_TYPE_MAX; i++)
  415. {
  416. led_indication(&led_work[i]);
  417. }
  418. }
  419. /*******************************************************************************
  420. * @函数名称 led_task
  421. * @函数说明 task的event处理回调函数,需要在注册task时候,传进去
  422. * @输入参数 task_id:任务ID
  423. events:事件
  424. * @输出参数 无
  425. * @返回参数 无
  426. *******************************************************************************/
  427. static uint16_t led_task_process_event(uint8_t task_id, uint16_t events)
  428. {
  429. //event 处理
  430. if(events & (1 << LED_QUEUE_TIME))
  431. {
  432. led_task();
  433. return (events ^ (1 << LED_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  434. }
  435. return 0;
  436. }
  437. /*******************************************************************************
  438. * @函数名称 set_led_indication
  439. * @函数说明 LED参数设置
  440. * @输入参数 type:LED灯号
  441. color:颜色
  442. workStat:状态
  443. * @输出参数 无
  444. * @返回参数 无
  445. *******************************************************************************/
  446. bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat, ...)
  447. {
  448. bool stat = false;
  449. if(type >= LED_TYPE_MAX)
  450. {
  451. goto exit;
  452. }
  453. if(color > YELLOW_LED)
  454. {
  455. goto exit;
  456. }
  457. if(work_stat == LED_WORK_OFF || work_stat == LED_WORK_ON)
  458. {
  459. led_work[type].color = color;
  460. led_work[type].workStat = work_stat;
  461. led_work[type].set_duty((work_stat == LED_WORK_ON) ? LED_ON_DUTY : LED_OFF_DUTY);
  462. stat = true;
  463. }
  464. else if(work_stat == LED_WORK_INVERT || work_stat == LED_WORK_BREATHE)
  465. {
  466. led_work[type].color = color;
  467. led_work[type].workStat = work_stat;
  468. led_work[type].duty_value = 0;
  469. led_work[type].stat = LED_STAT_OFF;
  470. va_list ap; //保存所有参数
  471. va_start(ap, work_stat); //第一个参数的位置
  472. led_work[type].flicker_period = va_arg(ap, uint32_t)/LED_INTERVAL;
  473. led_work[type].flicker_onperiod = va_arg(ap, uint32_t)/LED_INTERVAL;
  474. led_work[type].flicker_count = va_arg(ap, uint32_t);
  475. if(led_work[type].flicker_count == 0)
  476. {
  477. led_work[type].flicker_count = 0x7FFFFFFF;
  478. }
  479. led_work[type].single_flicker_period = led_work[type].flicker_period;
  480. if(work_stat == LED_WORK_BREATHE)
  481. {
  482. led_work[type].on_durationTime = va_arg(ap, uint32_t) / LED_INTERVAL;
  483. led_work[type].off_durationTime = va_arg(ap, uint32_t) / LED_INTERVAL;
  484. led_work[type].single_on_durationTime = led_work[type].on_durationTime;
  485. led_work[type].single_off_durationTime = led_work[type].off_durationTime;
  486. }
  487. va_end(ap);
  488. stat = true;
  489. }
  490. exit:
  491. return stat;
  492. }
  493. /*******************************************************************************
  494. * @函数名称 led_task_init
  495. * @函数说明 LED任务初始化
  496. * @输入参数 无
  497. * @输出参数 无
  498. * @返回参数 无
  499. *******************************************************************************/
  500. void led_task_init(void)
  501. {
  502. led_task_id = TMOS_ProcessEventRegister(led_task_process_event);
  503. PRINT("led_task_id=%d\n", led_task_id);
  504. led_pwm_init();
  505. }
  506. /*******************************************************************************
  507. * @函数名称 led_task_start
  508. * @函数说明 LED任务开始
  509. * @输入参数 无
  510. * @输出参数 无
  511. * @返回参数 无
  512. *******************************************************************************/
  513. void led_task_start(void)
  514. {
  515. bStatus_t stat = tmos_start_reload_task(led_task_id, (1 << LED_QUEUE_TIME), MS1_TO_SYSTEM_TIME(LED_INTERVAL));
  516. }
  517. /*******************************************************************************
  518. * @函数名称 vUser_led_set_alarm_view
  519. * @函数说明 设置LED故障显示状态
  520. * @输入参数 alarmStat:故障类型
  521. stat:故障状态
  522. * @输出参数 无
  523. * @返回参数 无
  524. *******************************************************************************/
  525. void vUser_led_set_alarm_view(led_all_alarm_stat_e alarmStat, bool stat)
  526. {
  527. if(stat == true)
  528. {
  529. alarm_stat |= (1 << alarmStat);
  530. }
  531. else{
  532. alarm_stat &= ~(1 << alarmStat);
  533. }
  534. if((alarm_stat & (1 << LED_ALL_ALARM_RST)) != 0)
  535. {
  536. set_led_indication(DEV_LED, YELLOW_LED, LED_WORK_INVERT, 1000, 500, 0, 0, 0);
  537. }
  538. else if((alarm_stat & (1 << LED_ALL_ALARM_BLE)) != 0)
  539. {
  540. set_led_indication(DEV_LED, GREEN_LED, LED_WORK_INVERT, 200, 100, 0, 0, 0);
  541. }
  542. else if((alarm_stat & (1 << LED_ALL_ALARM_CAN_IDX_ERROR)) != 0)
  543. {
  544. set_led_indication(DEV_LED, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 300, 300);
  545. }
  546. else if((alarm_stat & (1 << LED_ALL_ALARM_OFFLINE)) != 0)
  547. {
  548. set_led_indication(DEV_LED, YELLOW_LED, LED_WORK_BREATHE, 300, 150, 0, 100, 100);
  549. }
  550. else if(alarm_stat == 0)
  551. {
  552. set_led_indication(DEV_LED, GREEN_LED, LED_WORK_BREATHE, 5000, 2500, 0, 500, 500);
  553. }
  554. }
  555. /*******************************************************************************
  556. * @函数名称 vUser_led_set_alarm_view
  557. * @函数说明 设置LED故障显示状态
  558. * @输入参数 idx:灯下标
  559. duty:亮度
  560. * @输出参数 无
  561. * @返回参数 无
  562. *******************************************************************************/
  563. void vUser_led_set_bright(uint8_t idx, uint16_t duty)
  564. {
  565. uint16_t value = (duty > LED_ON_DUTY)?LED_ON_DUTY:duty;
  566. switch(idx)
  567. {
  568. case LEFT_LIGHT:left_light_duty(value);break;
  569. case RIGHT_LIGHT:right_light_duty(value);break;
  570. case LEFT_PWM:left_pwm_duty(value);break;
  571. case RIGHT_PWM:right_pwm_duty(value);break;
  572. default:break;
  573. }
  574. }