8#if AUTORESEARCH_LEGACY_OBSERVES_RMT4_FRAMES && FL_RMT4_ASYNC && defined(FL_RMT4_FAULT_TEST) && FL_RMT4_FAULT_TEST == 1
14#include "freertos/FreeRTOS.h"
15#include "freertos/task.h"
16#include "freertos/queue.h"
17#include "driver/rmt.h"
21namespace legacy_async_errors {
29 failuresConsumed.store(0);
30 armingTask.store(xTaskGetCurrentTaskHandle());
31 armedFault.store(
static_cast<int>(fault));
34void disarmFault()
FL_NO_EXCEPT { armedFault.store(
static_cast<int>(Fault::None)); }
35unsigned consumedFaults()
FL_NO_EXCEPT {
return failuresConsumed.load(); }
38 int expected =
static_cast<int>(fault);
39 if (!armedFault.compare_exchange_strong(expected,
static_cast<int>(Fault::None),
43 failuresConsumed.fetch_add(1);
48 return xTaskGetCurrentTaskHandle() == armingTask.load();
55BaseType_t __real_xTaskCreatePinnedToCore(TaskFunction_t code,
56 const char *
const name,
const uint32_t stackBytes,
void *
const argument,
57 UBaseType_t priority, TaskHandle_t *
const task,
const BaseType_t core)
FL_NO_EXCEPT;
58QueueHandle_t __real_xQueueCreateMutex(
const uint8_t queueType)
FL_NO_EXCEPT;
59esp_err_t __real_rmt_driver_install(rmt_channel_t channel,
size_t receiveBytes,
62BaseType_t __wrap_xTaskCreatePinnedToCore(TaskFunction_t code,
63 const char *
const name,
const uint32_t stackBytes,
void *
const argument,
64 UBaseType_t priority, TaskHandle_t *
const task,
const BaseType_t core)
FL_NO_EXCEPT {
65 using namespace autoresearch::legacy_async_errors;
66 if (name &&
fl::strcmp(name,
"fl_rmt4") == 0 &&
67 consumeFault(Fault::TaskAllocation)) {
68 if (task) { *task =
nullptr; }
69 return errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
71 return __real_xTaskCreatePinnedToCore(code, name, stackBytes, argument,
72 priority, task, core);
75QueueHandle_t __wrap_xQueueCreateMutex(
const uint8_t queueType)
FL_NO_EXCEPT {
76 using namespace autoresearch::legacy_async_errors;
77 if (isArmingTask() && consumeFault(Fault::MutexAllocation)) {
80 return __real_xQueueCreateMutex(queueType);
83esp_err_t __wrap_rmt_driver_install(rmt_channel_t channel,
size_t receiveBytes,
85 using namespace autoresearch::legacy_async_errors;
86 if (consumeFault(Fault::DriverInstall)) {
return ESP_ERR_NO_MEM; }
87 return __real_rmt_driver_install(channel, receiveBytes, interruptFlags);
FASTLED_FORCE_INLINE int strcmp(const char *s1, const char *s2) FL_NO_EXCEPT
atomic< unsigned int > atomic_uint