diff --git a/applications/services/application.fam b/applications/services/application.fam index 0389d1cba..8d7d8168a 100644 --- a/applications/services/application.fam +++ b/applications/services/application.fam @@ -10,5 +10,6 @@ App( "loader", "power", "ibuttonsrv", + "namechangersrv", ], ) diff --git a/applications/services/namechangersrv/application.fam b/applications/services/namechangersrv/application.fam new file mode 100644 index 000000000..5b64db607 --- /dev/null +++ b/applications/services/namechangersrv/application.fam @@ -0,0 +1,7 @@ +App( + appid="namechangersrv", + apptype=FlipperAppType.STARTUP, + entry_point="namechanger_on_system_start", + requires=["storage"], + order=130, +) \ No newline at end of file diff --git a/applications/services/namechangersrv/namechangersrv.c b/applications/services/namechangersrv/namechangersrv.c new file mode 100644 index 000000000..675cf2716 --- /dev/null +++ b/applications/services/namechangersrv/namechangersrv.c @@ -0,0 +1,178 @@ +#include "namechangersrv.h" +#include "m-string.h" +#include +#include + +void namechanger_on_system_start() { + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* file = flipper_format_file_alloc(storage); + + string_t NAMEHEADER; + string_init_set_str(NAMEHEADER, "Flipper Name File"); + + string_t folderpath; + string_init_set_str(folderpath, "/ext/dolphin"); + + string_t filepath; + string_init_set_str(filepath, "/ext/dolphin/name.txt"); + + //Make dir if doesn't exist + if(storage_simply_mkdir(storage, string_get_cstr(folderpath))) { + bool result = false; + + string_t data; + string_init(data); + + do { + if(!flipper_format_file_open_existing(file, string_get_cstr(filepath))) { + break; + } + + // header + uint32_t version; + + if(!flipper_format_read_header(file, data, &version)) { + break; + } + + if(string_cmp_str(data, string_get_cstr(NAMEHEADER)) != 0) { + break; + } + + if(version != 1) { + break; + } + + // get Name + if(!flipper_format_read_string(file, "Name", data)) { + break; + } + + result = true; + } while(false); + + flipper_format_free(file); + + if(!result) { + //file not good - write new one + FlipperFormat* file = flipper_format_file_alloc(storage); + + bool res = false; + + string_t name; + string_init_set_str(name, furi_hal_version_get_name_ptr()); + + do { + // Open file for write + if(!flipper_format_file_open_always(file, string_get_cstr(filepath))) { + break; + } + + // Write header + if(!flipper_format_write_header_cstr(file, string_get_cstr(NAMEHEADER), 1)) { + break; + } + + // Write comments + if(!flipper_format_write_comment_cstr( + file, + "Changing the value below will change your FlipperZero device name.")) { + break; + } + + if(!flipper_format_write_comment_cstr( + file, + "Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _")) { + break; + } + + if(!flipper_format_write_comment_cstr( + file, "It can contain other characters but use at your own risk.")) { + break; + } + + //Write name + if(!flipper_format_write_string_cstr(file, "Name", string_get_cstr(name))) { + break; + } + + res = true; + } while(false); + + flipper_format_free(file); + + if(!res) { + FURI_LOG_E(TAG, "Save failed."); + } + + string_clear(name); + } else { + string_strim(data); + FURI_LOG_I(TAG, "data: %s", data); + + if(!string_size(data)) { + //Empty file - get default name and write to file. + FlipperFormat* file = flipper_format_file_alloc(storage); + + bool res = false; + + string_t name; + string_init_set_str(name, furi_hal_version_get_name_ptr()); + + do { + // Open file for write + if(!flipper_format_file_open_always(file, string_get_cstr(filepath))) { + break; + } + + // Write header + if(!flipper_format_write_header_cstr(file, string_get_cstr(NAMEHEADER), 1)) { + break; + } + + // Write comments + if(!flipper_format_write_comment_cstr( + file, + "Changing the value below will change your FlipperZero device name.")) { + break; + } + + if(!flipper_format_write_comment_cstr( + file, + "Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _")) { + break; + } + + if(!flipper_format_write_comment_cstr( + file, "It cannot contain any other characters.")) { + break; + } + + //Write name + if(!flipper_format_write_string_cstr(file, "Name", string_get_cstr(name))) { + break; + } + + res = true; + } while(false); + + flipper_format_free(file); + + if(!res) { + FURI_LOG_E(TAG, "Save failed."); + } + + string_clear(name); + } else { + //set name from file + furi_hal_version_set_custom_name(string_get_cstr(data)); + } + } + + string_clear(data); + } + + string_clear(filepath); + string_clear(folderpath); + furi_record_close(RECORD_STORAGE); +} \ No newline at end of file diff --git a/applications/services/namechangersrv/namechangersrv.h b/applications/services/namechangersrv/namechangersrv.h new file mode 100644 index 000000000..c5014355b --- /dev/null +++ b/applications/services/namechangersrv/namechangersrv.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +#define NAMECHANGER_TEXT_STORE_SIZE 9 +#define NAMECHANGER_HEADER "Flipper Name File" + +#define TAG "NameChangerSRV" diff --git a/firmware/targets/f7/furi_hal/furi_hal_version.c b/firmware/targets/f7/furi_hal/furi_hal_version.c index 500317cdc..debcdf439 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_version.c +++ b/firmware/targets/f7/furi_hal/furi_hal_version.c @@ -90,6 +90,16 @@ typedef struct { static FuriHalVersion furi_hal_version = {0}; +void furi_hal_version_set_custom_name(const char* name) { + if((name != NULL) && ((strlen(name) >= 1) && (strlen(name) <= 8))) { + strlcpy(furi_hal_version.name, name, FURI_HAL_VERSION_ARRAY_NAME_LENGTH); + snprintf( + furi_hal_version.device_name, FURI_HAL_VERSION_DEVICE_NAME_LENGTH, "xFlipper %s", name); + + furi_hal_version.device_name[0] = AD_TYPE_COMPLETE_LOCAL_NAME; + } +} + static void furi_hal_version_set_name(const char* name) { if(name != NULL) { strlcpy(furi_hal_version.name, name, FURI_HAL_VERSION_ARRAY_NAME_LENGTH); diff --git a/firmware/targets/furi_hal_include/furi_hal_version.h b/firmware/targets/furi_hal_include/furi_hal_version.h index 720fdfd17..297090732 100644 --- a/firmware/targets/furi_hal_include/furi_hal_version.h +++ b/firmware/targets/furi_hal_include/furi_hal_version.h @@ -127,6 +127,9 @@ FuriHalVersionDisplay furi_hal_version_get_hw_display(); */ uint32_t furi_hal_version_get_hw_timestamp(); +// Set custom name +void furi_hal_version_set_custom_name(const char* name); + /** Get pointer to target name * * @return Hardware Name C-string