Sat, 14 Mar 2020 13:07:02 +0100
Version 0.2.2 Changed to use a permanent network and WiFi connection. Removed three mainloop stages. Removed MQTT sequence counter that was not used. Update WiFi rssi status during eacht measure cycle. Changed FreeRTOS schedulng to 500 Hz.
/** * @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_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); units[i].pressure_zero = 110; } 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); 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); } } 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"); }