NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Wed Feb 06 15:53:49 2019 +0100
Revision:
10:7999d15fd227
Parent:
9:ac6c43b29434
Child:
12:5539cdc8be4b
Updated

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut Tschemernjak 7:5c36e5c18b65 1 /*
Helmut Tschemernjak 7:5c36e5c18b65 2 * This is an unpublished work copyright
Helmut Tschemernjak 7:5c36e5c18b65 3 * (c) 2019 Helmut Tschemernjak
Helmut Tschemernjak 7:5c36e5c18b65 4 * 30826 Garbsen (Hannover) Germany
Helmut Tschemernjak 7:5c36e5c18b65 5 *
Helmut Tschemernjak 7:5c36e5c18b65 6 *
Helmut Tschemernjak 7:5c36e5c18b65 7 * Use is granted to registered RadioShuttle licensees only.
Helmut Tschemernjak 7:5c36e5c18b65 8 * Licensees must own a valid serial number and product code.
Helmut Tschemernjak 7:5c36e5c18b65 9 * Details see: www.radioshuttle.de
Helmut Tschemernjak 7:5c36e5c18b65 10 */
Helmut Tschemernjak 7:5c36e5c18b65 11
Helmut Tschemernjak 7:5c36e5c18b65 12
Helmut Tschemernjak 7:5c36e5c18b65 13 #include <mbed.h>
Helmut Tschemernjak 7:5c36e5c18b65 14 #include "main.h"
Helmut Tschemernjak 7:5c36e5c18b65 15 #include "arch.h"
Helmut Tschemernjak 7:5c36e5c18b65 16
Helmut Tschemernjak 7:5c36e5c18b65 17 #ifdef FEATURE_NVPROPERTYEDITOR
Helmut Tschemernjak 7:5c36e5c18b65 18 #include <NVPropertyProviderInterface.h>
Helmut Tschemernjak 7:5c36e5c18b65 19 #include "NVProperty.h"
Helmut Tschemernjak 7:5c36e5c18b65 20
Helmut Tschemernjak 7:5c36e5c18b65 21 static const char *getNiceName(int id, int val);
Helmut Tschemernjak 7:5c36e5c18b65 22
Helmut Tschemernjak 7:5c36e5c18b65 23 /*
Helmut Tschemernjak 7:5c36e5c18b65 24 * add custom user defined properties here
Helmut Tschemernjak 7:5c36e5c18b65 25 */
Helmut Tschemernjak 7:5c36e5c18b65 26 class UserProperty : public NVProperty {
Helmut Tschemernjak 7:5c36e5c18b65 27 public:
Helmut Tschemernjak 7:5c36e5c18b65 28 enum Properties {
Helmut Tschemernjak 7:5c36e5c18b65 29 MY_DEVNAME = PRIVATE_RANGE_START,
Helmut Tschemernjak 7:5c36e5c18b65 30 MY_CITY,
Helmut Tschemernjak 7:5c36e5c18b65 31 MY_APP_PASSWORD,
Helmut Tschemernjak 7:5c36e5c18b65 32 };
Helmut Tschemernjak 7:5c36e5c18b65 33 };
Helmut Tschemernjak 7:5c36e5c18b65 34
Helmut Tschemernjak 7:5c36e5c18b65 35 // #define ARRAYLEN(arr) (sizeof(arr) / sizeof(0[arr]))
Helmut Tschemernjak 7:5c36e5c18b65 36
Helmut Tschemernjak 7:5c36e5c18b65 37 struct propArray {
Helmut Tschemernjak 7:5c36e5c18b65 38 int id;
Helmut Tschemernjak 7:5c36e5c18b65 39 NVProperty::NVPType type;
Helmut Tschemernjak 7:5c36e5c18b65 40 const char *name;
Helmut Tschemernjak 7:5c36e5c18b65 41 int valueInt;
Helmut Tschemernjak 7:5c36e5c18b65 42 const char *valueStr;
Helmut Tschemernjak 7:5c36e5c18b65 43 } propArray[] = {
Helmut Tschemernjak 7:5c36e5c18b65 44 { NVProperty::RTC_AGING_CAL, NVProperty::T_32BIT, "RTC_AGING_CAL", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 45 { NVProperty::ADC_VREF, NVProperty::T_32BIT, "ADC_VREF", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 46 { NVProperty::HARDWARE_REV, NVProperty::T_32BIT, "HARDWARE_REV", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 47
Helmut Tschemernjak 7:5c36e5c18b65 48 { NVProperty::LORA_DEVICE_ID, NVProperty::T_32BIT, "LORA_DEVICE_ID", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 49 { NVProperty::LORA_CODE_ID, NVProperty::T_32BIT, "LORA_CODE_ID", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 50 { NVProperty::LORA_REMOTE_ID, NVProperty::T_32BIT, "LORA_REMOTE_ID", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 51 { NVProperty::LORA_REMOTE_ID_ALT, NVProperty::T_32BIT, "LORA_REMOTE_ID_ALT", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 52 { NVProperty::LORA_RADIO_TYPE, NVProperty::T_32BIT, "LORA_RADIO_TYPE", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 53 { NVProperty::LORA_FREQUENCY, NVProperty::T_32BIT, "LORA_FREQUENCY", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 54 { NVProperty::LORA_BANDWIDTH, NVProperty::T_32BIT, "LORA_BANDWIDTH", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 55 { NVProperty::LORA_SPREADING_FACTOR, NVProperty::T_32BIT, "LORA_SPREADING_FACTOR", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 56 { NVProperty::LORA_TXPOWER, NVProperty::T_32BIT, "LORA_TXPOWER", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 57 { NVProperty::LORA_FREQUENCY_OFFSET, NVProperty::T_32BIT, "LORA_FREQUENCY_OFFSET", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 58 { NVProperty::LORA_APP_PWD, NVProperty::T_STR, "LORA_APP_PWD", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 59 { NVProperty::LORA_APP_PWD_ALT, NVProperty::T_STR, "LORA_APP_PWD_ALT", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 60
Helmut Tschemernjak 7:5c36e5c18b65 61 { NVProperty::LOC_LONGITUDE, NVProperty::T_STR, "LOC_LONGITUDE", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 62 { NVProperty::LOC_LATITUDE, NVProperty::T_STR, "LOC_LATITUDE", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 63 { NVProperty::LOC_NAME, NVProperty::T_STR, "LOC_NAME", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 64 { NVProperty::HOSTNAME, NVProperty::T_STR, "HOSTNAME", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 65
Helmut Tschemernjak 7:5c36e5c18b65 66 { NVProperty::WIFI_SSID, NVProperty::T_STR, "WIFI_SSID", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 67 { NVProperty::WIFI_PASSWORD, NVProperty::T_STR, "WIFI_PASSWORD", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 68 { NVProperty::WIFI_SSID_ALT, NVProperty::T_STR, "WIFI_SSID_ALT", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 69 { NVProperty::WIFI_PASSWORD_ALT, NVProperty::T_STR, "WIFI_PASSWORD_ALT", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 70 { NVProperty::USE_DHCP, NVProperty::T_32BIT, "USE_DHCP", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 71 { NVProperty::MAC_ADDR, NVProperty::T_STR, "MAC_ADDR", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 72 { NVProperty::NET_IP_ADDR, NVProperty::T_STR, "NET_IP_ADDR", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 73 { NVProperty::NET_IP_ROUTER, NVProperty::T_STR, "NET_IP_ROUTER", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 74 { NVProperty::NET_IP_DNS_SERVER, NVProperty::T_STR, "NET_IP_DNS_SERVER", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 75
Helmut Tschemernjak 7:5c36e5c18b65 76 { NVProperty::MQTT_SERVER, NVProperty::T_STR, "MQTT_SERVER", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 77 { NVProperty::MQTT_SERVER_ALT, NVProperty::T_STR, "MQTT_SERVER_ALT", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 78 { NVProperty::MQTT_TOPIC_INFO, NVProperty::T_STR, "MQTT_TOPIC_INFO", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 79 { NVProperty::MQTT_TOPIC_ALARM, NVProperty::T_STR, "MQTT_TOPIC_ALARM", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 80 { NVProperty::MQTT_TOPIC_CONTROL, NVProperty::T_STR, "MQTT_TOPIC_CONTROL", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 81 { NVProperty::MQTT_TOPIC_4, NVProperty::T_STR, "MQTT_TOPIC_4", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 82 { NVProperty::MQTT_TOPIC_5, NVProperty::T_STR, "MQTT_TOPIC_5", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 83
Helmut Tschemernjak 7:5c36e5c18b65 84 { NVProperty::ALARM_STATUS, NVProperty::T_32BIT, "ALARM_STATUS", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 85
Helmut Tschemernjak 7:5c36e5c18b65 86 /*
Helmut Tschemernjak 7:5c36e5c18b65 87 * A user defined property
Helmut Tschemernjak 7:5c36e5c18b65 88 */
Helmut Tschemernjak 7:5c36e5c18b65 89 { UserProperty::MY_CITY, NVProperty::T_STR, "MY_CITY", 0, NULL },
Helmut Tschemernjak 7:5c36e5c18b65 90 };
Helmut Tschemernjak 7:5c36e5c18b65 91
Helmut Tschemernjak 7:5c36e5c18b65 92 void NVPropertyEditor(void)
Helmut Tschemernjak 7:5c36e5c18b65 93 {
Helmut Tschemernjak 7:5c36e5c18b65 94 NVProperty p;
Helmut Tschemernjak 7:5c36e5c18b65 95
Helmut Tschemernjak 7:5c36e5c18b65 96 rprintf("\nWelcome to the Property Editor which allows reading/writing/erasing non volatile settings\r\n\r\n");
Helmut Tschemernjak 10:7999d15fd227 97 const char *help = "Properties cmds are:\r\n l (list properties), s (set e.g. s20=value), d (delete e.g. d20), q (quit)\r\n";
Helmut Tschemernjak 10:7999d15fd227 98 rprintf(help);
Helmut Tschemernjak 7:5c36e5c18b65 99
Helmut Tschemernjak 7:5c36e5c18b65 100 while(true) {
Helmut Tschemernjak 7:5c36e5c18b65 101 char buf[80];
Helmut Tschemernjak 7:5c36e5c18b65 102
Helmut Tschemernjak 7:5c36e5c18b65 103 memset(buf, 0, sizeof(buf));
Helmut Tschemernjak 7:5c36e5c18b65 104
Helmut Tschemernjak 7:5c36e5c18b65 105 rprintf("$ ");
Helmut Tschemernjak 7:5c36e5c18b65 106 const char *cmd = ConsoleReadline(buf, (int)sizeof(buf), true);
Helmut Tschemernjak 7:5c36e5c18b65 107 if (!cmd)
Helmut Tschemernjak 7:5c36e5c18b65 108 continue;
Helmut Tschemernjak 7:5c36e5c18b65 109
Helmut Tschemernjak 7:5c36e5c18b65 110 switch(*cmd) {
Helmut Tschemernjak 7:5c36e5c18b65 111 case 'l': {
Helmut Tschemernjak 7:5c36e5c18b65 112 int cnt = ARRAYLEN(propArray);
Helmut Tschemernjak 7:5c36e5c18b65 113 rprintf("List of Properties:\r\n");
Helmut Tschemernjak 7:5c36e5c18b65 114 for (int i = 0; i < cnt; i++) {
Helmut Tschemernjak 7:5c36e5c18b65 115 char tbuf[128];
Helmut Tschemernjak 7:5c36e5c18b65 116 const char *value = "(not set)";
Helmut Tschemernjak 7:5c36e5c18b65 117 memset(tbuf, 0, sizeof(tbuf));
Helmut Tschemernjak 7:5c36e5c18b65 118 if (propArray[i].type <= NVProperty::T_32BIT) {
Helmut Tschemernjak 7:5c36e5c18b65 119 int val = p.GetProperty(propArray[i].id, NVProperty::NVP_ENOENT);
Helmut Tschemernjak 7:5c36e5c18b65 120 if (val != NVProperty::NVP_ENOENT) {
Helmut Tschemernjak 7:5c36e5c18b65 121 value = tbuf;
Helmut Tschemernjak 7:5c36e5c18b65 122 snprintf(tbuf, sizeof(tbuf), "%d (0x%x) %s", val, val, getNiceName(propArray[i].id, val));
Helmut Tschemernjak 7:5c36e5c18b65 123 }
Helmut Tschemernjak 7:5c36e5c18b65 124 } else if (propArray[i].type == NVProperty::T_STR) {
Helmut Tschemernjak 7:5c36e5c18b65 125 const char *s = p.GetProperty(propArray[i].id, (const char *)NULL);
Helmut Tschemernjak 7:5c36e5c18b65 126 if (s)
Helmut Tschemernjak 7:5c36e5c18b65 127 value = s;
Helmut Tschemernjak 7:5c36e5c18b65 128 }
Helmut Tschemernjak 7:5c36e5c18b65 129 rprintf("%24s: %d=%s\r\n", propArray[i].name, propArray[i].id, value);
Helmut Tschemernjak 7:5c36e5c18b65 130 wait_ms(2); // to flush buffers
Helmut Tschemernjak 7:5c36e5c18b65 131 }
Helmut Tschemernjak 7:5c36e5c18b65 132 rprintf("\r\n");
Helmut Tschemernjak 7:5c36e5c18b65 133 }
Helmut Tschemernjak 7:5c36e5c18b65 134 break;
Helmut Tschemernjak 7:5c36e5c18b65 135 case 'd': {
Helmut Tschemernjak 7:5c36e5c18b65 136 int id = strtol(++cmd, NULL, 0);
Helmut Tschemernjak 7:5c36e5c18b65 137
Helmut Tschemernjak 7:5c36e5c18b65 138 if (id < 1) {
Helmut Tschemernjak 7:5c36e5c18b65 139 dprintf("invalid parameter");
Helmut Tschemernjak 7:5c36e5c18b65 140 break;
Helmut Tschemernjak 7:5c36e5c18b65 141 }
Helmut Tschemernjak 7:5c36e5c18b65 142 int cnt = ARRAYLEN(propArray);
Helmut Tschemernjak 7:5c36e5c18b65 143 int slot = -1;
Helmut Tschemernjak 7:5c36e5c18b65 144 for (int i = 0; i < cnt; i++) {
Helmut Tschemernjak 7:5c36e5c18b65 145 if (propArray[i].id == id) {
Helmut Tschemernjak 7:5c36e5c18b65 146 slot = i;
Helmut Tschemernjak 7:5c36e5c18b65 147 break;
Helmut Tschemernjak 7:5c36e5c18b65 148 }
Helmut Tschemernjak 7:5c36e5c18b65 149 }
Helmut Tschemernjak 7:5c36e5c18b65 150 if (slot == -1)
Helmut Tschemernjak 7:5c36e5c18b65 151 dprintf("Property: %d not found in table", id);
Helmut Tschemernjak 7:5c36e5c18b65 152 else {
Helmut Tschemernjak 7:5c36e5c18b65 153 dprintf("Deleted Property: %d %s", id, propArray[slot].name);
Helmut Tschemernjak 7:5c36e5c18b65 154 p.OpenPropertyStore(true); // enable for write
Helmut Tschemernjak 7:5c36e5c18b65 155 p.EraseProperty(id);
Helmut Tschemernjak 7:5c36e5c18b65 156 }
Helmut Tschemernjak 7:5c36e5c18b65 157 }
Helmut Tschemernjak 7:5c36e5c18b65 158 break;
Helmut Tschemernjak 7:5c36e5c18b65 159 case 's': {
Helmut Tschemernjak 9:ac6c43b29434 160 char *v = (char *)strchr(++cmd, '=');
Helmut Tschemernjak 7:5c36e5c18b65 161 if (!v)
Helmut Tschemernjak 7:5c36e5c18b65 162 continue;
Helmut Tschemernjak 7:5c36e5c18b65 163 *v++ = 0;
Helmut Tschemernjak 7:5c36e5c18b65 164
Helmut Tschemernjak 7:5c36e5c18b65 165 int id = strtol(cmd, NULL, 0);
Helmut Tschemernjak 7:5c36e5c18b65 166 if (id < 1) {
Helmut Tschemernjak 7:5c36e5c18b65 167 dprintf("invalid parameter");
Helmut Tschemernjak 7:5c36e5c18b65 168 break;
Helmut Tschemernjak 7:5c36e5c18b65 169 }
Helmut Tschemernjak 7:5c36e5c18b65 170
Helmut Tschemernjak 7:5c36e5c18b65 171 int cnt = ARRAYLEN(propArray);
Helmut Tschemernjak 7:5c36e5c18b65 172 int slot = -1;
Helmut Tschemernjak 7:5c36e5c18b65 173 for (int i = 0; i < cnt; i++) {
Helmut Tschemernjak 7:5c36e5c18b65 174 if (propArray[i].id == id) {
Helmut Tschemernjak 7:5c36e5c18b65 175 slot = i;
Helmut Tschemernjak 7:5c36e5c18b65 176 break;
Helmut Tschemernjak 7:5c36e5c18b65 177 }
Helmut Tschemernjak 7:5c36e5c18b65 178 }
Helmut Tschemernjak 7:5c36e5c18b65 179 if (slot == -1)
Helmut Tschemernjak 7:5c36e5c18b65 180 dprintf("Property: %d not found in table", id);
Helmut Tschemernjak 7:5c36e5c18b65 181 else {
Helmut Tschemernjak 7:5c36e5c18b65 182 dprintf("Set Property: %s: %d=%s", propArray[slot].name, id, v);
Helmut Tschemernjak 7:5c36e5c18b65 183 p.OpenPropertyStore(true); // enable for write
Helmut Tschemernjak 7:5c36e5c18b65 184 if (propArray[slot].type == NVProperty::T_STR) {
Helmut Tschemernjak 7:5c36e5c18b65 185 p.SetProperty(id, p.T_STR, v, p.S_FLASH);
Helmut Tschemernjak 7:5c36e5c18b65 186 } else if (propArray[slot].type <= NVProperty::T_32BIT) {
Helmut Tschemernjak 7:5c36e5c18b65 187 p.SetProperty(id, p.T_32BIT, (int)strtoll(v, NULL, 0), p.S_FLASH);
Helmut Tschemernjak 7:5c36e5c18b65 188 }
Helmut Tschemernjak 7:5c36e5c18b65 189 }
Helmut Tschemernjak 7:5c36e5c18b65 190 }
Helmut Tschemernjak 7:5c36e5c18b65 191 break;
Helmut Tschemernjak 10:7999d15fd227 192 case 'i':
Helmut Tschemernjak 10:7999d15fd227 193 dump("Flash-Area", (void *)0x803c000, 2048);
Helmut Tschemernjak 10:7999d15fd227 194 break;
Helmut Tschemernjak 10:7999d15fd227 195 case 'r':
Helmut Tschemernjak 10:7999d15fd227 196 dprintf("ReorgProperties");
Helmut Tschemernjak 10:7999d15fd227 197 p.ReorgProperties();
Helmut Tschemernjak 10:7999d15fd227 198 break;
Helmut Tschemernjak 7:5c36e5c18b65 199 case 'q':
Helmut Tschemernjak 7:5c36e5c18b65 200 return;
Helmut Tschemernjak 7:5c36e5c18b65 201 default:
Helmut Tschemernjak 10:7999d15fd227 202 rprintf(help);
Helmut Tschemernjak 7:5c36e5c18b65 203 break;
Helmut Tschemernjak 7:5c36e5c18b65 204 }
Helmut Tschemernjak 7:5c36e5c18b65 205 }
Helmut Tschemernjak 7:5c36e5c18b65 206 }
Helmut Tschemernjak 7:5c36e5c18b65 207
Helmut Tschemernjak 7:5c36e5c18b65 208
Helmut Tschemernjak 7:5c36e5c18b65 209 static const char *getNiceName(int id, int val)
Helmut Tschemernjak 7:5c36e5c18b65 210 {
Helmut Tschemernjak 7:5c36e5c18b65 211 const char *name = "";
Helmut Tschemernjak 7:5c36e5c18b65 212
Helmut Tschemernjak 7:5c36e5c18b65 213 switch(id) {
Helmut Tschemernjak 7:5c36e5c18b65 214 case NVProperty::LORA_RADIO_TYPE:
Helmut Tschemernjak 7:5c36e5c18b65 215 if (val == 1)
Helmut Tschemernjak 7:5c36e5c18b65 216 return "RS_Node_Offline";
Helmut Tschemernjak 7:5c36e5c18b65 217 else if (val == 2)
Helmut Tschemernjak 7:5c36e5c18b65 218 return "RS_Node_Checking";
Helmut Tschemernjak 7:5c36e5c18b65 219 else if (val == 3)
Helmut Tschemernjak 7:5c36e5c18b65 220 return "RS_Node_Online";
Helmut Tschemernjak 7:5c36e5c18b65 221 else if (val == 4)
Helmut Tschemernjak 7:5c36e5c18b65 222 return "RS_Station_Basic";
Helmut Tschemernjak 7:5c36e5c18b65 223 else if (val == 5)
Helmut Tschemernjak 7:5c36e5c18b65 224 return "RS_Station_Server";
Helmut Tschemernjak 7:5c36e5c18b65 225 break;
Helmut Tschemernjak 7:5c36e5c18b65 226 default:
Helmut Tschemernjak 7:5c36e5c18b65 227 break;
Helmut Tschemernjak 7:5c36e5c18b65 228 }
Helmut Tschemernjak 7:5c36e5c18b65 229 return name;
Helmut Tschemernjak 7:5c36e5c18b65 230 }
Helmut Tschemernjak 7:5c36e5c18b65 231 #endif