statusled.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "defines.h"
  2. #include "statusled.h"
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include "driver/gpio.h"
  6. #include "ClassLogFile.h"
  7. // define `gpio_pad_select_gpip` for newer versions of IDF
  8. #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0))
  9. #include "esp_rom_gpio.h"
  10. #define gpio_pad_select_gpio esp_rom_gpio_pad_select_gpio
  11. #endif
  12. static const char *TAG = "STATUSLED";
  13. TaskHandle_t xHandle_task_StatusLED = NULL;
  14. struct StatusLEDData StatusLEDData = {};
  15. void task_status_led(void *pvParameter)
  16. {
  17. // ESP_LOGD(TAG, "task_StatusLED - create");
  18. while (StatusLEDData.bProcessingRequest)
  19. {
  20. // ESP_LOGD(TAG, "task_StatusLED - start");
  21. struct StatusLEDData StatusLEDDataInt = StatusLEDData;
  22. gpio_pad_select_gpio(BLINK_GPIO); // Init the GPIO
  23. gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); // Set the GPIO as a push/pull output
  24. gpio_set_level(BLINK_GPIO, 1); // LED off
  25. for (int i = 0; i < 2;) // Default: repeat 2 times
  26. {
  27. if (!StatusLEDDataInt.bInfinite)
  28. {
  29. ++i;
  30. }
  31. for (int j = 0; j < StatusLEDDataInt.iSourceBlinkCnt; ++j)
  32. {
  33. gpio_set_level(BLINK_GPIO, 0);
  34. vTaskDelay(StatusLEDDataInt.iBlinkTime / portTICK_PERIOD_MS);
  35. gpio_set_level(BLINK_GPIO, 1);
  36. vTaskDelay(StatusLEDDataInt.iBlinkTime / portTICK_PERIOD_MS);
  37. }
  38. vTaskDelay(500 / portTICK_PERIOD_MS); // Delay between module code and error code
  39. for (int j = 0; j < StatusLEDDataInt.iCodeBlinkCnt; ++j)
  40. {
  41. gpio_set_level(BLINK_GPIO, 0);
  42. vTaskDelay(StatusLEDDataInt.iBlinkTime / portTICK_PERIOD_MS);
  43. gpio_set_level(BLINK_GPIO, 1);
  44. vTaskDelay(StatusLEDDataInt.iBlinkTime / portTICK_PERIOD_MS);
  45. }
  46. vTaskDelay(1500 / portTICK_PERIOD_MS); // Delay to signal new round
  47. }
  48. StatusLEDData.bProcessingRequest = false;
  49. // ESP_LOGD(TAG, "task_StatusLED - done/wait");
  50. vTaskDelay(10000 / portTICK_PERIOD_MS); // Wait for an upcoming request otherwise continue and delete task to save memory
  51. }
  52. // ESP_LOGD(TAG, "task_StatusLED - delete");
  53. xHandle_task_StatusLED = NULL;
  54. vTaskDelete(NULL); // Delete this task due to no request
  55. }
  56. void set_status_led(StatusLedSource _eSource, int _iCode, bool _bInfinite)
  57. {
  58. // ESP_LOGD(TAG, "StatusLED - start");
  59. if (_eSource == WLAN_CONN)
  60. {
  61. StatusLEDData.iSourceBlinkCnt = WLAN_CONN;
  62. StatusLEDData.iCodeBlinkCnt = _iCode;
  63. StatusLEDData.iBlinkTime = 250;
  64. StatusLEDData.bInfinite = _bInfinite;
  65. }
  66. else if (_eSource == WLAN_INIT)
  67. {
  68. StatusLEDData.iSourceBlinkCnt = WLAN_INIT;
  69. StatusLEDData.iCodeBlinkCnt = _iCode;
  70. StatusLEDData.iBlinkTime = 250;
  71. StatusLEDData.bInfinite = _bInfinite;
  72. }
  73. else if (_eSource == SDCARD_INIT)
  74. {
  75. StatusLEDData.iSourceBlinkCnt = SDCARD_INIT;
  76. StatusLEDData.iCodeBlinkCnt = _iCode;
  77. StatusLEDData.iBlinkTime = 250;
  78. StatusLEDData.bInfinite = _bInfinite;
  79. }
  80. else if (_eSource == SDCARD_CHECK)
  81. {
  82. StatusLEDData.iSourceBlinkCnt = SDCARD_CHECK;
  83. StatusLEDData.iCodeBlinkCnt = _iCode;
  84. StatusLEDData.iBlinkTime = 250;
  85. StatusLEDData.bInfinite = _bInfinite;
  86. }
  87. else if (_eSource == CAM_INIT)
  88. {
  89. StatusLEDData.iSourceBlinkCnt = CAM_INIT;
  90. StatusLEDData.iCodeBlinkCnt = _iCode;
  91. StatusLEDData.iBlinkTime = 250;
  92. StatusLEDData.bInfinite = _bInfinite;
  93. }
  94. else if (_eSource == PSRAM_INIT)
  95. {
  96. StatusLEDData.iSourceBlinkCnt = PSRAM_INIT;
  97. StatusLEDData.iCodeBlinkCnt = _iCode;
  98. StatusLEDData.iBlinkTime = 250;
  99. StatusLEDData.bInfinite = _bInfinite;
  100. }
  101. else if (_eSource == TIME_CHECK)
  102. {
  103. StatusLEDData.iSourceBlinkCnt = TIME_CHECK;
  104. StatusLEDData.iCodeBlinkCnt = _iCode;
  105. StatusLEDData.iBlinkTime = 250;
  106. StatusLEDData.bInfinite = _bInfinite;
  107. }
  108. else if (_eSource == AP_OR_OTA)
  109. {
  110. StatusLEDData.iSourceBlinkCnt = AP_OR_OTA;
  111. StatusLEDData.iCodeBlinkCnt = _iCode;
  112. StatusLEDData.iBlinkTime = 350;
  113. StatusLEDData.bInfinite = _bInfinite;
  114. }
  115. if (xHandle_task_StatusLED && !StatusLEDData.bProcessingRequest)
  116. {
  117. StatusLEDData.bProcessingRequest = true;
  118. BaseType_t xReturned = xTaskAbortDelay(xHandle_task_StatusLED); // Reuse still running status LED task
  119. /*if (xReturned == pdPASS)
  120. ESP_LOGD(TAG, "task_StatusLED - abort waiting delay");*/
  121. }
  122. else if (xHandle_task_StatusLED == NULL)
  123. {
  124. StatusLEDData.bProcessingRequest = true;
  125. BaseType_t xReturned = xTaskCreate(&task_status_led, "task_StatusLED", 1280, NULL, tskIDLE_PRIORITY + 1, &xHandle_task_StatusLED);
  126. if (xReturned != pdPASS)
  127. {
  128. xHandle_task_StatusLED = NULL;
  129. LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "task_StatusLED failed to create");
  130. LogFile.WriteHeapInfo("task_StatusLED failed");
  131. }
  132. }
  133. else
  134. {
  135. ESP_LOGD(TAG, "task_StatusLED still processing, request skipped"); // Requests with high frequency could be skipped, but LED is only helpful for static states
  136. }
  137. // ESP_LOGD(TAG, "StatusLED - done");
  138. }
  139. void set_status_led_off(void)
  140. {
  141. if (xHandle_task_StatusLED)
  142. {
  143. vTaskDelete(xHandle_task_StatusLED); // Delete task for StatusLED to force stop of blinking
  144. }
  145. gpio_pad_select_gpio(BLINK_GPIO); // Init the GPIO
  146. gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); // Set the GPIO as a push/pull output
  147. gpio_set_level(BLINK_GPIO, 1); // LED off
  148. }