NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
Diff: NVProperty_Editor.cpp
- Revision:
- 7:5c36e5c18b65
- Child:
- 9:ac6c43b29434
--- /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
Helmut Tschemernjak