mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-07-03 22:23:35 -07:00
Merge remote-tracking branch 'ofw/dev' into mntm-dev
This commit is contained in:
+24
-15
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user