NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

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