led.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "led.h"
  2. #include "driver/gpio.h"
  3. #include "freertos/FreeRTOS.h"
  4. #include "freertos/task.h"
  5. #include "esp_log.h"
  6. unsigned int blinkLed = 0;
  7. #define BLINK_GPIO 2
  8. // Interface function to blink the green LED
  9. void blinkTheLED()
  10. {
  11. blinkLed++;
  12. }
  13. enum
  14. {
  15. MODE_INACTIVE,
  16. MODE_ON,
  17. MODE_OFF,
  18. MODE_SWITCH, // Just have been off
  19. };
  20. void rxLed()
  21. {
  22. static unsigned long timer = 0;
  23. static int mode = MODE_INACTIVE;
  24. switch (mode)
  25. {
  26. case MODE_INACTIVE:
  27. if (blinkLed > 0)
  28. {
  29. blinkLed--;
  30. mode = MODE_ON;
  31. timer = 1;
  32. gpio_set_level(BLINK_GPIO, 0); // On
  33. }
  34. break;
  35. case MODE_ON:
  36. timer--;
  37. if (timer == 0)
  38. {
  39. mode = MODE_OFF;
  40. gpio_set_level(BLINK_GPIO, 1);
  41. timer = 1;
  42. }
  43. break;
  44. case MODE_OFF:
  45. timer--;
  46. if (timer == 0)
  47. {
  48. mode = MODE_INACTIVE;
  49. gpio_set_level(BLINK_GPIO, 1);
  50. break;
  51. }
  52. }
  53. }
  54. static void led_task(void *pvParameter)
  55. {
  56. ESP_LOGI("LED", "Task started.");
  57. while (1)
  58. {
  59. rxLed();
  60. vTaskDelay(200 / portTICK_PERIOD_MS);
  61. }
  62. vTaskDelete(NULL);
  63. }
  64. void initLed()
  65. {
  66. gpio_set_level(BLINK_GPIO, 0);
  67. gpio_pad_select_gpio(BLINK_GPIO);
  68. gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
  69. xTaskCreatePinnedToCore(&led_task, "Led_Task", 8192, NULL, tskIDLE_PRIORITY + 1, NULL, 0);
  70. }