From eba0aca224c18624b7e398171fb8688728baf398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sat, 21 Dec 2019 14:31:51 +0100 Subject: [PATCH] light: Support sensors using raw values as well E.g. the vcnl4000 class devices reports a raw value and a scale to calculate lux. --- data/80-iio-sensor-proxy.rules | 1 + src/drv-iio-poll-light.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/data/80-iio-sensor-proxy.rules b/data/80-iio-sensor-proxy.rules index 06040dc..5bcb207 100644 --- a/data/80-iio-sensor-proxy.rules +++ b/data/80-iio-sensor-proxy.rules @@ -9,6 +9,7 @@ SUBSYSTEM=="iio", TEST=="in_accel_x_raw", TEST=="in_accel_y_raw", TEST=="in_acce SUBSYSTEM=="iio", TEST=="scan_elements/in_accel_x_en", TEST=="scan_elements/in_accel_y_en", TEST=="scan_elements/in_accel_z_en", ENV{IIO_SENSOR_PROXY_TYPE}="iio-buffer-accel" SUBSYSTEM=="iio", TEST=="scan_elements/in_rot_from_north_magnetic_tilt_comp_en", ENV{IIO_SENSOR_PROXY_TYPE}="iio-buffer-compass" SUBSYSTEM=="iio", TEST=="in_illuminance_input", ENV{IIO_SENSOR_PROXY_TYPE}="iio-poll-als" +SUBSYSTEM=="iio", TEST=="in_illuminance_raw", ENV{IIO_SENSOR_PROXY_TYPE}="iio-poll-als" SUBSYSTEM=="iio", TEST=="scan_elements/in_intensity_both_en", ENV{IIO_SENSOR_PROXY_TYPE}="iio-buffer-als" SUBSYSTEM=="input", ENV{ID_INPUT_ACCELEROMETER}=="1", ENV{IIO_SENSOR_PROXY_TYPE}="input-accel" diff --git a/src/drv-iio-poll-light.c b/src/drv-iio-poll-light.c index d0da7df..a7423c6 100644 --- a/src/drv-iio-poll-light.c +++ b/src/drv-iio-poll-light.c @@ -24,6 +24,8 @@ typedef struct DrvData { char *input_path; guint interval; guint timeout_id; + + double scale; } DrvData; static DrvData *drv_data = NULL; @@ -55,8 +57,8 @@ light_changed (gpointer user_data) g_error_free (error); return G_SOURCE_CONTINUE; } - - readings.level = level; + readings.level = level * drv_data->scale; + g_debug ("Light read from IIO: %lf, (scale %lf)", level, drv_data->scale); /* Even though the IIO kernel API declares in_intensity* values as unitless, * we use Microsoft's hid-sensors-usages.docx which mentions that Windows 8 @@ -125,6 +127,16 @@ iio_poll_light_open (GUdevDevice *device, drv_data->input_path = g_build_filename (g_udev_device_get_sysfs_path (device), "in_illuminance_input", NULL); + if (!g_file_test (drv_data->input_path, G_FILE_TEST_EXISTS)) { + g_free (drv_data->input_path); + drv_data->input_path = g_build_filename (g_udev_device_get_sysfs_path (device), + "in_illuminance_raw", + NULL); + } + + drv_data->scale = g_udev_device_get_sysfs_attr_as_double (device, "in_illuminance_scale"); + if (drv_data->scale == 0.0) + drv_data->scale = 1.0; return TRUE; }