1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/si1133/si1133_saul.c
Marian Buschsieweke 16f859dafd
drivers/saul: use const qualifier for data to write
This makes life easier when calling e.g. `saul_reg_write()` with data
stored in flash.

As now the signatures for reading and writing differ (in that `const`
qualifier only), `saul_notsup()` is split into `saul_write_notsup()`
and `saul_read_notsup()`. However, one is implemented as a symbol alias
of the other, so that ROM consumption remains unchanged.
2022-05-23 08:35:27 +02:00

108 lines
2.8 KiB
C

/*
* Copyright (C) 2020 iosabi
*
* 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_si1133
* @{
*
* @file
* @brief SAUL adaption for SI1133 devices
*
* @author iosabi <iosabi@protonmail.com>
*
* @}
*/
#include "saul.h"
#include "si1133.h"
static int read_uv(const void *dev, phydat_t *res)
{
if (si1133_easy_configure((si1133_t *)dev,
SI1133_SENS_UV | SI1133_SENS_DEEP_UV,
/*sample_time_log=*/ 1,
/*sw_gain=*/ 0) != 0) {
return -ECANCELED;
}
int32_t values[2];
if (si1133_capture_sensors((si1133_t *)dev, values,
ARRAY_SIZE(values)) != 0) {
return -ECANCELED;
}
for (uint8_t i = 0; i < ARRAY_SIZE(values); i++) {
res->val[i] = values[i];
}
res->unit = UNIT_NONE; /* UV index */
res->scale = 0;
return ARRAY_SIZE(values);
}
static int read_ir(const void *dev, phydat_t *res)
{
if (si1133_easy_configure((si1133_t *)dev,
SI1133_SENS_SMALL_IR | SI1133_SENS_MEDIUM_IR |
SI1133_SENS_LARGE_IR,
/*sample_time_log=*/ 1,
/*sw_gain=*/ 0) != 0) {
return -ECANCELED;
}
int32_t values[3];
if (si1133_capture_sensors((si1133_t *)dev, values,
ARRAY_SIZE(values)) != 0) {
return -ECANCELED;
}
for (uint8_t i = 0; i < ARRAY_SIZE(values); i++) {
res->val[i] = values[i];
}
res->unit = UNIT_LUX;
res->scale = 0;
return ARRAY_SIZE(values);
}
static int read_white(const void *dev, phydat_t *res)
{
if (si1133_easy_configure((si1133_t *)dev,
SI1133_SENS_WHITE | SI1133_SENS_LARGE_WHITE,
/*sample_time_log=*/ 1,
/*sw_gain=*/ 0) != 0) {
return -ECANCELED;
}
int32_t values[2];
if (si1133_capture_sensors((si1133_t *)dev, values,
ARRAY_SIZE(values)) != 0) {
return -ECANCELED;
}
for (uint8_t i = 0; i < ARRAY_SIZE(values); i++) {
res->val[i] = values[i];
}
res->unit = UNIT_LUX;
res->scale = 0;
return ARRAY_SIZE(values);
}
const saul_driver_t si1133_uv_saul_driver = {
.read = read_uv,
.write = saul_write_notsup,
.type = SAUL_SENSE_UV
};
const saul_driver_t si1133_ir_saul_driver = {
.read = read_ir,
.write = saul_write_notsup,
.type = SAUL_SENSE_LIGHT
};
const saul_driver_t si1133_visible_saul_driver = {
.read = read_white,
.write = saul_write_notsup,
.type = SAUL_SENSE_LIGHT
};