user_led.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  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 led_01_duty(uint16_t duty);
  9. static void led_02_duty(uint16_t duty);
  10. static void led_03_duty(uint16_t duty);
  11. static void led_04_duty(uint16_t duty);
  12. static void led_05_duty(uint16_t duty);
  13. static led_work_s led_work[LED_TYPE_MAX] = {
  14. {
  15. .idx = DEV_LED,
  16. .set_duty = led_dev_duty,
  17. .color = RED_LED,
  18. .workStat = LED_WORK_OFF,
  19. .viewStat = LED_VIEW_NULL,
  20. .single_flicker_period = 0,
  21. .flicker_period = 0,
  22. .flicker_onperiod = 0,
  23. .flicker_count = 0,
  24. .duty_on = 95,
  25. .duty_value = 0,
  26. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  27. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  28. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  29. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  30. },
  31. {
  32. .idx = LED_01,
  33. .set_duty = led_01_duty,
  34. .color = RED_LED,
  35. .workStat = LED_WORK_OFF,
  36. .viewStat = LED_VIEW_NULL,
  37. .single_flicker_period = 0,
  38. .flicker_period = 0,
  39. .flicker_onperiod = 0,
  40. .flicker_count = 0,
  41. .duty_on = 95,
  42. .duty_value = 0,
  43. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  44. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  45. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  46. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  47. },
  48. {
  49. .idx = LED_02,
  50. .set_duty = led_02_duty,
  51. .color = RED_LED,
  52. .workStat = LED_WORK_OFF,
  53. .viewStat = LED_VIEW_NULL,
  54. .single_flicker_period = 0,
  55. .flicker_period = 0,
  56. .flicker_onperiod = 0,
  57. .flicker_count = 0,
  58. .duty_on = 95,
  59. .duty_value = 0,
  60. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  61. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  62. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  63. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  64. },
  65. {
  66. .idx = LED_03,
  67. .set_duty = led_03_duty,
  68. .color = RED_LED,
  69. .workStat = LED_WORK_OFF,
  70. .viewStat = LED_VIEW_NULL,
  71. .single_flicker_period = 0,
  72. .flicker_period = 0,
  73. .flicker_onperiod = 0,
  74. .flicker_count = 0,
  75. .duty_on = 95,
  76. .duty_value = 0,
  77. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  78. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  79. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  80. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  81. },
  82. {
  83. .idx = LED_04,
  84. .set_duty = led_04_duty,
  85. .color = RED_LED,
  86. .workStat = LED_WORK_OFF,
  87. .viewStat = LED_VIEW_NULL,
  88. .single_flicker_period = 0,
  89. .flicker_period = 0,
  90. .flicker_onperiod = 0,
  91. .flicker_count = 0,
  92. .duty_on = 95,
  93. .duty_value = 0,
  94. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  95. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  96. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  97. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  98. },
  99. {
  100. .idx = LED_05,
  101. .set_duty = led_05_duty,
  102. .color = RED_LED,
  103. .workStat = LED_WORK_OFF,
  104. .viewStat = LED_VIEW_NULL,
  105. .single_flicker_period = 0,
  106. .flicker_period = 0,
  107. .flicker_onperiod = 0,
  108. .flicker_count = 0,
  109. .duty_on = 95,
  110. .duty_value = 0,
  111. .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  112. .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  113. .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  114. .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
  115. },
  116. };
  117. /*******************************************************************************
  118. * @函数名称 led_pwm_init
  119. * @函数说明 初始化
  120. * @输入参数 无
  121. * @输出参数 无
  122. * @返回参数 无
  123. *******************************************************************************/
  124. static void led_pwm_init(void)
  125. {
  126. GPIO_InitTypeDef GPIO_InitStructure={0};
  127. TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
  128. TIM_OCInitTypeDef TIM_OutputCompareInitStructure;
  129. TIM_BDTRInitTypeDef BDTR_Structure;
  130. TIM5_TimeBaseInitTypeDef TIM5_BaseInitStructure;
  131. TIM5_OCInitTypeDef TIM5_OutputCompareInitStructure;
  132. TIM5_BDTRInitTypeDef BDTR5_Structure;
  133. LED_GPIO_RCC_ENABLE;
  134. GPIO_InitStructure.GPIO_Pin = DEV_LED_PIN;
  135. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  136. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  137. GPIO_Init(DEV_LED_GPIO, &GPIO_InitStructure );
  138. GPIO_InitStructure.GPIO_Pin = LED_01_R_PIN;
  139. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  140. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  141. GPIO_Init(LED_01_R_GPIO, &GPIO_InitStructure );
  142. GPIO_InitStructure.GPIO_Pin = LED_01_G_PIN;
  143. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  144. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  145. GPIO_Init(LED_01_G_GPIO, &GPIO_InitStructure );
  146. GPIO_InitStructure.GPIO_Pin = LED_02_R_PIN;
  147. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  148. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  149. GPIO_Init(LED_02_R_GPIO, &GPIO_InitStructure );
  150. GPIO_InitStructure.GPIO_Pin = LED_02_G_PIN;
  151. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  152. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  153. GPIO_Init(LED_02_G_GPIO, &GPIO_InitStructure );
  154. GPIO_InitStructure.GPIO_Pin = LED_03_R_PIN;
  155. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  156. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  157. GPIO_Init(LED_03_R_GPIO, &GPIO_InitStructure );
  158. GPIO_InitStructure.GPIO_Pin = LED_03_G_PIN;
  159. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  160. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  161. GPIO_Init(LED_03_G_GPIO, &GPIO_InitStructure );
  162. GPIO_InitStructure.GPIO_Pin = LED_04_R_PIN;
  163. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  164. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  165. GPIO_Init(LED_04_R_GPIO, &GPIO_InitStructure );
  166. GPIO_InitStructure.GPIO_Pin = LED_04_G_PIN;
  167. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  168. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  169. GPIO_Init(LED_04_G_GPIO, &GPIO_InitStructure );
  170. GPIO_InitStructure.GPIO_Pin = LED_05_R_PIN;
  171. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  172. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  173. GPIO_Init(LED_05_R_GPIO, &GPIO_InitStructure );
  174. GPIO_InitStructure.GPIO_Pin = LED_05_G_PIN;
  175. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  176. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  177. GPIO_Init(LED_05_G_GPIO, &GPIO_InitStructure );
  178. LED_PWM_RCC_ENABLE;
  179. #ifdef LED_REMAPCONFIG_ENABLE
  180. LED_REMAPCONFIG_ENABLE;
  181. #endif
  182. TIM_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
  183. TIM_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
  184. TIM_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
  185. TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  186. TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
  187. TIM_TimeBaseInit(TIM3_LED_TYPE, &TIM_BaseInitStructure);
  188. TIM_TimeBaseInit(TIM4_LED_TYPE, &TIM_BaseInitStructure);
  189. TIM_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //占空比设置的高电平
  190. TIM_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  191. TIM_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
  192. TIM_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  193. TIM_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  194. TIM_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  195. TIM_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  196. TIM_OutputCompareInitStructure.TIM_Pulse = 0;
  197. BDTR_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  198. BDTR_Structure.TIM_Break = TIM_Break_Disable;
  199. BDTR_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  200. BDTR_Structure.TIM_DeadTime = 0x80;
  201. BDTR_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  202. BDTR_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
  203. BDTR_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
  204. TIM_BDTRConfig(TIM3_LED_TYPE,&BDTR_Structure);
  205. TIM_BDTRConfig(TIM4_LED_TYPE,&BDTR_Structure);
  206. LED_01_R_INIT(&TIM_OutputCompareInitStructure);
  207. LED_01_G_INIT(&TIM_OutputCompareInitStructure);
  208. LED_02_R_INIT(&TIM_OutputCompareInitStructure);
  209. LED_02_G_INIT(&TIM_OutputCompareInitStructure);
  210. LED_03_R_INIT(&TIM_OutputCompareInitStructure);
  211. LED_03_G_INIT(&TIM_OutputCompareInitStructure);
  212. TIM5_BaseInitStructure.TIM_Period = TIM_LED_PERIOD;
  213. TIM5_BaseInitStructure.TIM_Prescaler = TIM_LED_PRESCALER - 1;
  214. TIM5_BaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
  215. TIM5_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  216. TIM5_BaseInitStructure.TIM_RepetitionCounter = 0;
  217. TIM5_TimeBaseInit(&TIM5_BaseInitStructure);
  218. TIM5_OutputCompareInitStructure.TIM_OCMode =TIM_OCMode_PWM1; //占空比设置的高电平
  219. TIM5_OutputCompareInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  220. TIM5_OutputCompareInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;
  221. TIM5_OutputCompareInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  222. TIM5_OutputCompareInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  223. TIM5_OutputCompareInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  224. TIM5_OutputCompareInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  225. TIM5_OutputCompareInitStructure.TIM_Pulse = 0;
  226. BDTR5_Structure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  227. BDTR5_Structure.TIM_Break = TIM_Break_Disable;
  228. BDTR5_Structure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  229. BDTR5_Structure.TIM_DeadTime = 0x80;
  230. BDTR5_Structure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  231. BDTR5_Structure.TIM_OSSIState = TIM_OSSIState_Enable;
  232. BDTR5_Structure.TIM_OSSRState = TIM_OSSRState_Enable;
  233. TIM5_BDTRConfig(&BDTR5_Structure);
  234. LED_04_R_INIT(&TIM5_OutputCompareInitStructure);
  235. LED_04_G_INIT(&TIM5_OutputCompareInitStructure);
  236. LED_05_R_INIT(&TIM5_OutputCompareInitStructure);
  237. LED_05_G_INIT(&TIM5_OutputCompareInitStructure);
  238. LED_01_R_RUN;
  239. LED_01_G_RUN;
  240. LED_02_R_RUN;
  241. LED_02_G_RUN;
  242. LED_03_R_RUN;
  243. LED_03_G_RUN;
  244. LED_04_R_RUN;
  245. LED_04_G_RUN;
  246. LED_05_R_RUN;
  247. LED_05_G_RUN;
  248. DEV_LED_OFF;
  249. LED_01_R_COMPARE(0);
  250. LED_01_G_COMPARE(0);
  251. LED_02_R_COMPARE(0);
  252. LED_02_G_COMPARE(0);
  253. LED_03_R_COMPARE(0);
  254. LED_03_G_COMPARE(0);
  255. LED_04_R_COMPARE(0);
  256. LED_04_G_COMPARE(0);
  257. LED_05_R_COMPARE(0);
  258. LED_05_G_COMPARE(0);
  259. TIM_Cmd(TIM3_LED_TYPE,ENABLE);
  260. TIM_Cmd(TIM4_LED_TYPE,ENABLE);
  261. TIM_Cmd(TIM5_LED_TYPE,ENABLE);
  262. }
  263. /*******************************************************************************
  264. * @函数名称 led_dev_duty
  265. * @函数说明 设置设备指示灯PWM百分比
  266. * @输入参数 duty:百分比
  267. * @输出参数 无
  268. * @返回参数 无
  269. *******************************************************************************/
  270. static void led_dev_duty(uint16_t duty)
  271. {
  272. if(duty == 0)
  273. {
  274. DEV_LED_OFF;
  275. }
  276. else{
  277. DEV_LED_ON;
  278. }
  279. }
  280. /*******************************************************************************
  281. * @函数名称 led_01_duty
  282. * @函数说明 设置1号仓指示灯PWM百分比
  283. * @输入参数 duty:百分比
  284. * @输出参数 无
  285. * @返回参数 无
  286. *******************************************************************************/
  287. static void led_01_duty(uint16_t duty)
  288. {
  289. uint16_t value = TIM_LED_PERIOD * duty / 100;
  290. if(led_work[LED_01].color == RED_LED)
  291. {
  292. LED_01_G_COMPARE(LED_OFF_DUTY);
  293. LED_01_R_COMPARE(duty);
  294. }
  295. else if(led_work[LED_01].color == GREEN_LED)
  296. {
  297. LED_01_R_COMPARE(LED_OFF_DUTY);
  298. LED_01_G_COMPARE(duty);
  299. }
  300. else if(led_work[LED_01].color == YELLOW_LED)
  301. {
  302. LED_01_R_COMPARE(duty);
  303. LED_01_G_COMPARE(duty);
  304. }
  305. }
  306. /*******************************************************************************
  307. * @函数名称 led_02_duty
  308. * @函数说明 设置2号仓指示灯PWM百分比
  309. * @输入参数 duty:百分比
  310. * @输出参数 无
  311. * @返回参数 无
  312. *******************************************************************************/
  313. static void led_02_duty(uint16_t duty)
  314. {
  315. uint16_t value = TIM_LED_PERIOD * duty / 100;
  316. if(led_work[LED_02].color == RED_LED)
  317. {
  318. LED_02_G_COMPARE(LED_OFF_DUTY);
  319. LED_02_R_COMPARE(duty);
  320. }
  321. else if(led_work[LED_02].color == GREEN_LED)
  322. {
  323. LED_02_R_COMPARE(LED_OFF_DUTY);
  324. LED_02_G_COMPARE(duty);
  325. }
  326. else if(led_work[LED_02].color == YELLOW_LED)
  327. {
  328. LED_02_R_COMPARE(duty);
  329. LED_02_G_COMPARE(duty);
  330. }
  331. }
  332. /*******************************************************************************
  333. * @函数名称 led_03_duty
  334. * @函数说明 设置3号仓指示灯PWM百分比
  335. * @输入参数 duty:百分比
  336. * @输出参数 无
  337. * @返回参数 无
  338. *******************************************************************************/
  339. static void led_03_duty(uint16_t duty)
  340. {
  341. uint16_t value = TIM_LED_PERIOD * duty / 100;
  342. if(led_work[LED_03].color == RED_LED)
  343. {
  344. LED_03_G_COMPARE(LED_OFF_DUTY);
  345. LED_03_R_COMPARE(duty);
  346. }
  347. else if(led_work[LED_03].color == GREEN_LED)
  348. {
  349. LED_03_R_COMPARE(LED_OFF_DUTY);
  350. LED_03_G_COMPARE(duty);
  351. }
  352. else if(led_work[LED_03].color == YELLOW_LED)
  353. {
  354. LED_03_R_COMPARE(duty);
  355. LED_03_G_COMPARE(duty);
  356. }
  357. }
  358. /*******************************************************************************
  359. * @函数名称 led_04_duty
  360. * @函数说明 设置4号仓指示灯PWM百分比
  361. * @输入参数 duty:百分比
  362. * @输出参数 无
  363. * @返回参数 无
  364. *******************************************************************************/
  365. static void led_04_duty(uint16_t duty)
  366. {
  367. uint16_t value = TIM_LED_PERIOD * duty / 100;
  368. if(led_work[LED_04].color == RED_LED)
  369. {
  370. LED_04_G_COMPARE(LED_OFF_DUTY);
  371. LED_04_R_COMPARE(duty);
  372. }
  373. else if(led_work[LED_04].color == GREEN_LED)
  374. {
  375. LED_04_R_COMPARE(LED_OFF_DUTY);
  376. LED_04_G_COMPARE(duty);
  377. }
  378. else if(led_work[LED_04].color == YELLOW_LED)
  379. {
  380. LED_04_R_COMPARE(duty);
  381. LED_04_G_COMPARE(duty);
  382. }
  383. }
  384. /*******************************************************************************
  385. * @函数名称 led_05_duty
  386. * @函数说明 设置5号仓指示灯PWM百分比
  387. * @输入参数 duty:百分比
  388. * @输出参数 无
  389. * @返回参数 无
  390. *******************************************************************************/
  391. static void led_05_duty(uint16_t duty)
  392. {
  393. uint16_t value = TIM_LED_PERIOD * duty / 100;
  394. if(led_work[LED_05].color == RED_LED)
  395. {
  396. LED_05_G_COMPARE(LED_OFF_DUTY);
  397. LED_05_R_COMPARE(duty);
  398. }
  399. else if(led_work[LED_05].color == GREEN_LED)
  400. {
  401. LED_05_R_COMPARE(LED_OFF_DUTY);
  402. LED_05_G_COMPARE(duty);
  403. }
  404. else if(led_work[LED_05].color == YELLOW_LED)
  405. {
  406. LED_05_R_COMPARE(duty);
  407. LED_05_G_COMPARE(duty);
  408. }
  409. }
  410. /*******************************************************************************
  411. * @函数名称 led_invert
  412. * @函数说明 LED闪烁处理
  413. * @输入参数 led_work:led灯结构体直针
  414. * @输出参数 无
  415. * @返回参数 无
  416. *******************************************************************************/
  417. static void led_invert(led_work_s *led_work)
  418. {
  419. if(led_work->flicker_count > 0)
  420. {
  421. if(led_work->single_flicker_period == 0)
  422. {
  423. led_work->single_flicker_period = led_work->flicker_period;
  424. led_work->stat = LED_STAT_ON;
  425. led_work->set_duty(LED_ON_DUTY);
  426. }
  427. else if(led_work->single_flicker_period == (led_work->flicker_period - led_work->flicker_onperiod))
  428. {
  429. led_work->single_flicker_period--;
  430. led_work->stat = LED_STAT_OFF;
  431. led_work->set_duty(LED_OFF_DUTY);
  432. led_work->flicker_count--;
  433. }
  434. else{
  435. led_work->single_flicker_period--;
  436. }
  437. }
  438. else{
  439. led_work->workStat = LED_WORK_OFF;
  440. led_work->set_duty(LED_OFF_DUTY);
  441. }
  442. }
  443. /*******************************************************************************
  444. * @函数名称 led_heart
  445. * @函数说明 LED呼吸灯处理
  446. * @输入参数 led_work:led灯结构体直针
  447. * @输出参数 无
  448. * @返回参数 无
  449. *******************************************************************************/
  450. static void led_heart(led_work_s *led_work)
  451. {
  452. if(led_work->flicker_count > 0)
  453. {
  454. uint32_t off_period = led_work->flicker_period - led_work->flicker_onperiod;
  455. if(led_work->single_flicker_period == 0)
  456. {
  457. led_work->single_flicker_period = led_work->flicker_period;
  458. led_work->duty_value = 0;
  459. led_work->single_off_durationTime = led_work->off_durationTime;
  460. led_work->set_duty(led_work->duty_value);
  461. led_work->flicker_count--;
  462. }
  463. else if(led_work->single_flicker_period == off_period)
  464. {
  465. led_work->single_flicker_period--;
  466. led_work->duty_value = led_work->duty_on;
  467. led_work->single_on_durationTime = led_work->on_durationTime;
  468. led_work->set_duty(led_work->duty_value);
  469. }
  470. else{
  471. if(led_work->single_flicker_period > off_period)
  472. {
  473. if(led_work->single_off_durationTime == 0)
  474. {
  475. led_work->single_flicker_period--;
  476. led_work->duty_value = (led_work->flicker_period - led_work->single_flicker_period) * 100 / led_work->flicker_onperiod;
  477. led_work->set_duty(led_work->duty_value);
  478. }
  479. else{
  480. led_work->single_off_durationTime--;
  481. }
  482. }
  483. else{
  484. if(led_work->single_on_durationTime == 0)
  485. {
  486. led_work->single_flicker_period--;
  487. led_work->duty_value = led_work->single_flicker_period * 100 / off_period;
  488. led_work->set_duty(led_work->duty_value);
  489. }
  490. else{
  491. led_work->single_on_durationTime--;
  492. }
  493. }
  494. }
  495. }
  496. else{
  497. led_work->workStat = LED_WORK_OFF;
  498. }
  499. }
  500. /*******************************************************************************
  501. * @函数名称 led_indication
  502. * @函数说明 LED灯处理
  503. * @输入参数 led_work:led灯结构体直针
  504. * @输出参数 无
  505. * @返回参数 无
  506. *******************************************************************************/
  507. static void led_indication(led_work_s *led_work)
  508. {
  509. switch(led_work->workStat)
  510. {
  511. case LED_WORK_OFF:
  512. {
  513. break;
  514. }
  515. case LED_WORK_ON:
  516. {
  517. break;
  518. }
  519. case LED_WORK_INVERT:
  520. {
  521. led_invert(led_work);
  522. break;
  523. }
  524. case LED_WORK_BREATHE:
  525. {
  526. led_heart(led_work);
  527. break;
  528. }
  529. default:break;
  530. }
  531. }
  532. /*******************************************************************************
  533. * @函数名称 led_task
  534. * @函数说明 LED任务
  535. * @输入参数 无
  536. * @输出参数 无
  537. * @返回参数 无
  538. *******************************************************************************/
  539. static void led_task(void)
  540. {
  541. for(int i = 0; i < LED_TYPE_MAX; i++)
  542. {
  543. led_indication(&led_work[i]);
  544. }
  545. }
  546. /*******************************************************************************
  547. * @函数名称 led_task
  548. * @函数说明 task的event处理回调函数,需要在注册task时候,传进去
  549. * @输入参数 task_id:任务ID
  550. events:事件
  551. * @输出参数 无
  552. * @返回参数 无
  553. *******************************************************************************/
  554. static uint16_t led_task_process_event(uint8_t task_id, uint16_t events)
  555. {
  556. //event 处理
  557. if(events & (1 << LED_QUEUE_TIME))
  558. {
  559. led_task();
  560. return (events ^ (1 << LED_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  561. }
  562. return 0;
  563. }
  564. /*******************************************************************************
  565. * @函数名称 set_led_indication
  566. * @函数说明 LED参数设置
  567. * @输入参数 type:LED灯号
  568. color:颜色
  569. workStat:状态
  570. * @输出参数 无
  571. * @返回参数 无
  572. *******************************************************************************/
  573. bool set_led_indication(LED_TYPE type, LED_COLOR color, LED_WORK_STAT work_stat, ...)
  574. {
  575. bool stat = false;
  576. if(type >= LED_TYPE_MAX)
  577. {
  578. goto exit;
  579. }
  580. if(color > YELLOW_LED)
  581. {
  582. goto exit;
  583. }
  584. if(work_stat == LED_WORK_OFF || work_stat == LED_WORK_ON)
  585. {
  586. led_work[type].color = color;
  587. led_work[type].workStat = work_stat;
  588. led_work[type].set_duty((work_stat == LED_WORK_ON) ? LED_ON_DUTY : LED_OFF_DUTY);
  589. stat = true;
  590. }
  591. else if(work_stat == LED_WORK_INVERT || work_stat == LED_WORK_BREATHE)
  592. {
  593. led_work[type].color = color;
  594. led_work[type].workStat = work_stat;
  595. led_work[type].duty_value = 0;
  596. led_work[type].stat = LED_STAT_OFF;
  597. va_list ap; //保存所有参数
  598. va_start(ap, work_stat); //第一个参数的位置
  599. led_work[type].flicker_period = va_arg(ap, uint32_t)/LED_INTERVAL;
  600. led_work[type].flicker_onperiod = va_arg(ap, uint32_t)/LED_INTERVAL;
  601. led_work[type].flicker_count = va_arg(ap, uint32_t);
  602. if(led_work[type].flicker_count == 0)
  603. {
  604. led_work[type].flicker_count = 0x7FFFFFFF;
  605. }
  606. led_work[type].single_flicker_period = led_work[type].flicker_period;
  607. if(work_stat == LED_WORK_BREATHE)
  608. {
  609. led_work[type].on_durationTime = va_arg(ap, uint32_t) / LED_INTERVAL;
  610. led_work[type].off_durationTime = va_arg(ap, uint32_t) / LED_INTERVAL;
  611. led_work[type].single_on_durationTime = led_work[type].on_durationTime;
  612. led_work[type].single_off_durationTime = led_work[type].off_durationTime;
  613. }
  614. va_end(ap);
  615. stat = true;
  616. }
  617. exit:
  618. return stat;
  619. }
  620. /*******************************************************************************
  621. * @函数名称 led_task_init
  622. * @函数说明 LED任务初始化
  623. * @输入参数 无
  624. * @输出参数 无
  625. * @返回参数 无
  626. *******************************************************************************/
  627. void led_task_init(void)
  628. {
  629. led_task_id = TMOS_ProcessEventRegister(led_task_process_event);
  630. PRINT("led_task_id=%d\n", led_task_id);
  631. led_pwm_init();
  632. }
  633. /*******************************************************************************
  634. * @函数名称 led_task_start
  635. * @函数说明 LED任务开始
  636. * @输入参数 无
  637. * @输出参数 无
  638. * @返回参数 无
  639. *******************************************************************************/
  640. void led_task_start(void)
  641. {
  642. bStatus_t stat = tmos_start_reload_task(led_task_id, (1 << LED_QUEUE_TIME), MS1_TO_SYSTEM_TIME(LED_INTERVAL));
  643. }
  644. /*******************************************************************************
  645. * @函数名称 vUser_led_set_view_stat
  646. * @函数说明 设置LED显示状态
  647. * @输入参数 stat:led显示状态
  648. * @输出参数 无
  649. * @返回参数 无
  650. *******************************************************************************/
  651. void vUser_led_set_view_stat(LED_TYPE idx, led_view_stat_e stat)
  652. {
  653. PRINT("set No.%d led stat:%d\n", idx + 1, stat);
  654. led_work[idx + 1].viewStat = stat;
  655. if(alarm_stat == 0)
  656. {
  657. switch(stat)
  658. {
  659. case LED_VIEW_ALARM:set_led_indication(idx + 1, YELLOW_LED, LED_WORK_INVERT, 1000, 500, 0);break; //报警
  660. case LED_VIEW_WARN:set_led_indication(idx + 1, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);break; //警告
  661. case LED_VIEW_LOCK_ELECT:set_led_indication(idx + 1, RED_LED, LED_WORK_ON);break; //有挂锁并上锁
  662. case LED_VIEW_NOLOCK_ELECT:set_led_indication(idx + 1, RED_LED, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break; //无挂锁并上锁
  663. case LED_VIEW_LOCK_NOELECT:set_led_indication(idx + 1, GREEN_LED, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break; //有挂锁没上锁
  664. case LED_VIEW_NOLOCK_NOELECT:set_led_indication(idx + 1, GREEN_LED, LED_WORK_ON);break; //无挂锁没上锁
  665. default:break;
  666. }
  667. }
  668. }
  669. /*******************************************************************************
  670. * @函数名称 vUser_led_set_alarm_view
  671. * @函数说明 设置LED故障显示状态
  672. * @输入参数 alarmStat:故障类型
  673. stat:故障状态
  674. * @输出参数 无
  675. * @返回参数 无
  676. *******************************************************************************/
  677. void vUser_led_set_alarm_view(led_all_alarm_stat_e alarmStat, bool stat)
  678. {
  679. if(stat == true)
  680. {
  681. alarm_stat |= (1 << alarmStat);
  682. }
  683. else{
  684. alarm_stat &= ~(1 << alarmStat);
  685. }
  686. if((alarm_stat & (1 << LED_ALL_ALARM_RST)) != 0)
  687. {
  688. for(int i = 1; i < LED_TYPE_MAX; i++)
  689. {
  690. set_led_indication(i, YELLOW_LED, LED_WORK_INVERT, 1000, 500, 0, 0, 0);
  691. }
  692. }
  693. else if((alarm_stat & (1 << LED_ALL_ALARM_BLE)) != 0)
  694. {
  695. for(int i = 1; i < LED_TYPE_MAX; i++)
  696. {
  697. set_led_indication(i, GREEN_LED, LED_WORK_INVERT, 200, 100, 0, 0, 0);
  698. }
  699. }
  700. else if((alarm_stat & (1 << LED_ALL_ALARM_CAN_IDX_ERROR)) != 0)
  701. {
  702. for(int i = 1; i < LED_TYPE_MAX; i++)
  703. {
  704. set_led_indication(i, YELLOW_LED, LED_WORK_BREATHE, 3000, 1500, 0, 500, 500);
  705. }
  706. }
  707. else if((alarm_stat & (1 << LED_ALL_ALARM_OFFLINE)) != 0)
  708. {
  709. for(int i = 1; i < LED_TYPE_MAX; i++)
  710. {
  711. set_led_indication(i, YELLOW_LED, LED_WORK_BREATHE, 300, 150, 0, 100, 100);
  712. }
  713. }
  714. else if(alarm_stat == 0)
  715. {
  716. for(int i = 1; i < LED_TYPE_MAX; i++)
  717. {
  718. vUser_led_set_view_stat(i - 1, led_work[i].viewStat);
  719. }
  720. }
  721. }