NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
Diff: NVProperty.cpp
- Revision:
- 1:3a8297ad8cd9
- Child:
- 4:eb6850e3bc21
diff -r 1083b3c785dc -r 3a8297ad8cd9 NVProperty.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NVProperty.cpp Thu Jan 24 14:28:11 2019 +0100 @@ -0,0 +1,355 @@ +/* + * This is an unpublished work copyright + * (c) 2019 Helmut Tschemernjak + * 30826 Garbsen (Hannover) Germany + * + * + * Use is granted to registered RadioShuttle licensees only. + * Licensees must own a valid serial number and product code. + * Details see: www.radioshuttle.de + */ + +#ifdef ARDUINO +#include <Arduino.h> +#elif __MBED__ +#include <mbed.h> +#else +#error "Unkown operating system" +#endif + + +#include <NVPropertyProviderInterface.h> +#include <NVProperty_SRAM.h> +#ifdef ARDUINO_ARCH_ESP32 + #include <NVProperty_ESP32NVS.h> + #include <NVProperty_ESP32efuse.h> +#elif defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_ARCH_SAMD) + #include <NVProperty_D21Flash.h> +#elif defined(__MBED__) && defined(TARGET_STM32L4) + #include <mbed.h> + #include <NVProperty_L4OTP.h> + #include <NVProperty_L4Flash.h> +#else +#error "Unkown implementation" +#endif +#include <NVProperty.h> + + +NVProperty::NVProperty(int propSizekB, bool erase) +{ + _flash = NULL; + _otp = NULL; + _ram = new NVProperty_SRAM(); + +#ifdef ARDUINO_ARCH_ESP32 + _flash = new NVProperty_ESP32NVS(); +#elif defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_ARCH_SAMD) + _flash = new NVProperty_D21Flash(propSizekB, erase); +#elif TARGET_STM32L4 + // TODO _flash = new NVProperty_L4Flash(propSizekB, erase); +#else + #error "unkown platform" +#endif + +#ifdef ARDUINO_ARCH_ESP32 + _otp = new NVProperty_ESP32efuse(); +#elif TARGET_STM32L4 + _otp = new NVProperty_L4OTP(); +#endif + _allowWrite = false; + _didOpen = false; +} + +NVProperty::~NVProperty() +{ + if (_ram) { + delete _ram; + } + if (_flash) + delete _flash; + if (_otp) + delete _otp; +} + + +int +NVProperty::GetProperty(int key, int defaultValue) +{ + int res; + + if (!_didOpen) + OpenPropertyStore(); + + if (_ram) { + res = _ram->GetProperty(key); + if (res != NVP_ENOENT) + return res; + } + if (_flash) { + res = _flash->GetProperty(key); + if (res != NVP_ENOENT) + return res; + } + if (_otp) { + res = _otp->GetProperty(key); + if (res != NVP_ENOENT) + return res; + } + return defaultValue; +} + + +int64_t +NVProperty::GetProperty64(int key, int64_t defaultValue) +{ + int64_t res; + + if (!_didOpen) + OpenPropertyStore(); + + if (_ram) { + res = _ram->GetProperty64(key); + if (res != NVP_ENOENT) + return res; + } + if (_flash) { + res = _flash->GetProperty64(key); + if (res != NVP_ENOENT) + return res; + } + if (_otp) { + res = _otp->GetProperty64(key); + if (res != NVP_ENOENT) + return res; + } + return defaultValue; +} + +const char * +NVProperty::GetProperty(int key, const char *defaultValue) +{ + const char *res; + + if (!_didOpen) + OpenPropertyStore(); + + if (_ram) { + res = _ram->GetPropertyStr(key); + if (res != NULL) + return res; + } + if (_flash) { + res = _flash->GetPropertyStr(key); + if (res != NULL) + return res; + } + if (_otp) { + res = _otp->GetPropertyStr(key); + if (res != NULL) + return res; + } + if (res != NULL) + return res; + + return defaultValue; +} + +int +NVProperty::GetProperty(int key, void *buffer, int *size) +{ + int res; + int maxsize = *size; + + if (!_didOpen) + OpenPropertyStore(); + + if (_ram) { + res = _ram->GetPropertyBlob(key, buffer, &maxsize); + if (res == NVP_OK) + return res; + } + if (_flash) { + res = _flash->GetPropertyBlob(key, buffer, &maxsize); + if (res == NVP_OK) + return res; + } + if (_otp) { + res = _otp->GetPropertyBlob(key, buffer, &maxsize); + if (res == NVP_OK) + return res; + } + + return NVP_ENOENT; +} + + +int +NVProperty::SetProperty(int key, NVPType ptype, int64_t value, NVPStore store) +{ + int res = NVP_OK; + + if (!_didOpen) + OpenPropertyStore(); + + if (!_allowWrite) + return NVP_NO_PERM; + + if (store == S_RAM && _ram) { + res = _ram->SetProperty(key, value, ptype); + } else if (store == S_FLASH && _flash) { + res = _flash->SetProperty(key, value, ptype); + } else if (store == S_OTP && _otp) { + res = _otp->SetProperty(key, value, ptype); + } else { + return NVP_NO_STORE; + } + return res; +} + + +int +NVProperty::SetProperty(int key, NVPType ptype, const char *value, NVPStore store) +{ + int res = NVP_OK; + + if (!_didOpen) + OpenPropertyStore(); + + if (!_allowWrite) + return NVP_NO_PERM; + + if (store == S_RAM && _ram) { + res = _ram->SetPropertyStr(key, value, ptype); + } else if (store == S_FLASH && _flash) { + res = _flash->SetPropertyStr(key, value, ptype); + } else if (store == S_OTP && _otp) { + res = _otp->SetPropertyStr(key, value, ptype); + } else { + return NVP_NO_STORE; + } + + return res; +} + +// NVProperty_SRAM::SetPropertyBlob(int key, const void *blob, int size, int type) + + +int +NVProperty::SetProperty(int key, NVPType ptype, const void *blob, int length, NVPStore store) +{ + int res = NVP_OK; + + if (!_didOpen) + OpenPropertyStore(); + + if (!_allowWrite) { + return NVP_NO_PERM; + } + + if (store == S_RAM && _ram) { + res = _ram->SetPropertyBlob(key, blob, length, ptype); + } else if (store == S_FLASH && _flash) { + res = _flash->SetPropertyBlob(key, blob, length, ptype); + } else if (store == S_OTP && _otp) { + res = _otp->SetPropertyBlob(key, blob, length, ptype); + } else { + return NVP_NO_STORE; + } + + return res; +} + +int +NVProperty::EraseProperty(int key, NVPStore store) +{ + if (!_didOpen) + OpenPropertyStore(); + + int res = NVP_OK; + + if (!_allowWrite) + return NVP_NO_PERM; + + if (store == S_RAM && _ram) { + res = _ram->EraseProperty(key); + } else if (store == S_FLASH && _flash) { + res = _flash->EraseProperty(key); + } else if (store == S_OTP && _otp) { + res = _otp->EraseProperty(key); + } else { + return NVP_NO_STORE; + } + + return res; +} + +int +NVProperty::ReorgProperties(NVPStore store) +{ + int res = NVP_OK; + + if (!_didOpen) + OpenPropertyStore(); + + if (!_allowWrite) + return NVP_NO_PERM; + + if (store == S_RAM && _ram) { + res = _ram->ReorgProperties(); + } else if (store == S_FLASH && _flash) { + res = _flash->ReorgProperties(); + } else if (store == S_OTP && _otp) { + res = _otp->ReorgProperties(); + } else { + return NVP_NO_STORE; + } + + return res; +} + +int +NVProperty::OpenPropertyStore(bool forWrite) +{ + int res = NVP_OK; + + if (_didOpen) { + if (_ram) + _ram->ClosePropertyStore(); + if (_flash) + _flash->ClosePropertyStore(); + if (_otp) + _otp->ClosePropertyStore(); + } + + if (_ram) + _ram->OpenPropertyStore(forWrite); + if (_flash) + res = _flash->OpenPropertyStore(forWrite); + if (_otp) + _otp->OpenPropertyStore(forWrite); + _didOpen = true; + if(forWrite) + _allowWrite = true; + + + return res; +} + +int +NVProperty::ClosePropertyStore(bool flush) +{ + int res = NVP_OK; + + if (_didOpen) + return NVP_NO_PERM; + + if (_ram) + _ram->ClosePropertyStore(flush); + if (_flash) + res = _flash->ClosePropertyStore(flush); + if (_otp) + _otp->ClosePropertyStore(flush); + return res; +} + +