Merge remote-tracking branch 'ofw/dev' into mntm-dev

This commit is contained in:
Willy-JL
2024-10-14 23:44:44 +01:00
167 changed files with 6280 additions and 2155 deletions
+24 -15
View File
@@ -24,7 +24,7 @@ const char* furi_timer_get_current_name(void) {
return current_timer_name;
}
static void TimerCallback(TimerHandle_t hTimer) {
static void furi_timer_callback(TimerHandle_t hTimer) {
FuriTimer* instance = pvTimerGetTimerID(hTimer);
furi_check(instance);
current_timer_name = pcTimerGetName(hTimer);
@@ -32,6 +32,18 @@ static void TimerCallback(TimerHandle_t hTimer) {
current_timer_name = NULL;
}
static void furi_timer_flush_epilogue(void* context, uint32_t arg) {
furi_assert(context);
UNUSED(arg);
EventGroupHandle_t hEvent = context;
// See https://github.com/FreeRTOS/FreeRTOS-Kernel/issues/1142
vTaskSuspendAll();
xEventGroupSetBits(hEvent, TIMER_DELETED_EVENT);
(void)xTaskResumeAll();
}
FuriTimer* furi_timer_alloc(FuriTimerCallback func, FuriTimerType type, void* context) {
furi_check((furi_kernel_is_irq_or_masked() == 0U) && (func != NULL));
@@ -45,23 +57,13 @@ FuriTimer* furi_timer_alloc(FuriTimerCallback func, FuriTimerType type, void* co
const UBaseType_t reload = (type == FuriTimerTypeOnce ? pdFALSE : pdTRUE);
const TimerHandle_t hTimer = xTimerCreateStatic(
name, portMAX_DELAY, reload, instance, TimerCallback, &instance->container);
name, portMAX_DELAY, reload, instance, furi_timer_callback, &instance->container);
furi_check(hTimer == (TimerHandle_t)instance);
return instance;
}
static void furi_timer_epilogue(void* context, uint32_t arg) {
furi_assert(context);
UNUSED(arg);
EventGroupHandle_t hEvent = context;
vTaskSuspendAll();
xEventGroupSetBits(hEvent, TIMER_DELETED_EVENT);
(void)xTaskResumeAll();
}
void furi_timer_free(FuriTimer* instance) {
furi_check(!furi_kernel_is_irq_or_masked());
furi_check(instance);
@@ -69,16 +71,21 @@ void furi_timer_free(FuriTimer* instance) {
TimerHandle_t hTimer = (TimerHandle_t)instance;
furi_check(xTimerDelete(hTimer, portMAX_DELAY) == pdPASS);
furi_timer_flush();
free(instance);
}
void furi_timer_flush(void) {
StaticEventGroup_t event_container = {};
EventGroupHandle_t hEvent = xEventGroupCreateStatic(&event_container);
furi_check(xTimerPendFunctionCall(furi_timer_epilogue, hEvent, 0, portMAX_DELAY) == pdPASS);
furi_check(
xTimerPendFunctionCall(furi_timer_flush_epilogue, hEvent, 0, portMAX_DELAY) == pdPASS);
furi_check(
xEventGroupWaitBits(hEvent, TIMER_DELETED_EVENT, pdFALSE, pdTRUE, portMAX_DELAY) ==
TIMER_DELETED_EVENT);
vEventGroupDelete(hEvent);
free(instance);
}
FuriStatus furi_timer_start(FuriTimer* instance, uint32_t ticks) {
@@ -124,6 +131,8 @@ FuriStatus furi_timer_stop(FuriTimer* instance) {
furi_check(xTimerStop(hTimer, portMAX_DELAY) == pdPASS);
furi_timer_flush();
return FuriStatusOk;
}