NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
Diff: NVProperty_Editor.cpp
- Revision:
- 7:5c36e5c18b65
- Child:
- 9:ac6c43b29434
diff -r 633f80228fc8 -r 5c36e5c18b65 NVProperty_Editor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NVProperty_Editor.cpp Sun Feb 03 13:00:24 2019 +0100 @@ -0,0 +1,222 @@ +/* + * This is an unpublished work copyright + * (c) 2019 Helmut Tschemernjak + * 30826 Garbsen (Hannover) Germany + * + * + * Use is granted to registered RadioShuttle licensees only. + * Licensees must own a valid serial number and product code. + * Details see: www.radioshuttle.de + */ + + +#include <mbed.h> +#include "main.h" +#include "arch.h" + +#ifdef FEATURE_NVPROPERTYEDITOR +#include <NVPropertyProviderInterface.h> +#include "NVProperty.h" + +static const char *getNiceName(int id, int val); + +/* + * add custom user defined properties here + */ +class UserProperty : public NVProperty { +public: + enum Properties { + MY_DEVNAME = PRIVATE_RANGE_START, + MY_CITY, + MY_APP_PASSWORD, + }; +}; + +// #define ARRAYLEN(arr) (sizeof(arr) / sizeof(0[arr])) + +struct propArray { + int id; + NVProperty::NVPType type; + const char *name; + int valueInt; + const char *valueStr; +} propArray[] = { + { NVProperty::RTC_AGING_CAL, NVProperty::T_32BIT, "RTC_AGING_CAL", 0, NULL }, + { NVProperty::ADC_VREF, NVProperty::T_32BIT, "ADC_VREF", 0, NULL }, + { NVProperty::HARDWARE_REV, NVProperty::T_32BIT, "HARDWARE_REV", 0, NULL }, + + { NVProperty::LORA_DEVICE_ID, NVProperty::T_32BIT, "LORA_DEVICE_ID", 0, NULL }, + { NVProperty::LORA_CODE_ID, NVProperty::T_32BIT, "LORA_CODE_ID", 0, NULL }, + { NVProperty::LORA_REMOTE_ID, NVProperty::T_32BIT, "LORA_REMOTE_ID", 0, NULL }, + { NVProperty::LORA_REMOTE_ID_ALT, NVProperty::T_32BIT, "LORA_REMOTE_ID_ALT", 0, NULL }, + { NVProperty::LORA_RADIO_TYPE, NVProperty::T_32BIT, "LORA_RADIO_TYPE", 0, NULL }, + { NVProperty::LORA_FREQUENCY, NVProperty::T_32BIT, "LORA_FREQUENCY", 0, NULL }, + { NVProperty::LORA_BANDWIDTH, NVProperty::T_32BIT, "LORA_BANDWIDTH", 0, NULL }, + { NVProperty::LORA_SPREADING_FACTOR, NVProperty::T_32BIT, "LORA_SPREADING_FACTOR", 0, NULL }, + { NVProperty::LORA_TXPOWER, NVProperty::T_32BIT, "LORA_TXPOWER", 0, NULL }, + { NVProperty::LORA_FREQUENCY_OFFSET, NVProperty::T_32BIT, "LORA_FREQUENCY_OFFSET", 0, NULL }, + { NVProperty::LORA_APP_PWD, NVProperty::T_STR, "LORA_APP_PWD", 0, NULL }, + { NVProperty::LORA_APP_PWD_ALT, NVProperty::T_STR, "LORA_APP_PWD_ALT", 0, NULL }, + + { NVProperty::LOC_LONGITUDE, NVProperty::T_STR, "LOC_LONGITUDE", 0, NULL }, + { NVProperty::LOC_LATITUDE, NVProperty::T_STR, "LOC_LATITUDE", 0, NULL }, + { NVProperty::LOC_NAME, NVProperty::T_STR, "LOC_NAME", 0, NULL }, + { NVProperty::HOSTNAME, NVProperty::T_STR, "HOSTNAME", 0, NULL }, + + { NVProperty::WIFI_SSID, NVProperty::T_STR, "WIFI_SSID", 0, NULL }, + { NVProperty::WIFI_PASSWORD, NVProperty::T_STR, "WIFI_PASSWORD", 0, NULL }, + { NVProperty::WIFI_SSID_ALT, NVProperty::T_STR, "WIFI_SSID_ALT", 0, NULL }, + { NVProperty::WIFI_PASSWORD_ALT, NVProperty::T_STR, "WIFI_PASSWORD_ALT", 0, NULL }, + { NVProperty::USE_DHCP, NVProperty::T_32BIT, "USE_DHCP", 0, NULL }, + { NVProperty::MAC_ADDR, NVProperty::T_STR, "MAC_ADDR", 0, NULL }, + { NVProperty::NET_IP_ADDR, NVProperty::T_STR, "NET_IP_ADDR", 0, NULL }, + { NVProperty::NET_IP_ROUTER, NVProperty::T_STR, "NET_IP_ROUTER", 0, NULL }, + { NVProperty::NET_IP_DNS_SERVER, NVProperty::T_STR, "NET_IP_DNS_SERVER", 0, NULL }, + + { NVProperty::MQTT_SERVER, NVProperty::T_STR, "MQTT_SERVER", 0, NULL }, + { NVProperty::MQTT_SERVER_ALT, NVProperty::T_STR, "MQTT_SERVER_ALT", 0, NULL }, + { NVProperty::MQTT_TOPIC_INFO, NVProperty::T_STR, "MQTT_TOPIC_INFO", 0, NULL }, + { NVProperty::MQTT_TOPIC_ALARM, NVProperty::T_STR, "MQTT_TOPIC_ALARM", 0, NULL }, + { NVProperty::MQTT_TOPIC_CONTROL, NVProperty::T_STR, "MQTT_TOPIC_CONTROL", 0, NULL }, + { NVProperty::MQTT_TOPIC_4, NVProperty::T_STR, "MQTT_TOPIC_4", 0, NULL }, + { NVProperty::MQTT_TOPIC_5, NVProperty::T_STR, "MQTT_TOPIC_5", 0, NULL }, + + { NVProperty::ALARM_STATUS, NVProperty::T_32BIT, "ALARM_STATUS", 0, NULL }, + + /* + * A user defined property + */ + { UserProperty::MY_CITY, NVProperty::T_STR, "MY_CITY", 0, NULL }, +}; + +void NVPropertyEditor(void) +{ + NVProperty p; + + rprintf("\nWelcome to the Property Editor which allows reading/writing/erasing non volatile settings\r\n\r\n"); + rprintf("Properties cmds are: l (list properties), s (set e.g. s20=value), d (delete e.g. d20), q (quit)\r\n"); + + while(true) { + char buf[80]; + + memset(buf, 0, sizeof(buf)); + + rprintf("$ "); + const char *cmd = ConsoleReadline(buf, (int)sizeof(buf), true); + if (!cmd) + continue; + + switch(*cmd) { + case 'l': { + int cnt = ARRAYLEN(propArray); + rprintf("List of Properties:\r\n"); + for (int i = 0; i < cnt; i++) { + char tbuf[128]; + const char *value = "(not set)"; + memset(tbuf, 0, sizeof(tbuf)); + if (propArray[i].type <= NVProperty::T_32BIT) { + int val = p.GetProperty(propArray[i].id, NVProperty::NVP_ENOENT); + if (val != NVProperty::NVP_ENOENT) { + value = tbuf; + snprintf(tbuf, sizeof(tbuf), "%d (0x%x) %s", val, val, getNiceName(propArray[i].id, val)); + } + } else if (propArray[i].type == NVProperty::T_STR) { + const char *s = p.GetProperty(propArray[i].id, (const char *)NULL); + if (s) + value = s; + } + rprintf("%24s: %d=%s\r\n", propArray[i].name, propArray[i].id, value); + wait_ms(2); // to flush buffers + } + rprintf("\r\n"); + } + break; + case 'd': { + int id = strtol(++cmd, NULL, 0); + + if (id < 1) { + dprintf("invalid parameter"); + break; + } + int cnt = ARRAYLEN(propArray); + int slot = -1; + for (int i = 0; i < cnt; i++) { + if (propArray[i].id == id) { + slot = i; + break; + } + } + if (slot == -1) + dprintf("Property: %d not found in table", id); + else { + dprintf("Deleted Property: %d %s", id, propArray[slot].name); + p.OpenPropertyStore(true); // enable for write + p.EraseProperty(id); + } + } + break; + case 's': { + char *v = strchr(++cmd, '='); + if (!v) + continue; + *v++ = 0; + + int id = strtol(cmd, NULL, 0); + if (id < 1) { + dprintf("invalid parameter"); + break; + } + + int cnt = ARRAYLEN(propArray); + int slot = -1; + for (int i = 0; i < cnt; i++) { + if (propArray[i].id == id) { + slot = i; + break; + } + } + if (slot == -1) + dprintf("Property: %d not found in table", id); + else { + dprintf("Set Property: %s: %d=%s", propArray[slot].name, id, v); + p.OpenPropertyStore(true); // enable for write + if (propArray[slot].type == NVProperty::T_STR) { + p.SetProperty(id, p.T_STR, v, p.S_FLASH); + } else if (propArray[slot].type <= NVProperty::T_32BIT) { + p.SetProperty(id, p.T_32BIT, (int)strtoll(v, NULL, 0), p.S_FLASH); + } + } + } + break; + case 'q': + return; + default: + break; + } + } +} + + +static const char *getNiceName(int id, int val) +{ + const char *name = ""; + + switch(id) { + case NVProperty::LORA_RADIO_TYPE: + if (val == 1) + return "RS_Node_Offline"; + else if (val == 2) + return "RS_Node_Checking"; + else if (val == 3) + return "RS_Node_Online"; + else if (val == 4) + return "RS_Station_Basic"; + else if (val == 5) + return "RS_Station_Server"; + break; + default: + break; + } + return name; +} +#endif