diff --git a/ReadMe.md b/ReadMe.md index c9773fdbc..87e6df32e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -123,7 +123,7 @@ Note: This repo is always updated with OFW & Unleashed. No need to mention all t - Custom subghz presets - Multiple NFC protocols - Multiple Sub-Ghz protocols | Merged from Unleashed, thanks @xMasterX -- Subghz and IR signal replication via gpio | Credits to @ankris812 +- Subghz and IR signal replication via gpio | Credits to @xMasterX - New API Routes for Locale settings ``` diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 9cb9f1b24..ddf3b1544 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -469,7 +469,7 @@ int32_t bt_srv(void* p) { UNUSED(p); Bt* bt = bt_alloc(); - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + if(!furi_hal_is_normal_boot()) { FURI_LOG_W(TAG, "Skipping start in special boot mode"); ble_glue_wait_for_c2_start(FURI_HAL_BT_C2_START_TIMEOUT); furi_record_create(RECORD_BT, bt); diff --git a/applications/services/cli/cli.c b/applications/services/cli/cli.c index ad3bbd665..a6aaa8429 100644 --- a/applications/services/cli/cli.c +++ b/applications/services/cli/cli.c @@ -460,7 +460,7 @@ int32_t cli_srv(void* p) { furi_thread_set_stdout_callback(NULL); } - if(furi_hal_rtc_get_boot_mode() == FuriHalRtcBootModeNormal) { + if(furi_hal_is_normal_boot()) { cli_session_open(cli, &cli_vcp); } else { FURI_LOG_W(TAG, "Skipping start in special boot mode"); diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index a578ecfcb..89e4f6105 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -304,11 +304,19 @@ static bool desktop_check_file_flag(const char* flag_path) { int32_t desktop_srv(void* p) { UNUSED(p); - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + if(!furi_hal_is_normal_boot()) { FURI_LOG_W(TAG, "Skipping start in special boot mode"); return 0; } + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagResetPin)) { + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_remove(storage, DESKTOP_SETTINGS_PATH); + storage_common_remove(storage, DESKTOP_SETTINGS_OLD_PATH); + furi_record_close(RECORD_STORAGE); + furi_hal_rtc_reset_flag(FuriHalRtcFlagResetPin); + } + Desktop* desktop = desktop_alloc(); bool loaded = DESKTOP_SETTINGS_LOAD(&desktop->settings); diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index cf37c5cd9..df34abe78 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -161,7 +161,7 @@ static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) { int32_t dolphin_srv(void* p) { UNUSED(p); - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + if(!furi_hal_is_normal_boot()) { FURI_LOG_W(TAG, "Skipping start in special boot mode"); return 0; } diff --git a/applications/services/namechangersrv/namechangersrv.c b/applications/services/namechangersrv/namechangersrv.c index fe25906ae..33aeb3fdd 100644 --- a/applications/services/namechangersrv/namechangersrv.c +++ b/applications/services/namechangersrv/namechangersrv.c @@ -4,7 +4,7 @@ #include void namechanger_on_system_start() { - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + if(!furi_hal_is_normal_boot()) { FURI_LOG_W(TAG, "NameChangerSRV load skipped. Device is in special startup mode."); } else { Storage* storage = furi_record_open(RECORD_STORAGE); diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 7c1b9be58..4c4e1404e 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -515,7 +515,7 @@ static void power_check_battery_level_change(Power* power) { int32_t power_srv(void* p) { UNUSED(p); - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + if(!furi_hal_is_normal_boot()) { FURI_LOG_W(TAG, "Skipping start in special boot mode"); return 0; } diff --git a/applications/services/rgb_backlight/rgb_backlight.c b/applications/services/rgb_backlight/rgb_backlight.c index d7ab89975..2dbfa7e8c 100644 --- a/applications/services/rgb_backlight/rgb_backlight.c +++ b/applications/services/rgb_backlight/rgb_backlight.c @@ -63,8 +63,7 @@ const char* rgb_backlight_get_color_text(uint8_t index) { void rgb_backlight_load_settings(void) { //Не загружать данные из внутренней памяти при загрузке в режиме DFU - FuriHalRtcBootMode bm = furi_hal_rtc_get_boot_mode(); - if(bm == FuriHalRtcBootModeDfu) { + if(!furi_hal_is_normal_boot()) { rgb_settings.settings_is_loaded = true; return; } diff --git a/applications/services/xtreme/assets.c b/applications/services/xtreme/assets.c index 2e4e0bda9..574e932ce 100644 --- a/applications/services/xtreme/assets.c +++ b/applications/services/xtreme/assets.c @@ -143,7 +143,7 @@ void XTREME_ASSETS_LOAD() { xtreme_assets->I_Connected_62x31 = &I_Connected_62x31; xtreme_assets->I_Error_62x31 = &I_Error_62x31; - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + if(!furi_hal_is_normal_boot()) { FURI_LOG_W(TAG, "Load skipped. Device is in special startup mode."); return; } diff --git a/applications/services/xtreme/settings.c b/applications/services/xtreme/settings.c index 799c1a768..a5b7ee6cb 100644 --- a/applications/services/xtreme/settings.c +++ b/applications/services/xtreme/settings.c @@ -15,9 +15,8 @@ void XTREME_SETTINGS_LOAD() { if(xtreme_settings == NULL) { xtreme_settings = malloc(sizeof(XtremeSettings)); bool loaded = false; - bool skip = furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal; - if(skip) { + if(!furi_hal_is_normal_boot()) { FURI_LOG_W(TAG, "Load skipped. Device is in special startup mode."); loaded = false; } else { @@ -74,7 +73,7 @@ bool XTREME_SETTINGS_SAVE() { XTREME_SETTINGS_LOAD(); } - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + if(!furi_hal_is_normal_boot()) { return true; } diff --git a/applications/settings/bt_settings_app/bt_settings_app.c b/applications/settings/bt_settings_app/bt_settings_app.c index f211c7128..71d0495e3 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.c +++ b/applications/settings/bt_settings_app/bt_settings_app.c @@ -16,9 +16,9 @@ BtSettingsApp* bt_settings_app_alloc() { BtSettingsApp* app = malloc(sizeof(BtSettingsApp)); // Load settings - bt_settings_load(&app->settings); app->gui = furi_record_open(RECORD_GUI); app->bt = furi_record_open(RECORD_BT); + bt_settings_load(&app->bt->bt_settings); // View Dispatcher and Scene Manager app->view_dispatcher = view_dispatcher_alloc(); @@ -79,7 +79,7 @@ extern int32_t bt_settings_app(void* p) { UNUSED(p); BtSettingsApp* app = bt_settings_app_alloc(); view_dispatcher_run(app->view_dispatcher); - bt_settings_save(&app->settings); + bt_settings_save(&app->bt->bt_settings); bt_settings_app_free(app); return 0; } diff --git a/applications/settings/bt_settings_app/bt_settings_app.h b/applications/settings/bt_settings_app/bt_settings_app.h index b79e36951..4dc20b020 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.h +++ b/applications/settings/bt_settings_app/bt_settings_app.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -24,7 +25,6 @@ enum BtSettingsCustomEvent { }; typedef struct { - BtSettings settings; Bt* bt; Gui* gui; SceneManager* scene_manager; diff --git a/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c b/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c index 5db98e9de..696e5c8d0 100644 --- a/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c +++ b/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c @@ -46,7 +46,7 @@ void bt_settings_scene_start_on_enter(void* context) { BtSettingNum, bt_settings_scene_start_var_list_change_callback, app); - if(app->settings.enabled) { + if(app->bt->bt_settings.enabled) { variable_item_set_current_value_index(item, BtSettingOn); variable_item_set_current_value_text(item, bt_settings_text[BtSettingOn]); } else { @@ -71,10 +71,10 @@ bool bt_settings_scene_start_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == BtSettingOn) { furi_hal_bt_start_advertising(); - app->settings.enabled = true; + app->bt->bt_settings.enabled = true; consumed = true; } else if(event.event == BtSettingOff) { - app->settings.enabled = false; + app->bt->bt_settings.enabled = false; furi_hal_bt_stop_advertising(); consumed = true; } else if(event.event == BtSettingsCustomEventForgetDevices) { diff --git a/firmware/targets/f18/furi_hal/furi_hal.c b/firmware/targets/f18/furi_hal/furi_hal.c index 4064dd647..9b234143c 100644 --- a/firmware/targets/f18/furi_hal/furi_hal.c +++ b/firmware/targets/f18/furi_hal/furi_hal.c @@ -6,6 +6,12 @@ #define TAG "FuriHal" +bool normal_boot = false; + +bool furi_hal_is_normal_boot() { + return normal_boot; +} + void furi_hal_init_early() { furi_hal_cortex_init_early(); furi_hal_clock_init_early(); @@ -26,6 +32,7 @@ void furi_hal_deinit_early() { } void furi_hal_init() { + normal_boot = true; furi_hal_mpu_init(); furi_hal_clock_init(); furi_hal_console_init(); diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 66536e574..be5934b82 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1261,6 +1261,7 @@ Function,-,furi_hal_init_early,void, Function,-,furi_hal_interrupt_init,void, Function,+,furi_hal_interrupt_set_isr,void,"FuriHalInterruptId, FuriHalInterruptISR, void*" Function,+,furi_hal_interrupt_set_isr_ex,void,"FuriHalInterruptId, uint16_t, FuriHalInterruptISR, void*" +Function,-,furi_hal_is_normal_boot,_Bool, Function,+,furi_hal_light_blink_set_color,void,Light Function,+,furi_hal_light_blink_start,void,"Light, uint8_t, uint16_t, uint16_t" Function,+,furi_hal_light_blink_stop,void, diff --git a/firmware/targets/f7/furi_hal/furi_hal.c b/firmware/targets/f7/furi_hal/furi_hal.c index c9b4c8088..01ec37bc6 100644 --- a/firmware/targets/f7/furi_hal/furi_hal.c +++ b/firmware/targets/f7/furi_hal/furi_hal.c @@ -6,6 +6,12 @@ #define TAG "FuriHal" +bool normal_boot = false; + +bool furi_hal_is_normal_boot() { + return normal_boot; +} + void furi_hal_init_early() { furi_hal_cortex_init_early(); furi_hal_clock_init_early(); @@ -26,6 +32,7 @@ void furi_hal_deinit_early() { } void furi_hal_init() { + normal_boot = true; furi_hal_mpu_init(); furi_hal_clock_init(); furi_hal_console_init(); diff --git a/firmware/targets/f7/src/recovery.c b/firmware/targets/f7/src/recovery.c index 49d780d47..700fb03c6 100644 --- a/firmware/targets/f7/src/recovery.c +++ b/firmware/targets/f7/src/recovery.c @@ -56,6 +56,7 @@ void flipper_boot_recovery_exec() { } if(!counter) { + furi_hal_rtc_set_flag(FuriHalRtcFlagResetPin); furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset); furi_hal_rtc_set_pin_fails(0); furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); diff --git a/firmware/targets/furi_hal_include/furi_hal.h b/firmware/targets/furi_hal_include/furi_hal.h index 2eb4688d4..7d6dc7f24 100644 --- a/firmware/targets/furi_hal_include/furi_hal.h +++ b/firmware/targets/furi_hal_include/furi_hal.h @@ -42,6 +42,9 @@ struct STOP_EXTERNING_ME {}; extern "C" { #endif +/** True if normally with all subsystems */ +bool furi_hal_is_normal_boot(); + /** Early FuriHal init, only essential subsystems */ void furi_hal_init_early(); diff --git a/firmware/targets/furi_hal_include/furi_hal_rtc.h b/firmware/targets/furi_hal_include/furi_hal_rtc.h index b16b04a68..96acb5848 100644 --- a/firmware/targets/furi_hal_include/furi_hal_rtc.h +++ b/firmware/targets/furi_hal_include/furi_hal_rtc.h @@ -30,6 +30,7 @@ typedef enum { FuriHalRtcFlagLock = (1 << 2), FuriHalRtcFlagC2Update = (1 << 3), FuriHalRtcFlagHandOrient = (1 << 4), + FuriHalRtcFlagResetPin = (1 << 5), } FuriHalRtcFlag; typedef enum {