Fri, 01 Nov 2019 14:23:48 +0100
Added code comments.
/** * @file config.c * @brief BrewBoard configuration files. */ #include "config.h" static const char *TAG = "config"; unit_t units[3]; ///< Pressure test units SemaphoreHandle_t xSemaphoreUnits = NULL; ///< Semaphore Units records 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, "co2meter-%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); } } 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"); }