diff -r 000000000000 -r 88d965579617 main/config.c --- /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"); +} +