statusled.cpp 4.9 KB

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