1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/dht/dht_saul.c
Marian Buschsieweke 579a67be03
drivers/dht: Move hold logic from SAUL to driver
The DHT11/DHT21/DHT22 cannot be sampled more than once a second. Previously,
a global cache was added to the SAUL adaption of the dht driver to answer with
stored values for one second after the last read. This however had two
disadvantages:

- The global cache was shared for all DHTXX devices connected. As a result
  incorrect values were delivered when reading out multiple sensors over SAUL
  with less than 1 second delay in between
- A user of the low level API will had to implement the same caching strategy,
  resulting in code duplication

By moving the hold logic to the driver, both limitations can be overcome.
2019-07-29 10:39:50 +02:00

65 lines
1.5 KiB
C

/*
* Copyright (C) 2016 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup drivers_dht
* @{
*
* @file
* @brief SAUL adaption for DHT devices
*
* The values exported to SAUL for DHT devices are buffered, meaning that new
* values will only be read from the device, if the buffered values are older
* then 1 second (being exactly the maximum sampling time for DHT devices).
*
* This buffering does further introduce a coupling between both SAUL endpoints,
* meaning that if you read from both endpoints after each other, both values
* are from the same sensor reading.
*
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
*
* @}
*/
#include <string.h>
#include "saul.h"
#include "dht.h"
static int read_temp(const void *dev, phydat_t *res)
{
if (dht_read((dht_t *)dev, &res->val[0], NULL)) {
return -ECANCELED;
}
res->unit = UNIT_TEMP_C;
res->scale = -1;
return 1;
}
static int read_hum(const void *dev, phydat_t *res)
{
if (dht_read((dht_t *)dev, NULL, &res->val[0])) {
return -ECANCELED;
}
res->unit = UNIT_PERCENT;
res->scale = -1;
return 1;
}
const saul_driver_t dht_temp_saul_driver = {
.read = read_temp,
.write = saul_notsup,
.type = SAUL_SENSE_TEMP
};
const saul_driver_t dht_hum_saul_driver = {
.read = read_hum,
.write = saul_notsup,
.type = SAUL_SENSE_HUM
};