main/config.c

changeset 0
88d965579617
child 1
1082183cd6bb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/config.c	Tue Oct 08 12:00:31 2019 +0200
@@ -0,0 +1,214 @@
+/**
+ * @file config.c
+ * @brief BrewBoard configuration files.
+ */
+
+#include "config.h"
+
+static const char *TAG = "config";
+
+extern unit_t		units[3];
+
+
+void write_config() {
+    uint8_t	*dst = (uint8_t *)&config;
+    FILE	*f = fopen("/spiffs/etc/config.conf", "w+");
+	      
+    if (f == NULL) {
+	ESP_LOGE(TAG, "write /spiffs/etc/config.conf failed");
+	return;
+    }
+
+    size_t bytes = fwrite(dst, 1, sizeof(config), f);
+    fclose(f);
+    if (bytes != sizeof(config)) {
+	ESP_LOGE(TAG, "/spiffs/etc/config.conf written %d/%d bytes", bytes, sizeof(config));
+    } else {
+	ESP_LOGI(TAG, "/spiffs/etc/config.conf written %d bytes", bytes);
+    }
+}
+
+
+
+void read_config() {
+    uint8_t	*dst;
+    uint8_t	mac_addr[8] = {0};
+    FILE	*f = fopen("/spiffs/etc/config.conf", "r");
+
+    if (f == NULL) {
+	// No configuration yet, create it.
+	esp_efuse_mac_get_default(mac_addr);
+	config.Version = 1;
+	sprintf(config.hostname, "pressure-%02x%02x%02x", mac_addr[3], mac_addr[4], mac_addr[5]);
+	config.mqtt_server[0] = '\0';
+	config.mqtt_port = 1883;
+	config.mqtt_user[0] = '\0';
+	config.mqtt_pwd[0] = '\0';
+	sprintf(config.uuid, "c0ffeeee-dead-beef-cafe-%02x%02x%02x%02x%02x%02x", 
+			mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
+	write_config();
+    } else {
+	dst = (uint8_t*)&config;
+	size_t bytes = fread(dst, 1, sizeof(config), f);
+	fclose(f);
+	ESP_LOGI(TAG, "/spiffs/etc/config.conf read %d bytes", bytes);
+    }
+}
+
+
+
+void write_units() {
+    uint8_t     *dst = (uint8_t *)&units;
+    FILE        *f = fopen("/spiffs/etc/units.conf", "w+");
+
+    if (f == NULL) {
+        ESP_LOGE(TAG, "write /spiffs/etc/units.conf failed");
+        return;
+    }
+    size_t bytes = fwrite(dst, 1, sizeof(units), f);
+    fclose(f);
+    if (bytes != sizeof(units)) {
+        ESP_LOGE(TAG, "/spiffs/etc/units.conf written %d/%d bytes", bytes, sizeof(units));
+    } else {
+        ESP_LOGI(TAG, "/spiffs/etc/units.conf written %d bytes", bytes);
+    }
+}
+
+
+
+void read_units() {
+    uint8_t     *dst;
+    uint8_t     mac_addr[8] = {0};
+    FILE        *f = fopen("/spiffs/etc/units.conf", "r");
+
+    if (f == NULL) {
+        // No units yet, create them.
+	esp_efuse_mac_get_default(mac_addr);
+        for (int i = 0; i < 3; i++) {
+            memset(&units[i], 0, sizeof(unit_t));
+            sprintf(units[i].uuid, "c0ffeeee-dead-beef-caf%d-%02x%02x%02x%02x%02x%02x", i & 3,
+                        mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
+            sprintf(units[i].alias, "unit%d", (i + 1) & 3);
+        }
+        write_units();
+    } else {
+        dst = (uint8_t*)&units;
+        size_t bytes = fread(dst, 1, sizeof(units), f);
+        fclose(f);
+        ESP_LOGI(TAG, "/spiffs/etc/units.conf read %d bytes", bytes);
+	ESP_LOGI(TAG, "%s %s", units[0].uuid, units[0].alias);
+    }
+}
+
+
+
+int add_station(uint8_t *SSID, uint8_t *Password)
+{
+    FILE	*f;
+    uint8_t     *dst = (uint8_t *)&wifiStation;
+
+    if (read_station(SSID) >= 0) {
+	ESP_LOGE(TAG, "add_station %s already excists", SSID);
+	return -1;
+    }
+
+    f = fopen("/spiffs/etc/stations.conf", "a+");
+    if (f == NULL) {
+	ESP_LOGE(TAG, "write /spiffs/etc/stations.conf failed");
+	return -1;
+    }
+    memset(dst, 0, sizeof(wifiStation));
+    sprintf(wifiStation.SSID, "%s", (char *)SSID);
+    sprintf(wifiStation.Password, "%s", (char *)Password);
+    wifiStation.hide = false;
+    fwrite(dst, 1, sizeof(wifiStation), f);
+    fclose(f);
+
+    ESP_LOGI(TAG, "add_station %s record: %d", (char *)SSID, read_station(SSID));
+    /* Return the record number */
+    return read_station(SSID);
+}
+
+
+
+int read_station(uint8_t *SSID)
+{
+    uint8_t     *dst = (uint8_t *)&wifiStation;
+    static int	rc;
+    FILE	*f;
+    size_t	bytes;
+
+    if ((SSID == NULL) || (strlen((char *)SSID) == 0)) {
+	ESP_LOGI(TAG, "read_station(NULL)");
+	return -1;
+    }
+
+    memset(dst, 0, sizeof(wifiStation));
+    f = fopen("/spiffs/etc/stations.conf", "r+");
+    if (f == NULL) {
+	f = fopen("/spiffs/etc/stations.conf", "w+");
+	fclose(f);
+	ESP_LOGI(TAG, "/spiffs/etc/stations.conf created, return -1");
+	return -1;
+    }
+
+    rc = 0;
+    fseek(f, 0, SEEK_SET);
+
+    while (1) {
+        bytes = fread(dst, 1, sizeof(wifiStation), f);
+	if (bytes < sizeof(wifiStation)) {
+	    fclose(f);
+	    memset(dst, 0, sizeof(wifiStation));
+	    return -1;
+	}
+	if (strcmp(wifiStation.SSID, (char *)SSID) == 0) {
+	    // Fount it
+	    fclose(f);
+	    return rc;
+	}
+	rc++;
+    }
+    return -1;
+}
+
+
+
+void remove_station(uint8_t *SSID)
+{
+    FILE        *n, *o;
+    uint8_t     *dst;
+    size_t      bytes;
+
+    n = fopen("/spiffs/etc/stations.new", "a");
+    if (n == NULL) {
+        ESP_LOGE(TAG, "cannot create /spiffs/etc/stations.new");
+        return;
+    }
+    o = fopen("/spiffs/etc/stations.conf", "r");
+    if (o == NULL) {
+        ESP_LOGE(TAG, "cannot open spiffs/etc/stations.conf for reading");
+        fclose(n);
+        return;
+    }
+
+    dst = (uint8_t*)&wifiStation;
+    while (true) {
+        bytes = fread(dst, 1, sizeof(wifiStation), o);
+        if (bytes == 0)
+            break;
+
+        if ((strcmp((char *)SSID, wifiStation.SSID) == 0) || (strlen(wifiStation.SSID) == 0)) {
+            // Record to delete, don't copy
+        } else {
+            fwrite(dst, 1, sizeof(wifiStation), n);
+        }
+    }
+    fclose(o);
+    fclose(n);
+
+    rename("/spiffs/etc/stations.conf", "/spiffs/etc/stations.old");
+    rename("/spiffs/etc/stations.new", "/spiffs/etc/stations.conf");
+    unlink("/spiffs/etc/stations.old");
+}
+

mercurial