NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Sun Feb 03 13:00:24 2019 +0100
Revision:
7:5c36e5c18b65
Child:
9:ac6c43b29434
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 7:5c36e5c18b65 97 rprintf("Properties cmds are: l (list properties), s (set e.g. s20=value), d (delete e.g. d20), q (quit)\r\n");
Helmut Tschemernjak 7:5c36e5c18b65 98
Helmut Tschemernjak 7:5c36e5c18b65 99 while(true) {
Helmut Tschemernjak 7:5c36e5c18b65 100 char buf[80];
Helmut Tschemernjak 7:5c36e5c18b65 101
Helmut Tschemernjak 7:5c36e5c18b65 102 memset(buf, 0, sizeof(buf));
Helmut Tschemernjak 7:5c36e5c18b65 103
Helmut Tschemernjak 7:5c36e5c18b65 104 rprintf("$ ");
Helmut Tschemernjak 7:5c36e5c18b65 105 const char *cmd = ConsoleReadline(buf, (int)sizeof(buf), true);
Helmut Tschemernjak 7:5c36e5c18b65 106 if (!cmd)
Helmut Tschemernjak 7:5c36e5c18b65 107 continue;
Helmut Tschemernjak 7:5c36e5c18b65 108
Helmut Tschemernjak 7:5c36e5c18b65 109 switch(*cmd) {
Helmut Tschemernjak 7:5c36e5c18b65 110 case 'l': {
Helmut Tschemernjak 7:5c36e5c18b65 111 int cnt = ARRAYLEN(propArray);
Helmut Tschemernjak 7:5c36e5c18b65 112 rprintf("List of Properties:\r\n");
Helmut Tschemernjak 7:5c36e5c18b65 113 for (int i = 0; i < cnt; i++) {
Helmut Tschemernjak 7:5c36e5c18b65 114 char tbuf[128];
Helmut Tschemernjak 7:5c36e5c18b65 115 const char *value = "(not set)";
Helmut Tschemernjak 7:5c36e5c18b65 116 memset(tbuf, 0, sizeof(tbuf));
Helmut Tschemernjak 7:5c36e5c18b65 117 if (propArray[i].type <= NVProperty::T_32BIT) {
Helmut Tschemernjak 7:5c36e5c18b65 118 int val = p.GetProperty(propArray[i].id, NVProperty::NVP_ENOENT);
Helmut Tschemernjak 7:5c36e5c18b65 119 if (val != NVProperty::NVP_ENOENT) {
Helmut Tschemernjak 7:5c36e5c18b65 120 value = tbuf;
Helmut Tschemernjak 7:5c36e5c18b65 121 snprintf(tbuf, sizeof(tbuf), "%d (0x%x) %s", val, val, getNiceName(propArray[i].id, val));
Helmut Tschemernjak 7:5c36e5c18b65 122 }
Helmut Tschemernjak 7:5c36e5c18b65 123 } else if (propArray[i].type == NVProperty::T_STR) {
Helmut Tschemernjak 7:5c36e5c18b65 124 const char *s = p.GetProperty(propArray[i].id, (const char *)NULL);
Helmut Tschemernjak 7:5c36e5c18b65 125 if (s)
Helmut Tschemernjak 7:5c36e5c18b65 126 value = s;
Helmut Tschemernjak 7:5c36e5c18b65 127 }
Helmut Tschemernjak 7:5c36e5c18b65 128 rprintf("%24s: %d=%s\r\n", propArray[i].name, propArray[i].id, value);
Helmut Tschemernjak 7:5c36e5c18b65 129 wait_ms(2); // to flush buffers
Helmut Tschemernjak 7:5c36e5c18b65 130 }
Helmut Tschemernjak 7:5c36e5c18b65 131 rprintf("\r\n");
Helmut Tschemernjak 7:5c36e5c18b65 132 }
Helmut Tschemernjak 7:5c36e5c18b65 133 break;
Helmut Tschemernjak 7:5c36e5c18b65 134 case 'd': {
Helmut Tschemernjak 7:5c36e5c18b65 135 int id = strtol(++cmd, NULL, 0);
Helmut Tschemernjak 7:5c36e5c18b65 136
Helmut Tschemernjak 7:5c36e5c18b65 137 if (id < 1) {
Helmut Tschemernjak 7:5c36e5c18b65 138 dprintf("invalid parameter");
Helmut Tschemernjak 7:5c36e5c18b65 139 break;
Helmut Tschemernjak 7:5c36e5c18b65 140 }
Helmut Tschemernjak 7:5c36e5c18b65 141 int cnt = ARRAYLEN(propArray);
Helmut Tschemernjak 7:5c36e5c18b65 142 int slot = -1;
Helmut Tschemernjak 7:5c36e5c18b65 143 for (int i = 0; i < cnt; i++) {
Helmut Tschemernjak 7:5c36e5c18b65 144 if (propArray[i].id == id) {
Helmut Tschemernjak 7:5c36e5c18b65 145 slot = i;
Helmut Tschemernjak 7:5c36e5c18b65 146 break;
Helmut Tschemernjak 7:5c36e5c18b65 147 }
Helmut Tschemernjak 7:5c36e5c18b65 148 }
Helmut Tschemernjak 7:5c36e5c18b65 149 if (slot == -1)
Helmut Tschemernjak 7:5c36e5c18b65 150 dprintf("Property: %d not found in table", id);
Helmut Tschemernjak 7:5c36e5c18b65 151 else {
Helmut Tschemernjak 7:5c36e5c18b65 152 dprintf("Deleted Property: %d %s", id, propArray[slot].name);
Helmut Tschemernjak 7:5c36e5c18b65 153 p.OpenPropertyStore(true); // enable for write
Helmut Tschemernjak 7:5c36e5c18b65 154 p.EraseProperty(id);
Helmut Tschemernjak 7:5c36e5c18b65 155 }
Helmut Tschemernjak 7:5c36e5c18b65 156 }
Helmut Tschemernjak 7:5c36e5c18b65 157 break;
Helmut Tschemernjak 7:5c36e5c18b65 158 case 's': {
Helmut Tschemernjak 7:5c36e5c18b65 159 char *v = strchr(++cmd, '=');
Helmut Tschemernjak 7:5c36e5c18b65 160 if (!v)
Helmut Tschemernjak 7:5c36e5c18b65 161 continue;
Helmut Tschemernjak 7:5c36e5c18b65 162 *v++ = 0;
Helmut Tschemernjak 7:5c36e5c18b65 163
Helmut Tschemernjak 7:5c36e5c18b65 164 int id = strtol(cmd, NULL, 0);
Helmut Tschemernjak 7:5c36e5c18b65 165 if (id < 1) {
Helmut Tschemernjak 7:5c36e5c18b65 166 dprintf("invalid parameter");
Helmut Tschemernjak 7:5c36e5c18b65 167 break;
Helmut Tschemernjak 7:5c36e5c18b65 168 }
Helmut Tschemernjak 7:5c36e5c18b65 169
Helmut Tschemernjak 7:5c36e5c18b65 170 int cnt = ARRAYLEN(propArray);
Helmut Tschemernjak 7:5c36e5c18b65 171 int slot = -1;
Helmut Tschemernjak 7:5c36e5c18b65 172 for (int i = 0; i < cnt; i++) {
Helmut Tschemernjak 7:5c36e5c18b65 173 if (propArray[i].id == id) {
Helmut Tschemernjak 7:5c36e5c18b65 174 slot = i;
Helmut Tschemernjak 7:5c36e5c18b65 175 break;
Helmut Tschemernjak 7:5c36e5c18b65 176 }
Helmut Tschemernjak 7:5c36e5c18b65 177 }
Helmut Tschemernjak 7:5c36e5c18b65 178 if (slot == -1)
Helmut Tschemernjak 7:5c36e5c18b65 179 dprintf("Property: %d not found in table", id);
Helmut Tschemernjak 7:5c36e5c18b65 180 else {
Helmut Tschemernjak 7:5c36e5c18b65 181 dprintf("Set Property: %s: %d=%s", propArray[slot].name, id, v);
Helmut Tschemernjak 7:5c36e5c18b65 182 p.OpenPropertyStore(true); // enable for write
Helmut Tschemernjak 7:5c36e5c18b65 183 if (propArray[slot].type == NVProperty::T_STR) {
Helmut Tschemernjak 7:5c36e5c18b65 184 p.SetProperty(id, p.T_STR, v, p.S_FLASH);
Helmut Tschemernjak 7:5c36e5c18b65 185 } else if (propArray[slot].type <= NVProperty::T_32BIT) {
Helmut Tschemernjak 7:5c36e5c18b65 186 p.SetProperty(id, p.T_32BIT, (int)strtoll(v, NULL, 0), p.S_FLASH);
Helmut Tschemernjak 7:5c36e5c18b65 187 }
Helmut Tschemernjak 7:5c36e5c18b65 188 }
Helmut Tschemernjak 7:5c36e5c18b65 189 }
Helmut Tschemernjak 7:5c36e5c18b65 190 break;
Helmut Tschemernjak 7:5c36e5c18b65 191 case 'q':
Helmut Tschemernjak 7:5c36e5c18b65 192 return;
Helmut Tschemernjak 7:5c36e5c18b65 193 default:
Helmut Tschemernjak 7:5c36e5c18b65 194 break;
Helmut Tschemernjak 7:5c36e5c18b65 195 }
Helmut Tschemernjak 7:5c36e5c18b65 196 }
Helmut Tschemernjak 7:5c36e5c18b65 197 }
Helmut Tschemernjak 7:5c36e5c18b65 198
Helmut Tschemernjak 7:5c36e5c18b65 199
Helmut Tschemernjak 7:5c36e5c18b65 200 static const char *getNiceName(int id, int val)
Helmut Tschemernjak 7:5c36e5c18b65 201 {
Helmut Tschemernjak 7:5c36e5c18b65 202 const char *name = "";
Helmut Tschemernjak 7:5c36e5c18b65 203
Helmut Tschemernjak 7:5c36e5c18b65 204 switch(id) {
Helmut Tschemernjak 7:5c36e5c18b65 205 case NVProperty::LORA_RADIO_TYPE:
Helmut Tschemernjak 7:5c36e5c18b65 206 if (val == 1)
Helmut Tschemernjak 7:5c36e5c18b65 207 return "RS_Node_Offline";
Helmut Tschemernjak 7:5c36e5c18b65 208 else if (val == 2)
Helmut Tschemernjak 7:5c36e5c18b65 209 return "RS_Node_Checking";
Helmut Tschemernjak 7:5c36e5c18b65 210 else if (val == 3)
Helmut Tschemernjak 7:5c36e5c18b65 211 return "RS_Node_Online";
Helmut Tschemernjak 7:5c36e5c18b65 212 else if (val == 4)
Helmut Tschemernjak 7:5c36e5c18b65 213 return "RS_Station_Basic";
Helmut Tschemernjak 7:5c36e5c18b65 214 else if (val == 5)
Helmut Tschemernjak 7:5c36e5c18b65 215 return "RS_Station_Server";
Helmut Tschemernjak 7:5c36e5c18b65 216 break;
Helmut Tschemernjak 7:5c36e5c18b65 217 default:
Helmut Tschemernjak 7:5c36e5c18b65 218 break;
Helmut Tschemernjak 7:5c36e5c18b65 219 }
Helmut Tschemernjak 7:5c36e5c18b65 220 return name;
Helmut Tschemernjak 7:5c36e5c18b65 221 }
Helmut Tschemernjak 7:5c36e5c18b65 222 #endif