user_led.c 21 KB

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