main/config.c

Mon, 15 Jun 2020 12:08:21 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 15 Jun 2020 12:08:21 +0200
changeset 59
52d9405474e1
parent 57
232f318a6b51
child 60
07a1a07fdc8c
permissions
-rw-r--r--

Better check for a corrupted units file. Added a small boot delay to prevent units file corruption.

/**
 * @file config.c
 * @brief The 'co2meter' configuration data. These are stored in the 
 *        spiffs filesystem in a flash partition.
 */

#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_LOGD(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_LOGD(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_LOGD(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_LOGE(TAG, "/spiffs/etc/units.conf not found, create new");
	goto u_error;
    } else {
        dst = (uint8_t*)&units;
        size_t bytes = fread(dst, 1, sizeof(units), f);
        fclose(f);
	if (bytes != sizeof(units)) {
	    ESP_LOGE(TAG, "/spiffs/etc/units.conf read %d of %d bytes", bytes, sizeof(units));
	    goto u_error;
	}
        ESP_LOGI(TAG, "/spiffs/etc/units.conf read %d bytes", bytes);
	for (int i = 0; i < 3; i++)
	   ESP_LOGI(TAG, "%d %s %d %4d %3d", i, units[i].alias, units[i].pressure_channel, units[i].pressure_voltage, units[i].pressure_zero);
    }
    return;

u_error:
    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);
        units[i].pressure_zero = 110;
    }
    f = fopen("/spiffs/etc/units.conf", "w+");
}



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);
    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)) {
	    ESP_LOGI(TAG, "remove station %s", (char *)SSID);
        } 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