NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Thu Jan 24 15:38:20 2019 +0100
Revision:
3:968b84113ef3
Parent:
1:3a8297ad8cd9
Child:
4:eb6850e3bc21
Updated

Who changed what in which revision?

UserRevisionLine numberNew 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 #include <string.h>
Helmut Tschemernjak 1:3a8297ad8cd9 13 #include <stdlib.h>
Helmut Tschemernjak 1:3a8297ad8cd9 14 #include <stdint.h>
Helmut Tschemernjak 3:968b84113ef3 15 #include "arch.h"
Helmut Tschemernjak 1:3a8297ad8cd9 16 #include <NVPropertyProviderInterface.h>
Helmut Tschemernjak 1:3a8297ad8cd9 17 #include <NVProperty.h>
Helmut Tschemernjak 1:3a8297ad8cd9 18 #include <NVProperty_SRAM.h>
Helmut Tschemernjak 1:3a8297ad8cd9 19
Helmut Tschemernjak 1:3a8297ad8cd9 20 NVProperty_SRAM::NVProperty_SRAM()
Helmut Tschemernjak 1:3a8297ad8cd9 21 {
Helmut Tschemernjak 1:3a8297ad8cd9 22
Helmut Tschemernjak 1:3a8297ad8cd9 23 }
Helmut Tschemernjak 1:3a8297ad8cd9 24
Helmut Tschemernjak 1:3a8297ad8cd9 25 NVProperty_SRAM::~NVProperty_SRAM()
Helmut Tschemernjak 1:3a8297ad8cd9 26 {
Helmut Tschemernjak 1:3a8297ad8cd9 27 std::map<int, PropertyEntry>::iterator re;
Helmut Tschemernjak 1:3a8297ad8cd9 28 for(re = _props.begin(); re != _props.end(); re++) {
Helmut Tschemernjak 1:3a8297ad8cd9 29 if (re->second.type == NVProperty::T_STR)
Helmut Tschemernjak 1:3a8297ad8cd9 30 free(re->second.str);
Helmut Tschemernjak 1:3a8297ad8cd9 31 if (re->second.type == NVProperty::T_BLOB)
Helmut Tschemernjak 1:3a8297ad8cd9 32 delete[] (char *)re->second.data;
Helmut Tschemernjak 1:3a8297ad8cd9 33 }
Helmut Tschemernjak 1:3a8297ad8cd9 34
Helmut Tschemernjak 1:3a8297ad8cd9 35 _props.clear();
Helmut Tschemernjak 1:3a8297ad8cd9 36 }
Helmut Tschemernjak 1:3a8297ad8cd9 37
Helmut Tschemernjak 1:3a8297ad8cd9 38 int
Helmut Tschemernjak 1:3a8297ad8cd9 39 NVProperty_SRAM::GetProperty(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 40 {
Helmut Tschemernjak 1:3a8297ad8cd9 41 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 42 if(it != _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 43 switch (it->second.type) {
Helmut Tschemernjak 1:3a8297ad8cd9 44 case NVProperty::T_STR:
Helmut Tschemernjak 1:3a8297ad8cd9 45 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 46 break;
Helmut Tschemernjak 1:3a8297ad8cd9 47 case NVProperty::T_BLOB:
Helmut Tschemernjak 1:3a8297ad8cd9 48 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 49 break;
Helmut Tschemernjak 1:3a8297ad8cd9 50 default:
Helmut Tschemernjak 1:3a8297ad8cd9 51 return it->second.val32;
Helmut Tschemernjak 1:3a8297ad8cd9 52 }
Helmut Tschemernjak 1:3a8297ad8cd9 53 }
Helmut Tschemernjak 1:3a8297ad8cd9 54 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 55 };
Helmut Tschemernjak 1:3a8297ad8cd9 56
Helmut Tschemernjak 1:3a8297ad8cd9 57
Helmut Tschemernjak 1:3a8297ad8cd9 58 int64_t
Helmut Tschemernjak 1:3a8297ad8cd9 59 NVProperty_SRAM::GetProperty64(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 60 {
Helmut Tschemernjak 1:3a8297ad8cd9 61 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 62 if(it != _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 63 switch (it->second.type) {
Helmut Tschemernjak 1:3a8297ad8cd9 64 case NVProperty::T_STR:
Helmut Tschemernjak 1:3a8297ad8cd9 65 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 66 break;
Helmut Tschemernjak 1:3a8297ad8cd9 67 case NVProperty::T_BLOB:
Helmut Tschemernjak 1:3a8297ad8cd9 68 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 69 break;
Helmut Tschemernjak 1:3a8297ad8cd9 70 default:
Helmut Tschemernjak 1:3a8297ad8cd9 71 return it->second.val64;
Helmut Tschemernjak 1:3a8297ad8cd9 72 }
Helmut Tschemernjak 1:3a8297ad8cd9 73 }
Helmut Tschemernjak 1:3a8297ad8cd9 74 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 75 }
Helmut Tschemernjak 1:3a8297ad8cd9 76
Helmut Tschemernjak 1:3a8297ad8cd9 77 const char *
Helmut Tschemernjak 1:3a8297ad8cd9 78 NVProperty_SRAM::GetPropertyStr(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 79 {
Helmut Tschemernjak 1:3a8297ad8cd9 80 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 81 if(it != _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 82 if (it->second.type == NVProperty::T_STR) {
Helmut Tschemernjak 1:3a8297ad8cd9 83 return (const char *)it->second.str;
Helmut Tschemernjak 1:3a8297ad8cd9 84 }
Helmut Tschemernjak 1:3a8297ad8cd9 85 }
Helmut Tschemernjak 1:3a8297ad8cd9 86 return NULL;
Helmut Tschemernjak 1:3a8297ad8cd9 87 }
Helmut Tschemernjak 1:3a8297ad8cd9 88
Helmut Tschemernjak 1:3a8297ad8cd9 89 int
Helmut Tschemernjak 1:3a8297ad8cd9 90
Helmut Tschemernjak 1:3a8297ad8cd9 91 NVProperty_SRAM::GetPropertyBlob(int key, const void *blob, int *size)
Helmut Tschemernjak 1:3a8297ad8cd9 92 {
Helmut Tschemernjak 1:3a8297ad8cd9 93 if (!blob || *size <= 0)
Helmut Tschemernjak 1:3a8297ad8cd9 94 return NVProperty::NVP_INVALD_PARM;
Helmut Tschemernjak 1:3a8297ad8cd9 95
Helmut Tschemernjak 1:3a8297ad8cd9 96 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 97 if(it != _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 98 switch (it->second.type) {
Helmut Tschemernjak 1:3a8297ad8cd9 99 case NVProperty::T_BLOB:
Helmut Tschemernjak 1:3a8297ad8cd9 100 *size = std::min(*size, (int)it->second.size);
Helmut Tschemernjak 1:3a8297ad8cd9 101 if (blob)
Helmut Tschemernjak 1:3a8297ad8cd9 102 memcpy((void *)blob, it->second.data, *size);
Helmut Tschemernjak 1:3a8297ad8cd9 103 return *size;
Helmut Tschemernjak 1:3a8297ad8cd9 104 break;
Helmut Tschemernjak 1:3a8297ad8cd9 105 default:
Helmut Tschemernjak 1:3a8297ad8cd9 106 break;
Helmut Tschemernjak 1:3a8297ad8cd9 107 }
Helmut Tschemernjak 1:3a8297ad8cd9 108 }
Helmut Tschemernjak 1:3a8297ad8cd9 109 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 110 }
Helmut Tschemernjak 1:3a8297ad8cd9 111
Helmut Tschemernjak 1:3a8297ad8cd9 112
Helmut Tschemernjak 1:3a8297ad8cd9 113 int
Helmut Tschemernjak 1:3a8297ad8cd9 114 NVProperty_SRAM::SetProperty(int key, int64_t value, int type)
Helmut Tschemernjak 1:3a8297ad8cd9 115 {
Helmut Tschemernjak 1:3a8297ad8cd9 116 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 117 if(it != _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 118 it->second.val32 = value;
Helmut Tschemernjak 1:3a8297ad8cd9 119 return 0;
Helmut Tschemernjak 1:3a8297ad8cd9 120 }
Helmut Tschemernjak 1:3a8297ad8cd9 121
Helmut Tschemernjak 1:3a8297ad8cd9 122 struct PropertyEntry r;
Helmut Tschemernjak 1:3a8297ad8cd9 123 memset(&r, 0, sizeof(r));
Helmut Tschemernjak 1:3a8297ad8cd9 124 r.key = key;
Helmut Tschemernjak 1:3a8297ad8cd9 125 r.type = type;
Helmut Tschemernjak 1:3a8297ad8cd9 126 if (type <= NVProperty::T_32BIT) {
Helmut Tschemernjak 1:3a8297ad8cd9 127 r.size = sizeof(r.val32);
Helmut Tschemernjak 1:3a8297ad8cd9 128 r.val32 = value;
Helmut Tschemernjak 1:3a8297ad8cd9 129 } else if (type == NVProperty::T_64BIT) {
Helmut Tschemernjak 1:3a8297ad8cd9 130 r.size = sizeof(r.val64);
Helmut Tschemernjak 1:3a8297ad8cd9 131 r.val64 = value;
Helmut Tschemernjak 1:3a8297ad8cd9 132 }
Helmut Tschemernjak 1:3a8297ad8cd9 133
Helmut Tschemernjak 1:3a8297ad8cd9 134 _props.insert(std::pair<int,PropertyEntry> (key, r));
Helmut Tschemernjak 1:3a8297ad8cd9 135
Helmut Tschemernjak 1:3a8297ad8cd9 136 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 137 }
Helmut Tschemernjak 1:3a8297ad8cd9 138
Helmut Tschemernjak 1:3a8297ad8cd9 139 int
Helmut Tschemernjak 1:3a8297ad8cd9 140 NVProperty_SRAM::SetPropertyStr(int key, const char *str, int type)
Helmut Tschemernjak 1:3a8297ad8cd9 141 {
Helmut Tschemernjak 1:3a8297ad8cd9 142 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 143 if(it != _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 144 if (it->second.str)
Helmut Tschemernjak 1:3a8297ad8cd9 145 free(it->second.str);
Helmut Tschemernjak 1:3a8297ad8cd9 146 it->second.str = strdup(str);
Helmut Tschemernjak 1:3a8297ad8cd9 147 it->second.size = strlen(str)+1;
Helmut Tschemernjak 1:3a8297ad8cd9 148 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 149 }
Helmut Tschemernjak 1:3a8297ad8cd9 150
Helmut Tschemernjak 1:3a8297ad8cd9 151 struct PropertyEntry r;
Helmut Tschemernjak 1:3a8297ad8cd9 152 memset(&r, 0, sizeof(r));
Helmut Tschemernjak 1:3a8297ad8cd9 153 r.key = key;
Helmut Tschemernjak 1:3a8297ad8cd9 154 r.type = type;
Helmut Tschemernjak 1:3a8297ad8cd9 155 r.size = strlen(str)+1;
Helmut Tschemernjak 1:3a8297ad8cd9 156 r.str = strdup(str);
Helmut Tschemernjak 1:3a8297ad8cd9 157
Helmut Tschemernjak 1:3a8297ad8cd9 158 _props.insert(std::pair<int,PropertyEntry> (key, r));
Helmut Tschemernjak 1:3a8297ad8cd9 159
Helmut Tschemernjak 1:3a8297ad8cd9 160 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 161 }
Helmut Tschemernjak 1:3a8297ad8cd9 162
Helmut Tschemernjak 1:3a8297ad8cd9 163 int
Helmut Tschemernjak 1:3a8297ad8cd9 164 NVProperty_SRAM::SetPropertyBlob(int key, const void *blob, int size, int type)
Helmut Tschemernjak 1:3a8297ad8cd9 165 {
Helmut Tschemernjak 1:3a8297ad8cd9 166 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 167 if(it != _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 168 if (it->second.data)
Helmut Tschemernjak 1:3a8297ad8cd9 169 delete[] (char *)it->second.data;
Helmut Tschemernjak 1:3a8297ad8cd9 170 it->second.size = size;
Helmut Tschemernjak 1:3a8297ad8cd9 171 it->second.data = new char[size];
Helmut Tschemernjak 1:3a8297ad8cd9 172 memcpy(it->second.data, blob, size);
Helmut Tschemernjak 1:3a8297ad8cd9 173
Helmut Tschemernjak 1:3a8297ad8cd9 174 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 175 }
Helmut Tschemernjak 1:3a8297ad8cd9 176
Helmut Tschemernjak 1:3a8297ad8cd9 177 struct PropertyEntry r;
Helmut Tschemernjak 1:3a8297ad8cd9 178 memset(&r, 0, sizeof(r));
Helmut Tschemernjak 1:3a8297ad8cd9 179 r.key = key;
Helmut Tschemernjak 1:3a8297ad8cd9 180 r.type = type;
Helmut Tschemernjak 1:3a8297ad8cd9 181 r.size = size;
Helmut Tschemernjak 1:3a8297ad8cd9 182 r.data = new char[size];
Helmut Tschemernjak 1:3a8297ad8cd9 183 memcpy(r.data, blob, size);
Helmut Tschemernjak 1:3a8297ad8cd9 184 _props.insert(std::pair<int,PropertyEntry> (key, r));
Helmut Tschemernjak 1:3a8297ad8cd9 185
Helmut Tschemernjak 1:3a8297ad8cd9 186 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 187 }
Helmut Tschemernjak 1:3a8297ad8cd9 188
Helmut Tschemernjak 1:3a8297ad8cd9 189 int
Helmut Tschemernjak 1:3a8297ad8cd9 190 NVProperty_SRAM::EraseProperty(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 191 {
Helmut Tschemernjak 1:3a8297ad8cd9 192 std::map<int, PropertyEntry>::iterator it = _props.find(key);
Helmut Tschemernjak 1:3a8297ad8cd9 193 if(it == _props.end()) {
Helmut Tschemernjak 1:3a8297ad8cd9 194 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 195 }
Helmut Tschemernjak 1:3a8297ad8cd9 196 if (it->second.type == NVProperty::T_STR)
Helmut Tschemernjak 1:3a8297ad8cd9 197 free((char *)it->second.data);
Helmut Tschemernjak 1:3a8297ad8cd9 198 if (it->second.type == NVProperty::T_BLOB)
Helmut Tschemernjak 1:3a8297ad8cd9 199 delete[] (char *)it->second.data;
Helmut Tschemernjak 1:3a8297ad8cd9 200
Helmut Tschemernjak 1:3a8297ad8cd9 201 _props.erase(it->first);
Helmut Tschemernjak 1:3a8297ad8cd9 202 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 203 }
Helmut Tschemernjak 1:3a8297ad8cd9 204
Helmut Tschemernjak 1:3a8297ad8cd9 205 int
Helmut Tschemernjak 1:3a8297ad8cd9 206 NVProperty_SRAM::ReorgProperties(void)
Helmut Tschemernjak 1:3a8297ad8cd9 207 {
Helmut Tschemernjak 1:3a8297ad8cd9 208 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 209 }
Helmut Tschemernjak 1:3a8297ad8cd9 210
Helmut Tschemernjak 1:3a8297ad8cd9 211 int
Helmut Tschemernjak 1:3a8297ad8cd9 212 NVProperty_SRAM::OpenPropertyStore(bool forWrite)
Helmut Tschemernjak 1:3a8297ad8cd9 213 {
Helmut Tschemernjak 1:3a8297ad8cd9 214 UNUSED(forWrite);
Helmut Tschemernjak 1:3a8297ad8cd9 215 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 216 }
Helmut Tschemernjak 1:3a8297ad8cd9 217
Helmut Tschemernjak 1:3a8297ad8cd9 218 int
Helmut Tschemernjak 1:3a8297ad8cd9 219 NVProperty_SRAM::ClosePropertyStore(bool flush)
Helmut Tschemernjak 1:3a8297ad8cd9 220 {
Helmut Tschemernjak 1:3a8297ad8cd9 221 UNUSED(flush);
Helmut Tschemernjak 1:3a8297ad8cd9 222 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 223 }