| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #include "bt_keys_storage.h"
- #include <furi.h>
- #include <furi_hal_bt.h>
- #include <lib/toolbox/saved_struct.h>
- #include <storage/storage.h>
- #define BT_KEYS_STORAGE_VERSION (0)
- #define BT_KEYS_STORAGE_MAGIC (0x18)
- #define TAG "BtKeyStorage"
- struct BtKeysStorage {
- uint8_t* nvm_sram_buff;
- uint16_t nvm_sram_buff_size;
- FuriString* file_path;
- };
- bool bt_keys_storage_delete(BtKeysStorage* instance) {
- furi_assert(instance);
- bool delete_succeed = false;
- bool bt_is_active = furi_hal_bt_is_active();
- furi_hal_bt_stop_advertising();
- delete_succeed = furi_hal_bt_clear_white_list();
- if(bt_is_active) {
- furi_hal_bt_start_advertising();
- }
- return delete_succeed;
- }
- BtKeysStorage* bt_keys_storage_alloc(const char* keys_storage_path) {
- furi_assert(keys_storage_path);
- BtKeysStorage* instance = malloc(sizeof(BtKeysStorage));
- // Set default nvm ram parameters
- furi_hal_bt_get_key_storage_buff(&instance->nvm_sram_buff, &instance->nvm_sram_buff_size);
- // Set key storage file
- instance->file_path = furi_string_alloc();
- furi_string_set_str(instance->file_path, keys_storage_path);
- return instance;
- }
- void bt_keys_storage_free(BtKeysStorage* instance) {
- furi_assert(instance);
- furi_string_free(instance->file_path);
- free(instance);
- }
- void bt_keys_storage_set_file_path(BtKeysStorage* instance, const char* path) {
- furi_assert(instance);
- furi_assert(path);
- furi_string_set_str(instance->file_path, path);
- }
- void bt_keys_storage_set_ram_params(BtKeysStorage* instance, uint8_t* buff, uint16_t size) {
- furi_assert(instance);
- furi_assert(buff);
- instance->nvm_sram_buff = buff;
- instance->nvm_sram_buff_size = size;
- }
- bool bt_keys_storage_load(BtKeysStorage* instance) {
- furi_assert(instance);
- bool loaded = false;
- do {
- // Get payload size
- size_t payload_size = 0;
- if(!saved_struct_get_payload_size(
- furi_string_get_cstr(instance->file_path),
- BT_KEYS_STORAGE_MAGIC,
- BT_KEYS_STORAGE_VERSION,
- &payload_size)) {
- FURI_LOG_E(TAG, "Failed to read payload size");
- break;
- }
- if(payload_size > instance->nvm_sram_buff_size) {
- FURI_LOG_E(TAG, "Saved data doesn't fit ram buffer");
- break;
- }
- // Load saved data to ram
- furi_hal_bt_nvm_sram_sem_acquire();
- bool data_loaded = saved_struct_load(
- furi_string_get_cstr(instance->file_path),
- instance->nvm_sram_buff,
- payload_size,
- BT_KEYS_STORAGE_MAGIC,
- BT_KEYS_STORAGE_VERSION);
- furi_hal_bt_nvm_sram_sem_release();
- if(!data_loaded) {
- FURI_LOG_E(TAG, "Failed to load struct");
- break;
- }
- loaded = true;
- } while(false);
- return loaded;
- }
- bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32_t size) {
- furi_assert(instance);
- furi_assert(start_addr);
- bool updated = false;
- FURI_LOG_I(
- TAG,
- "Base address: %p. Start update address: %p. Size changed: %ld",
- (void*)instance->nvm_sram_buff,
- start_addr,
- size);
- do {
- size_t new_size = start_addr - instance->nvm_sram_buff + size;
- if(new_size > instance->nvm_sram_buff_size) {
- FURI_LOG_E(TAG, "NVM RAM buffer overflow");
- break;
- }
- furi_hal_bt_nvm_sram_sem_acquire();
- bool data_updated = saved_struct_save(
- furi_string_get_cstr(instance->file_path),
- instance->nvm_sram_buff,
- new_size,
- BT_KEYS_STORAGE_MAGIC,
- BT_KEYS_STORAGE_VERSION);
- furi_hal_bt_nvm_sram_sem_release();
- if(!data_updated) {
- FURI_LOG_E(TAG, "Failed to update key storage");
- break;
- }
- updated = true;
- } while(false);
- return updated;
- }
|