You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.8 KiB

3 years ago
  1. #include "who_led.h"
  2. static const char *TAG = "app_led";
  3. static QueueHandle_t xQueueLEDControlI = NULL;
  4. static int gpio_led;
  5. #if CONFIG_LED_ILLUMINATOR_ENABLED
  6. #include "esp_log.h"
  7. #include "driver/ledc.h"
  8. #if CONFIG_LED_LEDC_LOW_SPEED_MODE
  9. #define CONFIG_LED_LEDC_SPEED_MODE LEDC_LOW_SPEED_MODE
  10. #else
  11. #define CONFIG_LED_LEDC_SPEED_MODE LEDC_HIGH_SPEED_MODE
  12. #endif
  13. void app_led_init()
  14. {
  15. gpio_set_direction(CONFIG_LED_LEDC_PIN, GPIO_MODE_OUTPUT);
  16. ledc_timer_config_t ledc_timer = {
  17. .duty_resolution = LEDC_TIMER_8_BIT, // resolution of PWM duty
  18. .freq_hz = 1000, // frequency of PWM signal
  19. .speed_mode = LEDC_LOW_SPEED_MODE, // timer mode
  20. .timer_num = CONFIG_LED_LEDC_TIMER // timer index
  21. };
  22. ledc_channel_config_t ledc_channel = {
  23. .channel = CONFIG_LED_LEDC_CHANNEL,
  24. .duty = 0,
  25. .gpio_num = CONFIG_LED_LEDC_PIN,
  26. .speed_mode = LEDC_LOW_SPEED_MODE,
  27. .hpoint = 0,
  28. .timer_sel = CONFIG_LED_LEDC_TIMER};
  29. #if CONFIG_LED_LEDC_HIGH_SPEED_MODE
  30. ledc_timer.speed_mode = ledc_channel.speed_mode = LEDC_HIGH_SPEED_MODE;
  31. #endif
  32. switch (ledc_timer_config(&ledc_timer))
  33. {
  34. case ESP_ERR_INVALID_ARG:
  35. ESP_LOGE(TAG, "ledc_timer_config() parameter error");
  36. break;
  37. case ESP_FAIL:
  38. ESP_LOGE(TAG, "ledc_timer_config() Can not find a proper pre-divider number base on the given frequency and the current duty_resolution");
  39. break;
  40. case ESP_OK:
  41. if (ledc_channel_config(&ledc_channel) == ESP_ERR_INVALID_ARG)
  42. {
  43. ESP_LOGE(TAG, "ledc_channel_config() parameter error");
  44. }
  45. break;
  46. default:
  47. break;
  48. }
  49. ESP_LOGE(TAG, "LED has been initialized.");
  50. }
  51. void app_led_duty(int duty)
  52. { // Turn LED On or Off
  53. if (duty > CONFIG_LED_MAX_INTENSITY)
  54. duty = CONFIG_LED_MAX_INTENSITY;
  55. ledc_set_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL, duty);
  56. ledc_update_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL);
  57. ESP_LOGI(TAG, "Set LED intensity to %d", duty);
  58. }
  59. #endif
  60. static void led_task(void *arg)
  61. {
  62. led_state_t led_op;
  63. while (1)
  64. {
  65. xQueueReceive(xQueueLEDControlI, &led_op, portMAX_DELAY);
  66. switch (led_op)
  67. {
  68. case LED_ALWAYS_OFF:
  69. gpio_set_level(gpio_led, 0);
  70. break;
  71. case LED_ALWAYS_ON:
  72. gpio_set_level(gpio_led, 1);
  73. break;
  74. case LED_OFF_1S:
  75. gpio_set_level(gpio_led, 0);
  76. vTaskDelay(1000 / portTICK_PERIOD_MS);
  77. gpio_set_level(gpio_led, 1);
  78. break;
  79. case LED_OFF_2S:
  80. gpio_set_level(gpio_led, 0);
  81. vTaskDelay(2000 / portTICK_PERIOD_MS);
  82. gpio_set_level(gpio_led, 1);
  83. break;
  84. case LED_OFF_4S:
  85. gpio_set_level(gpio_led, 0);
  86. vTaskDelay(4000 / portTICK_PERIOD_MS);
  87. gpio_set_level(gpio_led, 1);
  88. break;
  89. case LED_ON_1S:
  90. gpio_set_level(gpio_led, 1);
  91. vTaskDelay(1000 / portTICK_PERIOD_MS);
  92. gpio_set_level(gpio_led, 0);
  93. break;
  94. case LED_ON_2S:
  95. gpio_set_level(gpio_led, 1);
  96. vTaskDelay(2000 / portTICK_PERIOD_MS);
  97. gpio_set_level(gpio_led, 0);
  98. break;
  99. case LED_ON_4S:
  100. gpio_set_level(gpio_led, 1);
  101. vTaskDelay(4000 / portTICK_PERIOD_MS);
  102. gpio_set_level(gpio_led, 0);
  103. break;
  104. case LED_BLINK_1S:
  105. for (int i = 0; i < 2; ++i)
  106. {
  107. gpio_set_level(gpio_led, 1);
  108. vTaskDelay(250 / portTICK_PERIOD_MS);
  109. gpio_set_level(gpio_led, 0);
  110. vTaskDelay(250 / portTICK_PERIOD_MS);
  111. }
  112. break;
  113. case LED_BLINK_2S:
  114. for (int i = 0; i < 4; ++i)
  115. {
  116. gpio_set_level(gpio_led, 1);
  117. vTaskDelay(250 / portTICK_PERIOD_MS);
  118. gpio_set_level(gpio_led, 0);
  119. vTaskDelay(250 / portTICK_PERIOD_MS);
  120. }
  121. break;
  122. case LED_BLINK_4S:
  123. for (int i = 0; i < 8; ++i)
  124. {
  125. gpio_set_level(gpio_led, 1);
  126. vTaskDelay(250 / portTICK_PERIOD_MS);
  127. gpio_set_level(gpio_led, 0);
  128. vTaskDelay(250 / portTICK_PERIOD_MS);
  129. }
  130. break;
  131. default:
  132. break;
  133. }
  134. }
  135. }
  136. void register_led(const gpio_num_t led_io_num, const QueueHandle_t control_i)
  137. {
  138. xQueueLEDControlI = control_i;
  139. gpio_led = led_io_num;
  140. gpio_config_t gpio_conf;
  141. gpio_conf.mode = GPIO_MODE_OUTPUT_OD;
  142. gpio_conf.pull_up_en = 1;
  143. gpio_conf.intr_type = GPIO_INTR_DISABLE;
  144. gpio_conf.pin_bit_mask = 1LL << gpio_led;
  145. gpio_config(&gpio_conf);
  146. xTaskCreatePinnedToCore(&led_task, "who_led_task", 1 * 1024, NULL, 5, NULL, 0);
  147. }