Furi, FuriHal: remove FreeRTOS headers leaks (#3179)
* Furi: remove direct FreeRTOS timers use * Furi: eliminate FreeRTOS headers leak. What did it cost? Everything... * SubGhz: proper public api for protocols. Format Sources. * Furi: slightly less redundant declarations * Desktop: proper types in printf * Sync API Symbols * Furi: add timer reset and fix dolphin service, fix unit tests * Furi: proper timer restart method naming and correct behavior in timer stopped state. --------- Co-authored-by: hedger <hedger@nanode.su>
This commit is contained in:
		
							parent
							
								
									7bd3bd7ea4
								
							
						
					
					
						commit
						aa06328516
					
				@ -71,7 +71,7 @@ static void direct_draw_run(DirectDraw* instance) {
 | 
				
			|||||||
    size_t counter = 0;
 | 
					    size_t counter = 0;
 | 
				
			||||||
    float fps = 0;
 | 
					    float fps = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    vTaskPrioritySet(furi_thread_get_current_id(), FuriThreadPriorityIdle);
 | 
					    furi_thread_set_current_priority(FuriThreadPriorityIdle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    do {
 | 
					    do {
 | 
				
			||||||
        size_t elapsed = DWT->CYCCNT - start;
 | 
					        size_t elapsed = DWT->CYCCNT - start;
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,8 @@
 | 
				
			|||||||
#include <cli/cli.h>
 | 
					#include <cli/cli.h>
 | 
				
			||||||
#include <loader/loader.h>
 | 
					#include <loader/loader.h>
 | 
				
			||||||
#include <protobuf_version.h>
 | 
					#include <protobuf_version.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <semphr.h>
 | 
					#include <semphr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LIST_DEF(MsgList, PB_Main, M_POD_OPLIST)
 | 
					LIST_DEF(MsgList, PB_Main, M_POD_OPLIST)
 | 
				
			||||||
@ -36,7 +38,7 @@ typedef struct {
 | 
				
			|||||||
    FuriStreamBuffer* output_stream;
 | 
					    FuriStreamBuffer* output_stream;
 | 
				
			||||||
    SemaphoreHandle_t close_session_semaphore;
 | 
					    SemaphoreHandle_t close_session_semaphore;
 | 
				
			||||||
    SemaphoreHandle_t terminate_semaphore;
 | 
					    SemaphoreHandle_t terminate_semaphore;
 | 
				
			||||||
    TickType_t timeout;
 | 
					    uint32_t timeout;
 | 
				
			||||||
} RpcSessionContext;
 | 
					} RpcSessionContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static RpcSessionContext rpc_session[TEST_RPC_SESSIONS];
 | 
					static RpcSessionContext rpc_session[TEST_RPC_SESSIONS];
 | 
				
			||||||
@ -544,7 +546,7 @@ static bool test_rpc_pb_stream_read(pb_istream_t* istream, pb_byte_t* buf, size_
 | 
				
			|||||||
    RpcSessionContext* session_context = istream->state;
 | 
					    RpcSessionContext* session_context = istream->state;
 | 
				
			||||||
    size_t bytes_received = 0;
 | 
					    size_t bytes_received = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TickType_t now = xTaskGetTickCount();
 | 
					    uint32_t now = furi_get_tick();
 | 
				
			||||||
    int32_t time_left = session_context->timeout - now;
 | 
					    int32_t time_left = session_context->timeout - now;
 | 
				
			||||||
    time_left = MAX(time_left, 0);
 | 
					    time_left = MAX(time_left, 0);
 | 
				
			||||||
    bytes_received =
 | 
					    bytes_received =
 | 
				
			||||||
@ -688,7 +690,7 @@ static void test_rpc_decode_and_compare(MsgList_t expected_msg_list, uint8_t ses
 | 
				
			|||||||
    furi_check(!MsgList_empty_p(expected_msg_list));
 | 
					    furi_check(!MsgList_empty_p(expected_msg_list));
 | 
				
			||||||
    furi_check(session < TEST_RPC_SESSIONS);
 | 
					    furi_check(session < TEST_RPC_SESSIONS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rpc_session[session].timeout = xTaskGetTickCount() + MAX_RECEIVE_OUTPUT_TIMEOUT;
 | 
					    rpc_session[session].timeout = furi_get_tick() + MAX_RECEIVE_OUTPUT_TIMEOUT;
 | 
				
			||||||
    pb_istream_t istream = {
 | 
					    pb_istream_t istream = {
 | 
				
			||||||
        .callback = test_rpc_pb_stream_read,
 | 
					        .callback = test_rpc_pb_stream_read,
 | 
				
			||||||
        .state = &rpc_session[session],
 | 
					        .state = &rpc_session[session],
 | 
				
			||||||
@ -712,7 +714,7 @@ static void test_rpc_decode_and_compare(MsgList_t expected_msg_list, uint8_t ses
 | 
				
			|||||||
            pb_release(&PB_Main_msg, &result);
 | 
					            pb_release(&PB_Main_msg, &result);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rpc_session[session].timeout = xTaskGetTickCount() + 50;
 | 
					    rpc_session[session].timeout = furi_get_tick() + 50;
 | 
				
			||||||
    if(pb_decode_ex(&istream, &PB_Main_msg, &result, PB_DECODE_DELIMITED)) {
 | 
					    if(pb_decode_ex(&istream, &PB_Main_msg, &result, PB_DECODE_DELIMITED)) {
 | 
				
			||||||
        mu_fail("decoded more than expected");
 | 
					        mu_fail("decoded more than expected");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -65,8 +65,8 @@ const UnitTest unit_tests[] = {
 | 
				
			|||||||
void minunit_print_progress() {
 | 
					void minunit_print_progress() {
 | 
				
			||||||
    static const char progress[] = {'\\', '|', '/', '-'};
 | 
					    static const char progress[] = {'\\', '|', '/', '-'};
 | 
				
			||||||
    static uint8_t progress_counter = 0;
 | 
					    static uint8_t progress_counter = 0;
 | 
				
			||||||
    static TickType_t last_tick = 0;
 | 
					    static uint32_t last_tick = 0;
 | 
				
			||||||
    TickType_t current_tick = xTaskGetTickCount();
 | 
					    uint32_t current_tick = furi_get_tick();
 | 
				
			||||||
    if(current_tick - last_tick > 20) {
 | 
					    if(current_tick - last_tick > 20) {
 | 
				
			||||||
        last_tick = current_tick;
 | 
					        last_tick = current_tick;
 | 
				
			||||||
        printf("[%c]\033[3D", progress[++progress_counter % COUNT_OF(progress)]);
 | 
					        printf("[%c]\033[3D", progress[++progress_counter % COUNT_OF(progress)]);
 | 
				
			||||||
 | 
				
			|||||||
@ -384,18 +384,17 @@ void infrared_play_notification_message(
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void infrared_show_loading_popup(const InfraredApp* infrared, bool show) {
 | 
					void infrared_show_loading_popup(const InfraredApp* infrared, bool show) {
 | 
				
			||||||
    TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
 | 
					 | 
				
			||||||
    ViewStack* view_stack = infrared->view_stack;
 | 
					    ViewStack* view_stack = infrared->view_stack;
 | 
				
			||||||
    Loading* loading = infrared->loading;
 | 
					    Loading* loading = infrared->loading;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(show) {
 | 
					    if(show) {
 | 
				
			||||||
        // Raise timer priority so that animations can play
 | 
					        // Raise timer priority so that animations can play
 | 
				
			||||||
        vTaskPrioritySet(timer_task, configMAX_PRIORITIES - 1);
 | 
					        furi_timer_set_thread_priority(FuriTimerThreadPriorityElevated);
 | 
				
			||||||
        view_stack_add_view(view_stack, loading_get_view(loading));
 | 
					        view_stack_add_view(view_stack, loading_get_view(loading));
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        view_stack_remove_view(view_stack, loading_get_view(loading));
 | 
					        view_stack_remove_view(view_stack, loading_get_view(loading));
 | 
				
			||||||
        // Restore default timer priority
 | 
					        // Restore default timer priority
 | 
				
			||||||
        vTaskPrioritySet(timer_task, configTIMER_TASK_PRIORITY);
 | 
					        furi_timer_set_thread_priority(FuriTimerThreadPriorityNormal);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -411,15 +411,14 @@ bool nfc_load_from_file_select(NfcApp* instance) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void nfc_show_loading_popup(void* context, bool show) {
 | 
					void nfc_show_loading_popup(void* context, bool show) {
 | 
				
			||||||
    NfcApp* nfc = context;
 | 
					    NfcApp* nfc = context;
 | 
				
			||||||
    TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(show) {
 | 
					    if(show) {
 | 
				
			||||||
        // Raise timer priority so that animations can play
 | 
					        // Raise timer priority so that animations can play
 | 
				
			||||||
        vTaskPrioritySet(timer_task, configMAX_PRIORITIES - 1);
 | 
					        furi_timer_set_thread_priority(FuriTimerThreadPriorityElevated);
 | 
				
			||||||
        view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewLoading);
 | 
					        view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewLoading);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        // Restore default timer priority
 | 
					        // Restore default timer priority
 | 
				
			||||||
        vTaskPrioritySet(timer_task, configTIMER_TASK_PRIORITY);
 | 
					        furi_timer_set_thread_priority(FuriTimerThreadPriorityNormal);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -91,7 +91,7 @@ void subghz_view_receiver_set_lock(SubGhzViewReceiver* subghz_receiver, bool loc
 | 
				
			|||||||
            SubGhzViewReceiverModel * model,
 | 
					            SubGhzViewReceiverModel * model,
 | 
				
			||||||
            { model->bar_show = SubGhzViewReceiverBarShowLock; },
 | 
					            { model->bar_show = SubGhzViewReceiverBarShowLock; },
 | 
				
			||||||
            true);
 | 
					            true);
 | 
				
			||||||
        furi_timer_start(subghz_receiver->timer, pdMS_TO_TICKS(1000));
 | 
					        furi_timer_start(subghz_receiver->timer, 1000);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        with_view_model(
 | 
					        with_view_model(
 | 
				
			||||||
            subghz_receiver->view,
 | 
					            subghz_receiver->view,
 | 
				
			||||||
@ -316,7 +316,7 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) {
 | 
				
			|||||||
            { model->bar_show = SubGhzViewReceiverBarShowToUnlockPress; },
 | 
					            { model->bar_show = SubGhzViewReceiverBarShowToUnlockPress; },
 | 
				
			||||||
            true);
 | 
					            true);
 | 
				
			||||||
        if(subghz_receiver->lock_count == 0) {
 | 
					        if(subghz_receiver->lock_count == 0) {
 | 
				
			||||||
            furi_timer_start(subghz_receiver->timer, pdMS_TO_TICKS(1000));
 | 
					            furi_timer_start(subghz_receiver->timer, 1000);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if(event->key == InputKeyBack && event->type == InputTypeShort) {
 | 
					        if(event->key == InputKeyBack && event->type == InputTypeShort) {
 | 
				
			||||||
            subghz_receiver->lock_count++;
 | 
					            subghz_receiver->lock_count++;
 | 
				
			||||||
@ -330,7 +330,7 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) {
 | 
				
			|||||||
                { model->bar_show = SubGhzViewReceiverBarShowUnlock; },
 | 
					                { model->bar_show = SubGhzViewReceiverBarShowUnlock; },
 | 
				
			||||||
                true);
 | 
					                true);
 | 
				
			||||||
            //subghz_receiver->lock = false;
 | 
					            //subghz_receiver->lock = false;
 | 
				
			||||||
            furi_timer_start(subghz_receiver->timer, pdMS_TO_TICKS(650));
 | 
					            furi_timer_start(subghz_receiver->timer, 650);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
#include <dolphin/dolphin.h>
 | 
					#include <dolphin/dolphin.h>
 | 
				
			||||||
#include <power/power_service/power.h>
 | 
					#include <power/power_service/power.h>
 | 
				
			||||||
#include <storage/storage.h>
 | 
					#include <storage/storage.h>
 | 
				
			||||||
@ -450,7 +449,7 @@ void animation_manager_unload_and_stall_animation(AnimationManager* animation_ma
 | 
				
			|||||||
        animation_manager->state = AnimationManagerStateFreezedIdle;
 | 
					        animation_manager->state = AnimationManagerStateFreezedIdle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        animation_manager->freezed_animation_time_left =
 | 
					        animation_manager->freezed_animation_time_left =
 | 
				
			||||||
            xTimerGetExpiryTime(animation_manager->idle_animation_timer) - xTaskGetTickCount();
 | 
					            furi_timer_get_expire_time(animation_manager->idle_animation_timer) - furi_get_tick();
 | 
				
			||||||
        if(animation_manager->freezed_animation_time_left < 0) {
 | 
					        if(animation_manager->freezed_animation_time_left < 0) {
 | 
				
			||||||
            animation_manager->freezed_animation_time_left = 0;
 | 
					            animation_manager->freezed_animation_time_left = 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -304,7 +304,7 @@ static bool animation_storage_load_frames(
 | 
				
			|||||||
        if(file_info.size > max_filesize) {
 | 
					        if(file_info.size > max_filesize) {
 | 
				
			||||||
            FURI_LOG_E(
 | 
					            FURI_LOG_E(
 | 
				
			||||||
                TAG,
 | 
					                TAG,
 | 
				
			||||||
                "Filesize %lld, max: %d (width %d, height %d)",
 | 
					                "Filesize %llu, max: %zu (width %u, height %u)",
 | 
				
			||||||
                file_info.size,
 | 
					                file_info.size,
 | 
				
			||||||
                max_filesize,
 | 
					                max_filesize,
 | 
				
			||||||
                width,
 | 
					                width,
 | 
				
			||||||
@ -329,7 +329,7 @@ static bool animation_storage_load_frames(
 | 
				
			|||||||
    if(!frames_ok) {
 | 
					    if(!frames_ok) {
 | 
				
			||||||
        FURI_LOG_E(
 | 
					        FURI_LOG_E(
 | 
				
			||||||
            TAG,
 | 
					            TAG,
 | 
				
			||||||
            "Load \'%s\' failed, %dx%d, size: %lld",
 | 
					            "Load \'%s\' failed, %ux%u, size: %llu",
 | 
				
			||||||
            furi_string_get_cstr(filename),
 | 
					            furi_string_get_cstr(filename),
 | 
				
			||||||
            width,
 | 
					            width,
 | 
				
			||||||
            height,
 | 
					            height,
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ typedef struct {
 | 
				
			|||||||
    uint8_t active_bubbles;
 | 
					    uint8_t active_bubbles;
 | 
				
			||||||
    uint8_t passive_bubbles;
 | 
					    uint8_t passive_bubbles;
 | 
				
			||||||
    uint8_t active_shift;
 | 
					    uint8_t active_shift;
 | 
				
			||||||
    TickType_t active_ended_at;
 | 
					    uint32_t active_ended_at;
 | 
				
			||||||
    Icon* freeze_frame;
 | 
					    Icon* freeze_frame;
 | 
				
			||||||
} BubbleAnimationViewModel;
 | 
					} BubbleAnimationViewModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -154,7 +154,7 @@ static void bubble_animation_activate(BubbleAnimationView* view, bool force) {
 | 
				
			|||||||
    if(model->current != NULL) {
 | 
					    if(model->current != NULL) {
 | 
				
			||||||
        if(!force) {
 | 
					        if(!force) {
 | 
				
			||||||
            if((model->active_ended_at + model->current->active_cooldown * 1000) >
 | 
					            if((model->active_ended_at + model->current->active_cooldown * 1000) >
 | 
				
			||||||
               xTaskGetTickCount()) {
 | 
					               furi_get_tick()) {
 | 
				
			||||||
                activate = false;
 | 
					                activate = false;
 | 
				
			||||||
            } else if(model->active_shift) {
 | 
					            } else if(model->active_shift) {
 | 
				
			||||||
                activate = false;
 | 
					                activate = false;
 | 
				
			||||||
@ -215,7 +215,7 @@ static void bubble_animation_next_frame(BubbleAnimationViewModel* model) {
 | 
				
			|||||||
            model->active_cycle = 0;
 | 
					            model->active_cycle = 0;
 | 
				
			||||||
            model->current_frame = 0;
 | 
					            model->current_frame = 0;
 | 
				
			||||||
            model->current_bubble = bubble_animation_pick_bubble(model, false);
 | 
					            model->current_bubble = bubble_animation_pick_bubble(model, false);
 | 
				
			||||||
            model->active_ended_at = xTaskGetTickCount();
 | 
					            model->active_ended_at = furi_get_tick();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(model->current_bubble) {
 | 
					        if(model->current_bubble) {
 | 
				
			||||||
@ -355,7 +355,7 @@ void bubble_animation_view_set_animation(
 | 
				
			|||||||
    furi_assert(model);
 | 
					    furi_assert(model);
 | 
				
			||||||
    model->current = new_animation;
 | 
					    model->current = new_animation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    model->active_ended_at = xTaskGetTickCount() - (model->current->active_cooldown * 1000);
 | 
					    model->active_ended_at = furi_get_tick() - (model->current->active_cooldown * 1000);
 | 
				
			||||||
    model->active_bubbles = 0;
 | 
					    model->active_bubbles = 0;
 | 
				
			||||||
    model->passive_bubbles = 0;
 | 
					    model->passive_bubbles = 0;
 | 
				
			||||||
    for(int i = 0; i < new_animation->frame_bubble_sequences_count; ++i) {
 | 
					    for(int i = 0; i < new_animation->frame_bubble_sequences_count; ++i) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "one_shot_animation_view.h"
 | 
					#include "one_shot_animation_view.h"
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
#include <gui/canvas.h>
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
#include <gui/view.h>
 | 
					#include <gui/view.h>
 | 
				
			||||||
#include <gui/icon_i.h>
 | 
					#include <gui/icon_i.h>
 | 
				
			||||||
@ -11,7 +10,7 @@ typedef void (*OneShotInteractCallback)(void*);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct OneShotView {
 | 
					struct OneShotView {
 | 
				
			||||||
    View* view;
 | 
					    View* view;
 | 
				
			||||||
    TimerHandle_t update_timer;
 | 
					    FuriTimer* update_timer;
 | 
				
			||||||
    OneShotInteractCallback interact_callback;
 | 
					    OneShotInteractCallback interact_callback;
 | 
				
			||||||
    void* interact_callback_context;
 | 
					    void* interact_callback_context;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -22,8 +21,8 @@ typedef struct {
 | 
				
			|||||||
    bool block_input;
 | 
					    bool block_input;
 | 
				
			||||||
} OneShotViewModel;
 | 
					} OneShotViewModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void one_shot_view_update_timer_callback(TimerHandle_t xTimer) {
 | 
					static void one_shot_view_update_timer_callback(void* context) {
 | 
				
			||||||
    OneShotView* view = (void*)pvTimerGetTimerID(xTimer);
 | 
					    OneShotView* view = context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OneShotViewModel* model = view_get_model(view->view);
 | 
					    OneShotViewModel* model = view_get_model(view->view);
 | 
				
			||||||
    if((model->index + 1) < model->icon->frame_count) {
 | 
					    if((model->index + 1) < model->icon->frame_count) {
 | 
				
			||||||
@ -81,7 +80,7 @@ OneShotView* one_shot_view_alloc(void) {
 | 
				
			|||||||
    OneShotView* view = malloc(sizeof(OneShotView));
 | 
					    OneShotView* view = malloc(sizeof(OneShotView));
 | 
				
			||||||
    view->view = view_alloc();
 | 
					    view->view = view_alloc();
 | 
				
			||||||
    view->update_timer =
 | 
					    view->update_timer =
 | 
				
			||||||
        xTimerCreate(NULL, 1000, pdTRUE, view, one_shot_view_update_timer_callback);
 | 
					        furi_timer_alloc(one_shot_view_update_timer_callback, FuriTimerTypePeriodic, view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    view_allocate_model(view->view, ViewModelTypeLocking, sizeof(OneShotViewModel));
 | 
					    view_allocate_model(view->view, ViewModelTypeLocking, sizeof(OneShotViewModel));
 | 
				
			||||||
    view_set_context(view->view, view);
 | 
					    view_set_context(view->view, view);
 | 
				
			||||||
@ -94,7 +93,7 @@ OneShotView* one_shot_view_alloc(void) {
 | 
				
			|||||||
void one_shot_view_free(OneShotView* view) {
 | 
					void one_shot_view_free(OneShotView* view) {
 | 
				
			||||||
    furi_assert(view);
 | 
					    furi_assert(view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xTimerDelete(view->update_timer, portMAX_DELAY);
 | 
					    furi_timer_free(view->update_timer);
 | 
				
			||||||
    view_free(view->view);
 | 
					    view_free(view->view);
 | 
				
			||||||
    view->view = NULL;
 | 
					    view->view = NULL;
 | 
				
			||||||
    free(view);
 | 
					    free(view);
 | 
				
			||||||
@ -120,7 +119,7 @@ void one_shot_view_start_animation(OneShotView* view, const Icon* icon) {
 | 
				
			|||||||
    model->icon = icon;
 | 
					    model->icon = icon;
 | 
				
			||||||
    model->block_input = true;
 | 
					    model->block_input = true;
 | 
				
			||||||
    view_commit_model(view->view, true);
 | 
					    view_commit_model(view->view, true);
 | 
				
			||||||
    xTimerChangePeriod(view->update_timer, 1000 / model->icon->frame_rate, portMAX_DELAY);
 | 
					    furi_timer_start(view->update_timer, 1000 / model->icon->frame_rate);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
View* one_shot_view_get_view(OneShotView* view) {
 | 
					View* one_shot_view_get_view(OneShotView* view) {
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@
 | 
				
			|||||||
#include <gui/scene_manager.h>
 | 
					#include <gui/scene_manager.h>
 | 
				
			||||||
#include <gui/view_stack.h>
 | 
					#include <gui/view_stack.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../desktop.h"
 | 
					#include "../desktop.h"
 | 
				
			||||||
#include "../desktop_i.h"
 | 
					#include "../desktop_i.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@
 | 
				
			|||||||
#include <gui/scene_manager.h>
 | 
					#include <gui/scene_manager.h>
 | 
				
			||||||
#include <gui/view_stack.h>
 | 
					#include <gui/view_stack.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
#include <notification/notification.h>
 | 
					#include <notification/notification.h>
 | 
				
			||||||
#include <notification/notification_messages.h>
 | 
					#include <notification/notification_messages.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -20,7 +19,7 @@
 | 
				
			|||||||
#define INPUT_PIN_VIEW_TIMEOUT 15000
 | 
					#define INPUT_PIN_VIEW_TIMEOUT 15000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
    TimerHandle_t timer;
 | 
					    FuriTimer* timer;
 | 
				
			||||||
} DesktopScenePinInputState;
 | 
					} DesktopScenePinInputState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void desktop_scene_locked_light_red(bool value) {
 | 
					static void desktop_scene_locked_light_red(bool value) {
 | 
				
			||||||
@ -33,17 +32,16 @@ static void desktop_scene_locked_light_red(bool value) {
 | 
				
			|||||||
    furi_record_close(RECORD_NOTIFICATION);
 | 
					    furi_record_close(RECORD_NOTIFICATION);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void desktop_scene_pin_input_set_timer(Desktop* desktop, bool enable, uint32_t new_period) {
 | 
				
			||||||
    desktop_scene_pin_input_set_timer(Desktop* desktop, bool enable, TickType_t new_period) {
 | 
					 | 
				
			||||||
    furi_assert(desktop);
 | 
					    furi_assert(desktop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DesktopScenePinInputState* state = (DesktopScenePinInputState*)scene_manager_get_scene_state(
 | 
					    DesktopScenePinInputState* state = (DesktopScenePinInputState*)scene_manager_get_scene_state(
 | 
				
			||||||
        desktop->scene_manager, DesktopScenePinInput);
 | 
					        desktop->scene_manager, DesktopScenePinInput);
 | 
				
			||||||
    furi_assert(state);
 | 
					    furi_assert(state);
 | 
				
			||||||
    if(enable) {
 | 
					    if(enable) {
 | 
				
			||||||
        xTimerChangePeriod(state->timer, new_period, portMAX_DELAY);
 | 
					        furi_timer_start(state->timer, new_period);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        xTimerStop(state->timer, portMAX_DELAY);
 | 
					        furi_timer_stop(state->timer);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -64,8 +62,8 @@ static void desktop_scene_pin_input_done_callback(const PinCode* pin_code, void*
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void desktop_scene_pin_input_timer_callback(TimerHandle_t timer) {
 | 
					static void desktop_scene_pin_input_timer_callback(void* context) {
 | 
				
			||||||
    Desktop* desktop = pvTimerGetTimerID(timer);
 | 
					    Desktop* desktop = context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    view_dispatcher_send_custom_event(
 | 
					    view_dispatcher_send_custom_event(
 | 
				
			||||||
        desktop->view_dispatcher, DesktopPinInputEventResetWrongPinLabel);
 | 
					        desktop->view_dispatcher, DesktopPinInputEventResetWrongPinLabel);
 | 
				
			||||||
@ -84,7 +82,7 @@ void desktop_scene_pin_input_on_enter(void* context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    DesktopScenePinInputState* state = malloc(sizeof(DesktopScenePinInputState));
 | 
					    DesktopScenePinInputState* state = malloc(sizeof(DesktopScenePinInputState));
 | 
				
			||||||
    state->timer =
 | 
					    state->timer =
 | 
				
			||||||
        xTimerCreate(NULL, 10000, pdFALSE, desktop, desktop_scene_pin_input_timer_callback);
 | 
					        furi_timer_alloc(desktop_scene_pin_input_timer_callback, FuriTimerTypeOnce, desktop);
 | 
				
			||||||
    scene_manager_set_scene_state(desktop->scene_manager, DesktopScenePinInput, (uint32_t)state);
 | 
					    scene_manager_set_scene_state(desktop->scene_manager, DesktopScenePinInput, (uint32_t)state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    desktop_view_pin_input_hide_pin(desktop->pin_input_view, true);
 | 
					    desktop_view_pin_input_hide_pin(desktop->pin_input_view, true);
 | 
				
			||||||
@ -149,10 +147,7 @@ void desktop_scene_pin_input_on_exit(void* context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    DesktopScenePinInputState* state = (DesktopScenePinInputState*)scene_manager_get_scene_state(
 | 
					    DesktopScenePinInputState* state = (DesktopScenePinInputState*)scene_manager_get_scene_state(
 | 
				
			||||||
        desktop->scene_manager, DesktopScenePinInput);
 | 
					        desktop->scene_manager, DesktopScenePinInput);
 | 
				
			||||||
    xTimerStop(state->timer, portMAX_DELAY);
 | 
					
 | 
				
			||||||
    while(xTimerIsTimerActive(state->timer)) {
 | 
					    furi_timer_free(state->timer);
 | 
				
			||||||
        furi_delay_tick(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    xTimerDelete(state->timer, portMAX_DELAY);
 | 
					 | 
				
			||||||
    free(state);
 | 
					    free(state);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,5 @@
 | 
				
			|||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <FreeRTOS.h>
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
#include <gui/scene_manager.h>
 | 
					#include <gui/scene_manager.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../desktop_i.h"
 | 
					#include "../desktop_i.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,6 @@
 | 
				
			|||||||
#include <gui/icon.h>
 | 
					#include <gui/icon.h>
 | 
				
			||||||
#include <gui/view.h>
 | 
					#include <gui/view.h>
 | 
				
			||||||
#include <assets_icons.h>
 | 
					#include <assets_icons.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <desktop/desktop_settings.h>
 | 
					#include <desktop/desktop_settings.h>
 | 
				
			||||||
#include "../desktop_i.h"
 | 
					#include "../desktop_i.h"
 | 
				
			||||||
@ -29,7 +28,7 @@ struct DesktopViewLocked {
 | 
				
			|||||||
    DesktopViewLockedCallback callback;
 | 
					    DesktopViewLockedCallback callback;
 | 
				
			||||||
    void* context;
 | 
					    void* context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TimerHandle_t timer;
 | 
					    FuriTimer* timer;
 | 
				
			||||||
    uint8_t lock_count;
 | 
					    uint8_t lock_count;
 | 
				
			||||||
    uint32_t lock_lastpress;
 | 
					    uint32_t lock_lastpress;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -58,8 +57,8 @@ void desktop_view_locked_set_callback(
 | 
				
			|||||||
    locked_view->context = context;
 | 
					    locked_view->context = context;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void locked_view_timer_callback(TimerHandle_t timer) {
 | 
					static void locked_view_timer_callback(void* context) {
 | 
				
			||||||
    DesktopViewLocked* locked_view = pvTimerGetTimerID(timer);
 | 
					    DesktopViewLocked* locked_view = context;
 | 
				
			||||||
    locked_view->callback(DesktopLockedEventUpdate, locked_view->context);
 | 
					    locked_view->callback(DesktopLockedEventUpdate, locked_view->context);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -90,7 +89,7 @@ static void desktop_view_locked_update_hint_icon_timeout(DesktopViewLocked* lock
 | 
				
			|||||||
        model->view_state = DesktopViewLockedStateLockedHintShown;
 | 
					        model->view_state = DesktopViewLockedStateLockedHintShown;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    view_commit_model(locked_view->view, change_state);
 | 
					    view_commit_model(locked_view->view, change_state);
 | 
				
			||||||
    xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(LOCKED_HINT_TIMEOUT_MS), portMAX_DELAY);
 | 
					    furi_timer_start(locked_view->timer, LOCKED_HINT_TIMEOUT_MS);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void desktop_view_locked_update(DesktopViewLocked* locked_view) {
 | 
					void desktop_view_locked_update(DesktopViewLocked* locked_view) {
 | 
				
			||||||
@ -110,7 +109,7 @@ void desktop_view_locked_update(DesktopViewLocked* locked_view) {
 | 
				
			|||||||
    view_commit_model(locked_view->view, true);
 | 
					    view_commit_model(locked_view->view, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(view_state != DesktopViewLockedStateDoorsClosing) {
 | 
					    if(view_state != DesktopViewLockedStateDoorsClosing) {
 | 
				
			||||||
        xTimerStop(locked_view->timer, portMAX_DELAY);
 | 
					        furi_timer_stop(locked_view->timer);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -148,7 +147,7 @@ static bool desktop_view_locked_input(InputEvent* event, void* context) {
 | 
				
			|||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool is_changed = false;
 | 
					    bool is_changed = false;
 | 
				
			||||||
    const uint32_t press_time = xTaskGetTickCount();
 | 
					    const uint32_t press_time = furi_get_tick();
 | 
				
			||||||
    DesktopViewLocked* locked_view = context;
 | 
					    DesktopViewLocked* locked_view = context;
 | 
				
			||||||
    DesktopViewLockedModel* model = view_get_model(locked_view->view);
 | 
					    DesktopViewLockedModel* model = view_get_model(locked_view->view);
 | 
				
			||||||
    if(model->view_state == DesktopViewLockedStateUnlockedHintShown &&
 | 
					    if(model->view_state == DesktopViewLockedStateUnlockedHintShown &&
 | 
				
			||||||
@ -196,7 +195,7 @@ DesktopViewLocked* desktop_view_locked_alloc() {
 | 
				
			|||||||
    DesktopViewLocked* locked_view = malloc(sizeof(DesktopViewLocked));
 | 
					    DesktopViewLocked* locked_view = malloc(sizeof(DesktopViewLocked));
 | 
				
			||||||
    locked_view->view = view_alloc();
 | 
					    locked_view->view = view_alloc();
 | 
				
			||||||
    locked_view->timer =
 | 
					    locked_view->timer =
 | 
				
			||||||
        xTimerCreate(NULL, 1000 / 16, pdTRUE, locked_view, locked_view_timer_callback);
 | 
					        furi_timer_alloc(locked_view_timer_callback, FuriTimerTypePeriodic, locked_view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    view_allocate_model(locked_view->view, ViewModelTypeLocking, sizeof(DesktopViewLockedModel));
 | 
					    view_allocate_model(locked_view->view, ViewModelTypeLocking, sizeof(DesktopViewLockedModel));
 | 
				
			||||||
    view_set_context(locked_view->view, locked_view);
 | 
					    view_set_context(locked_view->view, locked_view);
 | 
				
			||||||
@ -219,7 +218,7 @@ void desktop_view_locked_close_doors(DesktopViewLocked* locked_view) {
 | 
				
			|||||||
    model->view_state = DesktopViewLockedStateDoorsClosing;
 | 
					    model->view_state = DesktopViewLockedStateDoorsClosing;
 | 
				
			||||||
    model->door_offset = DOOR_OFFSET_START;
 | 
					    model->door_offset = DOOR_OFFSET_START;
 | 
				
			||||||
    view_commit_model(locked_view->view, true);
 | 
					    view_commit_model(locked_view->view, true);
 | 
				
			||||||
    xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(DOOR_MOVING_INTERVAL_MS), portMAX_DELAY);
 | 
					    furi_timer_start(locked_view->timer, DOOR_MOVING_INTERVAL_MS);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) {
 | 
					void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) {
 | 
				
			||||||
@ -236,7 +235,7 @@ void desktop_view_locked_unlock(DesktopViewLocked* locked_view) {
 | 
				
			|||||||
    model->view_state = DesktopViewLockedStateUnlockedHintShown;
 | 
					    model->view_state = DesktopViewLockedStateUnlockedHintShown;
 | 
				
			||||||
    model->pin_locked = false;
 | 
					    model->pin_locked = false;
 | 
				
			||||||
    view_commit_model(locked_view->view, true);
 | 
					    view_commit_model(locked_view->view, true);
 | 
				
			||||||
    xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(UNLOCKED_HINT_TIMEOUT_MS), portMAX_DELAY);
 | 
					    furi_timer_start(locked_view->timer, UNLOCKED_HINT_TIMEOUT_MS);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool desktop_view_locked_is_locked_hint_visible(DesktopViewLocked* locked_view) {
 | 
					bool desktop_view_locked_is_locked_hint_visible(DesktopViewLocked* locked_view) {
 | 
				
			||||||
 | 
				
			|||||||
@ -13,14 +13,14 @@ struct DesktopMainView {
 | 
				
			|||||||
    View* view;
 | 
					    View* view;
 | 
				
			||||||
    DesktopMainViewCallback callback;
 | 
					    DesktopMainViewCallback callback;
 | 
				
			||||||
    void* context;
 | 
					    void* context;
 | 
				
			||||||
    TimerHandle_t poweroff_timer;
 | 
					    FuriTimer* poweroff_timer;
 | 
				
			||||||
    bool dummy_mode;
 | 
					    bool dummy_mode;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT 5000
 | 
					#define DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT 5000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void desktop_main_poweroff_timer_callback(TimerHandle_t timer) {
 | 
					static void desktop_main_poweroff_timer_callback(void* context) {
 | 
				
			||||||
    DesktopMainView* main_view = pvTimerGetTimerID(timer);
 | 
					    DesktopMainView* main_view = context;
 | 
				
			||||||
    main_view->callback(DesktopMainEventOpenPowerOff, main_view->context);
 | 
					    main_view->callback(DesktopMainEventOpenPowerOff, main_view->context);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -90,12 +90,9 @@ bool desktop_main_input_callback(InputEvent* event, void* context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if(event->key == InputKeyBack) {
 | 
					    if(event->key == InputKeyBack) {
 | 
				
			||||||
        if(event->type == InputTypePress) {
 | 
					        if(event->type == InputTypePress) {
 | 
				
			||||||
            xTimerChangePeriod(
 | 
					            furi_timer_start(main_view->poweroff_timer, DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT);
 | 
				
			||||||
                main_view->poweroff_timer,
 | 
					 | 
				
			||||||
                pdMS_TO_TICKS(DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT),
 | 
					 | 
				
			||||||
                portMAX_DELAY);
 | 
					 | 
				
			||||||
        } else if(event->type == InputTypeRelease) {
 | 
					        } else if(event->type == InputTypeRelease) {
 | 
				
			||||||
            xTimerStop(main_view->poweroff_timer, portMAX_DELAY);
 | 
					            furi_timer_stop(main_view->poweroff_timer);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -109,12 +106,8 @@ DesktopMainView* desktop_main_alloc() {
 | 
				
			|||||||
    view_set_context(main_view->view, main_view);
 | 
					    view_set_context(main_view->view, main_view);
 | 
				
			||||||
    view_set_input_callback(main_view->view, desktop_main_input_callback);
 | 
					    view_set_input_callback(main_view->view, desktop_main_input_callback);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    main_view->poweroff_timer = xTimerCreate(
 | 
					    main_view->poweroff_timer =
 | 
				
			||||||
        NULL,
 | 
					        furi_timer_alloc(desktop_main_poweroff_timer_callback, FuriTimerTypeOnce, main_view);
 | 
				
			||||||
        pdMS_TO_TICKS(DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT),
 | 
					 | 
				
			||||||
        pdFALSE,
 | 
					 | 
				
			||||||
        main_view,
 | 
					 | 
				
			||||||
        desktop_main_poweroff_timer_callback);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return main_view;
 | 
					    return main_view;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@
 | 
				
			|||||||
#include <gui/elements.h>
 | 
					#include <gui/elements.h>
 | 
				
			||||||
#include <assets_icons.h>
 | 
					#include <assets_icons.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "desktop_view_pin_input.h"
 | 
					#include "desktop_view_pin_input.h"
 | 
				
			||||||
#include <desktop/desktop_settings.h>
 | 
					#include <desktop/desktop_settings.h>
 | 
				
			||||||
@ -21,7 +20,7 @@ struct DesktopViewPinInput {
 | 
				
			|||||||
    DesktopViewPinInputCallback timeout_callback;
 | 
					    DesktopViewPinInputCallback timeout_callback;
 | 
				
			||||||
    DesktopViewPinInputDoneCallback done_callback;
 | 
					    DesktopViewPinInputDoneCallback done_callback;
 | 
				
			||||||
    void* context;
 | 
					    void* context;
 | 
				
			||||||
    TimerHandle_t timer;
 | 
					    FuriTimer* timer;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
@ -90,7 +89,7 @@ static bool desktop_view_pin_input_input(InputEvent* event, void* context) {
 | 
				
			|||||||
        pin_input->back_callback(pin_input->context);
 | 
					        pin_input->back_callback(pin_input->context);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xTimerStart(pin_input->timer, 0);
 | 
					    furi_timer_start(pin_input->timer, NO_ACTIVITY_TIMEOUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -170,8 +169,8 @@ static void desktop_view_pin_input_draw(Canvas* canvas, void* context) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void desktop_view_pin_input_timer_callback(TimerHandle_t timer) {
 | 
					void desktop_view_pin_input_timer_callback(void* context) {
 | 
				
			||||||
    DesktopViewPinInput* pin_input = pvTimerGetTimerID(timer);
 | 
					    DesktopViewPinInput* pin_input = context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(pin_input->timeout_callback) {
 | 
					    if(pin_input->timeout_callback) {
 | 
				
			||||||
        pin_input->timeout_callback(pin_input->context);
 | 
					        pin_input->timeout_callback(pin_input->context);
 | 
				
			||||||
@ -180,12 +179,12 @@ void desktop_view_pin_input_timer_callback(TimerHandle_t timer) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void desktop_view_pin_input_enter(void* context) {
 | 
					static void desktop_view_pin_input_enter(void* context) {
 | 
				
			||||||
    DesktopViewPinInput* pin_input = context;
 | 
					    DesktopViewPinInput* pin_input = context;
 | 
				
			||||||
    xTimerStart(pin_input->timer, portMAX_DELAY);
 | 
					    furi_timer_start(pin_input->timer, NO_ACTIVITY_TIMEOUT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void desktop_view_pin_input_exit(void* context) {
 | 
					static void desktop_view_pin_input_exit(void* context) {
 | 
				
			||||||
    DesktopViewPinInput* pin_input = context;
 | 
					    DesktopViewPinInput* pin_input = context;
 | 
				
			||||||
    xTimerStop(pin_input->timer, portMAX_DELAY);
 | 
					    furi_timer_stop(pin_input->timer);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DesktopViewPinInput* desktop_view_pin_input_alloc(void) {
 | 
					DesktopViewPinInput* desktop_view_pin_input_alloc(void) {
 | 
				
			||||||
@ -195,12 +194,8 @@ DesktopViewPinInput* desktop_view_pin_input_alloc(void) {
 | 
				
			|||||||
    view_set_context(pin_input->view, pin_input);
 | 
					    view_set_context(pin_input->view, pin_input);
 | 
				
			||||||
    view_set_draw_callback(pin_input->view, desktop_view_pin_input_draw);
 | 
					    view_set_draw_callback(pin_input->view, desktop_view_pin_input_draw);
 | 
				
			||||||
    view_set_input_callback(pin_input->view, desktop_view_pin_input_input);
 | 
					    view_set_input_callback(pin_input->view, desktop_view_pin_input_input);
 | 
				
			||||||
    pin_input->timer = xTimerCreate(
 | 
					    pin_input->timer =
 | 
				
			||||||
        NULL,
 | 
					        furi_timer_alloc(desktop_view_pin_input_timer_callback, FuriTimerTypeOnce, pin_input);
 | 
				
			||||||
        pdMS_TO_TICKS(NO_ACTIVITY_TIMEOUT),
 | 
					 | 
				
			||||||
        pdFALSE,
 | 
					 | 
				
			||||||
        pin_input,
 | 
					 | 
				
			||||||
        desktop_view_pin_input_timer_callback);
 | 
					 | 
				
			||||||
    view_set_enter_callback(pin_input->view, desktop_view_pin_input_enter);
 | 
					    view_set_enter_callback(pin_input->view, desktop_view_pin_input_enter);
 | 
				
			||||||
    view_set_exit_callback(pin_input->view, desktop_view_pin_input_exit);
 | 
					    view_set_exit_callback(pin_input->view, desktop_view_pin_input_exit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -216,11 +211,7 @@ DesktopViewPinInput* desktop_view_pin_input_alloc(void) {
 | 
				
			|||||||
void desktop_view_pin_input_free(DesktopViewPinInput* pin_input) {
 | 
					void desktop_view_pin_input_free(DesktopViewPinInput* pin_input) {
 | 
				
			||||||
    furi_assert(pin_input);
 | 
					    furi_assert(pin_input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xTimerStop(pin_input->timer, portMAX_DELAY);
 | 
					    furi_timer_free(pin_input->timer);
 | 
				
			||||||
    while(xTimerIsTimerActive(pin_input->timer)) {
 | 
					 | 
				
			||||||
        furi_delay_tick(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    xTimerDelete(pin_input->timer, portMAX_DELAY);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    view_free(pin_input->view);
 | 
					    view_free(pin_input->view);
 | 
				
			||||||
    free(pin_input);
 | 
					    free(pin_input);
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@
 | 
				
			|||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <FreeRTOS.h>
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
#include <projdefs.h>
 | 
					#include <projdefs.h>
 | 
				
			||||||
#include <input/input.h>
 | 
					#include <input/input.h>
 | 
				
			||||||
#include <gui/canvas.h>
 | 
					#include <gui/canvas.h>
 | 
				
			||||||
@ -13,7 +12,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct DesktopViewPinTimeout {
 | 
					struct DesktopViewPinTimeout {
 | 
				
			||||||
    View* view;
 | 
					    View* view;
 | 
				
			||||||
    TimerHandle_t timer;
 | 
					    FuriTimer* timer;
 | 
				
			||||||
    DesktopViewPinTimeoutDoneCallback callback;
 | 
					    DesktopViewPinTimeoutDoneCallback callback;
 | 
				
			||||||
    void* context;
 | 
					    void* context;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -32,8 +31,8 @@ void desktop_view_pin_timeout_set_callback(
 | 
				
			|||||||
    instance->context = context;
 | 
					    instance->context = context;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void desktop_view_pin_timeout_timer_callback(TimerHandle_t timer) {
 | 
					static void desktop_view_pin_timeout_timer_callback(void* context) {
 | 
				
			||||||
    DesktopViewPinTimeout* instance = pvTimerGetTimerID(timer);
 | 
					    DesktopViewPinTimeout* instance = context;
 | 
				
			||||||
    bool stop = false;
 | 
					    bool stop = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DesktopViewPinTimeoutModel* model = view_get_model(instance->view);
 | 
					    DesktopViewPinTimeoutModel* model = view_get_model(instance->view);
 | 
				
			||||||
@ -45,7 +44,7 @@ static void desktop_view_pin_timeout_timer_callback(TimerHandle_t timer) {
 | 
				
			|||||||
    view_commit_model(instance->view, true);
 | 
					    view_commit_model(instance->view, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(stop) {
 | 
					    if(stop) {
 | 
				
			||||||
        xTimerStop(instance->timer, portMAX_DELAY);
 | 
					        furi_timer_stop(instance->timer);
 | 
				
			||||||
        instance->callback(instance->context);
 | 
					        instance->callback(instance->context);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -73,15 +72,15 @@ static void desktop_view_pin_timeout_draw(Canvas* canvas, void* _model) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void desktop_view_pin_timeout_free(DesktopViewPinTimeout* instance) {
 | 
					void desktop_view_pin_timeout_free(DesktopViewPinTimeout* instance) {
 | 
				
			||||||
    view_free(instance->view);
 | 
					    view_free(instance->view);
 | 
				
			||||||
    xTimerDelete(instance->timer, portMAX_DELAY);
 | 
					    furi_timer_free(instance->timer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    free(instance);
 | 
					    free(instance);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DesktopViewPinTimeout* desktop_view_pin_timeout_alloc(void) {
 | 
					DesktopViewPinTimeout* desktop_view_pin_timeout_alloc(void) {
 | 
				
			||||||
    DesktopViewPinTimeout* instance = malloc(sizeof(DesktopViewPinTimeout));
 | 
					    DesktopViewPinTimeout* instance = malloc(sizeof(DesktopViewPinTimeout));
 | 
				
			||||||
    instance->timer = xTimerCreate(
 | 
					    instance->timer =
 | 
				
			||||||
        NULL, pdMS_TO_TICKS(1000), pdTRUE, instance, desktop_view_pin_timeout_timer_callback);
 | 
					        furi_timer_alloc(desktop_view_pin_timeout_timer_callback, FuriTimerTypePeriodic, instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    instance->view = view_alloc();
 | 
					    instance->view = view_alloc();
 | 
				
			||||||
    view_allocate_model(instance->view, ViewModelTypeLockFree, sizeof(DesktopViewPinTimeoutModel));
 | 
					    view_allocate_model(instance->view, ViewModelTypeLockFree, sizeof(DesktopViewPinTimeoutModel));
 | 
				
			||||||
@ -101,7 +100,7 @@ void desktop_view_pin_timeout_start(DesktopViewPinTimeout* instance, uint32_t ti
 | 
				
			|||||||
    model->time_left = time_left;
 | 
					    model->time_left = time_left;
 | 
				
			||||||
    view_commit_model(instance->view, true);
 | 
					    view_commit_model(instance->view, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xTimerStart(instance->timer, portMAX_DELAY);
 | 
					    furi_timer_start(instance->timer, 1000);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
View* desktop_view_pin_timeout_get_view(DesktopViewPinTimeout* instance) {
 | 
					View* desktop_view_pin_timeout_get_view(DesktopViewPinTimeout* instance) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
#include "dolphin/dolphin.h"
 | 
					#include "dolphin/dolphin.h"
 | 
				
			||||||
#include "dolphin/helpers/dolphin_state.h"
 | 
					#include "dolphin/helpers/dolphin_state.h"
 | 
				
			||||||
#include "dolphin_i.h"
 | 
					#include "dolphin_i.h"
 | 
				
			||||||
#include "portmacro.h"
 | 
					 | 
				
			||||||
#include "projdefs.h"
 | 
					#include "projdefs.h"
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
@ -45,8 +44,8 @@ void dolphin_flush(Dolphin* dolphin) {
 | 
				
			|||||||
    dolphin_event_send_wait(dolphin, &event);
 | 
					    dolphin_event_send_wait(dolphin, &event);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void dolphin_butthurt_timer_callback(TimerHandle_t xTimer) {
 | 
					void dolphin_butthurt_timer_callback(void* context) {
 | 
				
			||||||
    Dolphin* dolphin = pvTimerGetTimerID(xTimer);
 | 
					    Dolphin* dolphin = context;
 | 
				
			||||||
    furi_assert(dolphin);
 | 
					    furi_assert(dolphin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DolphinEvent event;
 | 
					    DolphinEvent event;
 | 
				
			||||||
@ -54,8 +53,8 @@ void dolphin_butthurt_timer_callback(TimerHandle_t xTimer) {
 | 
				
			|||||||
    dolphin_event_send_async(dolphin, &event);
 | 
					    dolphin_event_send_async(dolphin, &event);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void dolphin_flush_timer_callback(TimerHandle_t xTimer) {
 | 
					void dolphin_flush_timer_callback(void* context) {
 | 
				
			||||||
    Dolphin* dolphin = pvTimerGetTimerID(xTimer);
 | 
					    Dolphin* dolphin = context;
 | 
				
			||||||
    furi_assert(dolphin);
 | 
					    furi_assert(dolphin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DolphinEvent event;
 | 
					    DolphinEvent event;
 | 
				
			||||||
@ -63,11 +62,11 @@ void dolphin_flush_timer_callback(TimerHandle_t xTimer) {
 | 
				
			|||||||
    dolphin_event_send_async(dolphin, &event);
 | 
					    dolphin_event_send_async(dolphin, &event);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void dolphin_clear_limits_timer_callback(TimerHandle_t xTimer) {
 | 
					void dolphin_clear_limits_timer_callback(void* context) {
 | 
				
			||||||
    Dolphin* dolphin = pvTimerGetTimerID(xTimer);
 | 
					    Dolphin* dolphin = context;
 | 
				
			||||||
    furi_assert(dolphin);
 | 
					    furi_assert(dolphin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xTimerChangePeriod(dolphin->clear_limits_timer, HOURS_IN_TICKS(24), portMAX_DELAY);
 | 
					    furi_timer_start(dolphin->clear_limits_timer, HOURS_IN_TICKS(24));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DolphinEvent event;
 | 
					    DolphinEvent event;
 | 
				
			||||||
    event.type = DolphinEventTypeClearLimits;
 | 
					    event.type = DolphinEventTypeClearLimits;
 | 
				
			||||||
@ -80,12 +79,12 @@ Dolphin* dolphin_alloc() {
 | 
				
			|||||||
    dolphin->state = dolphin_state_alloc();
 | 
					    dolphin->state = dolphin_state_alloc();
 | 
				
			||||||
    dolphin->event_queue = furi_message_queue_alloc(8, sizeof(DolphinEvent));
 | 
					    dolphin->event_queue = furi_message_queue_alloc(8, sizeof(DolphinEvent));
 | 
				
			||||||
    dolphin->pubsub = furi_pubsub_alloc();
 | 
					    dolphin->pubsub = furi_pubsub_alloc();
 | 
				
			||||||
    dolphin->butthurt_timer = xTimerCreate(
 | 
					    dolphin->butthurt_timer =
 | 
				
			||||||
        NULL, HOURS_IN_TICKS(2 * 24), pdTRUE, dolphin, dolphin_butthurt_timer_callback);
 | 
					        furi_timer_alloc(dolphin_butthurt_timer_callback, FuriTimerTypePeriodic, dolphin);
 | 
				
			||||||
    dolphin->flush_timer =
 | 
					    dolphin->flush_timer =
 | 
				
			||||||
        xTimerCreate(NULL, 30 * 1000, pdFALSE, dolphin, dolphin_flush_timer_callback);
 | 
					        furi_timer_alloc(dolphin_flush_timer_callback, FuriTimerTypeOnce, dolphin);
 | 
				
			||||||
    dolphin->clear_limits_timer = xTimerCreate(
 | 
					    dolphin->clear_limits_timer =
 | 
				
			||||||
        NULL, HOURS_IN_TICKS(24), pdTRUE, dolphin, dolphin_clear_limits_timer_callback);
 | 
					        furi_timer_alloc(dolphin_clear_limits_timer_callback, FuriTimerTypePeriodic, dolphin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return dolphin;
 | 
					    return dolphin;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -125,14 +124,14 @@ FuriPubSub* dolphin_get_pubsub(Dolphin* dolphin) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) {
 | 
					static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) {
 | 
				
			||||||
    furi_assert(dolphin);
 | 
					    furi_assert(dolphin);
 | 
				
			||||||
    TickType_t now_ticks = xTaskGetTickCount();
 | 
					    uint32_t now_ticks = furi_get_tick();
 | 
				
			||||||
    TickType_t timer_expires_at = xTimerGetExpiryTime(dolphin->clear_limits_timer);
 | 
					    uint32_t timer_expires_at = furi_timer_get_expire_time(dolphin->clear_limits_timer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if((timer_expires_at - now_ticks) > HOURS_IN_TICKS(0.1)) {
 | 
					    if((timer_expires_at - now_ticks) > HOURS_IN_TICKS(0.1)) {
 | 
				
			||||||
        FuriHalRtcDateTime date;
 | 
					        FuriHalRtcDateTime date;
 | 
				
			||||||
        furi_hal_rtc_get_datetime(&date);
 | 
					        furi_hal_rtc_get_datetime(&date);
 | 
				
			||||||
        TickType_t now_time_in_ms = ((date.hour * 60 + date.minute) * 60 + date.second) * 1000;
 | 
					        uint32_t now_time_in_ms = ((date.hour * 60 + date.minute) * 60 + date.second) * 1000;
 | 
				
			||||||
        TickType_t time_to_clear_limits = 0;
 | 
					        uint32_t time_to_clear_limits = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(date.hour < 5) {
 | 
					        if(date.hour < 5) {
 | 
				
			||||||
            time_to_clear_limits = HOURS_IN_TICKS(5) - now_time_in_ms;
 | 
					            time_to_clear_limits = HOURS_IN_TICKS(5) - now_time_in_ms;
 | 
				
			||||||
@ -140,7 +139,7 @@ static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) {
 | 
				
			|||||||
            time_to_clear_limits = HOURS_IN_TICKS(24 + 5) - now_time_in_ms;
 | 
					            time_to_clear_limits = HOURS_IN_TICKS(24 + 5) - now_time_in_ms;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        xTimerChangePeriod(dolphin->clear_limits_timer, time_to_clear_limits, portMAX_DELAY);
 | 
					        furi_timer_start(dolphin->clear_limits_timer, time_to_clear_limits);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -156,9 +155,9 @@ int32_t dolphin_srv(void* p) {
 | 
				
			|||||||
    furi_record_create(RECORD_DOLPHIN, dolphin);
 | 
					    furi_record_create(RECORD_DOLPHIN, dolphin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dolphin_state_load(dolphin->state);
 | 
					    dolphin_state_load(dolphin->state);
 | 
				
			||||||
    xTimerReset(dolphin->butthurt_timer, portMAX_DELAY);
 | 
					    furi_timer_stop(dolphin->butthurt_timer);
 | 
				
			||||||
    dolphin_update_clear_limits_timer_period(dolphin);
 | 
					    dolphin_update_clear_limits_timer_period(dolphin);
 | 
				
			||||||
    xTimerReset(dolphin->clear_limits_timer, portMAX_DELAY);
 | 
					    furi_timer_stop(dolphin->clear_limits_timer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DolphinEvent event;
 | 
					    DolphinEvent event;
 | 
				
			||||||
    while(1) {
 | 
					    while(1) {
 | 
				
			||||||
@ -168,8 +167,8 @@ int32_t dolphin_srv(void* p) {
 | 
				
			|||||||
                dolphin_state_on_deed(dolphin->state, event.deed);
 | 
					                dolphin_state_on_deed(dolphin->state, event.deed);
 | 
				
			||||||
                DolphinPubsubEvent event = DolphinPubsubEventUpdate;
 | 
					                DolphinPubsubEvent event = DolphinPubsubEventUpdate;
 | 
				
			||||||
                furi_pubsub_publish(dolphin->pubsub, &event);
 | 
					                furi_pubsub_publish(dolphin->pubsub, &event);
 | 
				
			||||||
                xTimerReset(dolphin->butthurt_timer, portMAX_DELAY);
 | 
					                furi_timer_restart(dolphin->butthurt_timer);
 | 
				
			||||||
                xTimerReset(dolphin->flush_timer, portMAX_DELAY);
 | 
					                furi_timer_restart(dolphin->flush_timer);
 | 
				
			||||||
            } else if(event.type == DolphinEventTypeStats) {
 | 
					            } else if(event.type == DolphinEventTypeStats) {
 | 
				
			||||||
                event.stats->icounter = dolphin->state->data.icounter;
 | 
					                event.stats->icounter = dolphin->state->data.icounter;
 | 
				
			||||||
                event.stats->butthurt = dolphin->state->data.butthurt;
 | 
					                event.stats->butthurt = dolphin->state->data.butthurt;
 | 
				
			||||||
 | 
				
			|||||||
@ -30,9 +30,9 @@ struct Dolphin {
 | 
				
			|||||||
    // Queue
 | 
					    // Queue
 | 
				
			||||||
    FuriMessageQueue* event_queue;
 | 
					    FuriMessageQueue* event_queue;
 | 
				
			||||||
    FuriPubSub* pubsub;
 | 
					    FuriPubSub* pubsub;
 | 
				
			||||||
    TimerHandle_t butthurt_timer;
 | 
					    FuriTimer* butthurt_timer;
 | 
				
			||||||
    TimerHandle_t flush_timer;
 | 
					    FuriTimer* flush_timer;
 | 
				
			||||||
    TimerHandle_t clear_limits_timer;
 | 
					    FuriTimer* clear_limits_timer;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Dolphin* dolphin_alloc();
 | 
					Dolphin* dolphin_alloc();
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,6 @@ IconAnimation* icon_animation_alloc(const Icon* icon) {
 | 
				
			|||||||
void icon_animation_free(IconAnimation* instance) {
 | 
					void icon_animation_free(IconAnimation* instance) {
 | 
				
			||||||
    furi_assert(instance);
 | 
					    furi_assert(instance);
 | 
				
			||||||
    icon_animation_stop(instance);
 | 
					    icon_animation_stop(instance);
 | 
				
			||||||
    while(xTimerIsTimerActive(instance->timer) == pdTRUE) furi_delay_tick(1);
 | 
					 | 
				
			||||||
    furi_timer_free(instance->timer);
 | 
					    furi_timer_free(instance->timer);
 | 
				
			||||||
    free(instance);
 | 
					    free(instance);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -67,10 +66,9 @@ void icon_animation_start(IconAnimation* instance) {
 | 
				
			|||||||
        instance->animating = true;
 | 
					        instance->animating = true;
 | 
				
			||||||
        furi_assert(instance->icon->frame_rate);
 | 
					        furi_assert(instance->icon->frame_rate);
 | 
				
			||||||
        furi_check(
 | 
					        furi_check(
 | 
				
			||||||
            xTimerChangePeriod(
 | 
					            furi_timer_start(
 | 
				
			||||||
                instance->timer,
 | 
					                instance->timer,
 | 
				
			||||||
                (furi_kernel_get_tick_frequency() / instance->icon->frame_rate),
 | 
					                (furi_kernel_get_tick_frequency() / instance->icon->frame_rate)) == FuriStatusOk);
 | 
				
			||||||
                portMAX_DELAY) == pdPASS);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -78,7 +76,7 @@ void icon_animation_stop(IconAnimation* instance) {
 | 
				
			|||||||
    furi_assert(instance);
 | 
					    furi_assert(instance);
 | 
				
			||||||
    if(instance->animating) {
 | 
					    if(instance->animating) {
 | 
				
			||||||
        instance->animating = false;
 | 
					        instance->animating = false;
 | 
				
			||||||
        furi_check(xTimerStop(instance->timer, portMAX_DELAY) == pdPASS);
 | 
					        furi_timer_stop(instance->timer);
 | 
				
			||||||
        instance->frame = 0;
 | 
					        instance->frame = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,20 +6,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static Input* input = NULL;
 | 
					static Input* input = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline static void input_timer_start(FuriTimer* timer_id, uint32_t ticks) {
 | 
					 | 
				
			||||||
    TimerHandle_t hTimer = (TimerHandle_t)timer_id;
 | 
					 | 
				
			||||||
    furi_check(xTimerChangePeriod(hTimer, ticks, portMAX_DELAY) == pdPASS);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline static void input_timer_stop(FuriTimer* timer_id) {
 | 
					 | 
				
			||||||
    TimerHandle_t hTimer = (TimerHandle_t)timer_id;
 | 
					 | 
				
			||||||
    furi_check(xTimerStop(hTimer, portMAX_DELAY) == pdPASS);
 | 
					 | 
				
			||||||
    // xTimerStop is not actually stopping timer,
 | 
					 | 
				
			||||||
    // Instead it places stop event into timer queue
 | 
					 | 
				
			||||||
    // This code ensures that timer is stopped
 | 
					 | 
				
			||||||
    while(xTimerIsTimerActive(hTimer) == pdTRUE) furi_delay_tick(1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void input_press_timer_callback(void* arg) {
 | 
					void input_press_timer_callback(void* arg) {
 | 
				
			||||||
    InputPinState* input_pin = arg;
 | 
					    InputPinState* input_pin = arg;
 | 
				
			||||||
    InputEvent event;
 | 
					    InputEvent event;
 | 
				
			||||||
@ -123,10 +109,12 @@ int32_t input_srv(void* p) {
 | 
				
			|||||||
                    input->counter++;
 | 
					                    input->counter++;
 | 
				
			||||||
                    input->pin_states[i].counter = input->counter;
 | 
					                    input->pin_states[i].counter = input->counter;
 | 
				
			||||||
                    event.sequence_counter = input->pin_states[i].counter;
 | 
					                    event.sequence_counter = input->pin_states[i].counter;
 | 
				
			||||||
                    input_timer_start(input->pin_states[i].press_timer, INPUT_PRESS_TICKS);
 | 
					                    furi_timer_start(input->pin_states[i].press_timer, INPUT_PRESS_TICKS);
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    event.sequence_counter = input->pin_states[i].counter;
 | 
					                    event.sequence_counter = input->pin_states[i].counter;
 | 
				
			||||||
                    input_timer_stop(input->pin_states[i].press_timer);
 | 
					                    furi_timer_stop(input->pin_states[i].press_timer);
 | 
				
			||||||
 | 
					                    while(furi_timer_is_running(input->pin_states[i].press_timer))
 | 
				
			||||||
 | 
					                        furi_delay_tick(1);
 | 
				
			||||||
                    if(input->pin_states[i].press_counter < INPUT_LONG_PRESS_COUNTS) {
 | 
					                    if(input->pin_states[i].press_counter < INPUT_LONG_PRESS_COUNTS) {
 | 
				
			||||||
                        event.type = InputTypeShort;
 | 
					                        event.type = InputTypeShort;
 | 
				
			||||||
                        furi_pubsub_publish(input->event_pubsub, &event);
 | 
					                        furi_pubsub_publish(input->event_pubsub, &event);
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <storage.pb.h>
 | 
					#include <storage.pb.h>
 | 
				
			||||||
#include <flipper.pb.h>
 | 
					#include <flipper.pb.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -162,7 +161,7 @@ void rpc_session_set_terminated_callback(
 | 
				
			|||||||
 * odd: client sends close request and sends command after.
 | 
					 * odd: client sends close request and sends command after.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
size_t
 | 
					size_t
 | 
				
			||||||
    rpc_session_feed(RpcSession* session, uint8_t* encoded_bytes, size_t size, TickType_t timeout) {
 | 
					    rpc_session_feed(RpcSession* session, uint8_t* encoded_bytes, size_t size, uint32_t timeout) {
 | 
				
			||||||
    furi_assert(session);
 | 
					    furi_assert(session);
 | 
				
			||||||
    furi_assert(encoded_bytes);
 | 
					    furi_assert(encoded_bytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -124,7 +124,7 @@ void rpc_session_set_terminated_callback(
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @return              actually consumed bytes
 | 
					 * @return              actually consumed bytes
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
size_t rpc_session_feed(RpcSession* session, uint8_t* buffer, size_t size, TickType_t timeout);
 | 
					size_t rpc_session_feed(RpcSession* session, uint8_t* buffer, size_t size, uint32_t timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Get available size of RPC buffer
 | 
					/** Get available size of RPC buffer
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <rpc/rpc.h>
 | 
					#include <rpc/rpc.h>
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <semphr.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "RpcCli"
 | 
					#define TAG "RpcCli"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,6 @@
 | 
				
			|||||||
#include <gui/view_dispatcher.h>
 | 
					#include <gui/view_dispatcher.h>
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <portmacro.h>
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool updater_custom_event_callback(void* context, uint32_t event) {
 | 
					static bool updater_custom_event_callback(void* context, uint32_t event) {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <furi_config.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
 | 
				
			|||||||
@ -55,8 +55,6 @@ PLACE_IN_SECTION("MB_MEM2") uint32_t __furi_check_registers[13] = {0};
 | 
				
			|||||||
                 : "memory");
 | 
					                 : "memory");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern size_t xPortGetTotalHeapSize(void);
 | 
					extern size_t xPortGetTotalHeapSize(void);
 | 
				
			||||||
extern size_t xPortGetFreeHeapSize(void);
 | 
					 | 
				
			||||||
extern size_t xPortGetMinimumEverFreeHeapSize(void);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __furi_put_uint32_as_text(uint32_t data) {
 | 
					static void __furi_put_uint32_as_text(uint32_t data) {
 | 
				
			||||||
    char tmp_str[] = "-2147483648";
 | 
					    char tmp_str[] = "-2147483648";
 | 
				
			||||||
 | 
				
			|||||||
@ -2,8 +2,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "core_defines.h"
 | 
					#include "core_defines.h"
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <FreeRTOS.h>
 | 
					 | 
				
			||||||
#include <task.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,8 @@
 | 
				
			|||||||
#include "common_defines.h"
 | 
					#include "common_defines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
 | 
					#include <task.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__FuriCriticalInfo __furi_critical_enter(void) {
 | 
					__FuriCriticalInfo __furi_critical_enter(void) {
 | 
				
			||||||
    __FuriCriticalInfo info;
 | 
					    __FuriCriticalInfo info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
#include "common_defines.h"
 | 
					#include "common_defines.h"
 | 
				
			||||||
#include "check.h"
 | 
					#include "check.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <event_groups.h>
 | 
					#include <event_groups.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FURI_EVENT_FLAG_MAX_BITS_EVENT_GROUPS 24U
 | 
					#define FURI_EVENT_FLAG_MAX_BITS_EVENT_GROUPS 24U
 | 
				
			||||||
 | 
				
			|||||||
@ -5,6 +5,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
 | 
					#include <task.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include CMSIS_device_header
 | 
					#include CMSIS_device_header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool furi_kernel_is_irq_or_masked() {
 | 
					bool furi_kernel_is_irq_or_masked() {
 | 
				
			||||||
@ -31,6 +34,10 @@ bool furi_kernel_is_irq_or_masked() {
 | 
				
			|||||||
    return (irq);
 | 
					    return (irq);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool furi_kernel_is_running() {
 | 
				
			||||||
 | 
					    return xTaskGetSchedulerState() != taskSCHEDULER_RUNNING;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t furi_kernel_lock() {
 | 
					int32_t furi_kernel_lock() {
 | 
				
			||||||
    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
					    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -27,6 +27,12 @@ extern "C" {
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
bool furi_kernel_is_irq_or_masked();
 | 
					bool furi_kernel_is_irq_or_masked();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Check if kernel is running
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return     true if running, false otherwise
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool furi_kernel_is_running();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Lock kernel, pause process scheduling
 | 
					/** Lock kernel, pause process scheduling
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @warning This should never be called in interrupt request context.
 | 
					 * @warning This should never be called in interrupt request context.
 | 
				
			||||||
 | 
				
			|||||||
@ -47,8 +47,8 @@ all the API functions to use the MPU wrappers.  That should only be done when
 | 
				
			|||||||
task.h is included from an application file. */
 | 
					task.h is included from an application file. */
 | 
				
			||||||
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
 | 
					#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "FreeRTOS.h"
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include "task.h"
 | 
					#include <task.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
 | 
					#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
#include "kernel.h"
 | 
					#include "kernel.h"
 | 
				
			||||||
#include "message_queue.h"
 | 
					#include "message_queue.h"
 | 
				
			||||||
 | 
					#include "check.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <FreeRTOS.h>
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <queue.h>
 | 
					#include <queue.h>
 | 
				
			||||||
#include "check.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
FuriMessageQueue* furi_message_queue_alloc(uint32_t msg_count, uint32_t msg_size) {
 | 
					FuriMessageQueue* furi_message_queue_alloc(uint32_t msg_count, uint32_t msg_size) {
 | 
				
			||||||
    furi_assert((furi_kernel_is_irq_or_masked() == 0U) && (msg_count > 0U) && (msg_size > 0U));
 | 
					    furi_assert((furi_kernel_is_irq_or_masked() == 0U) && (msg_count > 0U) && (msg_size > 0U));
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
#include "check.h"
 | 
					#include "check.h"
 | 
				
			||||||
#include "common_defines.h"
 | 
					#include "common_defines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <semphr.h>
 | 
					#include <semphr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FuriMutex* furi_mutex_alloc(FuriMutexType type) {
 | 
					FuriMutex* furi_mutex_alloc(FuriMutexType type) {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
#include "check.h"
 | 
					#include "check.h"
 | 
				
			||||||
#include "common_defines.h"
 | 
					#include "common_defines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <semphr.h>
 | 
					#include <semphr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FuriSemaphore* furi_semaphore_alloc(uint32_t max_count, uint32_t initial_count) {
 | 
					FuriSemaphore* furi_semaphore_alloc(uint32_t max_count, uint32_t initial_count) {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
#include "check.h"
 | 
					#include "check.h"
 | 
				
			||||||
#include "stream_buffer.h"
 | 
					#include "stream_buffer.h"
 | 
				
			||||||
#include "common_defines.h"
 | 
					#include "common_defines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <FreeRTOS.h>
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
#include <FreeRTOS-Kernel/include/stream_buffer.h>
 | 
					#include <FreeRTOS-Kernel/include/stream_buffer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -7,11 +7,13 @@
 | 
				
			|||||||
#include "mutex.h"
 | 
					#include "mutex.h"
 | 
				
			||||||
#include "string.h"
 | 
					#include "string.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <task.h>
 | 
					 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
#include <furi_hal_rtc.h>
 | 
					#include <furi_hal_rtc.h>
 | 
				
			||||||
#include <furi_hal_console.h>
 | 
					#include <furi_hal_console.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
 | 
					#include <task.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "FuriThread"
 | 
					#define TAG "FuriThread"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define THREAD_NOTIFY_INDEX 1 // Index 0 is used for stream buffers
 | 
					#define THREAD_NOTIFY_INDEX 1 // Index 0 is used for stream buffers
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,9 @@
 | 
				
			|||||||
#include "base.h"
 | 
					#include "base.h"
 | 
				
			||||||
#include "common_defines.h"
 | 
					#include "common_defines.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -28,7 +31,8 @@ typedef enum {
 | 
				
			|||||||
    FuriThreadPriorityNormal = 16, /**< Normal */
 | 
					    FuriThreadPriorityNormal = 16, /**< Normal */
 | 
				
			||||||
    FuriThreadPriorityHigh = 17, /**< High */
 | 
					    FuriThreadPriorityHigh = 17, /**< High */
 | 
				
			||||||
    FuriThreadPriorityHighest = 18, /**< Highest */
 | 
					    FuriThreadPriorityHighest = 18, /**< Highest */
 | 
				
			||||||
    FuriThreadPriorityIsr = (configMAX_PRIORITIES - 1), /**< Deferred ISR (highest possible) */
 | 
					    FuriThreadPriorityIsr =
 | 
				
			||||||
 | 
					        (FURI_CONFIG_THREAD_MAX_PRIORITIES - 1), /**< Deferred ISR (highest possible) */
 | 
				
			||||||
} FuriThreadPriority;
 | 
					} FuriThreadPriority;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** FuriThread anonymous structure */
 | 
					/** FuriThread anonymous structure */
 | 
				
			||||||
 | 
				
			|||||||
@ -97,6 +97,23 @@ FuriStatus furi_timer_start(FuriTimer* instance, uint32_t ticks) {
 | 
				
			|||||||
    return (stat);
 | 
					    return (stat);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FuriStatus furi_timer_restart(FuriTimer* instance) {
 | 
				
			||||||
 | 
					    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
				
			||||||
 | 
					    furi_assert(instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    TimerHandle_t hTimer = (TimerHandle_t)instance;
 | 
				
			||||||
 | 
					    FuriStatus stat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(xTimerReset(hTimer, portMAX_DELAY) == pdPASS) {
 | 
				
			||||||
 | 
					        stat = FuriStatusOk;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        stat = FuriStatusErrorResource;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Return execution status */
 | 
				
			||||||
 | 
					    return (stat);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FuriStatus furi_timer_stop(FuriTimer* instance) {
 | 
					FuriStatus furi_timer_stop(FuriTimer* instance) {
 | 
				
			||||||
    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
					    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
				
			||||||
    furi_assert(instance);
 | 
					    furi_assert(instance);
 | 
				
			||||||
@ -125,6 +142,15 @@ uint32_t furi_timer_is_running(FuriTimer* instance) {
 | 
				
			|||||||
    return (uint32_t)xTimerIsTimerActive(hTimer);
 | 
					    return (uint32_t)xTimerIsTimerActive(hTimer);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t furi_timer_get_expire_time(FuriTimer* instance) {
 | 
				
			||||||
 | 
					    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
				
			||||||
 | 
					    furi_assert(instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    TimerHandle_t hTimer = (TimerHandle_t)instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (uint32_t)xTimerGetExpiryTime(hTimer);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void furi_timer_pending_callback(FuriTimerPendigCallback callback, void* context, uint32_t arg) {
 | 
					void furi_timer_pending_callback(FuriTimerPendigCallback callback, void* context, uint32_t arg) {
 | 
				
			||||||
    BaseType_t ret = pdFAIL;
 | 
					    BaseType_t ret = pdFAIL;
 | 
				
			||||||
    if(furi_kernel_is_irq_or_masked()) {
 | 
					    if(furi_kernel_is_irq_or_masked()) {
 | 
				
			||||||
@ -134,3 +160,16 @@ void furi_timer_pending_callback(FuriTimerPendigCallback callback, void* context
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    furi_check(ret == pdPASS);
 | 
					    furi_check(ret == pdPASS);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void furi_timer_set_thread_priority(FuriTimerThreadPriority priority) {
 | 
				
			||||||
 | 
					    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
				
			||||||
 | 
					    TaskHandle_t task_handle = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(priority == FuriTimerThreadPriorityNormal) {
 | 
				
			||||||
 | 
					        vTaskPrioritySet(task_handle, configTIMER_TASK_PRIORITY);
 | 
				
			||||||
 | 
					    } else if(priority == FuriTimerThreadPriorityElevated) {
 | 
				
			||||||
 | 
					        vTaskPrioritySet(task_handle, configMAX_PRIORITIES - 1);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        furi_crash();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -40,6 +40,14 @@ void furi_timer_free(FuriTimer* instance);
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
FuriStatus furi_timer_start(FuriTimer* instance, uint32_t ticks);
 | 
					FuriStatus furi_timer_start(FuriTimer* instance, uint32_t ticks);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Restart timer with previous timeout value
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param      instance  The pointer to FuriTimer instance
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return     The furi status.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					FuriStatus furi_timer_restart(FuriTimer* instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Stop timer
 | 
					/** Stop timer
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param      instance  The pointer to FuriTimer instance
 | 
					 * @param      instance  The pointer to FuriTimer instance
 | 
				
			||||||
@ -56,10 +64,29 @@ FuriStatus furi_timer_stop(FuriTimer* instance);
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
uint32_t furi_timer_is_running(FuriTimer* instance);
 | 
					uint32_t furi_timer_is_running(FuriTimer* instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Get timer expire time
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param      instance  The Timer instance
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return     expire tick
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					uint32_t furi_timer_get_expire_time(FuriTimer* instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef void (*FuriTimerPendigCallback)(void* context, uint32_t arg);
 | 
					typedef void (*FuriTimerPendigCallback)(void* context, uint32_t arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void furi_timer_pending_callback(FuriTimerPendigCallback callback, void* context, uint32_t arg);
 | 
					void furi_timer_pending_callback(FuriTimerPendigCallback callback, void* context, uint32_t arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    FuriTimerThreadPriorityNormal, /**< Lower then other threads */
 | 
				
			||||||
 | 
					    FuriTimerThreadPriorityElevated, /**< Same as other threads */
 | 
				
			||||||
 | 
					} FuriTimerThreadPriority;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Set Timer thread priority
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]  priority  The priority
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void furi_timer_set_thread_priority(FuriTimerThreadPriority priority);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -5,6 +5,8 @@
 | 
				
			|||||||
#include <furi_hal_memory.h>
 | 
					#include <furi_hal_memory.h>
 | 
				
			||||||
#include <furi_hal_rtc.h>
 | 
					#include <furi_hal_rtc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "Flipper"
 | 
					#define TAG "Flipper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void flipper_print_version(const char* target, const Version* version) {
 | 
					static void flipper_print_version(const char* target, const Version* version) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,8 @@
 | 
				
			|||||||
#include "furi.h"
 | 
					#include "furi.h"
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include "queue.h"
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
 | 
					#include <queue.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void furi_init() {
 | 
					void furi_init() {
 | 
				
			||||||
    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
					    furi_assert(!furi_kernel_is_irq_or_masked());
 | 
				
			||||||
 | 
				
			|||||||
@ -21,9 +21,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <furi_hal_gpio.h>
 | 
					#include <furi_hal_gpio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FreeRTOS timer, REMOVE AFTER REFACTORING
 | 
					 | 
				
			||||||
#include <timers.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Workaround for math.h leaking through HAL in older versions
 | 
					// Workaround for math.h leaking through HAL in older versions
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -165,7 +165,7 @@ static int32_t infrared_worker_rx_thread(void* thread_context) {
 | 
				
			|||||||
    InfraredWorker* instance = thread_context;
 | 
					    InfraredWorker* instance = thread_context;
 | 
				
			||||||
    uint32_t events = 0;
 | 
					    uint32_t events = 0;
 | 
				
			||||||
    LevelDuration level_duration;
 | 
					    LevelDuration level_duration;
 | 
				
			||||||
    TickType_t last_blink_time = 0;
 | 
					    uint32_t last_blink_time = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(1) {
 | 
					    while(1) {
 | 
				
			||||||
        events = furi_thread_flags_wait(INFRARED_WORKER_ALL_RX_EVENTS, 0, FuriWaitForever);
 | 
					        events = furi_thread_flags_wait(INFRARED_WORKER_ALL_RX_EVENTS, 0, FuriWaitForever);
 | 
				
			||||||
@ -173,8 +173,8 @@ static int32_t infrared_worker_rx_thread(void* thread_context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if(events & INFRARED_WORKER_RX_RECEIVED) {
 | 
					        if(events & INFRARED_WORKER_RX_RECEIVED) {
 | 
				
			||||||
            if(!instance->rx.overrun && instance->blink_enable &&
 | 
					            if(!instance->rx.overrun && instance->blink_enable &&
 | 
				
			||||||
               ((xTaskGetTickCount() - last_blink_time) > 80)) {
 | 
					               ((furi_get_tick() - last_blink_time) > 80)) {
 | 
				
			||||||
                last_blink_time = xTaskGetTickCount();
 | 
					                last_blink_time = furi_get_tick();
 | 
				
			||||||
                notification_message(instance->notification, &sequence_blink_blue_10);
 | 
					                notification_message(instance->notification, &sequence_blink_blue_10);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if(instance->signal.timings_cnt == 0)
 | 
					            if(instance->signal.timings_cnt == 0)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					#include "lfrfid_worker_i.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <atomic.h>
 | 
					 | 
				
			||||||
#include "lfrfid_worker_i.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
    LFRFIDEventStopThread = (1 << 0),
 | 
					    LFRFIDEventStopThread = (1 << 0),
 | 
				
			||||||
 | 
				
			|||||||
@ -43,8 +43,6 @@ struct Iso14443_4aPoller {
 | 
				
			|||||||
    void* context;
 | 
					    void* context;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Iso14443_4aError iso14443_4a_process_error(Iso14443_3aError error);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const Iso14443_4aData* iso14443_4a_poller_get_data(Iso14443_4aPoller* instance);
 | 
					const Iso14443_4aData* iso14443_4a_poller_get_data(Iso14443_4aPoller* instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Iso14443_4aError iso14443_4a_poller_halt(Iso14443_4aPoller* instance);
 | 
					Iso14443_4aError iso14443_4a_poller_halt(Iso14443_4aPoller* instance);
 | 
				
			||||||
 | 
				
			|||||||
@ -40,8 +40,6 @@ struct Iso14443_4bPoller {
 | 
				
			|||||||
    void* context;
 | 
					    void* context;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Iso14443_4bError iso14443_4b_process_error(Iso14443_3bError error);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const Iso14443_4bData* iso14443_4b_poller_get_data(Iso14443_4bPoller* instance);
 | 
					const Iso14443_4bData* iso14443_4b_poller_get_data(Iso14443_4bPoller* instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Iso14443_4bError iso14443_4b_poller_halt(Iso14443_4bPoller* instance);
 | 
					Iso14443_4bError iso14443_4b_poller_halt(Iso14443_4bPoller* instance);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
@ -6,7 +8,6 @@
 | 
				
			|||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void _putchar(char character);
 | 
					 | 
				
			||||||
int __wrap_printf(const char* format, ...);
 | 
					int __wrap_printf(const char* format, ...);
 | 
				
			||||||
int __wrap_vsnprintf(char* str, size_t size, const char* format, va_list args);
 | 
					int __wrap_vsnprintf(char* str, size_t size, const char* format, va_list args);
 | 
				
			||||||
int __wrap_puts(const char* str);
 | 
					int __wrap_puts(const char* str);
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@ env.Append(
 | 
				
			|||||||
        File("subghz_tx_rx_worker.h"),
 | 
					        File("subghz_tx_rx_worker.h"),
 | 
				
			||||||
        File("transmitter.h"),
 | 
					        File("transmitter.h"),
 | 
				
			||||||
        File("protocols/raw.h"),
 | 
					        File("protocols/raw.h"),
 | 
				
			||||||
 | 
					        File("protocols/public_api.h"),
 | 
				
			||||||
        File("blocks/const.h"),
 | 
					        File("blocks/const.h"),
 | 
				
			||||||
        File("blocks/decoder.h"),
 | 
					        File("blocks/decoder.h"),
 | 
				
			||||||
        File("blocks/encoder.h"),
 | 
					        File("blocks/encoder.h"),
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "base.h"
 | 
					#include "base.h"
 | 
				
			||||||
 | 
					#include "public_api.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SUBGHZ_PROTOCOL_BIN_RAW_NAME "BinRAW"
 | 
					#define SUBGHZ_PROTOCOL_BIN_RAW_NAME "BinRAW"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -80,10 +81,6 @@ void subghz_protocol_decoder_bin_raw_feed(void* context, bool level, uint32_t du
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
uint8_t subghz_protocol_decoder_bin_raw_get_hash_data(void* context);
 | 
					uint8_t subghz_protocol_decoder_bin_raw_get_hash_data(void* context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void subghz_protocol_decoder_bin_raw_data_input_rssi(
 | 
					 | 
				
			||||||
    SubGhzProtocolDecoderBinRAW* instance,
 | 
					 | 
				
			||||||
    float rssi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Serialize data SubGhzProtocolDecoderBinRAW.
 | 
					 * Serialize data SubGhzProtocolDecoderBinRAW.
 | 
				
			||||||
 * @param context Pointer to a SubGhzProtocolDecoderBinRAW instance
 | 
					 * @param context Pointer to a SubGhzProtocolDecoderBinRAW instance
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "base.h"
 | 
					#include "base.h"
 | 
				
			||||||
 | 
					#include "public_api.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SUBGHZ_PROTOCOL_KEELOQ_NAME "KeeLoq"
 | 
					#define SUBGHZ_PROTOCOL_KEELOQ_NAME "KeeLoq"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -24,26 +25,6 @@ void* subghz_protocol_encoder_keeloq_alloc(SubGhzEnvironment* environment);
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
void subghz_protocol_encoder_keeloq_free(void* context);
 | 
					void subghz_protocol_encoder_keeloq_free(void* context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Key generation from simple data.
 | 
					 | 
				
			||||||
 * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance
 | 
					 | 
				
			||||||
 * @param flipper_format Pointer to a FlipperFormat instance
 | 
					 | 
				
			||||||
 * @param serial Serial number, 28 bit
 | 
					 | 
				
			||||||
 * @param btn Button number, 4 bit
 | 
					 | 
				
			||||||
 * @param cnt Container value, 16 bit
 | 
					 | 
				
			||||||
 * @param manufacture_name Name of manufacturer's key
 | 
					 | 
				
			||||||
 * @param preset Modulation, SubGhzRadioPreset
 | 
					 | 
				
			||||||
 * @return true On success
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
bool subghz_protocol_keeloq_create_data(
 | 
					 | 
				
			||||||
    void* context,
 | 
					 | 
				
			||||||
    FlipperFormat* flipper_format,
 | 
					 | 
				
			||||||
    uint32_t serial,
 | 
					 | 
				
			||||||
    uint8_t btn,
 | 
					 | 
				
			||||||
    uint16_t cnt,
 | 
					 | 
				
			||||||
    const char* manufacture_name,
 | 
					 | 
				
			||||||
    SubGhzRadioPreset* preset);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Deserialize and generating an upload to send.
 | 
					 * Deserialize and generating an upload to send.
 | 
				
			||||||
 * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance
 | 
					 * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										63
									
								
								lib/subghz/protocols/public_api.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								lib/subghz/protocols/public_api.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../types.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Key generation from simple data.
 | 
				
			||||||
 | 
					 * @param context Pointer to a SubGhzProtocolEncoderSecPlus_v2 instance
 | 
				
			||||||
 | 
					 * @param flipper_format Pointer to a FlipperFormat instance
 | 
				
			||||||
 | 
					 * @param serial Serial number, 32 bit
 | 
				
			||||||
 | 
					 * @param btn Button number, 8 bit
 | 
				
			||||||
 | 
					 * @param cnt Container value, 28 bit
 | 
				
			||||||
 | 
					 * @param manufacture_name Name of manufacturer's key
 | 
				
			||||||
 | 
					 * @param preset Modulation, SubGhzRadioPreset
 | 
				
			||||||
 | 
					 * @return true On success
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool subghz_protocol_secplus_v2_create_data(
 | 
				
			||||||
 | 
					    void* context,
 | 
				
			||||||
 | 
					    FlipperFormat* flipper_format,
 | 
				
			||||||
 | 
					    uint32_t serial,
 | 
				
			||||||
 | 
					    uint8_t btn,
 | 
				
			||||||
 | 
					    uint32_t cnt,
 | 
				
			||||||
 | 
					    SubGhzRadioPreset* preset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Key generation from simple data.
 | 
				
			||||||
 | 
					 * @param context Pointer to a SubGhzProtocolEncoderKeeloq instance
 | 
				
			||||||
 | 
					 * @param flipper_format Pointer to a FlipperFormat instance
 | 
				
			||||||
 | 
					 * @param serial Serial number, 28 bit
 | 
				
			||||||
 | 
					 * @param btn Button number, 4 bit
 | 
				
			||||||
 | 
					 * @param cnt Container value, 16 bit
 | 
				
			||||||
 | 
					 * @param manufacture_name Name of manufacturer's key
 | 
				
			||||||
 | 
					 * @param preset Modulation, SubGhzRadioPreset
 | 
				
			||||||
 | 
					 * @return true On success
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool subghz_protocol_keeloq_create_data(
 | 
				
			||||||
 | 
					    void* context,
 | 
				
			||||||
 | 
					    FlipperFormat* flipper_format,
 | 
				
			||||||
 | 
					    uint32_t serial,
 | 
				
			||||||
 | 
					    uint8_t btn,
 | 
				
			||||||
 | 
					    uint16_t cnt,
 | 
				
			||||||
 | 
					    const char* manufacture_name,
 | 
				
			||||||
 | 
					    SubGhzRadioPreset* preset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SubGhzProtocolDecoderBinRAW SubGhzProtocolDecoderBinRAW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void subghz_protocol_decoder_bin_raw_data_input_rssi(
 | 
				
			||||||
 | 
					    SubGhzProtocolDecoderBinRAW* instance,
 | 
				
			||||||
 | 
					    float rssi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Validation of fixed parts SubGhzProtocolDecoderSecPlus_v1.
 | 
				
			||||||
 | 
					 * @param fixed fixed parts
 | 
				
			||||||
 | 
					 * @return true On success
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool subghz_protocol_secplus_v1_check_fixed(uint32_t fixed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "base.h"
 | 
					#include "base.h"
 | 
				
			||||||
 | 
					#include "public_api.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SUBGHZ_PROTOCOL_SECPLUS_V1_NAME "Security+ 1.0"
 | 
					#define SUBGHZ_PROTOCOL_SECPLUS_V1_NAME "Security+ 1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -100,13 +102,6 @@ SubGhzProtocolStatus subghz_protocol_decoder_secplus_v1_serialize(
 | 
				
			|||||||
SubGhzProtocolStatus
 | 
					SubGhzProtocolStatus
 | 
				
			||||||
    subghz_protocol_decoder_secplus_v1_deserialize(void* context, FlipperFormat* flipper_format);
 | 
					    subghz_protocol_decoder_secplus_v1_deserialize(void* context, FlipperFormat* flipper_format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Validation of fixed parts SubGhzProtocolDecoderSecPlus_v1.
 | 
					 | 
				
			||||||
 * @param fixed fixed parts
 | 
					 | 
				
			||||||
 * @return true On success
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
bool subghz_protocol_secplus_v1_check_fixed(uint32_t fixed);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Getting a textual representation of the received data.
 | 
					 * Getting a textual representation of the received data.
 | 
				
			||||||
 * @param context Pointer to a SubGhzProtocolDecoderSecPlus_v1 instance
 | 
					 * @param context Pointer to a SubGhzProtocolDecoderSecPlus_v1 instance
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "base.h"
 | 
					#include "base.h"
 | 
				
			||||||
 | 
					#include "public_api.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SUBGHZ_PROTOCOL_SECPLUS_V2_NAME "Security+ 2.0"
 | 
					#define SUBGHZ_PROTOCOL_SECPLUS_V2_NAME "Security+ 2.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -45,25 +47,6 @@ void subghz_protocol_encoder_secplus_v2_stop(void* context);
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
LevelDuration subghz_protocol_encoder_secplus_v2_yield(void* context);
 | 
					LevelDuration subghz_protocol_encoder_secplus_v2_yield(void* context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Key generation from simple data.
 | 
					 | 
				
			||||||
 * @param context Pointer to a SubGhzProtocolEncoderSecPlus_v2 instance
 | 
					 | 
				
			||||||
 * @param flipper_format Pointer to a FlipperFormat instance
 | 
					 | 
				
			||||||
 * @param serial Serial number, 32 bit
 | 
					 | 
				
			||||||
 * @param btn Button number, 8 bit
 | 
					 | 
				
			||||||
 * @param cnt Container value, 28 bit
 | 
					 | 
				
			||||||
 * @param manufacture_name Name of manufacturer's key
 | 
					 | 
				
			||||||
 * @param preset Modulation, SubGhzRadioPreset
 | 
					 | 
				
			||||||
 * @return true On success
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
bool subghz_protocol_secplus_v2_create_data(
 | 
					 | 
				
			||||||
    void* context,
 | 
					 | 
				
			||||||
    FlipperFormat* flipper_format,
 | 
					 | 
				
			||||||
    uint32_t serial,
 | 
					 | 
				
			||||||
    uint8_t btn,
 | 
					 | 
				
			||||||
    uint32_t cnt,
 | 
					 | 
				
			||||||
    SubGhzRadioPreset* preset);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Allocate SubGhzProtocolDecoderSecPlus_v2.
 | 
					 * Allocate SubGhzProtocolDecoderSecPlus_v2.
 | 
				
			||||||
 * @param environment Pointer to a SubGhzEnvironment instance
 | 
					 * @param environment Pointer to a SubGhzEnvironment instance
 | 
				
			||||||
 | 
				
			|||||||
@ -10,29 +10,6 @@ extern const SubGhzProtocolRegistry subghz_protocol_registry;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct SubGhzProtocolDecoderBinRAW SubGhzProtocolDecoderBinRAW;
 | 
					typedef struct SubGhzProtocolDecoderBinRAW SubGhzProtocolDecoderBinRAW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool subghz_protocol_secplus_v2_create_data(
 | 
					 | 
				
			||||||
    void* context,
 | 
					 | 
				
			||||||
    FlipperFormat* flipper_format,
 | 
					 | 
				
			||||||
    uint32_t serial,
 | 
					 | 
				
			||||||
    uint8_t btn,
 | 
					 | 
				
			||||||
    uint32_t cnt,
 | 
					 | 
				
			||||||
    SubGhzRadioPreset* preset);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool subghz_protocol_keeloq_create_data(
 | 
					 | 
				
			||||||
    void* context,
 | 
					 | 
				
			||||||
    FlipperFormat* flipper_format,
 | 
					 | 
				
			||||||
    uint32_t serial,
 | 
					 | 
				
			||||||
    uint8_t btn,
 | 
					 | 
				
			||||||
    uint16_t cnt,
 | 
					 | 
				
			||||||
    const char* manufacture_name,
 | 
					 | 
				
			||||||
    SubGhzRadioPreset* preset);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void subghz_protocol_decoder_bin_raw_data_input_rssi(
 | 
					 | 
				
			||||||
    SubGhzProtocolDecoderBinRAW* instance,
 | 
					 | 
				
			||||||
    float rssi);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool subghz_protocol_secplus_v1_check_fixed(uint32_t fixed);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -112,7 +112,7 @@ bool buffer_stream_send_from_isr(BufferStream* buffer_stream, const uint8_t* dat
 | 
				
			|||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Buffer* buffer_stream_receive(BufferStream* buffer_stream, TickType_t timeout) {
 | 
					Buffer* buffer_stream_receive(BufferStream* buffer_stream, uint32_t timeout) {
 | 
				
			||||||
    Buffer* buffer;
 | 
					    Buffer* buffer;
 | 
				
			||||||
    size_t size =
 | 
					    size_t size =
 | 
				
			||||||
        furi_stream_buffer_receive(buffer_stream->stream, &buffer, sizeof(Buffer*), timeout);
 | 
					        furi_stream_buffer_receive(buffer_stream->stream, &buffer, sizeof(Buffer*), timeout);
 | 
				
			||||||
 | 
				
			|||||||
@ -69,7 +69,7 @@ bool buffer_stream_send_from_isr(BufferStream* buffer_stream, const uint8_t* dat
 | 
				
			|||||||
 * @param timeout 
 | 
					 * @param timeout 
 | 
				
			||||||
 * @return Buffer* 
 | 
					 * @return Buffer* 
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
Buffer* buffer_stream_receive(BufferStream* buffer_stream, TickType_t timeout);
 | 
					Buffer* buffer_stream_receive(BufferStream* buffer_stream, uint32_t timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief Get stream overrun count
 | 
					 * @brief Get stream overrun count
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
entry,status,name,type,params
 | 
					entry,status,name,type,params
 | 
				
			||||||
Version,+,41.0,,
 | 
					Version,+,43.2,,
 | 
				
			||||||
Header,+,applications/services/bt/bt_service/bt.h,,
 | 
					Header,+,applications/services/bt/bt_service/bt.h,,
 | 
				
			||||||
Header,+,applications/services/cli/cli.h,,
 | 
					Header,+,applications/services/cli/cli.h,,
 | 
				
			||||||
Header,+,applications/services/cli/cli_vcp.h,,
 | 
					Header,+,applications/services/cli/cli_vcp.h,,
 | 
				
			||||||
@ -417,7 +417,6 @@ Function,-,_perror_r,void,"_reent*, const char*"
 | 
				
			|||||||
Function,-,_printf_r,int,"_reent*, const char*, ..."
 | 
					Function,-,_printf_r,int,"_reent*, const char*, ..."
 | 
				
			||||||
Function,-,_putc_r,int,"_reent*, int, FILE*"
 | 
					Function,-,_putc_r,int,"_reent*, int, FILE*"
 | 
				
			||||||
Function,-,_putc_unlocked_r,int,"_reent*, int, FILE*"
 | 
					Function,-,_putc_unlocked_r,int,"_reent*, int, FILE*"
 | 
				
			||||||
Function,-,_putchar,void,char
 | 
					 | 
				
			||||||
Function,-,_putchar_r,int,"_reent*, int"
 | 
					Function,-,_putchar_r,int,"_reent*, int"
 | 
				
			||||||
Function,-,_putchar_unlocked_r,int,"_reent*, int"
 | 
					Function,-,_putchar_unlocked_r,int,"_reent*, int"
 | 
				
			||||||
Function,-,_putenv_r,int,"_reent*, char*"
 | 
					Function,-,_putenv_r,int,"_reent*, char*"
 | 
				
			||||||
@ -751,8 +750,6 @@ Function,-,dprintf,int,"int, const char*, ..."
 | 
				
			|||||||
Function,-,drand48,double,
 | 
					Function,-,drand48,double,
 | 
				
			||||||
Function,-,drem,double,"double, double"
 | 
					Function,-,drem,double,"double, double"
 | 
				
			||||||
Function,-,dremf,float,"float, float"
 | 
					Function,-,dremf,float,"float, float"
 | 
				
			||||||
Function,-,eTaskConfirmSleepModeStatus,eSleepModeStatus,
 | 
					 | 
				
			||||||
Function,-,eTaskGetState,eTaskState,TaskHandle_t
 | 
					 | 
				
			||||||
Function,+,elements_bold_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
					Function,+,elements_bold_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
				
			||||||
Function,+,elements_bubble,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
					Function,+,elements_bubble,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
				
			||||||
Function,+,elements_bubble_str,void,"Canvas*, uint8_t, uint8_t, const char*, Align, Align"
 | 
					Function,+,elements_bubble_str,void,"Canvas*, uint8_t, uint8_t, const char*, Align, Align"
 | 
				
			||||||
@ -1342,6 +1339,7 @@ Function,+,furi_hal_vibro_on,void,_Bool
 | 
				
			|||||||
Function,-,furi_init,void,
 | 
					Function,-,furi_init,void,
 | 
				
			||||||
Function,+,furi_kernel_get_tick_frequency,uint32_t,
 | 
					Function,+,furi_kernel_get_tick_frequency,uint32_t,
 | 
				
			||||||
Function,+,furi_kernel_is_irq_or_masked,_Bool,
 | 
					Function,+,furi_kernel_is_irq_or_masked,_Bool,
 | 
				
			||||||
 | 
					Function,+,furi_kernel_is_running,_Bool,
 | 
				
			||||||
Function,+,furi_kernel_lock,int32_t,
 | 
					Function,+,furi_kernel_lock,int32_t,
 | 
				
			||||||
Function,+,furi_kernel_restore_lock,int32_t,int32_t
 | 
					Function,+,furi_kernel_restore_lock,int32_t,int32_t
 | 
				
			||||||
Function,+,furi_kernel_unlock,int32_t,
 | 
					Function,+,furi_kernel_unlock,int32_t,
 | 
				
			||||||
@ -1452,7 +1450,6 @@ Function,+,furi_string_utf8_push,void,"FuriString*, FuriStringUnicodeValue"
 | 
				
			|||||||
Function,+,furi_string_vprintf,int,"FuriString*, const char[], va_list"
 | 
					Function,+,furi_string_vprintf,int,"FuriString*, const char[], va_list"
 | 
				
			||||||
Function,+,furi_thread_alloc,FuriThread*,
 | 
					Function,+,furi_thread_alloc,FuriThread*,
 | 
				
			||||||
Function,+,furi_thread_alloc_ex,FuriThread*,"const char*, uint32_t, FuriThreadCallback, void*"
 | 
					Function,+,furi_thread_alloc_ex,FuriThread*,"const char*, uint32_t, FuriThreadCallback, void*"
 | 
				
			||||||
Function,+,furi_thread_catch,void,
 | 
					 | 
				
			||||||
Function,-,furi_thread_disable_heap_trace,void,FuriThread*
 | 
					Function,-,furi_thread_disable_heap_trace,void,FuriThread*
 | 
				
			||||||
Function,+,furi_thread_enable_heap_trace,void,FuriThread*
 | 
					Function,+,furi_thread_enable_heap_trace,void,FuriThread*
 | 
				
			||||||
Function,+,furi_thread_enumerate,uint32_t,"FuriThreadId*, uint32_t"
 | 
					Function,+,furi_thread_enumerate,uint32_t,"FuriThreadId*, uint32_t"
 | 
				
			||||||
@ -1493,8 +1490,11 @@ Function,+,furi_thread_suspend,void,FuriThreadId
 | 
				
			|||||||
Function,+,furi_thread_yield,void,
 | 
					Function,+,furi_thread_yield,void,
 | 
				
			||||||
Function,+,furi_timer_alloc,FuriTimer*,"FuriTimerCallback, FuriTimerType, void*"
 | 
					Function,+,furi_timer_alloc,FuriTimer*,"FuriTimerCallback, FuriTimerType, void*"
 | 
				
			||||||
Function,+,furi_timer_free,void,FuriTimer*
 | 
					Function,+,furi_timer_free,void,FuriTimer*
 | 
				
			||||||
 | 
					Function,+,furi_timer_get_expire_time,uint32_t,FuriTimer*
 | 
				
			||||||
Function,+,furi_timer_is_running,uint32_t,FuriTimer*
 | 
					Function,+,furi_timer_is_running,uint32_t,FuriTimer*
 | 
				
			||||||
Function,+,furi_timer_pending_callback,void,"FuriTimerPendigCallback, void*, uint32_t"
 | 
					Function,+,furi_timer_pending_callback,void,"FuriTimerPendigCallback, void*, uint32_t"
 | 
				
			||||||
 | 
					Function,+,furi_timer_restart,FuriStatus,FuriTimer*
 | 
				
			||||||
 | 
					Function,+,furi_timer_set_thread_priority,void,FuriTimerThreadPriority
 | 
				
			||||||
Function,+,furi_timer_start,FuriStatus,"FuriTimer*, uint32_t"
 | 
					Function,+,furi_timer_start,FuriStatus,"FuriTimer*, uint32_t"
 | 
				
			||||||
Function,+,furi_timer_stop,FuriStatus,FuriTimer*
 | 
					Function,+,furi_timer_stop,FuriStatus,FuriTimer*
 | 
				
			||||||
Function,-,fwrite,size_t,"const void*, size_t, size_t, FILE*"
 | 
					Function,-,fwrite,size_t,"const void*, size_t, size_t, FILE*"
 | 
				
			||||||
@ -1838,8 +1838,6 @@ Function,+,pb_read,_Bool,"pb_istream_t*, pb_byte_t*, size_t"
 | 
				
			|||||||
Function,+,pb_release,void,"const pb_msgdesc_t*, void*"
 | 
					Function,+,pb_release,void,"const pb_msgdesc_t*, void*"
 | 
				
			||||||
Function,+,pb_skip_field,_Bool,"pb_istream_t*, pb_wire_type_t"
 | 
					Function,+,pb_skip_field,_Bool,"pb_istream_t*, pb_wire_type_t"
 | 
				
			||||||
Function,+,pb_write,_Bool,"pb_ostream_t*, const pb_byte_t*, size_t"
 | 
					Function,+,pb_write,_Bool,"pb_ostream_t*, const pb_byte_t*, size_t"
 | 
				
			||||||
Function,-,pcTaskGetName,char*,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,pcTimerGetName,const char*,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,pclose,int,FILE*
 | 
					Function,-,pclose,int,FILE*
 | 
				
			||||||
Function,-,perror,void,const char*
 | 
					Function,-,perror,void,const char*
 | 
				
			||||||
Function,+,plugin_manager_alloc,PluginManager*,"const char*, uint32_t, const ElfApiInterface*"
 | 
					Function,+,plugin_manager_alloc,PluginManager*,"const char*, uint32_t, const ElfApiInterface*"
 | 
				
			||||||
@ -1914,12 +1912,6 @@ Function,-,putchar_unlocked,int,int
 | 
				
			|||||||
Function,-,putenv,int,char*
 | 
					Function,-,putenv,int,char*
 | 
				
			||||||
Function,-,puts,int,const char*
 | 
					Function,-,puts,int,const char*
 | 
				
			||||||
Function,-,putw,int,"int, FILE*"
 | 
					Function,-,putw,int,"int, FILE*"
 | 
				
			||||||
Function,-,pvPortCalloc,void*,"size_t, size_t"
 | 
					 | 
				
			||||||
Function,-,pvPortMalloc,void*,size_t
 | 
					 | 
				
			||||||
Function,-,pvTaskGetThreadLocalStoragePointer,void*,"TaskHandle_t, BaseType_t"
 | 
					 | 
				
			||||||
Function,-,pvTaskIncrementMutexHeldCount,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,-,pvTimerGetTimerID,void*,const TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,pxPortInitialiseStack,StackType_t*,"StackType_t*, TaskFunction_t, void*"
 | 
					 | 
				
			||||||
Function,-,qsort,void,"void*, size_t, size_t, __compar_fn_t"
 | 
					Function,-,qsort,void,"void*, size_t, size_t, __compar_fn_t"
 | 
				
			||||||
Function,-,qsort_r,void,"void*, size_t, size_t, int (*)(const void*, const void*, void*), void*"
 | 
					Function,-,qsort_r,void,"void*, size_t, size_t, int (*)(const void*, const void*, void*), void*"
 | 
				
			||||||
Function,-,quick_exit,void,int
 | 
					Function,-,quick_exit,void,int
 | 
				
			||||||
@ -1949,7 +1941,7 @@ Function,-,round,double,double
 | 
				
			|||||||
Function,+,roundf,float,float
 | 
					Function,+,roundf,float,float
 | 
				
			||||||
Function,-,roundl,long double,long double
 | 
					Function,-,roundl,long double,long double
 | 
				
			||||||
Function,+,rpc_session_close,void,RpcSession*
 | 
					Function,+,rpc_session_close,void,RpcSession*
 | 
				
			||||||
Function,+,rpc_session_feed,size_t,"RpcSession*, uint8_t*, size_t, TickType_t"
 | 
					Function,+,rpc_session_feed,size_t,"RpcSession*, uint8_t*, size_t, uint32_t"
 | 
				
			||||||
Function,+,rpc_session_get_available_size,size_t,RpcSession*
 | 
					Function,+,rpc_session_get_available_size,size_t,RpcSession*
 | 
				
			||||||
Function,+,rpc_session_get_owner,RpcOwner,RpcSession*
 | 
					Function,+,rpc_session_get_owner,RpcOwner,RpcSession*
 | 
				
			||||||
Function,+,rpc_session_open,RpcSession*,"Rpc*, RpcOwner"
 | 
					Function,+,rpc_session_open,RpcSession*,"Rpc*, RpcOwner"
 | 
				
			||||||
@ -2281,67 +2273,10 @@ Function,-,uECC_sign_deterministic,int,"const uint8_t*, const uint8_t*, unsigned
 | 
				
			|||||||
Function,-,uECC_valid_public_key,int,"const uint8_t*, uECC_Curve"
 | 
					Function,-,uECC_valid_public_key,int,"const uint8_t*, uECC_Curve"
 | 
				
			||||||
Function,-,uECC_verify,int,"const uint8_t*, const uint8_t*, unsigned, const uint8_t*, uECC_Curve"
 | 
					Function,-,uECC_verify,int,"const uint8_t*, const uint8_t*, unsigned, const uint8_t*, uECC_Curve"
 | 
				
			||||||
Function,+,uint8_to_hex_chars,void,"const uint8_t*, uint8_t*, int"
 | 
					Function,+,uint8_to_hex_chars,void,"const uint8_t*, uint8_t*, int"
 | 
				
			||||||
Function,-,ulTaskGenericNotifyTake,uint32_t,"UBaseType_t, BaseType_t, TickType_t"
 | 
					 | 
				
			||||||
Function,-,ulTaskGenericNotifyValueClear,uint32_t,"TaskHandle_t, UBaseType_t, uint32_t"
 | 
					 | 
				
			||||||
Function,-,ulTaskGetIdleRunTimeCounter,uint32_t,
 | 
					 | 
				
			||||||
Function,-,ulTaskGetIdleRunTimePercent,uint32_t,
 | 
					 | 
				
			||||||
Function,-,ungetc,int,"int, FILE*"
 | 
					Function,-,ungetc,int,"int, FILE*"
 | 
				
			||||||
Function,-,unsetenv,int,const char*
 | 
					Function,-,unsetenv,int,const char*
 | 
				
			||||||
Function,-,usbd_poll,void,usbd_device*
 | 
					Function,-,usbd_poll,void,usbd_device*
 | 
				
			||||||
Function,-,utoa,char*,"unsigned, char*, int"
 | 
					Function,-,utoa,char*,"unsigned, char*, int"
 | 
				
			||||||
Function,-,uxListRemove,UBaseType_t,ListItem_t*
 | 
					 | 
				
			||||||
Function,-,uxTaskGetNumberOfTasks,UBaseType_t,
 | 
					 | 
				
			||||||
Function,-,uxTaskGetStackHighWaterMark,UBaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskGetStackHighWaterMark2,uint16_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskGetSystemState,UBaseType_t,"TaskStatus_t*, const UBaseType_t, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,uxTaskGetTaskNumber,UBaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskPriorityGet,UBaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskPriorityGetFromISR,UBaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskResetEventItemValue,TickType_t,
 | 
					 | 
				
			||||||
Function,-,uxTimerGetReloadMode,UBaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTimerGetTimerNumber,UBaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,vApplicationGetIdleTaskMemory,void,"StaticTask_t**, StackType_t**, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,vApplicationGetTimerTaskMemory,void,"StaticTask_t**, StackType_t**, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,vListInitialise,void,List_t*
 | 
					 | 
				
			||||||
Function,-,vListInitialiseItem,void,ListItem_t*
 | 
					 | 
				
			||||||
Function,-,vListInsert,void,"List_t*, ListItem_t*"
 | 
					 | 
				
			||||||
Function,-,vListInsertEnd,void,"List_t*, ListItem_t*"
 | 
					 | 
				
			||||||
Function,-,vPortDefineHeapRegions,void,const HeapRegion_t*
 | 
					 | 
				
			||||||
Function,-,vPortEndScheduler,void,
 | 
					 | 
				
			||||||
Function,+,vPortEnterCritical,void,
 | 
					 | 
				
			||||||
Function,+,vPortExitCritical,void,
 | 
					 | 
				
			||||||
Function,-,vPortFree,void,void*
 | 
					 | 
				
			||||||
Function,-,vPortGetHeapStats,void,HeapStats_t*
 | 
					 | 
				
			||||||
Function,-,vPortInitialiseBlocks,void,
 | 
					 | 
				
			||||||
Function,-,vPortSuppressTicksAndSleep,void,TickType_t
 | 
					 | 
				
			||||||
Function,-,vTaskAllocateMPURegions,void,"TaskHandle_t, const MemoryRegion_t*"
 | 
					 | 
				
			||||||
Function,-,vTaskDelay,void,const TickType_t
 | 
					 | 
				
			||||||
Function,-,vTaskDelete,void,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,vTaskEndScheduler,void,
 | 
					 | 
				
			||||||
Function,-,vTaskGenericNotifyGiveFromISR,void,"TaskHandle_t, UBaseType_t, BaseType_t*"
 | 
					 | 
				
			||||||
Function,-,vTaskGetInfo,void,"TaskHandle_t, TaskStatus_t*, BaseType_t, eTaskState"
 | 
					 | 
				
			||||||
Function,-,vTaskGetRunTimeStats,void,char*
 | 
					 | 
				
			||||||
Function,-,vTaskInternalSetTimeOutState,void,TimeOut_t*
 | 
					 | 
				
			||||||
Function,-,vTaskList,void,char*
 | 
					 | 
				
			||||||
Function,-,vTaskMissedYield,void,
 | 
					 | 
				
			||||||
Function,-,vTaskPlaceOnEventList,void,"List_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskPlaceOnEventListRestricted,void,"List_t*, TickType_t, const BaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskPlaceOnUnorderedEventList,void,"List_t*, const TickType_t, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskPriorityDisinheritAfterTimeout,void,"const TaskHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,+,vTaskPrioritySet,void,"TaskHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskRemoveFromUnorderedEventList,void,"ListItem_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskResume,void,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,vTaskSetTaskNumber,void,"TaskHandle_t, const UBaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskSetThreadLocalStoragePointer,void,"TaskHandle_t, BaseType_t, void*"
 | 
					 | 
				
			||||||
Function,-,vTaskSetTimeOutState,void,TimeOut_t*
 | 
					 | 
				
			||||||
Function,-,vTaskStartScheduler,void,
 | 
					 | 
				
			||||||
Function,-,vTaskStepTick,void,TickType_t
 | 
					 | 
				
			||||||
Function,-,vTaskSuspend,void,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,vTaskSuspendAll,void,
 | 
					 | 
				
			||||||
Function,-,vTaskSwitchContext,void,
 | 
					 | 
				
			||||||
Function,-,vTimerSetReloadMode,void,"TimerHandle_t, const BaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTimerSetTimerID,void,"TimerHandle_t, void*"
 | 
					 | 
				
			||||||
Function,-,vTimerSetTimerNumber,void,"TimerHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,+,validator_is_file_alloc_init,ValidatorIsFile*,"const char*, const char*, const char*"
 | 
					Function,+,validator_is_file_alloc_init,ValidatorIsFile*,"const char*, const char*, const char*"
 | 
				
			||||||
Function,+,validator_is_file_callback,_Bool,"const char*, FuriString*, void*"
 | 
					Function,+,validator_is_file_callback,_Bool,"const char*, FuriString*, void*"
 | 
				
			||||||
Function,+,validator_is_file_free,void,ValidatorIsFile*
 | 
					Function,+,validator_is_file_free,void,ValidatorIsFile*
 | 
				
			||||||
@ -2456,43 +2391,6 @@ Function,+,widget_alloc,Widget*,
 | 
				
			|||||||
Function,+,widget_free,void,Widget*
 | 
					Function,+,widget_free,void,Widget*
 | 
				
			||||||
Function,+,widget_get_view,View*,Widget*
 | 
					Function,+,widget_get_view,View*,Widget*
 | 
				
			||||||
Function,+,widget_reset,void,Widget*
 | 
					Function,+,widget_reset,void,Widget*
 | 
				
			||||||
Function,-,xPortGetFreeHeapSize,size_t,
 | 
					 | 
				
			||||||
Function,-,xPortGetMinimumEverFreeHeapSize,size_t,
 | 
					 | 
				
			||||||
Function,-,xPortStartScheduler,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskAbortDelay,BaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTaskCallApplicationTaskHook,BaseType_t,"TaskHandle_t, void*"
 | 
					 | 
				
			||||||
Function,-,xTaskCatchUpTicks,BaseType_t,TickType_t
 | 
					 | 
				
			||||||
Function,-,xTaskCheckForTimeOut,BaseType_t,"TimeOut_t*, TickType_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskCreate,BaseType_t,"TaskFunction_t, const char*, const uint16_t, void*, UBaseType_t, TaskHandle_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskCreateStatic,TaskHandle_t,"TaskFunction_t, const char*, const uint32_t, void*, UBaseType_t, StackType_t*, StaticTask_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskDelayUntil,BaseType_t,"TickType_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotify,BaseType_t,"TaskHandle_t, UBaseType_t, uint32_t, eNotifyAction, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotifyFromISR,BaseType_t,"TaskHandle_t, UBaseType_t, uint32_t, eNotifyAction, uint32_t*, BaseType_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotifyStateClear,BaseType_t,"TaskHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotifyWait,BaseType_t,"UBaseType_t, uint32_t, uint32_t, uint32_t*, TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTaskGetCurrentTaskHandle,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,+,xTaskGetHandle,TaskHandle_t,const char*
 | 
					 | 
				
			||||||
Function,-,xTaskGetIdleTaskHandle,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,+,xTaskGetSchedulerState,BaseType_t,
 | 
					 | 
				
			||||||
Function,+,xTaskGetTickCount,TickType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskGetTickCountFromISR,TickType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskIncrementTick,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskPriorityDisinherit,BaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTaskPriorityInherit,BaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTaskRemoveFromEventList,BaseType_t,const List_t*
 | 
					 | 
				
			||||||
Function,-,xTaskResumeAll,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskResumeFromISR,BaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerCreate,TimerHandle_t,"const char*, const TickType_t, const BaseType_t, void*, TimerCallbackFunction_t"
 | 
					 | 
				
			||||||
Function,-,xTimerCreateStatic,TimerHandle_t,"const char*, const TickType_t, const BaseType_t, void*, TimerCallbackFunction_t, StaticTimer_t*"
 | 
					 | 
				
			||||||
Function,-,xTimerCreateTimerTask,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTimerGenericCommand,BaseType_t,"TimerHandle_t, const BaseType_t, const TickType_t, BaseType_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTimerGetExpiryTime,TickType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerGetPeriod,TickType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerGetReloadMode,BaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerGetTimerDaemonTaskHandle,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,-,xTimerIsTimerActive,BaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerPendFunctionCall,BaseType_t,"PendedFunction_t, void*, uint32_t, TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTimerPendFunctionCallFromISR,BaseType_t,"PendedFunction_t, void*, uint32_t, BaseType_t*"
 | 
					 | 
				
			||||||
Function,-,y0,double,double
 | 
					Function,-,y0,double,double
 | 
				
			||||||
Function,-,y0f,float,float
 | 
					Function,-,y0f,float,float
 | 
				
			||||||
Function,-,y1,double,double
 | 
					Function,-,y1,double,double
 | 
				
			||||||
 | 
				
			|||||||
		
		
			
  | 
@ -1,5 +1,5 @@
 | 
				
			|||||||
entry,status,name,type,params
 | 
					entry,status,name,type,params
 | 
				
			||||||
Version,+,41.0,,
 | 
					Version,+,43.2,,
 | 
				
			||||||
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
 | 
					Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
 | 
				
			||||||
Header,+,applications/services/bt/bt_service/bt.h,,
 | 
					Header,+,applications/services/bt/bt_service/bt.h,,
 | 
				
			||||||
Header,+,applications/services/cli/cli.h,,
 | 
					Header,+,applications/services/cli/cli.h,,
 | 
				
			||||||
@ -179,6 +179,7 @@ Header,+,lib/subghz/blocks/math.h,,
 | 
				
			|||||||
Header,+,lib/subghz/devices/cc1101_configs.h,,
 | 
					Header,+,lib/subghz/devices/cc1101_configs.h,,
 | 
				
			||||||
Header,+,lib/subghz/devices/cc1101_int/cc1101_int_interconnect.h,,
 | 
					Header,+,lib/subghz/devices/cc1101_int/cc1101_int_interconnect.h,,
 | 
				
			||||||
Header,+,lib/subghz/environment.h,,
 | 
					Header,+,lib/subghz/environment.h,,
 | 
				
			||||||
 | 
					Header,+,lib/subghz/protocols/public_api.h,,
 | 
				
			||||||
Header,+,lib/subghz/protocols/raw.h,,
 | 
					Header,+,lib/subghz/protocols/raw.h,,
 | 
				
			||||||
Header,+,lib/subghz/receiver.h,,
 | 
					Header,+,lib/subghz/receiver.h,,
 | 
				
			||||||
Header,+,lib/subghz/registry.h,,
 | 
					Header,+,lib/subghz/registry.h,,
 | 
				
			||||||
@ -485,7 +486,6 @@ Function,-,_perror_r,void,"_reent*, const char*"
 | 
				
			|||||||
Function,-,_printf_r,int,"_reent*, const char*, ..."
 | 
					Function,-,_printf_r,int,"_reent*, const char*, ..."
 | 
				
			||||||
Function,-,_putc_r,int,"_reent*, int, FILE*"
 | 
					Function,-,_putc_r,int,"_reent*, int, FILE*"
 | 
				
			||||||
Function,-,_putc_unlocked_r,int,"_reent*, int, FILE*"
 | 
					Function,-,_putc_unlocked_r,int,"_reent*, int, FILE*"
 | 
				
			||||||
Function,-,_putchar,void,char
 | 
					 | 
				
			||||||
Function,-,_putchar_r,int,"_reent*, int"
 | 
					Function,-,_putchar_r,int,"_reent*, int"
 | 
				
			||||||
Function,-,_putchar_unlocked_r,int,"_reent*, int"
 | 
					Function,-,_putchar_unlocked_r,int,"_reent*, int"
 | 
				
			||||||
Function,-,_putenv_r,int,"_reent*, char*"
 | 
					Function,-,_putenv_r,int,"_reent*, char*"
 | 
				
			||||||
@ -839,8 +839,6 @@ Function,-,dprintf,int,"int, const char*, ..."
 | 
				
			|||||||
Function,-,drand48,double,
 | 
					Function,-,drand48,double,
 | 
				
			||||||
Function,-,drem,double,"double, double"
 | 
					Function,-,drem,double,"double, double"
 | 
				
			||||||
Function,-,dremf,float,"float, float"
 | 
					Function,-,dremf,float,"float, float"
 | 
				
			||||||
Function,-,eTaskConfirmSleepModeStatus,eSleepModeStatus,
 | 
					 | 
				
			||||||
Function,-,eTaskGetState,eTaskState,TaskHandle_t
 | 
					 | 
				
			||||||
Function,+,elements_bold_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
					Function,+,elements_bold_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
				
			||||||
Function,+,elements_bubble,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
					Function,+,elements_bubble,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t"
 | 
				
			||||||
Function,+,elements_bubble_str,void,"Canvas*, uint8_t, uint8_t, const char*, Align, Align"
 | 
					Function,+,elements_bubble_str,void,"Canvas*, uint8_t, uint8_t, const char*, Align, Align"
 | 
				
			||||||
@ -1536,6 +1534,7 @@ Function,+,furi_hal_vibro_on,void,_Bool
 | 
				
			|||||||
Function,-,furi_init,void,
 | 
					Function,-,furi_init,void,
 | 
				
			||||||
Function,+,furi_kernel_get_tick_frequency,uint32_t,
 | 
					Function,+,furi_kernel_get_tick_frequency,uint32_t,
 | 
				
			||||||
Function,+,furi_kernel_is_irq_or_masked,_Bool,
 | 
					Function,+,furi_kernel_is_irq_or_masked,_Bool,
 | 
				
			||||||
 | 
					Function,+,furi_kernel_is_running,_Bool,
 | 
				
			||||||
Function,+,furi_kernel_lock,int32_t,
 | 
					Function,+,furi_kernel_lock,int32_t,
 | 
				
			||||||
Function,+,furi_kernel_restore_lock,int32_t,int32_t
 | 
					Function,+,furi_kernel_restore_lock,int32_t,int32_t
 | 
				
			||||||
Function,+,furi_kernel_unlock,int32_t,
 | 
					Function,+,furi_kernel_unlock,int32_t,
 | 
				
			||||||
@ -1646,7 +1645,6 @@ Function,+,furi_string_utf8_push,void,"FuriString*, FuriStringUnicodeValue"
 | 
				
			|||||||
Function,+,furi_string_vprintf,int,"FuriString*, const char[], va_list"
 | 
					Function,+,furi_string_vprintf,int,"FuriString*, const char[], va_list"
 | 
				
			||||||
Function,+,furi_thread_alloc,FuriThread*,
 | 
					Function,+,furi_thread_alloc,FuriThread*,
 | 
				
			||||||
Function,+,furi_thread_alloc_ex,FuriThread*,"const char*, uint32_t, FuriThreadCallback, void*"
 | 
					Function,+,furi_thread_alloc_ex,FuriThread*,"const char*, uint32_t, FuriThreadCallback, void*"
 | 
				
			||||||
Function,+,furi_thread_catch,void,
 | 
					 | 
				
			||||||
Function,-,furi_thread_disable_heap_trace,void,FuriThread*
 | 
					Function,-,furi_thread_disable_heap_trace,void,FuriThread*
 | 
				
			||||||
Function,+,furi_thread_enable_heap_trace,void,FuriThread*
 | 
					Function,+,furi_thread_enable_heap_trace,void,FuriThread*
 | 
				
			||||||
Function,+,furi_thread_enumerate,uint32_t,"FuriThreadId*, uint32_t"
 | 
					Function,+,furi_thread_enumerate,uint32_t,"FuriThreadId*, uint32_t"
 | 
				
			||||||
@ -1687,8 +1685,11 @@ Function,+,furi_thread_suspend,void,FuriThreadId
 | 
				
			|||||||
Function,+,furi_thread_yield,void,
 | 
					Function,+,furi_thread_yield,void,
 | 
				
			||||||
Function,+,furi_timer_alloc,FuriTimer*,"FuriTimerCallback, FuriTimerType, void*"
 | 
					Function,+,furi_timer_alloc,FuriTimer*,"FuriTimerCallback, FuriTimerType, void*"
 | 
				
			||||||
Function,+,furi_timer_free,void,FuriTimer*
 | 
					Function,+,furi_timer_free,void,FuriTimer*
 | 
				
			||||||
 | 
					Function,+,furi_timer_get_expire_time,uint32_t,FuriTimer*
 | 
				
			||||||
Function,+,furi_timer_is_running,uint32_t,FuriTimer*
 | 
					Function,+,furi_timer_is_running,uint32_t,FuriTimer*
 | 
				
			||||||
Function,+,furi_timer_pending_callback,void,"FuriTimerPendigCallback, void*, uint32_t"
 | 
					Function,+,furi_timer_pending_callback,void,"FuriTimerPendigCallback, void*, uint32_t"
 | 
				
			||||||
 | 
					Function,+,furi_timer_restart,FuriStatus,FuriTimer*
 | 
				
			||||||
 | 
					Function,+,furi_timer_set_thread_priority,void,FuriTimerThreadPriority
 | 
				
			||||||
Function,+,furi_timer_start,FuriStatus,"FuriTimer*, uint32_t"
 | 
					Function,+,furi_timer_start,FuriStatus,"FuriTimer*, uint32_t"
 | 
				
			||||||
Function,+,furi_timer_stop,FuriStatus,FuriTimer*
 | 
					Function,+,furi_timer_stop,FuriStatus,FuriTimer*
 | 
				
			||||||
Function,-,fwrite,size_t,"const void*, size_t, size_t, FILE*"
 | 
					Function,-,fwrite,size_t,"const void*, size_t, size_t, FILE*"
 | 
				
			||||||
@ -2380,8 +2381,6 @@ Function,+,pb_read,_Bool,"pb_istream_t*, pb_byte_t*, size_t"
 | 
				
			|||||||
Function,+,pb_release,void,"const pb_msgdesc_t*, void*"
 | 
					Function,+,pb_release,void,"const pb_msgdesc_t*, void*"
 | 
				
			||||||
Function,+,pb_skip_field,_Bool,"pb_istream_t*, pb_wire_type_t"
 | 
					Function,+,pb_skip_field,_Bool,"pb_istream_t*, pb_wire_type_t"
 | 
				
			||||||
Function,+,pb_write,_Bool,"pb_ostream_t*, const pb_byte_t*, size_t"
 | 
					Function,+,pb_write,_Bool,"pb_ostream_t*, const pb_byte_t*, size_t"
 | 
				
			||||||
Function,-,pcTaskGetName,char*,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,pcTimerGetName,const char*,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,pclose,int,FILE*
 | 
					Function,-,pclose,int,FILE*
 | 
				
			||||||
Function,-,perror,void,const char*
 | 
					Function,-,perror,void,const char*
 | 
				
			||||||
Function,+,plugin_manager_alloc,PluginManager*,"const char*, uint32_t, const ElfApiInterface*"
 | 
					Function,+,plugin_manager_alloc,PluginManager*,"const char*, uint32_t, const ElfApiInterface*"
 | 
				
			||||||
@ -2456,12 +2455,6 @@ Function,-,putchar_unlocked,int,int
 | 
				
			|||||||
Function,-,putenv,int,char*
 | 
					Function,-,putenv,int,char*
 | 
				
			||||||
Function,-,puts,int,const char*
 | 
					Function,-,puts,int,const char*
 | 
				
			||||||
Function,-,putw,int,"int, FILE*"
 | 
					Function,-,putw,int,"int, FILE*"
 | 
				
			||||||
Function,-,pvPortCalloc,void*,"size_t, size_t"
 | 
					 | 
				
			||||||
Function,-,pvPortMalloc,void*,size_t
 | 
					 | 
				
			||||||
Function,-,pvTaskGetThreadLocalStoragePointer,void*,"TaskHandle_t, BaseType_t"
 | 
					 | 
				
			||||||
Function,-,pvTaskIncrementMutexHeldCount,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,-,pvTimerGetTimerID,void*,const TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,pxPortInitialiseStack,StackType_t*,"StackType_t*, TaskFunction_t, void*"
 | 
					 | 
				
			||||||
Function,-,qsort,void,"void*, size_t, size_t, __compar_fn_t"
 | 
					Function,-,qsort,void,"void*, size_t, size_t, __compar_fn_t"
 | 
				
			||||||
Function,-,qsort_r,void,"void*, size_t, size_t, int (*)(const void*, const void*, void*), void*"
 | 
					Function,-,qsort_r,void,"void*, size_t, size_t, int (*)(const void*, const void*, void*), void*"
 | 
				
			||||||
Function,-,quick_exit,void,int
 | 
					Function,-,quick_exit,void,int
 | 
				
			||||||
@ -2491,7 +2484,7 @@ Function,-,round,double,double
 | 
				
			|||||||
Function,+,roundf,float,float
 | 
					Function,+,roundf,float,float
 | 
				
			||||||
Function,-,roundl,long double,long double
 | 
					Function,-,roundl,long double,long double
 | 
				
			||||||
Function,+,rpc_session_close,void,RpcSession*
 | 
					Function,+,rpc_session_close,void,RpcSession*
 | 
				
			||||||
Function,+,rpc_session_feed,size_t,"RpcSession*, uint8_t*, size_t, TickType_t"
 | 
					Function,+,rpc_session_feed,size_t,"RpcSession*, uint8_t*, size_t, uint32_t"
 | 
				
			||||||
Function,+,rpc_session_get_available_size,size_t,RpcSession*
 | 
					Function,+,rpc_session_get_available_size,size_t,RpcSession*
 | 
				
			||||||
Function,+,rpc_session_get_owner,RpcOwner,RpcSession*
 | 
					Function,+,rpc_session_get_owner,RpcOwner,RpcSession*
 | 
				
			||||||
Function,+,rpc_session_open,RpcSession*,"Rpc*, RpcOwner"
 | 
					Function,+,rpc_session_open,RpcSession*,"Rpc*, RpcOwner"
 | 
				
			||||||
@ -3011,67 +3004,10 @@ Function,-,uECC_sign_deterministic,int,"const uint8_t*, const uint8_t*, unsigned
 | 
				
			|||||||
Function,-,uECC_valid_public_key,int,"const uint8_t*, uECC_Curve"
 | 
					Function,-,uECC_valid_public_key,int,"const uint8_t*, uECC_Curve"
 | 
				
			||||||
Function,-,uECC_verify,int,"const uint8_t*, const uint8_t*, unsigned, const uint8_t*, uECC_Curve"
 | 
					Function,-,uECC_verify,int,"const uint8_t*, const uint8_t*, unsigned, const uint8_t*, uECC_Curve"
 | 
				
			||||||
Function,+,uint8_to_hex_chars,void,"const uint8_t*, uint8_t*, int"
 | 
					Function,+,uint8_to_hex_chars,void,"const uint8_t*, uint8_t*, int"
 | 
				
			||||||
Function,-,ulTaskGenericNotifyTake,uint32_t,"UBaseType_t, BaseType_t, TickType_t"
 | 
					 | 
				
			||||||
Function,-,ulTaskGenericNotifyValueClear,uint32_t,"TaskHandle_t, UBaseType_t, uint32_t"
 | 
					 | 
				
			||||||
Function,-,ulTaskGetIdleRunTimeCounter,uint32_t,
 | 
					 | 
				
			||||||
Function,-,ulTaskGetIdleRunTimePercent,uint32_t,
 | 
					 | 
				
			||||||
Function,-,ungetc,int,"int, FILE*"
 | 
					Function,-,ungetc,int,"int, FILE*"
 | 
				
			||||||
Function,-,unsetenv,int,const char*
 | 
					Function,-,unsetenv,int,const char*
 | 
				
			||||||
Function,-,usbd_poll,void,usbd_device*
 | 
					Function,-,usbd_poll,void,usbd_device*
 | 
				
			||||||
Function,-,utoa,char*,"unsigned, char*, int"
 | 
					Function,-,utoa,char*,"unsigned, char*, int"
 | 
				
			||||||
Function,-,uxListRemove,UBaseType_t,ListItem_t*
 | 
					 | 
				
			||||||
Function,-,uxTaskGetNumberOfTasks,UBaseType_t,
 | 
					 | 
				
			||||||
Function,-,uxTaskGetStackHighWaterMark,UBaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskGetStackHighWaterMark2,uint16_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskGetSystemState,UBaseType_t,"TaskStatus_t*, const UBaseType_t, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,uxTaskGetTaskNumber,UBaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskPriorityGet,UBaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskPriorityGetFromISR,UBaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTaskResetEventItemValue,TickType_t,
 | 
					 | 
				
			||||||
Function,-,uxTimerGetReloadMode,UBaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,uxTimerGetTimerNumber,UBaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,vApplicationGetIdleTaskMemory,void,"StaticTask_t**, StackType_t**, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,vApplicationGetTimerTaskMemory,void,"StaticTask_t**, StackType_t**, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,vListInitialise,void,List_t*
 | 
					 | 
				
			||||||
Function,-,vListInitialiseItem,void,ListItem_t*
 | 
					 | 
				
			||||||
Function,-,vListInsert,void,"List_t*, ListItem_t*"
 | 
					 | 
				
			||||||
Function,-,vListInsertEnd,void,"List_t*, ListItem_t*"
 | 
					 | 
				
			||||||
Function,-,vPortDefineHeapRegions,void,const HeapRegion_t*
 | 
					 | 
				
			||||||
Function,-,vPortEndScheduler,void,
 | 
					 | 
				
			||||||
Function,+,vPortEnterCritical,void,
 | 
					 | 
				
			||||||
Function,+,vPortExitCritical,void,
 | 
					 | 
				
			||||||
Function,-,vPortFree,void,void*
 | 
					 | 
				
			||||||
Function,-,vPortGetHeapStats,void,HeapStats_t*
 | 
					 | 
				
			||||||
Function,-,vPortInitialiseBlocks,void,
 | 
					 | 
				
			||||||
Function,-,vPortSuppressTicksAndSleep,void,TickType_t
 | 
					 | 
				
			||||||
Function,-,vTaskAllocateMPURegions,void,"TaskHandle_t, const MemoryRegion_t*"
 | 
					 | 
				
			||||||
Function,-,vTaskDelay,void,const TickType_t
 | 
					 | 
				
			||||||
Function,-,vTaskDelete,void,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,vTaskEndScheduler,void,
 | 
					 | 
				
			||||||
Function,-,vTaskGenericNotifyGiveFromISR,void,"TaskHandle_t, UBaseType_t, BaseType_t*"
 | 
					 | 
				
			||||||
Function,-,vTaskGetInfo,void,"TaskHandle_t, TaskStatus_t*, BaseType_t, eTaskState"
 | 
					 | 
				
			||||||
Function,-,vTaskGetRunTimeStats,void,char*
 | 
					 | 
				
			||||||
Function,-,vTaskInternalSetTimeOutState,void,TimeOut_t*
 | 
					 | 
				
			||||||
Function,-,vTaskList,void,char*
 | 
					 | 
				
			||||||
Function,-,vTaskMissedYield,void,
 | 
					 | 
				
			||||||
Function,-,vTaskPlaceOnEventList,void,"List_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskPlaceOnEventListRestricted,void,"List_t*, TickType_t, const BaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskPlaceOnUnorderedEventList,void,"List_t*, const TickType_t, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskPriorityDisinheritAfterTimeout,void,"const TaskHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,+,vTaskPrioritySet,void,"TaskHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskRemoveFromUnorderedEventList,void,"ListItem_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskResume,void,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,vTaskSetTaskNumber,void,"TaskHandle_t, const UBaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTaskSetThreadLocalStoragePointer,void,"TaskHandle_t, BaseType_t, void*"
 | 
					 | 
				
			||||||
Function,-,vTaskSetTimeOutState,void,TimeOut_t*
 | 
					 | 
				
			||||||
Function,-,vTaskStartScheduler,void,
 | 
					 | 
				
			||||||
Function,-,vTaskStepTick,void,TickType_t
 | 
					 | 
				
			||||||
Function,-,vTaskSuspend,void,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,vTaskSuspendAll,void,
 | 
					 | 
				
			||||||
Function,-,vTaskSwitchContext,void,
 | 
					 | 
				
			||||||
Function,-,vTimerSetReloadMode,void,"TimerHandle_t, const BaseType_t"
 | 
					 | 
				
			||||||
Function,-,vTimerSetTimerID,void,"TimerHandle_t, void*"
 | 
					 | 
				
			||||||
Function,-,vTimerSetTimerNumber,void,"TimerHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,+,validator_is_file_alloc_init,ValidatorIsFile*,"const char*, const char*, const char*"
 | 
					Function,+,validator_is_file_alloc_init,ValidatorIsFile*,"const char*, const char*, const char*"
 | 
				
			||||||
Function,+,validator_is_file_callback,_Bool,"const char*, FuriString*, void*"
 | 
					Function,+,validator_is_file_callback,_Bool,"const char*, FuriString*, void*"
 | 
				
			||||||
Function,+,validator_is_file_free,void,ValidatorIsFile*
 | 
					Function,+,validator_is_file_free,void,ValidatorIsFile*
 | 
				
			||||||
@ -3186,43 +3122,6 @@ Function,+,widget_alloc,Widget*,
 | 
				
			|||||||
Function,+,widget_free,void,Widget*
 | 
					Function,+,widget_free,void,Widget*
 | 
				
			||||||
Function,+,widget_get_view,View*,Widget*
 | 
					Function,+,widget_get_view,View*,Widget*
 | 
				
			||||||
Function,+,widget_reset,void,Widget*
 | 
					Function,+,widget_reset,void,Widget*
 | 
				
			||||||
Function,-,xPortGetFreeHeapSize,size_t,
 | 
					 | 
				
			||||||
Function,-,xPortGetMinimumEverFreeHeapSize,size_t,
 | 
					 | 
				
			||||||
Function,-,xPortStartScheduler,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskAbortDelay,BaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTaskCallApplicationTaskHook,BaseType_t,"TaskHandle_t, void*"
 | 
					 | 
				
			||||||
Function,-,xTaskCatchUpTicks,BaseType_t,TickType_t
 | 
					 | 
				
			||||||
Function,-,xTaskCheckForTimeOut,BaseType_t,"TimeOut_t*, TickType_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskCreate,BaseType_t,"TaskFunction_t, const char*, const uint16_t, void*, UBaseType_t, TaskHandle_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskCreateStatic,TaskHandle_t,"TaskFunction_t, const char*, const uint32_t, void*, UBaseType_t, StackType_t*, StaticTask_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskDelayUntil,BaseType_t,"TickType_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotify,BaseType_t,"TaskHandle_t, UBaseType_t, uint32_t, eNotifyAction, uint32_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotifyFromISR,BaseType_t,"TaskHandle_t, UBaseType_t, uint32_t, eNotifyAction, uint32_t*, BaseType_t*"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotifyStateClear,BaseType_t,"TaskHandle_t, UBaseType_t"
 | 
					 | 
				
			||||||
Function,-,xTaskGenericNotifyWait,BaseType_t,"UBaseType_t, uint32_t, uint32_t, uint32_t*, TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTaskGetCurrentTaskHandle,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,+,xTaskGetHandle,TaskHandle_t,const char*
 | 
					 | 
				
			||||||
Function,-,xTaskGetIdleTaskHandle,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,+,xTaskGetSchedulerState,BaseType_t,
 | 
					 | 
				
			||||||
Function,+,xTaskGetTickCount,TickType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskGetTickCountFromISR,TickType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskIncrementTick,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskPriorityDisinherit,BaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTaskPriorityInherit,BaseType_t,const TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTaskRemoveFromEventList,BaseType_t,const List_t*
 | 
					 | 
				
			||||||
Function,-,xTaskResumeAll,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTaskResumeFromISR,BaseType_t,TaskHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerCreate,TimerHandle_t,"const char*, const TickType_t, const BaseType_t, void*, TimerCallbackFunction_t"
 | 
					 | 
				
			||||||
Function,-,xTimerCreateStatic,TimerHandle_t,"const char*, const TickType_t, const BaseType_t, void*, TimerCallbackFunction_t, StaticTimer_t*"
 | 
					 | 
				
			||||||
Function,-,xTimerCreateTimerTask,BaseType_t,
 | 
					 | 
				
			||||||
Function,-,xTimerGenericCommand,BaseType_t,"TimerHandle_t, const BaseType_t, const TickType_t, BaseType_t*, const TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTimerGetExpiryTime,TickType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerGetPeriod,TickType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerGetReloadMode,BaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerGetTimerDaemonTaskHandle,TaskHandle_t,
 | 
					 | 
				
			||||||
Function,-,xTimerIsTimerActive,BaseType_t,TimerHandle_t
 | 
					 | 
				
			||||||
Function,-,xTimerPendFunctionCall,BaseType_t,"PendedFunction_t, void*, uint32_t, TickType_t"
 | 
					 | 
				
			||||||
Function,-,xTimerPendFunctionCallFromISR,BaseType_t,"PendedFunction_t, void*, uint32_t, BaseType_t*"
 | 
					 | 
				
			||||||
Function,-,y0,double,double
 | 
					Function,-,y0,double,double
 | 
				
			||||||
Function,-,y0f,float,float
 | 
					Function,-,y0f,float,float
 | 
				
			||||||
Function,-,y1,double,double
 | 
					Function,-,y1,double,double
 | 
				
			||||||
 | 
				
			|||||||
		
		
			
  | 
@ -532,8 +532,6 @@ void gap_thread_stop() {
 | 
				
			|||||||
        // Free resources
 | 
					        // Free resources
 | 
				
			||||||
        furi_mutex_free(gap->state_mutex);
 | 
					        furi_mutex_free(gap->state_mutex);
 | 
				
			||||||
        furi_message_queue_free(gap->command_queue);
 | 
					        furi_message_queue_free(gap->command_queue);
 | 
				
			||||||
        furi_timer_stop(gap->advertise_timer);
 | 
					 | 
				
			||||||
        while(xTimerIsTimerActive(gap->advertise_timer) == pdTRUE) furi_delay_tick(1);
 | 
					 | 
				
			||||||
        furi_timer_free(gap->advertise_timer);
 | 
					        furi_timer_free(gap->advertise_timer);
 | 
				
			||||||
        free(gap);
 | 
					        free(gap);
 | 
				
			||||||
        gap = NULL;
 | 
					        gap = NULL;
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <hsem_map.h>
 | 
					#include <hsem_map.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
 | 
					#include <task.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "FuriHalFlash"
 | 
					#define TAG "FuriHalFlash"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FURI_HAL_CRITICAL_MSG "Critical flash operation fail"
 | 
					#define FURI_HAL_CRITICAL_MSG "Critical flash operation fail"
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <furi.h>
 | 
					#include <furi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <FreeRTOS.h>
 | 
				
			||||||
 | 
					#include <task.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "FuriHalOs"
 | 
					#define TAG "FuriHalOs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FURI_HAL_IDLE_TIMER_CLK_HZ 32768
 | 
					#define FURI_HAL_IDLE_TIMER_CLK_HZ 32768
 | 
				
			||||||
 | 
				
			|||||||
@ -459,10 +459,10 @@ void furi_hal_power_disable_external_3_3v() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void furi_hal_power_suppress_charge_enter() {
 | 
					void furi_hal_power_suppress_charge_enter() {
 | 
				
			||||||
    vTaskSuspendAll();
 | 
					    FURI_CRITICAL_ENTER();
 | 
				
			||||||
    bool disable_charging = furi_hal_power.suppress_charge == 0;
 | 
					    bool disable_charging = furi_hal_power.suppress_charge == 0;
 | 
				
			||||||
    furi_hal_power.suppress_charge++;
 | 
					    furi_hal_power.suppress_charge++;
 | 
				
			||||||
    xTaskResumeAll();
 | 
					    FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(disable_charging) {
 | 
					    if(disable_charging) {
 | 
				
			||||||
        furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
 | 
					        furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
 | 
				
			||||||
@ -472,10 +472,10 @@ void furi_hal_power_suppress_charge_enter() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void furi_hal_power_suppress_charge_exit() {
 | 
					void furi_hal_power_suppress_charge_exit() {
 | 
				
			||||||
    vTaskSuspendAll();
 | 
					    FURI_CRITICAL_ENTER();
 | 
				
			||||||
    furi_hal_power.suppress_charge--;
 | 
					    furi_hal_power.suppress_charge--;
 | 
				
			||||||
    bool enable_charging = furi_hal_power.suppress_charge == 0;
 | 
					    bool enable_charging = furi_hal_power.suppress_charge == 0;
 | 
				
			||||||
    xTaskResumeAll();
 | 
					    FURI_CRITICAL_EXIT();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(enable_charging) {
 | 
					    if(enable_charging) {
 | 
				
			||||||
        furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
 | 
					        furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
 | 
				
			||||||
 | 
				
			|||||||
@ -200,7 +200,7 @@ bool furi_hal_spi_bus_trx_dma(
 | 
				
			|||||||
    furi_assert(size > 0);
 | 
					    furi_assert(size > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If scheduler is not running, use blocking mode
 | 
					    // If scheduler is not running, use blocking mode
 | 
				
			||||||
    if(xTaskGetSchedulerState() != taskSCHEDULER_RUNNING) {
 | 
					    if(furi_kernel_is_running()) {
 | 
				
			||||||
        return furi_hal_spi_bus_trx(handle, tx_buffer, rx_buffer, size, timeout_ms);
 | 
					        return furi_hal_spi_bus_trx(handle, tx_buffer, rx_buffer, size, timeout_ms);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -3,13 +3,14 @@
 | 
				
			|||||||
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
 | 
					#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#pragma GCC diagnostic ignored "-Wredundant-decls"
 | 
					#pragma GCC diagnostic ignored "-Wredundant-decls"
 | 
				
			||||||
extern uint32_t SystemCoreClock;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CMSIS_device_header
 | 
					#ifndef CMSIS_device_header
 | 
				
			||||||
#define CMSIS_device_header "stm32wbxx.h"
 | 
					#define CMSIS_device_header "stm32wbxx.h"
 | 
				
			||||||
#endif /* CMSIS_device_header */
 | 
					#endif /* CMSIS_device_header */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include CMSIS_device_header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define configENABLE_FPU 1
 | 
					#define configENABLE_FPU 1
 | 
				
			||||||
#define configENABLE_MPU 0
 | 
					#define configENABLE_MPU 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								targets/f7/inc/furi_config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								targets/f7/inc/furi_config.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FURI_CONFIG_THREAD_MAX_PRIORITIES (32)
 | 
				
			||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
#include <furi_hal.h>
 | 
					#include <furi_hal.h>
 | 
				
			||||||
#include <flipper.h>
 | 
					#include <flipper.h>
 | 
				
			||||||
#include <alt_boot.h>
 | 
					#include <alt_boot.h>
 | 
				
			||||||
#include <semphr.h>
 | 
					 | 
				
			||||||
#include <update_util/update_operation.h>
 | 
					#include <update_util/update_operation.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAG "Main"
 | 
					#define TAG "Main"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user