NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
Diff: NVProperty.h
- Revision:
- 1:3a8297ad8cd9
- Child:
- 12:5539cdc8be4b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/NVProperty.h Thu Jan 24 14:28:11 2019 +0100
@@ -0,0 +1,175 @@
+/*
+ * 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
+ */
+
+#ifndef __NVPROPERTY_H__
+#define __NVPROPERTY_H__
+
+
+#ifndef UNUSED
+ #define UNUSED(x) (void)(x)
+#endif
+
+class NVProperty {
+public:
+ /*
+ * The property store size depends on the implementation
+ * The ESP32 uses the NVS partition therefore the size is being ignored.
+ * The D21 uses the default 16kByte which is a good tradeoff between
+ * space needed for the application versus space for properties.
+ * Larger D21 property space (e.g. 20kB) has the advantage that the
+ * flash blocks are less busy. For the D21 it is a good idea to
+ * use increments of 16kB because this is the region locking area size
+ */
+ NVProperty(int propSizekB = 16, bool erase = false);
+ ~NVProperty();
+public:
+ enum NVPType {
+ T_BIT = 1,
+ T_8BIT = 2,
+ T_16BIT = 3,
+ T_32BIT = 4,
+ T_64BIT = 5,
+ T_STR = 6, // strings can be up to 256 bytes including zero
+ T_BLOB = 7, // blobs can be up to 256 bytes long
+ T_MAX = 15 // we have only 4 bit space for the NVP types
+ };
+
+ enum NVPStore {
+ S_OTP = 0x01,
+ S_FLASH = 0x02,
+ S_RAM = 0x04,
+ };
+
+ enum NVPErrCode {
+ NVP_OK = 0,
+ NVP_NO_FLASH = -1,
+ NVP_NO_RAM = -2,
+ NVP_NO_STORE = -3,
+ NVP_NO_PERM = -4,
+ NVP_ERR_NOSPACE = -5,
+ NVP_ERR_FAIL = -6,
+ NVP_INVALD_PARM = -7,
+ NVP_ENOENT = -0x12345687,
+ };
+
+ /*
+ * Get property protocol version to allow
+ * API differences between multiple versions
+ */
+ int GetVersion(void) { return 100; };
+
+ /*
+ * A simple GetProperty retuns its values as an int or int64
+ * The order should always be S_RAM,S_FLASH, S_OTP
+ */
+ int GetProperty(int key, int defaultValue = 0);
+ int64_t GetProperty64(int key, int64_t defaultValue = 0);
+ /*
+ * const char *GetProperty: receives a copy of the propery, use free to release it.
+ */
+ const char *GetProperty(int key, const char *defaultValue = NULL);
+ /*
+ * when a block gets returned the buffer is filled up to the property
+ * or max at the bsize length.
+ * if the buffer is NULL only the size value will be set
+ */
+ int GetProperty(int key, void *buffer, int *size);
+
+ /*
+ * SetProperty
+ * It requires to use OpenPropertyStore and finally ClosePropertyStore(true)
+ * to write out all properties.
+ * Properties are being limited to 256 bytes. (e.g. 255 long strings or 256 bytes blobs)
+ *
+ * Number properties e.g. 0 or 1, or 123 are highly optimized in storage sizes
+ * therefore the value is automatically being compressed to a bit or a little
+ * number to use less flash storage space.
+ */
+ int SetProperty(int key, NVPType ptype, int64_t value, NVPStore store = S_FLASH);
+ int SetProperty(int key, NVPType ptype, const char *value, NVPStore store = S_FLASH);
+ int SetProperty(int key, NVPType ptype, const void *blob, int length, NVPStore store = S_FLASH);
+
+ int EraseProperty(int key, NVPStore store = S_FLASH);
+
+ /*
+ * ReorgProperties is usually not needed because when a property storage is
+ * full it reorganizes itself to make space for new properties.
+ */
+ int ReorgProperties(NVPStore store = S_FLASH);
+ /*
+ * Opens a property store for reading or writing.
+ */
+ int OpenPropertyStore(bool forWrite = false);
+ /*
+ * Closes the property store and flushes the data, depending on the
+ * implementation flush may be not needed, e.g. D21
+ */
+ int ClosePropertyStore(bool flush = false);
+
+ enum Properties {
+ RTC_AGING_CAL = 1, // int8_t the RTC aging calibration value
+ ADC_VREF = 2, // the adc refernce volatge in millivolt
+ HARDWARE_REV = 3, // the hardware revision of the board
+ CPUID = 4, // the internal CPU ID
+
+ LORA_DEVICE_ID = 10, // uint32_t the LoRa device ID
+ LORA_CODE_ID = 11, // uint32_t the Code for the RadioShuttle protocol
+ LORA_REMOTE_ID = 12, // specifies the server address
+ LORA_REMOTE_ID_ALT = 13, // specifies the alternate server address
+ LORA_RADIO_TYPE = 14, // 1 = Offline, 3 = Online, 4 = RS_Station_Basic
+ LORA_FREQUENCY = 15, // channel frequency in Hz, e.g. 868100000
+ LORA_BANDWIDTH = 16, // channel bandwidth in Hz, e.g. 125000
+ LORA_SPREADING_FACTOR = 17, // e.g. 7
+ LORA_TXPOWER = 18, // e.g. 14 for 15 dBm.
+ LORA_FREQUENCY_OFFSET = 19,
+ LORA_APP_PWD = 20, // passwords are per app, there are only two placeholders
+ LORA_APP_PWD_ALT = 21,
+
+ LOC_LONGITUDE = 25, // a string
+ LOC_LATITUDE = 26, // a string
+ LOC_NAME = 27, // a string with the location name
+ HOSTNAME = 28, // the device host name
+
+ WIFI_SSID = 30,
+ WIFI_PASSWORD = 31,
+ WIFI_SSID_ALT = 32,
+ WIFI_PASSWORD_ALT = 33,
+ USE_DHCP = 34,
+ MAC_ADDR = 35,
+ NET_IP_ADDR = 36,
+ NET_IP_ROUTER = 37,
+ NET_IP_DNS_SERVER = 38,
+
+ MQTT_SERVER = 40, // url mqtt or mqtts://user.password@server:port
+ MQTT_SERVER_ALT = 41,
+ MQTT_TOPIC_INFO = 42,
+ MQTT_TOPIC_ALARM= 43,
+ MQTT_TOPIC_CONTROL = 44,
+ MQTT_TOPIC_4 = 45,
+ MQTT_TOPIC_5 = 46,
+
+ ALARM_STATUS = 50, // alarm on=0, off !0
+
+ PRIVATE_RANGE_START = 128,
+ PRIVATE_RANGE_END = 254,
+ PROPERTIES_EOF = 255,
+ MAX_PROPERTIES = 256,
+ };
+
+private:
+ NVPropertyProviderInterface *_ram;
+ NVPropertyProviderInterface *_flash;
+ NVPropertyProviderInterface *_otp;
+ bool _allowWrite;
+ bool _didOpen;
+};
+
+#endif
Helmut Tschemernjak