Tue, 08 Oct 2019 21:09:36 +0200
FreeRTOS scheduler from 100 Hz to 200 Hz. All units data is now protected with a semaphore.
main/co2meter.c | file | annotate | diff | comparison | revisions | |
main/config.c | file | annotate | diff | comparison | revisions | |
main/task_mqtt.c | file | annotate | diff | comparison | revisions | |
sdkconfig | file | annotate | diff | comparison | revisions |
--- a/main/co2meter.c Tue Oct 08 16:51:30 2019 +0200 +++ b/main/co2meter.c Tue Oct 08 21:09:36 2019 +0200 @@ -30,9 +30,10 @@ static TaskHandle_t xTaskWifi = NULL; static TaskHandle_t xTaskMQTT = NULL; const esp_app_desc_t *app_desc = NULL; -unit_t units[3]; ///< Pressure test units +extern unit_t units[3]; ///< Pressure test units +extern SemaphoreHandle_t xSemaphoreUnits; ///< Units lock semaphore extern DS18B20_State *ds18b20_state; ///< DS18B20 state extern SemaphoreHandle_t xSemaphoreDS18B20; ///< DS18B20 lock semaphore extern ADC_State *adc_state; ///< ADC state @@ -203,6 +204,7 @@ xSemaphoreDS18B20 = xSemaphoreCreateMutex(); xSemaphoreADC = xSemaphoreCreateMutex(); + xSemaphoreUnits = xSemaphoreCreateMutex(); xTaskCreate(&task_ds18b20, "task_ds18b20", 2560, NULL, 8, &xTaskDS18B20); xTaskCreate(&task_adc, "task_adc", 2560, NULL, 8, &xTaskADC); @@ -291,28 +293,31 @@ } /* Copy measured data and calculate results */ - for (int i = 0; i < 3; i++) { - units[i].temperature = temp; - units[i].temperature_state = state; - strncpy(units[i].temperature_rom_code, rom_code, strlen(rom_code)); - if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) { - units[i].pressure_state = adc_state->Pressure[i].error; - units[i].pressure_channel = adc_state->Pressure[i].channel; - units[i].pressure_voltage = adc_state->Pressure[i].voltage; - units[i].pressure_zero = 110; - int P = (units[i].pressure_voltage / (adc_state->Batt_voltage / 1000) - units[i].pressure_zero) * 14; // in bar - if (P < 0) - P = 0; - units[i].pressure = P; + if (xSemaphoreTake(xSemaphoreUnits, 25) == pdTRUE) { + for (int i = 0; i < 3; i++) { + units[i].temperature = temp; + units[i].temperature_state = state; + strncpy(units[i].temperature_rom_code, rom_code, 17); + if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) { + units[i].pressure_state = adc_state->Pressure[i].error; + units[i].pressure_channel = adc_state->Pressure[i].channel; + units[i].pressure_voltage = adc_state->Pressure[i].voltage; + units[i].pressure_zero = 110; + int P = (units[i].pressure_voltage / (adc_state->Batt_voltage / 1000) - units[i].pressure_zero) * 14; // in bar + if (P < 0) + P = 0; + units[i].pressure = P; printf("%d volt: %d batt: %d scale: %d bar: %d\n", i, units[i].pressure_voltage, adc_state->Batt_voltage, units[i].pressure_voltage / (adc_state->Batt_voltage / 1000) - units[i].pressure_zero, P); // Moet die echt op 5 volt? // Verbruik 10 mA // Setup tijd max 2 mS - xSemaphoreGive(xSemaphoreADC); + xSemaphoreGive(xSemaphoreADC); + } } + write_units(); + xSemaphoreGive(xSemaphoreUnits); } - write_units(); } break;
--- a/main/config.c Tue Oct 08 16:51:30 2019 +0200 +++ b/main/config.c Tue Oct 08 21:09:36 2019 +0200 @@ -7,7 +7,9 @@ static const char *TAG = "config"; -extern unit_t units[3]; +unit_t units[3]; ///< Pressure test units +SemaphoreHandle_t xSemaphoreUnits = NULL; ///< Semaphore Units records + void write_config() {
--- a/main/task_mqtt.c Tue Oct 08 16:51:30 2019 +0200 +++ b/main/task_mqtt.c Tue Oct 08 21:09:36 2019 +0200 @@ -30,6 +30,8 @@ extern SemaphoreHandle_t xSemaphoreWiFi; ///< WiFi lock semaphore extern unit_t units[3]; +extern SemaphoreHandle_t xSemaphoreUnits; + extern const esp_app_desc_t *app_desc; @@ -99,38 +101,41 @@ char *payload = NULL; char buf[128]; - payload = xstrcpy((char *)"{\"uuid\":\""); - payload = xstrcat(payload, units[i].uuid); - payload = xstrcat(payload, (char *)"\",\"alias\":\""); - payload = xstrcat(payload, units[i].alias); + if (xSemaphoreTake(xSemaphoreUnits, 25) == pdTRUE) { + payload = xstrcpy((char *)"{\"uuid\":\""); + payload = xstrcat(payload, units[i].uuid); + payload = xstrcat(payload, (char *)"\",\"alias\":\""); + payload = xstrcat(payload, units[i].alias); - // temperature_state temperature_address temperature - payload = xstrcat(payload, (char *)"\",\"temperature\":{\"state\":\""); - payload = xstrcat(payload, (char *)sensState[units[i].temperature_state]); - payload = xstrcat(payload, (char *)"\",\"address\":\""); - payload = xstrcat(payload, (char *)units[i].temperature_rom_code); - payload = xstrcat(payload, (char *)"\",\"temperature\":"); - sprintf(buf, "%.3f", units[i].temperature / 1000.0); - payload = xstrcat(payload, buf); + // temperature_state temperature_address temperature + payload = xstrcat(payload, (char *)"\",\"temperature\":{\"state\":\""); + payload = xstrcat(payload, (char *)sensState[units[i].temperature_state]); + payload = xstrcat(payload, (char *)"\",\"address\":\""); + payload = xstrcat(payload, (char *)units[i].temperature_rom_code); + payload = xstrcat(payload, (char *)"\",\"temperature\":"); + sprintf(buf, "%.3f", units[i].temperature / 1000.0); + payload = xstrcat(payload, buf); - // pressure_state pressure_channel pressure_voltage pressure_zero pressure - payload = xstrcat(payload, (char *)"},\"pressure\":{\"state\":\""); - payload = xstrcat(payload, (char *)sensState[units[i].pressure_state]); - payload = xstrcat(payload, (char *)"\",\"channel\":"); - sprintf(buf, "%d", units[i].pressure_channel); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"voltage\":"); - sprintf(buf, "%.3f", units[i].pressure_voltage / 1000.0); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"zero\":"); - sprintf(buf, "%.3f", units[i].pressure_zero / 1000.0); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"bar\":"); - sprintf(buf, "%.2f", units[i].pressure / 1000.0); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"},\"mode\":\""); - payload = xstrcat(payload, (char *)unitMode[units[i].mode]); - payload = xstrcat(payload, (char *)"\"}"); + // pressure_state pressure_channel pressure_voltage pressure_zero pressure + payload = xstrcat(payload, (char *)"},\"pressure\":{\"state\":\""); + payload = xstrcat(payload, (char *)sensState[units[i].pressure_state]); + payload = xstrcat(payload, (char *)"\",\"channel\":"); + sprintf(buf, "%d", units[i].pressure_channel); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"voltage\":"); + sprintf(buf, "%.3f", units[i].pressure_voltage / 1000.0); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"zero\":"); + sprintf(buf, "%.3f", units[i].pressure_zero / 1000.0); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"bar\":"); + sprintf(buf, "%.2f", units[i].pressure / 1000.0); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"},\"mode\":\""); + payload = xstrcat(payload, (char *)unitMode[units[i].mode]); + payload = xstrcat(payload, (char *)"\"}"); + xSemaphoreGive(xSemaphoreUnits); + } return payload; }
--- a/sdkconfig Tue Oct 08 16:51:30 2019 +0200 +++ b/sdkconfig Tue Oct 08 21:09:36 2019 +0200 @@ -320,7 +320,7 @@ CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF CONFIG_FREERTOS_CORETIMER_0=y # CONFIG_FREERTOS_CORETIMER_1 is not set -CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_HZ=200 CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set