NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
NVProperty.h@15:bc28cdbcfd68, 2019-04-22 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Mon Apr 22 12:26:03 2019 +0200
- Revision:
- 15:bc28cdbcfd68
- Parent:
- 12:5539cdc8be4b
Merged NTP support
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Helmut Tschemernjak | 1:3a8297ad8cd9 | 1 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 2 | * This is an unpublished work copyright |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 3 | * (c) 2019 Helmut Tschemernjak |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 4 | * 30826 Garbsen (Hannover) Germany |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 5 | * |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 6 | * |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 7 | * Use is granted to registered RadioShuttle licensees only. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 8 | * Licensees must own a valid serial number and product code. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 9 | * Details see: www.radioshuttle.de |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 10 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 11 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 12 | #ifndef __NVPROPERTY_H__ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 13 | #define __NVPROPERTY_H__ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 14 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 15 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 16 | #ifndef UNUSED |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 17 | #define UNUSED(x) (void)(x) |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 18 | #endif |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 19 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 20 | class NVProperty { |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 21 | public: |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 22 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 23 | * The property store size depends on the implementation |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 24 | * The ESP32 uses the NVS partition therefore the size is being ignored. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 25 | * The D21 uses the default 16kByte which is a good tradeoff between |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 26 | * space needed for the application versus space for properties. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 27 | * Larger D21 property space (e.g. 20kB) has the advantage that the |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 28 | * flash blocks are less busy. For the D21 it is a good idea to |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 29 | * use increments of 16kB because this is the region locking area size |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 30 | */ |
Helmut Tschemernjak | 12:5539cdc8be4b | 31 | #ifndef TARGET_STM32L0 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 32 | NVProperty(int propSizekB = 16, bool erase = false); |
Helmut Tschemernjak | 12:5539cdc8be4b | 33 | #else |
Helmut Tschemernjak | 12:5539cdc8be4b | 34 | NVProperty(int propSizekB = 4, bool erase = false); |
Helmut Tschemernjak | 12:5539cdc8be4b | 35 | #endif |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 36 | ~NVProperty(); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 37 | public: |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 38 | enum NVPType { |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 39 | T_BIT = 1, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 40 | T_8BIT = 2, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 41 | T_16BIT = 3, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 42 | T_32BIT = 4, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 43 | T_64BIT = 5, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 44 | T_STR = 6, // strings can be up to 256 bytes including zero |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 45 | T_BLOB = 7, // blobs can be up to 256 bytes long |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 46 | T_MAX = 15 // we have only 4 bit space for the NVP types |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 47 | }; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 48 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 49 | enum NVPStore { |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 50 | S_OTP = 0x01, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 51 | S_FLASH = 0x02, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 52 | S_RAM = 0x04, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 53 | }; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 54 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 55 | enum NVPErrCode { |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 56 | NVP_OK = 0, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 57 | NVP_NO_FLASH = -1, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 58 | NVP_NO_RAM = -2, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 59 | NVP_NO_STORE = -3, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 60 | NVP_NO_PERM = -4, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 61 | NVP_ERR_NOSPACE = -5, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 62 | NVP_ERR_FAIL = -6, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 63 | NVP_INVALD_PARM = -7, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 64 | NVP_ENOENT = -0x12345687, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 65 | }; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 66 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 67 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 68 | * Get property protocol version to allow |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 69 | * API differences between multiple versions |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 70 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 71 | int GetVersion(void) { return 100; }; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 72 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 73 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 74 | * A simple GetProperty retuns its values as an int or int64 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 75 | * The order should always be S_RAM,S_FLASH, S_OTP |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 76 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 77 | int GetProperty(int key, int defaultValue = 0); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 78 | int64_t GetProperty64(int key, int64_t defaultValue = 0); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 79 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 80 | * const char *GetProperty: receives a copy of the propery, use free to release it. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 81 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 82 | const char *GetProperty(int key, const char *defaultValue = NULL); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 83 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 84 | * when a block gets returned the buffer is filled up to the property |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 85 | * or max at the bsize length. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 86 | * if the buffer is NULL only the size value will be set |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 87 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 88 | int GetProperty(int key, void *buffer, int *size); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 89 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 90 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 91 | * SetProperty |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 92 | * It requires to use OpenPropertyStore and finally ClosePropertyStore(true) |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 93 | * to write out all properties. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 94 | * Properties are being limited to 256 bytes. (e.g. 255 long strings or 256 bytes blobs) |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 95 | * |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 96 | * Number properties e.g. 0 or 1, or 123 are highly optimized in storage sizes |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 97 | * therefore the value is automatically being compressed to a bit or a little |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 98 | * number to use less flash storage space. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 99 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 100 | int SetProperty(int key, NVPType ptype, int64_t value, NVPStore store = S_FLASH); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 101 | int SetProperty(int key, NVPType ptype, const char *value, NVPStore store = S_FLASH); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 102 | int SetProperty(int key, NVPType ptype, const void *blob, int length, NVPStore store = S_FLASH); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 103 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 104 | int EraseProperty(int key, NVPStore store = S_FLASH); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 105 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 106 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 107 | * ReorgProperties is usually not needed because when a property storage is |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 108 | * full it reorganizes itself to make space for new properties. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 109 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 110 | int ReorgProperties(NVPStore store = S_FLASH); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 111 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 112 | * Opens a property store for reading or writing. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 113 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 114 | int OpenPropertyStore(bool forWrite = false); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 115 | /* |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 116 | * Closes the property store and flushes the data, depending on the |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 117 | * implementation flush may be not needed, e.g. D21 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 118 | */ |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 119 | int ClosePropertyStore(bool flush = false); |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 120 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 121 | enum Properties { |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 122 | RTC_AGING_CAL = 1, // int8_t the RTC aging calibration value |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 123 | ADC_VREF = 2, // the adc refernce volatge in millivolt |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 124 | HARDWARE_REV = 3, // the hardware revision of the board |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 125 | CPUID = 4, // the internal CPU ID |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 126 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 127 | LORA_DEVICE_ID = 10, // uint32_t the LoRa device ID |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 128 | LORA_CODE_ID = 11, // uint32_t the Code for the RadioShuttle protocol |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 129 | LORA_REMOTE_ID = 12, // specifies the server address |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 130 | LORA_REMOTE_ID_ALT = 13, // specifies the alternate server address |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 131 | LORA_RADIO_TYPE = 14, // 1 = Offline, 3 = Online, 4 = RS_Station_Basic |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 132 | LORA_FREQUENCY = 15, // channel frequency in Hz, e.g. 868100000 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 133 | LORA_BANDWIDTH = 16, // channel bandwidth in Hz, e.g. 125000 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 134 | LORA_SPREADING_FACTOR = 17, // e.g. 7 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 135 | LORA_TXPOWER = 18, // e.g. 14 for 15 dBm. |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 136 | LORA_FREQUENCY_OFFSET = 19, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 137 | LORA_APP_PWD = 20, // passwords are per app, there are only two placeholders |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 138 | LORA_APP_PWD_ALT = 21, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 139 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 140 | LOC_LONGITUDE = 25, // a string |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 141 | LOC_LATITUDE = 26, // a string |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 142 | LOC_NAME = 27, // a string with the location name |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 143 | HOSTNAME = 28, // the device host name |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 144 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 145 | WIFI_SSID = 30, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 146 | WIFI_PASSWORD = 31, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 147 | WIFI_SSID_ALT = 32, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 148 | WIFI_PASSWORD_ALT = 33, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 149 | USE_DHCP = 34, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 150 | MAC_ADDR = 35, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 151 | NET_IP_ADDR = 36, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 152 | NET_IP_ROUTER = 37, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 153 | NET_IP_DNS_SERVER = 38, |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 154 | NET_IP_DNS_SERVER_ALT = 39, |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 155 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 156 | MQTT_SERVER = 40, // url mqtt or mqtts://user.password@server:port |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 157 | MQTT_SERVER_ALT = 41, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 158 | MQTT_TOPIC_INFO = 42, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 159 | MQTT_TOPIC_ALARM= 43, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 160 | MQTT_TOPIC_CONTROL = 44, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 161 | MQTT_TOPIC_4 = 45, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 162 | MQTT_TOPIC_5 = 46, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 163 | |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 164 | NET_NTP_SERVER = 50, |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 165 | NET_NTP_SERVER_ALT = 51, |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 166 | NET_NTP_GMTOFFSET = 52, |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 167 | NET_NTP_DAYLIGHTOFFSET = 53, |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 168 | |
Helmut Tschemernjak | 15:bc28cdbcfd68 | 169 | ALARM_STATUS = 60, // alarm on=0, off !0 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 170 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 171 | PRIVATE_RANGE_START = 128, |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 172 | PRIVATE_RANGE_END = 254, |
Helmut Tschemernjak | 12:5539cdc8be4b | 173 | MAX_PROPERTIES = 254, // 1-254 |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 174 | }; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 175 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 176 | private: |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 177 | NVPropertyProviderInterface *_ram; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 178 | NVPropertyProviderInterface *_flash; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 179 | NVPropertyProviderInterface *_otp; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 180 | bool _allowWrite; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 181 | bool _didOpen; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 182 | }; |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 183 | |
Helmut Tschemernjak | 1:3a8297ad8cd9 | 184 | #endif |