led.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "led.h"
  2. #include "define.h"
  3. #include "stdarg.h"
  4. static tmosTaskID led_task_id = INVALID_TASK_ID;
  5. static void stat_led_work_stat(bool stat);
  6. static led_work_s led_work[LED_TYPE_MAX] = {
  7. {
  8. .stat = LED_STAT_OFF,
  9. .work_stat = LED_WORK_OFF,
  10. .single_flicker_period = 0,
  11. .flicker_period = 0,
  12. .flicker_onperiod = 0,
  13. .flicker_count = 0,
  14. .set_work_stat = stat_led_work_stat,
  15. }
  16. };
  17. /**
  18. * gpio初始化函数
  19. */
  20. static void led_gpio_init(void)
  21. {
  22. GPIO_InitTypeDef GPIO_InitStructure={0};
  23. LED_GPIO_RCC_ENABLE;
  24. GPIO_InitStructure.GPIO_Pin = DEV_LED_PIN;
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  26. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  27. GPIO_Init(DEV_LED_GPIO, &GPIO_InitStructure);
  28. DEV_LED_OFF;
  29. }
  30. static void stat_led_work_stat(bool stat)
  31. {
  32. SET_DEV_LED(stat);
  33. }
  34. static void led_invert(led_work_s *led_work)
  35. {
  36. if(led_work->flicker_count > 0)
  37. {
  38. if(led_work->single_flicker_period == 0)
  39. {
  40. led_work->single_flicker_period = led_work->flicker_period;
  41. led_work->stat = LED_STAT_ON;
  42. led_work->set_work_stat(true);
  43. }
  44. else if(led_work->single_flicker_period == (led_work->flicker_period - led_work->flicker_onperiod))
  45. {
  46. led_work->single_flicker_period--;
  47. led_work->stat = LED_STAT_OFF;
  48. led_work->set_work_stat(false);
  49. led_work->flicker_count--;
  50. }
  51. else{
  52. led_work->single_flicker_period--;
  53. }
  54. }
  55. else{
  56. led_work->work_stat = LED_WORK_OFF;
  57. led_work->set_work_stat(false);
  58. }
  59. }
  60. static void led_indication(led_work_s *led_work)
  61. {
  62. switch(led_work->work_stat)
  63. {
  64. case LED_WORK_OFF:
  65. {
  66. break;
  67. }
  68. case LED_WORK_ON:
  69. {
  70. break;
  71. }
  72. case LED_WORK_INVERT:
  73. {
  74. led_invert(led_work);
  75. break;
  76. }
  77. default:break;
  78. }
  79. }
  80. static void led_task(void)
  81. {
  82. for(int i = 0; i < LED_TYPE_MAX; i++)
  83. {
  84. led_indication(&led_work[i]);
  85. }
  86. }
  87. //task的event处理回调函数,需要在注册task时候,传进去
  88. static uint16_t led_task_process_event(uint8_t task_id, uint16_t events)
  89. {
  90. //event 处理
  91. if(events & (1 << LED_QUEUE_PLAY))
  92. {
  93. return (events ^ (1 << LED_QUEUE_PLAY));
  94. }
  95. //event 处理
  96. if(events & (1 << LED_QUEUE_TIME))
  97. {
  98. led_task();
  99. return (events ^ (1 << LED_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  100. }
  101. return 0;
  102. }
  103. bool set_led_indication(LED_TYPE type, LED_WORK_STAT work_stat, ...)
  104. {
  105. bool stat = false;
  106. if(type >= LED_TYPE_MAX)
  107. {
  108. goto exit;
  109. }
  110. if(work_stat == LED_WORK_OFF || work_stat == LED_WORK_ON)
  111. {
  112. led_work[type].work_stat = work_stat;
  113. led_work[type].set_work_stat((work_stat == LED_WORK_ON)?true:false);
  114. stat = true;
  115. }
  116. else if(work_stat == LED_WORK_INVERT)
  117. {
  118. led_work[type].work_stat = work_stat;
  119. va_list ap; //保存所有参数
  120. va_start(ap, work_stat); //第一个参数的位置
  121. led_work[type].flicker_period = va_arg(ap, uint32_t)/LED_INTERVAL;
  122. led_work[type].flicker_onperiod = va_arg(ap, uint32_t)/LED_INTERVAL;
  123. led_work[type].flicker_count = va_arg(ap, uint32_t);
  124. if(led_work[type].flicker_count == 0)
  125. {
  126. led_work[type].flicker_count = 0x7FFFFFFF;
  127. }
  128. va_end(ap);
  129. stat = true;
  130. }
  131. exit:
  132. return stat;
  133. }
  134. void led_task_init(void)
  135. {
  136. led_gpio_init();
  137. led_task_id = TMOS_ProcessEventRegister(led_task_process_event);
  138. }
  139. void led_task_start(void)
  140. {
  141. bStatus_t stat = tmos_start_reload_task(led_task_id, (1 << LED_QUEUE_TIME), MS1_TO_SYSTEM_TIME(LED_INTERVAL));
  142. }
  143. void led_enter_ota(void)
  144. {
  145. set_led_indication(STAT_LED, LED_WORK_INVERT, 2000, 1000, 0);
  146. }
  147. void led_data_ota(void)
  148. {
  149. set_led_indication(STAT_LED, LED_WORK_INVERT, 20, 10, 5);
  150. }