diff --git a/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp b/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp index 8d14cf04be81e8..4e7f286d79cfc4 100644 --- a/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp @@ -37,8 +37,9 @@ namespace chip { namespace DeviceLayer { namespace PersistedStorage { -/* TODO: adjust this value */ -#define MAX_NO_OF_KEYS 20 +/* TODO: adjust these values */ +constexpr size_t kMaxNumberOfKeys = 20; +constexpr size_t kMaxKeyValueBytes = 255; KeyValueStoreManagerImpl KeyValueStoreManagerImpl::sInstance; @@ -48,22 +49,20 @@ KeyValueStoreManagerImpl KeyValueStoreManagerImpl::sInstance; */ std::unordered_map g_kvs_map; -/* list containing used PDM identifiers */ -std::list g_key_ids_list; - -/* max no of bytes for a key */ -#define MAX_KEY_VALUE 255 +/* set containing used PDM identifiers */ +std::set g_key_ids_set; /* used to check if we need to restore values from flash (e.g.: reset) */ -static bool g_restored_from_flash = FALSE; +static bool g_restored_from_flash = false; CHIP_ERROR RestoreFromFlash() { - CHIP_ERROR err = CHIP_NO_ERROR; - uint8_t key_id = 0; - char key_string_id[MAX_KEY_VALUE] = { 0 }; - size_t key_string_id_size = 0; - uint8_t pdm_id_kvs = chip::DeviceLayer::Internal::K32WConfig::kPDMId_KVS; + CHIP_ERROR err = CHIP_NO_ERROR; + uint8_t key_id = 0; + char key_string_id[kMaxKeyValueBytes] = { 0 }; + size_t key_string_id_size = 0; + uint8_t pdm_id_kvs = chip::DeviceLayer::Internal::K32WConfig::kPDMId_KVS; + uint16_t pdm_internal_id = 0; if (g_restored_from_flash) { @@ -71,32 +70,44 @@ CHIP_ERROR RestoreFromFlash() return err; } - for (key_id = 0; key_id < MAX_NO_OF_KEYS; key_id++) + for (key_id = 0; key_id < kMaxNumberOfKeys; key_id++) { - /* key was saved as string in flash (key_string_id) using (key_id + MAX_NO_OF_KEYS) as PDM key + /* key was saved as string in flash (key_string_id) using (key_id + kMaxNumberOfKeys) as PDM key * value corresponding to key_string_id was saved in flash using key_id as PDM key */ - err = chip::DeviceLayer::Internal::K32WConfig::ReadConfigValueStr( - chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id + MAX_NO_OF_KEYS), key_string_id, MAX_KEY_VALUE, - key_string_id_size); + pdm_internal_id = chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id + kMaxNumberOfKeys); + err = chip::DeviceLayer::Internal::K32WConfig::ReadConfigValueStr(pdm_internal_id, key_string_id, + kMaxKeyValueBytes, key_string_id_size); if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND) { + err = CHIP_NO_ERROR; continue; } + else if (err != CHIP_NO_ERROR) + { + ChipLogProgress(DeviceLayer, "KVS, Error while restoring Matter key [%s] from flash with PDM id: %i", key_string_id, pdm_internal_id); + break; + } if (key_string_id_size) { - g_key_ids_list.push_back(key_id); - g_kvs_map.insert(std::make_pair(std::string(key_string_id), key_id)); + g_key_ids_set.insert(key_id); key_string_id_size = 0; - - ChipLogProgress(DeviceLayer, "KVS, restored key [%s] from flash with PDM key: %i", key_string_id, key_id); + if (!g_kvs_map.insert(std::make_pair(std::string(key_string_id), key_id)).second) + { + /* key collision is not expected when restoring from flash */ + ChipLogProgress(DeviceLayer, "KVS, Unexpected collision while restoring Matter key [%s] from flash with PDM id: %i", key_string_id, pdm_internal_id); + } + else + { + ChipLogProgress(DeviceLayer, "KVS, restored Matter key [%s] from flash with PDM id: %i", key_string_id, pdm_internal_id); + } } } - g_restored_from_flash = TRUE; + g_restored_from_flash = true; return err; } @@ -109,18 +120,19 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Get(const char * key, void * value, size_t std::unordered_map::const_iterator it; size_t read_bytes = 0; uint8_t key_id = 0; + uint16_t pdm_internal_id = 0; VerifyOrExit((key != NULL) && (value != NULL) && (RestoreFromFlash() == CHIP_NO_ERROR), err = CHIP_ERROR_INVALID_ARGUMENT); if ((it = g_kvs_map.find(key)) != g_kvs_map.end()) { key_id = it->second; + pdm_internal_id = chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id); - err = chip::DeviceLayer::Internal::K32WConfig::ReadConfigValueBin( - chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id), (uint8_t *) value, value_size, read_bytes); + err = chip::DeviceLayer::Internal::K32WConfig::ReadConfigValueBin(pdm_internal_id, (uint8_t *) value, value_size, read_bytes); *read_bytes_size = read_bytes; - ChipLogProgress(DeviceLayer, "KVS, get key [%s] with PDM key: %i", key, key_id); + ChipLogProgress(DeviceLayer, "KVS, get Matter key [%s] with PDM id: %i", key, pdm_internal_id); } exit: @@ -131,47 +143,59 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value, { CHIP_ERROR err = CHIP_ERROR_INVALID_ARGUMENT; uint8_t key_id; - bool_t put_key = FALSE; + bool_t put_key = false; uint8_t pdm_id_kvs = chip::DeviceLayer::Internal::K32WConfig::kPDMId_KVS; std::unordered_map::const_iterator it; + uint16_t pdm_internal_id = 0; VerifyOrExit((key != NULL) && (value != NULL) && (RestoreFromFlash() == CHIP_NO_ERROR), err = CHIP_ERROR_INVALID_ARGUMENT); if ((it = g_kvs_map.find(key)) == g_kvs_map.end()) /* new key */ { - for (key_id = 0; key_id < MAX_NO_OF_KEYS; key_id++) + for (key_id = 0; key_id < kMaxNumberOfKeys; key_id++) { - std::list::iterator iter = std::find(g_key_ids_list.begin(), g_key_ids_list.end(), key_id); + std::set::iterator iter = std::find(g_key_ids_set.begin(), g_key_ids_set.end(), key_id); - if (iter == g_key_ids_list.end()) + if (iter == g_key_ids_set.end()) { - g_key_ids_list.push_back(key_id); + assert(g_key_ids_set.size() < kMaxNumberOfKeys); + g_key_ids_set.insert(key_id); - put_key = TRUE; + put_key = true; break; } } } else /* overwrite key */ { - put_key = TRUE; + put_key = true; key_id = it->second; } if (put_key) { - ChipLogProgress(DeviceLayer, "KVS, put key [%s] with PDM key: %i", key, key_id); + pdm_internal_id = chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id); + ChipLogProgress(DeviceLayer, "KVS, save in flash Matter key [%s] with PDM id: %i", key, pdm_internal_id); g_kvs_map.insert(std::make_pair(std::string(key), key_id)); - err = chip::DeviceLayer::Internal::K32WConfig::WriteConfigValueBin( - chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id), (uint8_t *) value, value_size); + err = chip::DeviceLayer::Internal::K32WConfig::WriteConfigValueBin(pdm_internal_id, (uint8_t *) value, value_size); /* save the 'key' in flash such that it can be retrieved later on */ if (err == CHIP_NO_ERROR) { - ChipLogProgress(DeviceLayer, "KVS, save in flash key [%s] with PDM key: %i", key, key_id + MAX_NO_OF_KEYS); - err = chip::DeviceLayer::Internal::K32WConfig::WriteConfigValueStr( - chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id + MAX_NO_OF_KEYS), key, strlen(key)); + pdm_internal_id = chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id + kMaxNumberOfKeys); + ChipLogProgress(DeviceLayer, "KVS, save in flash the value of the Matter key [%s] with PDM id: %i", key, pdm_internal_id); + + err = chip::DeviceLayer::Internal::K32WConfig::WriteConfigValueStr(pdm_internal_id, key, strlen(key)); + + if (err != CHIP_NO_ERROR) + { + ChipLogProgress(DeviceLayer, "KVS, Error while saving in flash the value of the Matter key [%s] with PDM id: %i", key, pdm_internal_id); + } + } + else + { + ChipLogProgress(DeviceLayer, "KVS, Error while saving in flash Matter key [%s] with PDM id: %i", key, pdm_internal_id); } } @@ -185,25 +209,37 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Delete(const char * key) std::unordered_map::const_iterator it; uint8_t pdm_id_kvs = chip::DeviceLayer::Internal::K32WConfig::kPDMId_KVS; uint8_t key_id = 0; + uint16_t pdm_internal_id = 0; VerifyOrExit((key != NULL) && (RestoreFromFlash() == CHIP_NO_ERROR), err = CHIP_ERROR_INVALID_ARGUMENT); if ((it = g_kvs_map.find(key)) != g_kvs_map.end()) { key_id = it->second; - g_key_ids_list.remove(key_id); + pdm_internal_id = chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id); + + g_key_ids_set.erase(key_id); g_kvs_map.erase(it); - ChipLogProgress(DeviceLayer, "KVS, delete key [%s] with PDM key: %i", key, key_id); - err = chip::DeviceLayer::Internal::K32WConfig::ClearConfigValue( - chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id)); + ChipLogProgress(DeviceLayer, "KVS, delete from flash the Matter key [%s] with PDM id: %i", key, pdm_internal_id); + err = chip::DeviceLayer::Internal::K32WConfig::ClearConfigValue(pdm_internal_id); /* also delete the 'key string' from flash */ if (err == CHIP_NO_ERROR) { - ChipLogProgress(DeviceLayer, "KVS, delete key [%s] with PDM key: %i", key, key_id + MAX_NO_OF_KEYS); - err = chip::DeviceLayer::Internal::K32WConfig::ClearConfigValue( - chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id + MAX_NO_OF_KEYS)); + pdm_internal_id = chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id + kMaxNumberOfKeys); + ChipLogProgress(DeviceLayer, "KVS, delete from flash the value of the Matter key [%s] with PDM id: %i", key, pdm_internal_id); + + err = chip::DeviceLayer::Internal::K32WConfig::ClearConfigValue(pdm_internal_id); + + if (err != CHIP_NO_ERROR) + { + ChipLogProgress(DeviceLayer, "KVS, Error while deleting from flash the value of the Matter key [%s] with PDM id: %i", key, pdm_internal_id); + } + } + else + { + ChipLogProgress(DeviceLayer, "KVS, Error while deleting from flash the Matter key [%s] with PDM id: %i", key, pdm_internal_id); } }